Add Language#find_by_extension

This commit is contained in:
Joshua Peek
2011-05-09 22:56:28 -05:00
parent 80ff3883ac
commit 6041dda7ca
2 changed files with 41 additions and 6 deletions

View File

@@ -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

View File

@@ -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