diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index 49c10bf7..4dd06bb4 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -194,9 +194,25 @@ module Linguist def self.find_by_filename(filename) basename = File.basename(filename) extname = FileBlob.new(filename).extension - langs = @filename_index[basename] + - @extension_index[extname] - langs.compact.uniq + (@filename_index[basename] + find_by_extension(extname)).compact.uniq + end + + # Public: Look up Languages by file extension. + # + # extname - The extension String. + # + # Examples + # + # Language.find_by_extension('.rb') + # # => [#] + # + # Language.find_by_extension('rb') + # # => [#] + # + # Returns all matching Languages or [] if none were found. + def self.find_by_extension(extname) + extname = ".#{extname}" unless extname.start_with?(".") + @extension_index[extname] end # Public: Look up Languages by shebang line. diff --git a/test/test_language.rb b/test/test_language.rb index 0039dc2b..77f5ecba 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -241,6 +241,22 @@ class TestLanguage < Test::Unit::TestCase end end + def test_find_by_extension + assert_equal [], Language.find_by_extension('.factor-rc') + assert_equal [], Language.find_by_extension('foo.rb') + assert_equal [Language['Ruby']], Language.find_by_extension('rb') + assert_equal [Language['Ruby']], Language.find_by_extension('.rb') + assert_equal [Language['M'], Language['Mathematica'], Language['Matlab'], Language['Mercury'], Language['Objective-C']], Language.find_by_extension('.m') + end + + def test_find_all_by_extension + Language.all.each do |language| + language.extensions.each do |extension| + assert_include Language.find_by_extension(extension), language + end + end + end + def test_find_by_filename assert_equal [Language['Shell']], Language.find_by_filename('PKGBUILD') assert_equal [Language['Ruby']], Language.find_by_filename('foo.rb')