mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Separate filename and extension configuration
This commit is contained in:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user