mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Merge pull request #1750 from github/interpreters-in-samples
Fix for interpreters from samples
This commit is contained in:
		| @@ -559,6 +559,8 @@ Crystal: | |||||||
|   - .cr |   - .cr | ||||||
|   ace_mode: ruby |   ace_mode: ruby | ||||||
|   tm_scope: source.ruby |   tm_scope: source.ruby | ||||||
|  |   interpreters: | ||||||
|  |   - crystal | ||||||
|  |  | ||||||
| Cucumber: | Cucumber: | ||||||
|   extensions: |   extensions: | ||||||
| @@ -736,6 +738,8 @@ Erlang: | |||||||
|   - .es |   - .es | ||||||
|   - .escript |   - .escript | ||||||
|   - .hrl |   - .hrl | ||||||
|  |   interpreters: | ||||||
|  |   - escript | ||||||
|  |  | ||||||
| F#: | F#: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -931,6 +935,8 @@ Gnuplot: | |||||||
|   - .gnuplot |   - .gnuplot | ||||||
|   - .plot |   - .plot | ||||||
|   - .plt |   - .plt | ||||||
|  |   interpreters: | ||||||
|  |   - gnuplot | ||||||
|  |  | ||||||
| Go: | Go: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -1196,6 +1202,8 @@ Ioke: | |||||||
|   color: "#078193" |   color: "#078193" | ||||||
|   extensions: |   extensions: | ||||||
|   - .ik |   - .ik | ||||||
|  |   interpreters: | ||||||
|  |   - ioke | ||||||
|  |  | ||||||
| Isabelle: | Isabelle: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -1703,6 +1711,8 @@ Nu: | |||||||
|   filenames: |   filenames: | ||||||
|   - Nukefile |   - Nukefile | ||||||
|   tm_scope: source.scheme |   tm_scope: source.scheme | ||||||
|  |   interpreters: | ||||||
|  |   - nush | ||||||
|  |  | ||||||
| NumPy: | NumPy: | ||||||
|   group: Python |   group: Python | ||||||
| @@ -1889,6 +1899,8 @@ Parrot Assembly: | |||||||
|   - pasm |   - pasm | ||||||
|   extensions: |   extensions: | ||||||
|   - .pasm |   - .pasm | ||||||
|  |   interpreters: | ||||||
|  |   - parrot | ||||||
|   tm_scope: none |   tm_scope: none | ||||||
|  |  | ||||||
| Parrot Internal Representation: | Parrot Internal Representation: | ||||||
| @@ -1899,6 +1911,8 @@ Parrot Internal Representation: | |||||||
|   - pir |   - pir | ||||||
|   extensions: |   extensions: | ||||||
|   - .pir |   - .pir | ||||||
|  |   interpreters: | ||||||
|  |   - parrot | ||||||
|  |  | ||||||
| Pascal: | Pascal: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -1941,6 +1955,8 @@ Perl6: | |||||||
|   - .p6m |   - .p6m | ||||||
|   - .pl6 |   - .pl6 | ||||||
|   - .pm6 |   - .pm6 | ||||||
|  |   interpreters: | ||||||
|  |   - perl6 | ||||||
|   tm_scope: none |   tm_scope: none | ||||||
|  |  | ||||||
| PigLatin: | PigLatin: | ||||||
| @@ -2005,6 +2021,8 @@ Prolog: | |||||||
|   - .ecl |   - .ecl | ||||||
|   - .pro |   - .pro | ||||||
|   - .prolog |   - .prolog | ||||||
|  |   interpreters: | ||||||
|  |   - swipl | ||||||
|  |  | ||||||
| Propeller Spin: | Propeller Spin: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -2068,6 +2086,8 @@ Python: | |||||||
|   - wscript |   - wscript | ||||||
|   interpreters: |   interpreters: | ||||||
|   - python |   - python | ||||||
|  |   - python2 | ||||||
|  |   - python3 | ||||||
|  |  | ||||||
| Python traceback: | Python traceback: | ||||||
|   type: data |   type: data | ||||||
| @@ -2088,6 +2108,8 @@ QMake: | |||||||
|   extensions: |   extensions: | ||||||
|   - .pro |   - .pro | ||||||
|   - .pri |   - .pri | ||||||
|  |   interpreters: | ||||||
|  |   - qmake | ||||||
|  |  | ||||||
| R: | R: | ||||||
|   type: programming |   type: programming | ||||||
| @@ -2242,6 +2264,8 @@ Ruby: | |||||||
|   - .watchr |   - .watchr | ||||||
|   interpreters: |   interpreters: | ||||||
|   - ruby |   - ruby | ||||||
|  |   - macruby | ||||||
|  |   - rake | ||||||
|   filenames: |   filenames: | ||||||
|   - .pryrc |   - .pryrc | ||||||
|   - Appraisals |   - Appraisals | ||||||
| @@ -2328,6 +2352,8 @@ Scala: | |||||||
|   - .scala |   - .scala | ||||||
|   - .sbt |   - .sbt | ||||||
|   - .sc |   - .sc | ||||||
|  |   interpreters: | ||||||
|  |   - scala | ||||||
|  |  | ||||||
| Scaml: | Scaml: | ||||||
|   group: HTML |   group: HTML | ||||||
|   | |||||||
| @@ -52,14 +52,16 @@ module Linguist | |||||||
|               }) |               }) | ||||||
|             end |             end | ||||||
|           else |           else | ||||||
|  |             path = File.join(dirname, filename) | ||||||
|  |  | ||||||
|             if File.extname(filename) == "" |             if File.extname(filename) == "" | ||||||
|               raise "#{File.join(dirname, filename)} is missing an extension, maybe it belongs in filenames/ subdir" |               raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir" | ||||||
|             end |             end | ||||||
|  |  | ||||||
|             yield({ |             yield({ | ||||||
|               :path     => File.join(dirname, filename), |               :path     => path, | ||||||
|               :language => category, |               :language => category, | ||||||
|               :interpreter => File.exist?(filename) ? Linguist.interpreter_from_shebang(File.read(filename)) : nil, |               :interpreter => Linguist.interpreter_from_shebang(File.read(path)), | ||||||
|               :extname  => File.extname(filename) |               :extname  => File.extname(filename) | ||||||
|             }) |             }) | ||||||
|           end |           end | ||||||
| @@ -131,18 +133,19 @@ module Linguist | |||||||
|  |  | ||||||
|       script = script == 'env' ? tokens[1] : script |       script = script == 'env' ? tokens[1] : script | ||||||
|  |  | ||||||
|       # "python2.6" -> "python" |       # If script has an invalid shebang, we might get here | ||||||
|       if script =~ /((?:\d+\.?)+)/ |       return unless script | ||||||
|         script.sub! $1, '' |  | ||||||
|       end |       # "python2.6" -> "python2" | ||||||
|  |       script.sub! $1, '' if script =~ /(\.\d+)$/ | ||||||
|  |  | ||||||
|       # Check for multiline shebang hacks that call `exec` |       # Check for multiline shebang hacks that call `exec` | ||||||
|       if script == 'sh' && |       if script == 'sh' && | ||||||
|         lines[0...5].any? { |l| l.match(/exec (\w+).+\$0.+\$@/) } |         lines[0...5].any? { |l| l.match(/exec (\w+).+\$0.+\$@/) } | ||||||
|         script = $1 |         script = $1 | ||||||
|       end |       end | ||||||
|  |        | ||||||
|       script |       File.basename(script) | ||||||
|     else |     else | ||||||
|       nil |       nil | ||||||
|     end |     end | ||||||
|   | |||||||
| @@ -1,2 +0,0 @@ | |||||||
| #!/usr/bin/env python |  | ||||||
| puts "Not Python" |  | ||||||
| @@ -31,23 +31,29 @@ class TestSamples < Test::Unit::TestCase | |||||||
|     assert_equal data['languages_total'], data['languages'].inject(0) { |n, (_, c)| n += c } |     assert_equal data['languages_total'], data['languages'].inject(0) { |n, (_, c)| n += c } | ||||||
|     assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c } |     assert_equal data['tokens_total'], data['language_tokens'].inject(0) { |n, (_, c)| n += c } | ||||||
|     assert_equal data['tokens_total'], data['tokens'].inject(0) { |n, (_, ts)| n += ts.inject(0) { |m, (_, c)| m += c } } |     assert_equal data['tokens_total'], data['tokens'].inject(0) { |n, (_, ts)| n += ts.inject(0) { |m, (_, c)| m += c } } | ||||||
|  |     assert !data["interpreters"].empty? | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   # Check that there aren't samples with extensions that aren't explicitly defined in languages.yml |   # Check that there aren't samples with extensions or interpreters that | ||||||
|   def test_parity |   # aren't explicitly defined in languages.yml | ||||||
|     extensions = Samples.cache['extnames'] |   languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__) | ||||||
|     languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__) |   YAML.load_file(languages_yml).each do |name, options| | ||||||
|     languages = YAML.load_file(languages_yml) |     define_method "test_samples_have_parity_with_languages_yml_for_#{name}" do | ||||||
|  |  | ||||||
|     languages.each do |name, options| |  | ||||||
|       options['extensions'] ||= [] |       options['extensions'] ||= [] | ||||||
|  |       if extnames = Samples.cache['extnames'][name] | ||||||
|       if extnames = extensions[name] |  | ||||||
|         extnames.each do |extname| |         extnames.each do |extname| | ||||||
|           next if extname == '.script!' |           next if extname == '.script!' | ||||||
|           assert options['extensions'].include?(extname), "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" |           assert options['extensions'].include?(extname), "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|  |  | ||||||
|  |       options['interpreters'] ||= [] | ||||||
|  |       if interpreters = Samples.cache['interpreters'][name] | ||||||
|  |         interpreters.each do |interpreter| | ||||||
|  |           # next if extname == '.script!' | ||||||
|  |           assert options['interpreters'].include?(interpreter), "#{name} has a sample with an interpreter (#{interpreter}) that isn't explicitly defined in languages.yml" | ||||||
|  |         end | ||||||
|  |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -76,4 +82,9 @@ class TestSamples < Test::Unit::TestCase | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   def test_shebang | ||||||
|  |     assert_equal "crystal", Linguist.interpreter_from_shebang("#!/usr/bin/env bin/crystal") | ||||||
|  |     assert_equal "python2", Linguist.interpreter_from_shebang("#!/usr/bin/python2.4") | ||||||
|  |   end | ||||||
| end | end | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user