diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index b4c2d5f0..8f6686d1 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -2,22 +2,42 @@ require 'yaml' module Linguist class Language - @name_index = {} + @name_index = {} + @extension_index = {} def self.create(attributes = {}) language = new(attributes) @name_index[language.name.downcase] = language + language.extensions.each do |extension| + @extension_index[extension] = language + @extension_index[extension.sub(/^./, '')] = language + end + language end + def self.[](name) + find_by_name(name) + end + def self.find_by_name(name) @name_index[name.downcase] end - def self.[](name) - find_by_name(name) + def self.find_by_extension(filename) + basename = File.basename(filename) + + if basename[0] == ?. + ext = basename + elsif basename.include?('.') + ext = File.extname(basename) + else + ext = basename + end + + @extension_index[ext] end attr_reader :name, :extensions diff --git a/test/test_language.rb b/test/test_language.rb index b3010e43..1ad96405 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -6,9 +6,24 @@ class TestLanguage < Test::Unit::TestCase include Linguist def test_find_by_name - assert_equal "Ruby", Language.find_by_name('Ruby').name - assert_equal "Ruby", Language.find_by_name('ruby').name - assert_equal "Ruby", Language.find_by_name('RUBY').name + ruby = Language['Ruby'] + assert_equal ruby, Language.find_by_name('Ruby') + assert_equal ruby, Language.find_by_name('ruby') + assert_equal ruby, Language.find_by_name('RUBY') + end + + def test_find_by_extension + ruby = Language['Ruby'] + assert_equal ruby, Language.find_by_extension('.rb') + assert_equal ruby, Language.find_by_extension('rb') + assert_equal ruby, Language.find_by_extension('foo.rb') + assert_equal ruby, Language.find_by_extension('./foo.rb') + assert_equal ruby, Language.find_by_extension('foo/bar.rb') + + # TODO: Review questionable usage + assert_equal ruby, Language.find_by_extension('Rakefile') + assert_equal ruby, Language.find_by_extension('vendor/Rakefile') + assert_equal ruby, Language.find_by_extension('./Rakefile') end def test_name