From 3ca872cea8c6105d07cf173b3aac33684c5d2f84 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 17 Nov 2014 14:54:22 -0500 Subject: [PATCH] Support for multiple file extension segments --- lib/linguist/file_blob.rb | 22 ++++++++++++++-------- lib/linguist/language.rb | 4 ++-- test/test_file_blob.rb | 10 ++++++++++ test/test_language.rb | 1 + 4 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 test/test_file_blob.rb diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb index bc475023..04441935 100644 --- a/lib/linguist/file_blob.rb +++ b/lib/linguist/file_blob.rb @@ -57,14 +57,20 @@ module Linguist # # Returns a String. def extension - # File.extname returns nil if the filename is an extension. - extension = File.extname(name) - basename = File.basename(name) - # Checks if the filename is an extension. - if extension.empty? && basename[0] == "." - basename - else - extension + extensions.last || "" + end + + # Public: Return an array of the file extensions + # + # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions + # => [".html.erb", ".erb"] + # + # Returns an Array + def extensions + basename, *segments = File.basename(name).split(".") + + segments.map.with_index do |segment, index| + "." + segments[index..-1].join(".") end end end diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index 507ae71a..9c0485fc 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -192,8 +192,8 @@ module Linguist # Returns all matching Languages or [] if none were found. def self.find_by_filename(filename) basename = File.basename(filename) - extname = FileBlob.new(filename).extension - (@filename_index[basename] + find_by_extension(extname)).compact.uniq + exts = FileBlob.new(filename).extensions.map {|extname| find_by_extension(extname)} + (@filename_index[basename] + exts.flatten).compact.uniq end # Public: Look up Languages by file extension. diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb new file mode 100644 index 00000000..9371dce7 --- /dev/null +++ b/test/test_file_blob.rb @@ -0,0 +1,10 @@ +require 'linguist/file_blob' +require 'test/unit' + +class TestFileBlob < Test::Unit::TestCase + def test_extensions + assert_equal [".gitignore"], Linguist::FileBlob.new(".gitignore").extensions + assert_equal [".xml"], Linguist::FileBlob.new("build.xml").extensions + assert_equal [".html.erb", ".erb"], Linguist::FileBlob.new("dotted.dir/index.html.erb").extensions + end +end diff --git a/test/test_language.rb b/test/test_language.rb index aeb1fce9..b44c6d30 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -222,6 +222,7 @@ class TestLanguage < Test::Unit::TestCase assert_equal [Language['Clojure']], Language.find_by_filename('riemann.config') assert_equal [Language['HTML+Django']], Language.find_by_filename('index.jinja') assert_equal [Language['Chapel']], Language.find_by_filename('examples/hello.chpl') + assert_equal [Language['Ant Build System']], Language.find_by_filename('build.ant.xml') end def test_find_by_shebang