Merge pull request #1731 from github/multiple-ext-segments

Support for multiple file extension segments
This commit is contained in:
Brandon Keepers
2014-11-26 15:09:15 -05:00
4 changed files with 34 additions and 12 deletions

View File

@@ -57,14 +57,20 @@ module Linguist
# #
# Returns a String. # Returns a String.
def extension def extension
# File.extname returns nil if the filename is an extension. extensions.last || ""
extension = File.extname(name) end
basename = File.basename(name)
# Checks if the filename is an extension. # Public: Return an array of the file extensions
if extension.empty? && basename[0] == "." #
basename # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions
else # => [".html.erb", ".erb"]
extension #
# 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 end
end end

View File

@@ -106,8 +106,8 @@ module Linguist
# A bit of an elegant hack. If the file is executable but extensionless, # A bit of an elegant hack. If the file is executable but extensionless,
# append a "magic" extension so it can be classified with other # append a "magic" extension so it can be classified with other
# languages that have shebang scripts. # languages that have shebang scripts.
extension = FileBlob.new(name).extension extensions = FileBlob.new(name).extensions
if extension.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05
name += ".script!" name += ".script!"
end end
@@ -190,8 +190,13 @@ module Linguist
# Returns all matching Languages or [] if none were found. # Returns all matching Languages or [] if none were found.
def self.find_by_filename(filename) def self.find_by_filename(filename)
basename = File.basename(filename) basename = File.basename(filename)
extname = FileBlob.new(filename).extension
(@filename_index[basename] + find_by_extension(extname)).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 end
# Public: Look up Languages by file extension. # Public: Look up Languages by file extension.

10
test/test_file_blob.rb Normal file
View File

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

View File

@@ -223,6 +223,7 @@ class TestLanguage < Test::Unit::TestCase
assert_equal [Language['Clojure']], Language.find_by_filename('riemann.config') assert_equal [Language['Clojure']], Language.find_by_filename('riemann.config')
assert_equal [Language['HTML+Django']], Language.find_by_filename('index.jinja') 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['Chapel']], Language.find_by_filename('examples/hello.chpl')
assert_equal [Language['Ant Build System']], Language.find_by_filename('build.ant.xml')
end end
def test_find_by_shebang def test_find_by_shebang