From 8a42f76f03717c17eddc8527cc4286f81101fed0 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 28 Nov 2014 16:49:40 -0600 Subject: [PATCH] Remove .script! hack --- lib/linguist/language.rb | 2 +- lib/linguist/samples.rb | 7 ++----- lib/linguist/strategy/filename.rb | 12 +---------- .../Erlang/{factorial.script! => factorial} | 0 samples/Erlang/{release.script! => release} | 0 samples/Groovy/build.script! | 17 ---------------- samples/Groovy/{groovy.script! => groovy} | 0 samples/JavaScript/{js.script! => js} | 0 samples/JavaScript/{js2.script! => js2} | 0 .../Makefile/{makefile.script! => makefile} | 0 samples/Nu/{nu.script! => nu} | 0 samples/PHP/{drupal.script! => drupal.module} | 0 samples/PHP/{php.script! => php} | 0 .../PHP/{php-script.script! => php-script} | 0 samples/PHP/{php2.script! => php2} | 0 samples/Perl/{perl.script! => perl} | 0 .../{dleak-report.script! => dleak-report} | 0 samples/Python/{python.script! => python} | 0 samples/Python/{python2.script! => python2} | 0 samples/Python/{python3.script! => python3} | 0 samples/QMake/{qmake.script! => qmake} | 0 .../{git-punchcard.script! => git-punchcard} | 0 samples/Ruby/{macruby.script! => macruby} | 0 samples/Ruby/{ruby.script! => ruby} | 0 samples/Ruby/{ruby2.script! => ruby2} | 0 ...les-of-beer.script! => 99-bottles-of-beer} | 0 samples/Scala/{scala.script! => scala} | 0 ...les-of-beer.script! => 99-bottles-of-beer} | 0 samples/Shell/{bash.script! => bash} | 0 samples/Shell/{plugin.script! => plugin} | 0 samples/Shell/{sbt.script! => sbt} | 0 samples/Shell/{sh.script! => sh} | 0 ...tring-chopping.script! => string-chopping} | 0 samples/Shell/{zsh.script! => zsh} | 0 test/test_samples.rb | 13 +++++++++--- test/test_tokenizer.rb | 20 +++++++++---------- 36 files changed, 24 insertions(+), 47 deletions(-) rename samples/Erlang/{factorial.script! => factorial} (100%) rename samples/Erlang/{release.script! => release} (100%) delete mode 100644 samples/Groovy/build.script! rename samples/Groovy/{groovy.script! => groovy} (100%) rename samples/JavaScript/{js.script! => js} (100%) rename samples/JavaScript/{js2.script! => js2} (100%) rename samples/Makefile/{makefile.script! => makefile} (100%) rename samples/Nu/{nu.script! => nu} (100%) rename samples/PHP/{drupal.script! => drupal.module} (100%) rename samples/PHP/{php.script! => php} (100%) rename samples/PHP/{php-script.script! => php-script} (100%) rename samples/PHP/{php2.script! => php2} (100%) rename samples/Perl/{perl.script! => perl} (100%) rename samples/Prolog/{dleak-report.script! => dleak-report} (100%) rename samples/Python/{python.script! => python} (100%) rename samples/Python/{python2.script! => python2} (100%) rename samples/Python/{python3.script! => python3} (100%) rename samples/QMake/{qmake.script! => qmake} (100%) rename samples/R/{git-punchcard.script! => git-punchcard} (100%) rename samples/Ruby/{macruby.script! => macruby} (100%) rename samples/Ruby/{ruby.script! => ruby} (100%) rename samples/Ruby/{ruby2.script! => ruby2} (100%) rename samples/Scala/{99-bottles-of-beer.script! => 99-bottles-of-beer} (100%) rename samples/Scala/{scala.script! => scala} (100%) rename samples/Shell/{99-bottles-of-beer.script! => 99-bottles-of-beer} (100%) rename samples/Shell/{bash.script! => bash} (100%) rename samples/Shell/{plugin.script! => plugin} (100%) rename samples/Shell/{sbt.script! => sbt} (100%) rename samples/Shell/{sh.script! => sh} (100%) rename samples/Shell/{string-chopping.script! => string-chopping} (100%) rename samples/Shell/{zsh.script! => zsh} (100%) diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index da02b110..d2d44466 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -541,7 +541,7 @@ module Linguist if extnames = extensions[name] extnames.each do |extname| if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase } - warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" unless extname == '.script!' + warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" options['extensions'] << extname end end diff --git a/lib/linguist/samples.rb b/lib/linguist/samples.rb index efcba365..a7ecd1bd 100644 --- a/lib/linguist/samples.rb +++ b/lib/linguist/samples.rb @@ -50,16 +50,13 @@ module Linguist end else path = File.join(dirname, filename) - - if File.extname(filename) == "" - raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir" - end + extname = File.extname(filename) yield({ :path => path, :language => category, :interpreter => Shebang.interpreter(File.read(path)), - :extname => File.extname(filename) + :extname => extname.empty? ? nil : extname }) end end diff --git a/lib/linguist/strategy/filename.rb b/lib/linguist/strategy/filename.rb index e682863b..b8c819eb 100644 --- a/lib/linguist/strategy/filename.rb +++ b/lib/linguist/strategy/filename.rb @@ -3,17 +3,7 @@ module Linguist # Detects language based on filename and/or extension class Filename def self.call(blob, _) - name = blob.name.to_s - - # A bit of an elegant hack. If the file is executable but extensionless, - # append a "magic" extension so it can be classified with other - # languages that have shebang scripts. - extensions = FileBlob.new(name).extensions - if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 - name += ".script!" - end - - Language.find_by_filename(name) + Language.find_by_filename(blob.name.to_s) end end end diff --git a/samples/Erlang/factorial.script! b/samples/Erlang/factorial similarity index 100% rename from samples/Erlang/factorial.script! rename to samples/Erlang/factorial diff --git a/samples/Erlang/release.script! b/samples/Erlang/release similarity index 100% rename from samples/Erlang/release.script! rename to samples/Erlang/release diff --git a/samples/Groovy/build.script! b/samples/Groovy/build.script! deleted file mode 100644 index c1ac812c..00000000 --- a/samples/Groovy/build.script! +++ /dev/null @@ -1,17 +0,0 @@ -task echoDirListViaAntBuilder() { - description = 'Uses the built-in AntBuilder instance to echo and list files' - //Docs: http://ant.apache.org/manual/Types/fileset.html - - //Echo the Gradle project name via the ant echo plugin - ant.echo(message: project.name) - ant.echo(path) - ant.echo("${projectDir}/samples") - - //Gather list of files in a subdirectory - ant.fileScanner{ - fileset(dir:"samples") - }.each{ - //Print each file to screen with the CWD (projectDir) path removed. - println it.toString() - "${projectDir}" - } -} diff --git a/samples/Groovy/groovy.script! b/samples/Groovy/groovy similarity index 100% rename from samples/Groovy/groovy.script! rename to samples/Groovy/groovy diff --git a/samples/JavaScript/js.script! b/samples/JavaScript/js similarity index 100% rename from samples/JavaScript/js.script! rename to samples/JavaScript/js diff --git a/samples/JavaScript/js2.script! b/samples/JavaScript/js2 similarity index 100% rename from samples/JavaScript/js2.script! rename to samples/JavaScript/js2 diff --git a/samples/Makefile/makefile.script! b/samples/Makefile/makefile similarity index 100% rename from samples/Makefile/makefile.script! rename to samples/Makefile/makefile diff --git a/samples/Nu/nu.script! b/samples/Nu/nu similarity index 100% rename from samples/Nu/nu.script! rename to samples/Nu/nu diff --git a/samples/PHP/drupal.script! b/samples/PHP/drupal.module similarity index 100% rename from samples/PHP/drupal.script! rename to samples/PHP/drupal.module diff --git a/samples/PHP/php.script! b/samples/PHP/php similarity index 100% rename from samples/PHP/php.script! rename to samples/PHP/php diff --git a/samples/PHP/php-script.script! b/samples/PHP/php-script similarity index 100% rename from samples/PHP/php-script.script! rename to samples/PHP/php-script diff --git a/samples/PHP/php2.script! b/samples/PHP/php2 similarity index 100% rename from samples/PHP/php2.script! rename to samples/PHP/php2 diff --git a/samples/Perl/perl.script! b/samples/Perl/perl similarity index 100% rename from samples/Perl/perl.script! rename to samples/Perl/perl diff --git a/samples/Prolog/dleak-report.script! b/samples/Prolog/dleak-report similarity index 100% rename from samples/Prolog/dleak-report.script! rename to samples/Prolog/dleak-report diff --git a/samples/Python/python.script! b/samples/Python/python similarity index 100% rename from samples/Python/python.script! rename to samples/Python/python diff --git a/samples/Python/python2.script! b/samples/Python/python2 similarity index 100% rename from samples/Python/python2.script! rename to samples/Python/python2 diff --git a/samples/Python/python3.script! b/samples/Python/python3 similarity index 100% rename from samples/Python/python3.script! rename to samples/Python/python3 diff --git a/samples/QMake/qmake.script! b/samples/QMake/qmake similarity index 100% rename from samples/QMake/qmake.script! rename to samples/QMake/qmake diff --git a/samples/R/git-punchcard.script! b/samples/R/git-punchcard similarity index 100% rename from samples/R/git-punchcard.script! rename to samples/R/git-punchcard diff --git a/samples/Ruby/macruby.script! b/samples/Ruby/macruby similarity index 100% rename from samples/Ruby/macruby.script! rename to samples/Ruby/macruby diff --git a/samples/Ruby/ruby.script! b/samples/Ruby/ruby similarity index 100% rename from samples/Ruby/ruby.script! rename to samples/Ruby/ruby diff --git a/samples/Ruby/ruby2.script! b/samples/Ruby/ruby2 similarity index 100% rename from samples/Ruby/ruby2.script! rename to samples/Ruby/ruby2 diff --git a/samples/Scala/99-bottles-of-beer.script! b/samples/Scala/99-bottles-of-beer similarity index 100% rename from samples/Scala/99-bottles-of-beer.script! rename to samples/Scala/99-bottles-of-beer diff --git a/samples/Scala/scala.script! b/samples/Scala/scala similarity index 100% rename from samples/Scala/scala.script! rename to samples/Scala/scala diff --git a/samples/Shell/99-bottles-of-beer.script! b/samples/Shell/99-bottles-of-beer similarity index 100% rename from samples/Shell/99-bottles-of-beer.script! rename to samples/Shell/99-bottles-of-beer diff --git a/samples/Shell/bash.script! b/samples/Shell/bash similarity index 100% rename from samples/Shell/bash.script! rename to samples/Shell/bash diff --git a/samples/Shell/plugin.script! b/samples/Shell/plugin similarity index 100% rename from samples/Shell/plugin.script! rename to samples/Shell/plugin diff --git a/samples/Shell/sbt.script! b/samples/Shell/sbt similarity index 100% rename from samples/Shell/sbt.script! rename to samples/Shell/sbt diff --git a/samples/Shell/sh.script! b/samples/Shell/sh similarity index 100% rename from samples/Shell/sh.script! rename to samples/Shell/sh diff --git a/samples/Shell/string-chopping.script! b/samples/Shell/string-chopping similarity index 100% rename from samples/Shell/string-chopping.script! rename to samples/Shell/string-chopping diff --git a/samples/Shell/zsh.script! b/samples/Shell/zsh similarity index 100% rename from samples/Shell/zsh.script! rename to samples/Shell/zsh diff --git a/test/test_samples.rb b/test/test_samples.rb index 6de1c7e9..dc3524c2 100644 --- a/test/test_samples.rb +++ b/test/test_samples.rb @@ -34,6 +34,14 @@ class TestSamples < Minitest::Test assert !data["interpreters"].empty? end + def test_ext_or_shebang + Samples.each do |sample| + if sample[:extname].to_s.empty? && !sample[:filename] + assert sample[:interpreter], "#{sample[:path]} should have a file extension or a shebang, maybe it belongs in filenames/ subdir" + end + end + end + # Check that there aren't samples with extensions or interpreters that # aren't explicitly defined in languages.yml languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__) @@ -42,7 +50,6 @@ class TestSamples < Minitest::Test options['extensions'] ||= [] if extnames = Samples.cache['extnames'][name] extnames.each do |extname| - next if extname == '.script!' assert options['extensions'].index { |x| x.downcase.end_with? extname.downcase }, "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" end end @@ -50,8 +57,8 @@ class TestSamples < Minitest::Test 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" + assert options['interpreters'].include?(interpreter), + "#{name} has a sample with an interpreter (#{interpreter}) that isn't explicitly defined in languages.yml" end end end diff --git a/test/test_tokenizer.rb b/test/test_tokenizer.rb index 8d7da0c0..75f854a9 100644 --- a/test/test_tokenizer.rb +++ b/test/test_tokenizer.rb @@ -84,16 +84,16 @@ class TestTokenizer < Minitest::Test end def test_shebang - assert_equal "SHEBANG#!sh", tokenize(:"Shell/sh.script!")[0] - assert_equal "SHEBANG#!bash", tokenize(:"Shell/bash.script!")[0] - assert_equal "SHEBANG#!zsh", tokenize(:"Shell/zsh.script!")[0] - assert_equal "SHEBANG#!perl", tokenize(:"Perl/perl.script!")[0] - assert_equal "SHEBANG#!python", tokenize(:"Python/python.script!")[0] - assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby.script!")[0] - assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby2.script!")[0] - assert_equal "SHEBANG#!node", tokenize(:"JavaScript/js.script!")[0] - assert_equal "SHEBANG#!php", tokenize(:"PHP/php.script!")[0] - assert_equal "SHEBANG#!escript", tokenize(:"Erlang/factorial.script!")[0] + assert_equal "SHEBANG#!sh", tokenize(:"Shell/sh")[0] + assert_equal "SHEBANG#!bash", tokenize(:"Shell/bash")[0] + assert_equal "SHEBANG#!zsh", tokenize(:"Shell/zsh")[0] + assert_equal "SHEBANG#!perl", tokenize(:"Perl/perl")[0] + assert_equal "SHEBANG#!python", tokenize(:"Python/python")[0] + assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby")[0] + assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby2")[0] + assert_equal "SHEBANG#!node", tokenize(:"JavaScript/js")[0] + assert_equal "SHEBANG#!php", tokenize(:"PHP/php")[0] + assert_equal "SHEBANG#!escript", tokenize(:"Erlang/factorial")[0] assert_equal "echo", tokenize(:"Shell/invalid-shebang.sh")[0] end