Use filenames as a definitive answer (#2006)

* Separate find_by_extension and find_by_filename
find_by_extension now takes a path as argument and not only the file extension.
Currently only find_by_extension is used as a strategy.

* Add find_by_filename as first strategy
This commit is contained in:
Paul Chaignon
2016-12-12 21:34:33 +01:00
committed by Brandon Black
parent 9d8392dab8
commit 9b941a34f0
10 changed files with 435 additions and 29 deletions

View File

@@ -11,6 +11,7 @@ require 'linguist/samples'
require 'linguist/file_blob'
require 'linguist/blob_helper'
require 'linguist/strategy/filename'
require 'linguist/strategy/extension'
require 'linguist/strategy/modeline'
require 'linguist/shebang'
@@ -129,41 +130,46 @@ module Linguist
# Public: Look up Languages by filename.
#
# The behaviour of this method recently changed.
# See the second example below.
#
# filename - The path String.
#
# Examples
#
# Language.find_by_filename('Cakefile')
# # => [#<Language name="CoffeeScript">]
# Language.find_by_filename('foo.rb')
# # => [#<Language name="Ruby">]
# # => []
#
# Returns all matching Languages or [] if none were found.
def self.find_by_filename(filename)
basename = File.basename(filename)
# 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
@filename_index[basename]
end
# Public: Look up Languages by file extension.
#
# extname - The extension String.
# The behaviour of this method recently changed.
# See the second example below.
#
# filename - The path String.
#
# Examples
#
# Language.find_by_extension('.rb')
# Language.find_by_extension('dummy.rb')
# # => [#<Language name="Ruby">]
#
# Language.find_by_extension('rb')
# # => [#<Language name="Ruby">]
# # => []
#
# Returns all matching Languages or [] if none were found.
def self.find_by_extension(extname)
extname = ".#{extname}" unless extname.start_with?(".")
@extension_index[extname.downcase]
def self.find_by_extension(filename)
# find the first extension with language definitions
extname = FileBlob.new(filename.downcase).extensions.detect do |e|
!@extension_index[e].empty?
end
@extension_index[extname]
end
# Public: Look up Languages by interpreter.

View File

@@ -0,0 +1,10 @@
module Linguist
module Strategy
# Detects language based on extension
class Extension
def self.call(blob, _)
Language.find_by_extension(blob.name.to_s)
end
end
end
end

View File

@@ -1,9 +1,10 @@
module Linguist
module Strategy
# Detects language based on filename and/or extension
# Detects language based on filename
class Filename
def self.call(blob, _)
Language.find_by_filename(blob.name.to_s)
name = blob.name.to_s
Language.find_by_filename(name)
end
end
end