From 3ca872cea8c6105d07cf173b3aac33684c5d2f84 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 17 Nov 2014 14:54:22 -0500 Subject: [PATCH 1/3] 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 From c46667581de09057e35b8ea01effbfe458c21964 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 17 Nov 2014 15:15:39 -0500 Subject: [PATCH 2/3] Use the first extension with languages defined --- lib/linguist/language.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index 9c0485fc..2794c23f 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -192,8 +192,13 @@ module Linguist # Returns all matching Languages or [] if none were found. def self.find_by_filename(filename) basename = File.basename(filename) - exts = FileBlob.new(filename).extensions.map {|extname| find_by_extension(extname)} - (@filename_index[basename] + exts.flatten).compact.uniq + + # find the first extension with language definitions + extname = FileBlob.new(filename).extensions.detect do |e| + !@extension_index[e].empty? + end + + (@filename_index[basename] + @extension_index[extname]).compact.uniq end # Public: Look up Languages by file extension. From 6c106b88c05cdf36c609c55d4029735372b22c5c Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 17 Nov 2014 15:47:21 -0500 Subject: [PATCH 3/3] Avoid using singular #extension --- lib/linguist/language.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index 2794c23f..53ce777e 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -110,8 +110,8 @@ module Linguist # A bit of an elegant hack. If the file is executable but extensionless, # append a "magic" extension so it can be classified with other # languages that have shebang scripts. - extension = FileBlob.new(name).extension - if extension.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 + extensions = FileBlob.new(name).extensions + if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 name += ".script!" end