Separate filename and extension configuration

This commit is contained in:
Joshua Peek
2011-06-07 10:31:39 -05:00
parent 0c45d67605
commit c7739119b3
7 changed files with 73 additions and 27 deletions

View File

@@ -260,7 +260,7 @@ module Linguist
language language
# See if there is a Language for the extension # See if there is a Language for the extension
elsif language = Language.find_by_extension(extname) elsif language = Language.find_by_filename(pathname.to_s)
language language
# Try to detect Language from shebang line # Try to detect Language from shebang line

View File

@@ -8,6 +8,7 @@ module Linguist
@name_index = {} @name_index = {}
@alias_index = {} @alias_index = {}
@extension_index = {} @extension_index = {}
@filename_index = {}
# Internal: Create a new Language object # Internal: Create a new Language object
# #
@@ -37,6 +38,10 @@ module Linguist
end end
language.extensions.each do |extension| language.extensions.each do |extension|
if extension !~ /^\./
warn "Extension is missing a '.': #{extension.inspect}"
end
# All Language extensions should be unique. Warn if there is a # All Language extensions should be unique. Warn if there is a
# duplicate. # duplicate.
if @extension_index.key?(extension) if @extension_index.key?(extension)
@@ -47,7 +52,11 @@ module Linguist
@extension_index[extension] = language @extension_index[extension] = language
# Index the extension without a leading ".": "rb" # Index the extension without a leading ".": "rb"
@extension_index[extension.sub(/^./, '')] = language @extension_index[extension.sub(/^\./, '')] = language
end
language.filenames.each do |filename|
@filename_index[filename] = language
end end
language language
@@ -102,6 +111,21 @@ module Linguist
@extension_index[extension] @extension_index[extension]
end end
# Public: Look up Language by filename.
#
# filename - The path String.
#
# Examples
#
# Language.find_by_filename('foo.rb')
# # => #<Language name="Ruby">
#
# Returns the Language or nil if none was found.
def self.find_by_filename(filename)
basename, extname = File.basename(filename), File.extname(filename)
@filename_index[basename] || @extension_index[extname]
end
# Public: Look up Language by its name or lexer. # Public: Look up Language by its name or lexer.
# #
# name - The case-insensitive String name of the Language # name - The case-insensitive String name of the Language
@@ -163,6 +187,7 @@ module Linguist
# Set extensions or default to []. # Set extensions or default to [].
# Consider using `@lexer.extensions` # Consider using `@lexer.extensions`
@extensions = attributes[:extensions] || [] @extensions = attributes[:extensions] || []
@filenames = attributes[:filenames] || []
# Set popular, common, and searchable flags # Set popular, common, and searchable flags
@popular = attributes.key?(:popular) ? attributes[:popular] : false @popular = attributes.key?(:popular) ? attributes[:popular] : false
@@ -211,11 +236,20 @@ module Linguist
# #
# Examples # Examples
# #
# # => ['.rb', '.rake', 'Rakefile', ...] # # => ['.rb', '.rake', ...]
# #
# Returns the extensions Array # Returns the extensions Array
attr_reader :extensions attr_reader :extensions
# Public: Get filenames
#
# Examples
#
# # => ['Rakefile', ...]
#
# Returns the extensions Array
attr_reader :filenames
# Internal: Get default alias name # Internal: Get default alias name
# #
# Returns the alias name String # Returns the alias name String
@@ -302,6 +336,7 @@ module Linguist
:searchable => options.key?(:searchable) ? options[:searchable] : true, :searchable => options.key?(:searchable) ? options[:searchable] : true,
:search_term => options[:search_term], :search_term => options[:search_term],
:extensions => options[:ext], :extensions => options[:ext],
:filenames => options[:filenames],
:popular => popular.include?(name), :popular => popular.include?(name),
:common => common.include?(name) :common => common.include?(name)
) )

View File

@@ -105,6 +105,7 @@ Clojure:
CoffeeScript: CoffeeScript:
:ext: :ext:
- .coffee - .coffee
:filenames:
- Cakefile - Cakefile
ColdFusion: ColdFusion:
:lexer: ColdFusion HTML :lexer: ColdFusion HTML
@@ -249,9 +250,10 @@ Haskell:
INI: INI:
:ext: :ext:
- .cfg - .cfg
- .gitconfig
- .ini - .ini
- .properties - .properties
:filenames:
- .gitconfig
IRC log: IRC log:
:lexer: IRC logs :lexer: IRC logs
:search_term: irc :search_term: irc
@@ -277,11 +279,12 @@ JavaScript:
:ext: :ext:
- .js - .js
- .sjs - .sjs
- Jakefile
- .jss - .jss
- .ssjs - .ssjs
- .jsx - .jsx
- .jake - .jake
:filenames:
- Jakefile
JSON: JSON:
:lexer: javascript :lexer: javascript
:search_term: javascript :search_term: javascript
@@ -303,6 +306,7 @@ Lua:
Makefile: Makefile:
:ext: :ext:
- .mak - .mak
:filenames:
- Makefile - Makefile
Mako: Mako:
:ext: :ext:
@@ -341,6 +345,7 @@ Nu:
- nush - nush
:ext: :ext:
- .nu - .nu
:filenames:
- Nukefile - Nukefile
NumPy: NumPy:
:ext: :ext:
@@ -451,16 +456,17 @@ Ruby:
- .rb - .rb
- .ru - .ru
- .builder - .builder
- Capfile
- .rbw - .rbw
- .rbx - .rbx
- .god - .god
- .rake - .rake
- .gemspec - .gemspec
- Rakefile
- .irbrc - .irbrc
- Thorfile
- .thor - .thor
:filenames:
- Capfile
- Rakefile
- Thorfile
- Gemfile - Gemfile
SQL: SQL:
:searchable: false :searchable: false
@@ -491,10 +497,11 @@ Shell:
- zsh - zsh
:ext: :ext:
- .bash - .bash
- .sh
:filenames:
- .bash_profile - .bash_profile
- .bashrc - .bashrc
- .profile - .profile
- .sh
- .zlogin - .zlogin
- .zsh - .zsh
- .zshrc - .zshrc
@@ -548,6 +555,7 @@ VimL:
- vim - vim
:ext: :ext:
- .vim - .vim
:filenames:
- .vimrc - .vimrc
- .gvimrc - .gvimrc
Visual Basic: Visual Basic:
@@ -583,6 +591,7 @@ YAML:
:ext: :ext:
- .yml - .yml
- .yaml - .yaml
:filenames:
- .gemrc - .gemrc
Java Server Pages: Java Server Pages:
:lexer: Java Server Page :lexer: Java Server Page

View File

@@ -39,18 +39,9 @@ module Linguist
# Pathname.new('file.rb').extname # Pathname.new('file.rb').extname
# # => '.rb' # # => '.rb'
# #
# Pathname.new('Rakefile').extname
# # => 'Rakefile'
#
# Returns a String. # Returns a String.
def extname def extname
if basename[0] == ?. File.extname(@path)
basename
elsif basename.include?('.')
File.extname(basename)
else
basename
end
end end
# Public: Get the language of the path # Public: Get the language of the path
@@ -65,7 +56,7 @@ module Linguist
# #
# Returns a Langauge. # Returns a Langauge.
def language def language
Language.find_by_extension(extname) || Language['Text'] Language.find_by_filename(@path) || Language['Text']
end end
# Internal: Has a language. # Internal: Has a language.
@@ -74,7 +65,7 @@ module Linguist
# #
# Returns true or false. # Returns true or false.
def language? def language?
Language.find_by_extension(extname) ? true : false Language.find_by_filename(@path) ? true : false
end end
# Deprecated: Get the lexer of the path # Deprecated: Get the lexer of the path

View File

@@ -92,7 +92,11 @@ class TestBlob < Test::Unit::TestCase
assert blob("README").text? assert blob("README").text?
assert blob("file.json").text? assert blob("file.json").text?
assert blob("file.txt").text? assert blob("file.txt").text?
assert blob("md").text?
assert blob("script.sh").text? assert blob("script.sh").text?
assert blob("tender.md").text?
assert blob("txt").text?
assert blob("zip").text?
end end
def test_image def test_image

View File

@@ -108,6 +108,15 @@ class TestLanguage < Test::Unit::TestCase
end end
end end
def test_find_by_filename
assert_equal Language['Ruby'], Language.find_by_filename('foo.rb')
assert_equal Language['Ruby'], Language.find_by_filename('foo/bar.rb')
assert_equal Language['Ruby'], Language.find_by_filename('Rakefile')
assert_nil Language.find_by_filename('rb')
assert_nil Language.find_by_filename('.rb')
assert_nil Language.find_by_filename('.kt')
end
def test_find def test_find
assert_equal "Ruby", Language['Ruby'].name assert_equal "Ruby", Language['Ruby'].name
assert_equal "Ruby", Language['ruby'].name assert_equal "Ruby", Language['ruby'].name

View File

@@ -13,21 +13,19 @@ class TestPathname < Test::Unit::TestCase
assert_equal 'file.rb', Pathname.new("file.rb").basename assert_equal 'file.rb', Pathname.new("file.rb").basename
assert_equal 'file.rb', Pathname.new("./file.rb").basename assert_equal 'file.rb', Pathname.new("./file.rb").basename
assert_equal 'file.rb', Pathname.new("sub/dir/file.rb").basename assert_equal 'file.rb', Pathname.new("sub/dir/file.rb").basename
assert_equal '.profile', Pathname.new(".profile").basename
end end
def test_extname def test_extname
assert_equal '.rb', Pathname.new(".rb").extname
assert_equal '.rb', Pathname.new("file.rb").extname assert_equal '.rb', Pathname.new("file.rb").extname
assert_equal '.rb', Pathname.new("./file.rb").extname assert_equal '.rb', Pathname.new("./file.rb").extname
assert_equal '.rb', Pathname.new("sub/dir/file.rb").extname assert_equal '.rb', Pathname.new("sub/dir/file.rb").extname
assert_equal '', Pathname.new(".profile").extname
assert_equal 'Rakefile', Pathname.new("Rakefile").extname
assert_equal 'Rakefile', Pathname.new("./Rakefile").extname
assert_equal 'Rakefile', Pathname.new("vendor/Rakefile").extname
end end
def test_language def test_language
assert_equal Language['Ruby'], Pathname.new(".rb").language assert_equal Language['Text'], Pathname.new(".rb").language
assert_equal Language['Ruby'], Pathname.new("file.rb").language assert_equal Language['Ruby'], Pathname.new("file.rb").language
assert_equal Language['Ruby'], Pathname.new("./file.rb").language assert_equal Language['Ruby'], Pathname.new("./file.rb").language
assert_equal Language['Ruby'], Pathname.new("sub/dir/file.rb").language assert_equal Language['Ruby'], Pathname.new("sub/dir/file.rb").language