diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index cfeb13d1..a5ecf7c1 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -197,6 +197,21 @@ module Linguist @popular = attributes.key?(:popular) ? attributes[:popular] : false @common = attributes.key?(:common) ? attributes[:common] : false @searchable = attributes.key?(:searchable) ? attributes[:searchable] : true + + # If group name is set, save the name so we can lazy load it later + if attributes[:group_name] + if common? + warn "#{name} is a major langauage, it should not be grouped with #{attributes[:group_name]}" + end + + @group = nil + @group_name = attributes[:group_name] + + # Otherwise we can set it to self now + else + @group = self + end + end # Public: Get proper name @@ -261,6 +276,19 @@ module Linguist name.downcase.gsub(/\s/, '-') end + # Public: Get Language group + # + # Minor languages maybe grouped with major languages for + # accounting purposes. For an example, JSP files are grouped as + # Java. + # + # For major languages, group should always return self. + # + # Returns a Language + def group + @group ||= Language.find_by_name(@group_name) + end + # Public: Is it popular? # # Returns true or false @@ -337,6 +365,7 @@ module Linguist :name => name, :aliases => options['aliases'], :lexer => options['lexer'], + :group_name => options['group'], :searchable => options.key?('searchable') ? options['searchable'] : true, :search_term => options['search_term'], :extensions => options['extensions'], diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index fd2ffaaf..2ff8a8cc 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -65,6 +65,7 @@ Assembly: - .asm Batchfile: + group: Shell search_term: bat aliases: - bat @@ -88,6 +89,7 @@ Brainfuck: extensions: - .b - .bf + C: extensions: - .c @@ -169,6 +171,7 @@ Cucumber: - .feature Cython: + group: Python extensions: - .pyx - .pxd @@ -244,6 +247,7 @@ Factor: - .factor GAS: + group: Assembly extensions: - .s - .S @@ -253,11 +257,13 @@ Genshi: - .kid Gentoo Ebuild: + group: Shell lexer: Bash extensions: - .ebuild Gentoo Eclass: + group: Shell lexer: Bash extensions: - .eclass @@ -299,17 +305,20 @@ HTML: - .xslt HTML+Django: + group: HTML lexer: HTML+Django/Jinja extensions: - .mustache HTML+ERB: + group: HTML lexer: RHTML extensions: - .erb - .html.erb HTML+PHP: + group: HTML extensions: - .phtml @@ -350,6 +359,7 @@ Io: - .io JSON: + group: JavaScript lexer: JavaScript search_term: javascript extensions: @@ -361,6 +371,7 @@ Java: - .pde Java Server Pages: + group: Java lexer: Java Server Page search_term: jsp aliases: @@ -387,6 +398,7 @@ LLVM: - .ll Literate Haskell: + group: Haskell search_term: lhs aliases: - lhs @@ -460,6 +472,7 @@ Nu: - Nukefile NumPy: + group: Python extensions: - .numpy - .numsc @@ -488,6 +501,7 @@ Objective-J: - .sj OpenCL: + group: C lexer: C extensions: - .cl @@ -532,6 +546,7 @@ Python: - .pyw Python traceback: + group: Python lexer: Python Traceback search_term: pytb aliases: @@ -546,6 +561,7 @@ R: - .R RHTML: + group: HTML extensions: - .rhtml diff --git a/test/test_language.rb b/test/test_language.rb index a64f8b30..b9b66745 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -196,6 +196,28 @@ class TestLanguage < Test::Unit::TestCase assert_equal Language['reStructuredText'], Language.find_by_alias('rst') end + def test_common_groups + Language.all.each do |language| + if language.common? + assert_equal language, language.group + end + end + end + + def test_groups + assert_equal Language['Assembly'], Language['GAS'].group + assert_equal Language['C'], Language['OpenCL'].group + assert_equal Language['Haskell'], Language['Literate Haskell'].group + assert_equal Language['Java'], Language['Java Server Pages'].group + assert_equal Language['JavaScript'], Language['JSON'].group + assert_equal Language['Python'], Language['Cython'].group + assert_equal Language['Python'], Language['NumPy'].group + assert_equal Language['Python'], Language['Python traceback'].group + assert_equal Language['Shell'], Language['Batchfile'].group + assert_equal Language['Shell'], Language['Gentoo Ebuild'].group + assert_equal Language['Shell'], Language['Gentoo Eclass'].group + end + # Used for code search indexing. Changing any of these values may # require reindexing repositories. def test_search_term