From 255f7fa6a966c3cc8a080d6eefe71fa39aac713b Mon Sep 17 00:00:00 2001 From: David Harsha Date: Thu, 6 Sep 2018 00:11:40 -0700 Subject: [PATCH 1/2] Allow overriding BUNDLE_GEMFILE in jars --- lib/warbler/templates/jar.erb | 2 +- spec/warbler/bundler_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/warbler/templates/jar.erb b/lib/warbler/templates/jar.erb index 5bc33849..a931210b 100644 --- a/lib/warbler/templates/jar.erb +++ b/lib/warbler/templates/jar.erb @@ -7,5 +7,5 @@ ENV['GEM_HOME'] <%= config.override_gem_home ? '=' : '||=' %> File.expand_path(F ENV['GEM_PATH'] = nil # RGs sets Gem.paths.path = Gem.default_path + [ GEM_HOME ] <% end -%> <% if config.bundler && config.bundler[:gemfile_path] -%> -ENV['BUNDLE_GEMFILE'] = File.expand_path(File.join('..', '..', '<%= config.bundler[:gemfile_path] %>'), __FILE__) +ENV['BUNDLE_GEMFILE'] ||= File.expand_path(File.join('..', '..', '<%= config.bundler[:gemfile_path] %>'), __FILE__) <% end -%> diff --git a/spec/warbler/bundler_spec.rb b/spec/warbler/bundler_spec.rb index 68b55517..466e9180 100644 --- a/spec/warbler/bundler_spec.rb +++ b/spec/warbler/bundler_spec.rb @@ -160,7 +160,7 @@ def bundle_install(*args) file_list(%r{^bundler/gems/tester[^/]*/tester.gemspec}).should_not be_empty jar.add_init_file(config) contents = jar.contents('META-INF/init.rb') - contents.should =~ /ENV\['BUNDLE_GEMFILE'\] = File.expand_path(.*, __FILE__)/ + contents.should =~ /ENV\['BUNDLE_GEMFILE'\] ||= File.expand_path(.*, __FILE__)/ end end @@ -168,7 +168,7 @@ def bundle_install(*args) File.open("Gemfile", "w") {|f| f << "source 'http://rubygems.org/'" } jar.add_init_file(config) contents = jar.contents('META-INF/init.rb') - contents.should =~ /ENV\['BUNDLE_GEMFILE'\] = File.expand_path(.*, __FILE__)/ + contents.should =~ /ENV\['BUNDLE_GEMFILE'\] ||= File.expand_path(.*, __FILE__)/ end end From 89769cc30a889dd24e78aa2739289ddfd389bcd2 Mon Sep 17 00:00:00 2001 From: David Harsha Date: Thu, 6 Sep 2018 01:47:28 -0700 Subject: [PATCH 2/2] Stop hard-coding BUNDLE_GEMFILE when running wars --- ext/WarMain.java | 29 +- lib/warbler/templates/war.erb | 13 +- spec/sample_bundler/Special-Gemfile | 3 + spec/sample_bundler/Special-Gemfile.lock | 13 + .../vendor/bundle/jruby/2.3.0/bin/rake | 5 + .../bundle/jruby/2.3.0/cache/rake-12.3.1.gem | Bin 0 -> 84992 bytes .../jruby/2.3.0/gems/rake-12.3.1/.gitignore | 14 + .../2.3.0/gems/rake-12.3.1/CONTRIBUTING.rdoc | 36 + .../jruby/2.3.0/gems/rake-12.3.1/Gemfile | 3 + .../jruby/2.3.0/gems/rake-12.3.1/History.rdoc | 2317 +++++++++++++++++ .../jruby/2.3.0/gems/rake-12.3.1/MIT-LICENSE | 21 + .../jruby/2.3.0/gems/rake-12.3.1/README.rdoc | 156 ++ .../jruby/2.3.0/gems/rake-12.3.1/Rakefile | 41 + .../jruby/2.3.0/gems/rake-12.3.1/bin/console | 7 + .../jruby/2.3.0/gems/rake-12.3.1/bin/setup | 6 + .../jruby/2.3.0/gems/rake-12.3.1/exe/rake | 27 + .../jruby/2.3.0/gems/rake-12.3.1/lib/rake.rb | 71 + .../gems/rake-12.3.1/lib/rake/application.rb | 824 ++++++ .../gems/rake-12.3.1/lib/rake/backtrace.rb | 24 + .../2.3.0/gems/rake-12.3.1/lib/rake/clean.rb | 78 + .../gems/rake-12.3.1/lib/rake/cloneable.rb | 17 + .../gems/rake-12.3.1/lib/rake/cpu_counter.rb | 107 + .../rake-12.3.1/lib/rake/default_loader.rb | 15 + .../rake-12.3.1/lib/rake/dsl_definition.rb | 195 ++ .../gems/rake-12.3.1/lib/rake/early_time.rb | 22 + .../gems/rake-12.3.1/lib/rake/ext/core.rb | 26 + .../gems/rake-12.3.1/lib/rake/ext/string.rb | 176 ++ .../lib/rake/file_creation_task.rb | 25 + .../gems/rake-12.3.1/lib/rake/file_list.rb | 435 ++++ .../gems/rake-12.3.1/lib/rake/file_task.rb | 54 + .../gems/rake-12.3.1/lib/rake/file_utils.rb | 137 + .../rake-12.3.1/lib/rake/file_utils_ext.rb | 145 ++ .../rake-12.3.1/lib/rake/invocation_chain.rb | 57 + .../lib/rake/invocation_exception_mixin.rb | 17 + .../gems/rake-12.3.1/lib/rake/late_time.rb | 18 + .../gems/rake-12.3.1/lib/rake/linked_list.rb | 112 + .../rake-12.3.1/lib/rake/loaders/makefile.rb | 54 + .../gems/rake-12.3.1/lib/rake/multi_task.rb | 14 + .../gems/rake-12.3.1/lib/rake/name_space.rb | 38 + .../gems/rake-12.3.1/lib/rake/packagetask.rb | 211 ++ .../2.3.0/gems/rake-12.3.1/lib/rake/phony.rb | 16 + .../rake-12.3.1/lib/rake/private_reader.rb | 21 + .../gems/rake-12.3.1/lib/rake/promise.rb | 100 + .../rake-12.3.1/lib/rake/pseudo_status.rb | 30 + .../gems/rake-12.3.1/lib/rake/rake_module.rb | 67 + .../rake-12.3.1/lib/rake/rake_test_loader.rb | 27 + .../lib/rake/rule_recursion_overflow_error.rb | 20 + .../2.3.0/gems/rake-12.3.1/lib/rake/scope.rb | 43 + .../2.3.0/gems/rake-12.3.1/lib/rake/task.rb | 411 +++ .../lib/rake/task_argument_error.rb | 8 + .../rake-12.3.1/lib/rake/task_arguments.rb | 109 + .../gems/rake-12.3.1/lib/rake/task_manager.rb | 323 +++ .../gems/rake-12.3.1/lib/rake/tasklib.rb | 12 + .../gems/rake-12.3.1/lib/rake/testtask.rb | 224 ++ .../lib/rake/thread_history_display.rb | 49 + .../gems/rake-12.3.1/lib/rake/thread_pool.rb | 163 ++ .../gems/rake-12.3.1/lib/rake/trace_output.rb | 23 + .../gems/rake-12.3.1/lib/rake/version.rb | 10 + .../2.3.0/gems/rake-12.3.1/lib/rake/win32.rb | 51 + .../jruby/2.3.0/gems/rake-12.3.1/rake.gemspec | 42 + .../2.3.0/specifications/rake-12.3.1.gemspec | 49 + spec/warbler/bundler_spec.rb | 21 +- 62 files changed, 7344 insertions(+), 38 deletions(-) create mode 100644 spec/sample_bundler/Special-Gemfile create mode 100644 spec/sample_bundler/Special-Gemfile.lock create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/cache/rake-12.3.1.gem create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/.gitignore create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/CONTRIBUTING.rdoc create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/Gemfile create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/History.rdoc create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/MIT-LICENSE create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/README.rdoc create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/Rakefile create mode 100755 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/console create mode 100755 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/setup create mode 100755 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/exe/rake create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/application.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/backtrace.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/clean.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cloneable.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cpu_counter.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/default_loader.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/dsl_definition.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/early_time.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/core.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/string.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_creation_task.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_list.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_task.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils_ext.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_chain.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_exception_mixin.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/late_time.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/linked_list.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/loaders/makefile.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/multi_task.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/name_space.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/packagetask.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/phony.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/private_reader.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/promise.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/pseudo_status.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_module.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_test_loader.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rule_recursion_overflow_error.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/scope.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_argument_error.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_arguments.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_manager.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/tasklib.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/testtask.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_history_display.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_pool.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/trace_output.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/version.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/win32.rb create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/rake.gemspec create mode 100644 spec/sample_bundler/vendor/bundle/jruby/2.3.0/specifications/rake-12.3.1.gemspec diff --git a/ext/WarMain.java b/ext/WarMain.java index 6832e789..fdb55915 100644 --- a/ext/WarMain.java +++ b/ext/WarMain.java @@ -241,7 +241,7 @@ protected int launchJRuby(final URL[] jars) throws Exception { invokeMethod(rubyInstanceConfig, "setUpdateNativeENVEnabled", new Class[] { Boolean.TYPE }, false); - final CharSequence execScriptEnvPre = executableScriptEnvPrefix(); + final CharSequence execScriptEnvPre = "require File.expand_path('META-INF/init.rb')"; final String executablePath = locateExecutable(scriptingContainer, execScriptEnvPre); if ( executablePath == null ) { @@ -267,21 +267,6 @@ protected int launchJRuby(final URL[] jars) throws Exception { return ( outcome instanceof Number ) ? ( (Number) outcome ).intValue() : 0; } - @Deprecated - protected String locateExecutable(final Object scriptingContainer) throws Exception { - if ( executable == null ) { - throw new IllegalStateException("no executable"); - } - final File exec = new File(extractRoot, executable); - if ( exec.exists() ) { - return exec.getAbsolutePath(); - } - else { - final String script = locateExecutableScript(executable, executableScriptEnvPrefix()); - return (String) invokeMethod(scriptingContainer, "runScriptlet", script); - } - } - protected String locateExecutable(final Object scriptingContainer, final CharSequence envPreScript) throws Exception { if ( executable == null ) { @@ -297,18 +282,6 @@ protected String locateExecutable(final Object scriptingContainer, final CharSeq } } - protected CharSequence executableScriptEnvPrefix() { - final String gemsDir = new File(extractRoot, "gems").getAbsolutePath(); - final String gemfile = new File(extractRoot, "Gemfile").getAbsolutePath(); - debug("setting GEM_HOME to " + gemsDir); - debug("... and BUNDLE_GEMFILE to " + gemfile); - - // ideally this would look up the config.override_gem_home setting - return "ENV['GEM_HOME'] = ENV['GEM_PATH'] = '"+ gemsDir +"' \n" + - "ENV['BUNDLE_GEMFILE'] ||= '"+ gemfile +"' \n" + - "require 'uri:classloader:/META-INF/init.rb'"; - } - protected String locateExecutableScript(final String executable, final CharSequence envPreScript) { return ( envPreScript == null ? "" : envPreScript + " \n" ) + "begin\n" + // locate the executable within gemspecs : diff --git a/lib/warbler/templates/war.erb b/lib/warbler/templates/war.erb index 6f141f6d..7457dd14 100644 --- a/lib/warbler/templates/war.erb +++ b/lib/warbler/templates/war.erb @@ -1,15 +1,12 @@ +<% gem_operator = config.override_gem_home ? '=' : '||=' %> if $servlet_context.nil? - ENV['GEM_HOME'] <%= config.override_gem_home ? '=' : '||=' %> File.expand_path(File.join('..', '..', '<%= config.gem_path %>'), __FILE__) -<% if config.override_gem_home -%> -<% # GEM_HOME/GEM_PATH are set as .war gets extracted (on java -jar ...) - # ... thus setting `ENV['GEM_PATH'] = nil` would cause a boot failure --%> -<% end -%> + ENV['GEM_HOME'] <%= gem_operator %> File.expand_path(File.join('..', '..', '<%= config.gem_path %>'), __FILE__).sub('/WEB-INF/', '/') + ENV['GEM_PATH'] <%= gem_operator %> ENV['GEM_HOME'] <% if config.bundler && config.bundler[:gemfile_path] -%> - ENV['BUNDLE_GEMFILE'] ||= File.expand_path(File.join('..', '..', '<%= config.bundler[:gemfile_path] %>'), __FILE__) + ENV['BUNDLE_GEMFILE'] ||= File.expand_path(File.join('..', '..', '<%= config.bundler[:gemfile_path] %>'), __FILE__).sub('/WEB-INF/', '/') <% end -%> else - ENV['GEM_HOME'] <%= config.override_gem_home ? '=' : '||=' %> $servlet_context.getRealPath('<%= config.gem_path %>') + ENV['GEM_HOME'] <%= gem_operator %> $servlet_context.getRealPath('<%= config.gem_path %>') <% if config.override_gem_home -%> ENV['GEM_PATH'] = nil <% end -%> diff --git a/spec/sample_bundler/Special-Gemfile b/spec/sample_bundler/Special-Gemfile new file mode 100644 index 00000000..0847a0a2 --- /dev/null +++ b/spec/sample_bundler/Special-Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem 'rake', '12.3.1' diff --git a/spec/sample_bundler/Special-Gemfile.lock b/spec/sample_bundler/Special-Gemfile.lock new file mode 100644 index 00000000..afa0f58d --- /dev/null +++ b/spec/sample_bundler/Special-Gemfile.lock @@ -0,0 +1,13 @@ +GEM + remote: https://rubygems.org/ + specs: + rake (12.3.1) + +PLATFORMS + java + +DEPENDENCIES + rake (= 12.3.1) + +BUNDLED WITH + 1.16.4 diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/bin/rake b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/bin/rake index e5a537e5..bb5b395d 100755 --- a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/bin/rake +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/bin/rake @@ -19,4 +19,9 @@ if ARGV.first end end +if Gem.respond_to?(:activate_bin_path) load Gem.activate_bin_path('rake', 'rake', version) +else +gem "rake", version +load Gem.bin_path("rake", "rake", version) +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/cache/rake-12.3.1.gem b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/cache/rake-12.3.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..ea34ea6f311e660c26d9d8ea359586ada824df72 GIT binary patch literal 84992 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 v1.2.0 which has a breaking change on formatters. + Pull request #262 by FUJI Goro. + +==== Enhancements: + +* Don't run task if it depends on already invoked but failed task. + Pull request #252 by Gonzalo Rodriguez. +* Make space trimming consistent for all task arguments. + Pull request #259 by Gonzalo Rodriguez. +* Removes duplicated inclusion of Rake::DSL in tests. + Pull request #254 by Gonzalo Rodriguez. +* Re-raise a LoadError that didn't come from require in the test loader. + Pull request #250 by Dylan Thacker-Smith. + +=== 12.3.0 + +==== Compatibility Changes + +* Bump `required_ruby_version` to Ruby 2.0.0. Rake has already + removed support for Ruby 1.9.x. + +==== Enhancements: + +* Support `test-bundled-gems` task on ruby core. + +=== 12.2.1 + +==== Bug fixes + +* Fixed to break Capistrano::Application on capistrano3. + +=== 12.2.0 + +==== Enhancements: + +* Make rake easier to use as a library + Pull request #211 by @drbrain +* Fix quadratic performance in FileTask#out_of_date? + Pull request #224 by @doudou +* Clarify output when printing nested exception traces + Pull request #232 by @urbanautomaton + +==== Bug fixes + +* Account for a file that match 2 or more patterns. + Pull request #231 by @styd + +=== 12.1.0 + +==== Enhancements: + +* Added did_you_mean feature for invalid rake task. + Pull request #221 by @xtina-starr +* Enabled to dependency chained by extensions. Pull request #39 by Petr Skocik. +* Make all of string literals to frozen objects on Ruby 2.4 or later. + +==== Bug fixes + +* Typo fixes in rakefile.rdoc. Pull request #180 by Yuta Kurotaki. +* Fix unexpected behavior of file task with dryrun option. + Pull request #183 by @aycabta. +* Make LoadError from running tests more obvious. Pull request #195 + by Eric Hodel. +* Fix unexpected TypeError with hash style option. Pull request #202 + by Kuniaki IGARASHI. + +=== 12.0.0 + +==== Compatibility Changes + +* Removed arguments on clear #157 by Jesse Bowes +* Removed `rake/contrib` packages. These are extracted to `rake-contrib` gem. +* Removed deprecated method named `last\_comment`. + +==== Enhancements: + +* Re-use trace option on `cleanup` task. #164 by Brian Henderson +* Actions adore keyword arguments #174 by Josh Cheek +* Rake::TaskArguments#key? alias of #has_key? #175 by Paul Annesley + +=== 11.3.0 / 2016-09-20 + +==== Enhancements: + +* Remove to reference `Fixnum` constant. Pull request #160 by nobu + +=== 11.2.2 / 2016-06-12 + +==== Bug fixes + +* Fix unexpected behavior with multiple dependencies on Rake::TestTask + +=== 11.2.1 / 2016-06-12 + +==== Bug fixes + +* Fix regression of dependencies handling on Rake::TestTask. Report #139 + +=== 11.2.0 / 2016-06-11 + +==== Bug fixes + +* Fix unexpected cut-out behavior on task description using triple dots + and exclamation. Report #106 from Stephan Kämper and Pull request #134 by Lee +* Fix empty argument assignment with `with_defaults` option. Pull request #135 + by bakunyo +* Ignore to use `hwprefs` on Darwin platform. Use sysctl now. Report #128 + +==== Enhancements + +* Spawn options for sh Pull equest #138 by Eric Hodel. +* Allow to specify dependencies(prerequisites) for Rake::TestTask + Pull request #117 by Tim Maslyuchenko +* Use Bundler task instead of hoe for gem release. +* Remove explicitly load to rubygems for Ruby 1.8. +* Unify to declare `Rake::VERSION`. +* Support xz format for PackageTask. + +=== 11.1.2 / 2016-03-28 + +==== Bug fixes + +* Remove `-W` option when Rake::TestTask#verbose enabled. It's misunderstanding + specification change with Rake 11. Partly revert #67 + +=== 11.1.1 / 2016-03-14 + +==== Bug fixes + +* Use `-W` instead of `--verbose` when Rake::TestTask#verbose enabled. + JRuby doesn't have `--verbose` option. + +=== 11.1.0 / 2016-03-11 + +==== Compatibility Changes + +* Revert to remove `last\_comment`. It will remove Rake 12. + +=== 11.0.1 / 2016-03-09 + +==== Bug fixes + +* Fixed packaging manifest. + +=== 11.0.0 / 2016-03-09 + +==== Bug fixes + +* Correctly handle bad encoding in exception messages. Pull request #113 + by Tomer Brisker +* Fix verbose option at TestTask. Pull request #67 by Mike Blumtritt + +==== Enhancements + +* Make FileList#exclude more analogous to FileList#include. +* Use IO.open instead of Open3.popen3 for CPU counter. +* Make Rake::Task#already_invoked publicly accessible. + Pull request #93 by Joe Rafaniello +* Lookup prerequisites with same name outside of scope instead of + matching self. Pull request #96 by Sandy Vanderbleek +* Make FileList#pathmap behave like String#pathmap. + Pull request #61 by Daniel Tamai +* Add fetch method to task arguments. + Pull request #12 by Chris Keathley +* Use ruby warnings by default. Pull request #97 by Harold Giménez + +==== Compatibility Changes + +* Removed to support Ruby 1.8.x +* Removed constant named `RAKEVERSION` +* Removed Rake::AltSystem +* Removed Rake::RubyForgePublisher +* Removed Rake::TaskManager#last\_comment. Use last\_description. +* Removed Rake::TaskLib#paste +* Removed Top-level SshDirPublisher, SshFreshDirPublisher, SshFilePublisher + and CompositePublisher from lib/rake/contrib/publisher.rb +* Removed "rake/runtest.rb" + +=== 10.5.0 / 2016-01-13 + +==== Enhancements + +* Removed monkey patching for Ruby 1.8. Pull request #46 by Pablo Herrero. +* Inheritance class of Rake::FileList returns always self class. + Pull request #74 by Thomas Scholz + +=== 10.4.2 / 2014-12-02 + +==== Bug fixes + +* Rake no longer edits ARGV. This allows you to re-exec rake from a rake + task. Pull requset #9 by Matt Palmer. +* Documented how Rake::DSL#desc handles sentences in task descriptions. + Issue #7 by Raza Sayed. +* Fixed test error on 1.9.3 with legacy RubyGems. Issue #8 by Matt Palmer. +* Deleted duplicated History entry. Pull request #10 by Yuji Yamamoto. + +=== 10.4.1 / 2014-12-01 + +==== Bug fixes + +* Reverted fix for #277 as it caused numerous issues for rake users. + rails/spring issue #366 by Gustavo Dutra. + +=== 10.4.0 / 2014-11-22 + +==== Enhancements + +* Upgraded to minitest 5. Pull request #292 by Teo Ljungberg. +* Added support for Pathname in rake tasks. Pull request #271 by Randy + Coulman. +* Rake now ignores falsy dependencies which allows for easier programmatic + creation of tasks. Pull request #273 by Manav. +* Rake no longer edits ARGV. This allows you to re-exec rake from a rake + task. Issue #277 by Matt Palmer. +* Etc.nprocessors is used for counting the number of CPUs. + +==== Bug fixes + +* Updated rake manpage. Issue #283 by Nathan Long, pull request #291 by + skittleys. +* Add Rake::LATE to allow rebuilding of files that depend on deleted files. + Bug #286, pull request #287 by David Grayson. +* Fix relinking of files when repackaging. Bug #276 by Muenze. +* Fixed some typos. Pull request #280 by Jed Northridge. +* Try counting CPUs via cpuinfo if host_os was not matched. Pull request + #282 by Edouard B. + +=== 10.3.2 / 2014-05-15 + +==== Bug fixes + +* Rake no longer infinitely loops when showing exception causes that refer to + each other. Bug #272 by Chris Bandy. +* Fixed documentation typos. Bug #275 by Jake Worth. + +=== 10.3.1 / 2014-04-17 + +==== Bug fixes + +* Really stop reporting an error when cleaning already-deleted files. Pull + request #269 by Randy Coulman +* Fixed infinite loop when cleaning already-deleted files on windows. + +=== 10.3 / 2014-04-15 + +==== Enhancements + +* Added --build-all option to rake which treats all file prerequisites as + out-of-date. Pull request #254 by Andrew Gilbert. +* Added Rake::NameSpace#scope. Issue #263 by Jon San Miguel. + +==== Bug fixes + +* Suppress org.jruby package files in rake error messages for JRuby users. + Issue #213 by Charles Nutter. +* Fixed typo, removed extra "h". Pull request #267 by Hsing-Hui Hsu. +* Rake no longer reports an error when cleaning already-deleted files. Pull + request #266 by Randy Coulman. +* Consume stderr while determining CPU count to avoid hang. Issue #268 by + Albert Sun. + +=== 10.2.2 / 2014-03-27 + +==== Bug fixes + +* Restored Ruby 1.8.7 compatibility + +=== 10.2.1 / 2014-03-25 + +==== Bug fixes + +* File tasks including a ':' are now top-level tasks again. Issue #262 by + Josh Holtrop. +* Use sysctl for CPU count for all BSDs. Pull request #261 by Joshua Stein. +* Fixed CPU detection for unknown platforms. + +=== 10.2.0 / 2014-03-24 + +==== Enhancements + +* Rake now requires Ruby 1.9 or newer. For me, this is a breaking change, but + it seems that Jim planned to release it with Rake 10.2. See also pull + request #247 by Philip Arndt. +* Rake now allows you to declare tasks under a namespace like: + + task 'a:b' do ... end + + Pull request #232 by Judson Lester. +* Task#source defaults to the first prerequisite in non-rule tasks. Pull + request #215 by Avdi Grimm. +* Rake now automatically rebuilds and reloads imported files. Pull request + #209 by Randy Coulman. +* The rake task arguments can contain escaped commas. Pull request #214 by + Filip Hrbek. +* Rake now prints the exception class on errors. Patch #251 by David Cornu. + +==== Bug fixes + +* Fixed typos. Pull request #256 by Valera Rozuvan, #250 via Jake Worth, #260 + by Zachary Scott. +* Fixed documentation for calling tasks with arguments. Pull request #235 by + John Varghese. +* Clarified `rake -f` usage message. Pull request #252 by Marco Pfatschbacher. +* Fixed a test failure on windows. Pull request #231 by Hiroshi Shirosaki. +* Fixed corrupted rake.1.gz. Pull request #225 by Michel Boaventura. +* Fixed bug in can\_detect\_signals? in test. Patch from #243 by Alexey + Borzenkov. + +=== 10.1.1 + +* Use http://github.com/jimweirich/rake instead of http://rake.rubyforge.org for + canonical project url. + +=== 10.1.0 + +==== Changes + +===== New Features + +* Add support for variable length task argument lists. If more actual + arguments are supplied than named arguments, then the extra + arguments values will be in args.extras. + +* Application name is not displayed in the help banner. (Previously + "rake" was hardcoded, now rake-based applications can display their + own names). + +===== Bug Fixes + +Bug fixes include: + +* Fix backtrace suppression issues. + +* Rules now explicit get task arguments passed to them. + +* Rename FileList#exclude? to FileList#exclude\_from\_list? to avoid + conflict with new Rails method. + +* Clean / Clobber tasks now report failure to remove files. + +* Plus heaps of internal code cleanup. + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. +The following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Michael Nikitochkin (general code cleanup) +* Vipul A M (general code cleanup) +* Dennis Bell (variable length task argument lists) +* Jacob Swanner (rules arguments) +* Rafael Rosa Fu (documentation typo) +* Stuart Nelson (install.rb fixes) +* Lee Hambley (application name in help banner) + +-- Jim Weirich + +=== 10.0.3 + + "Jim, when will Rake reach version 1.0?" + +Over the past several years I've been asked that question at +conferences, panels and over twitter. Due to historical reasons (or +maybe just plain laziness) Rake has (incorrectly) been treating the +second digit of the version as the major release number. So in my head +Rake was already at version 9. + +Well, it's time to fix things. This next version of Rake drops old, +crufty, backwards compatibility hacks such as top level constants, DSL +methods defined in Object and numerous other features that are just no +longer desired. It's also time to drop the leading zero from the +version number as well and call this new version of rake what it +really is: Version 10. + +So, welcome to Rake 10.0! + +Rake 10 is actually feature identical to the latest version of Rake 9 +(that would be the version spelled 0.9.3), *except* that Rake 10 drops +all the sundry deprecated features that have accumulated over the years. + +If your Rakefile is up to date and current with all the new features +of Rake 10, you are ready to go. If your Rakefile still uses a few +deprecated feeatures, feel free to use Rake 9 (0.9.3) with the same +feature set. Just be aware that future features will be in Rake 10 +family line. + +==== Changes + +As mentioned above, there are no new features in Rake 10. However, +there are a number of features missing: + +* Classic namespaces are now gone. Rake is no longer able to reflect + the options settings in the global variables ($rakefile, $show\_tasks, + $show\_prereqs, $trace, $dryrun and $silent). The + --classic-namespace option is no longer supported. + +* Global constants are no longer supported. This includes + Task, FileTask, FileCreationTask and + RakeApp). The constant missing hook to warn about using + global rake constants has been removed. + +* The Rake DSL methods (task, file, directory, etc) are in their own + module (Rake::DSL). The stub versions of these methods (that printed + warnings) in Object have been removed. However, the DSL methods are + added to the top-level main object. Since main is + not in the inheritance tree, the presence of the DSL methods in main + should be low impact on other libraries. + + If you want to use the Rake DSL commands from your own code, just + include Rake::DSL into your own classes and modules. + +* The deprecated syntax for task arguments (the one using + :needs) has been removed. + +* The --reduce-compat flag has been removed (it's not needed + anymore). + +* The deprecated rake/sys.rb library has been removed. + +* The deprecated rake/rdoctask.rb library has been removed. + RDoc supplies its own rake task now. + +* The deprecated rake/gempackagetask.rb library has been + removed. Gem supplies its own package task now. + +There is one small behavioral change: + +* Non-file tasks now always report the current time as their time + stamp. This is different from the previous behavior where non-file + tasks reported current time only if there were no prerequisites, and + the max prerequisite timestamp otherwise. This lead to inconsistent + and surprising behavior when adding prerequisites to tasks that in + turn were prequisites to file tasks. The new behavior is more + consistent and predictable. + +==== Changes (from 0.9.3, 0.9.4, 0.9.5) + +Since Rake 10 includes the changes from the last version of Rake 9, +we'll repeat the changes for versions 0.9.3 through 0.9.5 here. + +===== New Features (in 0.9.3) + +* Multitask tasks now use a thread pool. Use -j to limit the number of + available threads. + +* Use -m to turn regular tasks into multitasks (use at your own risk). + +* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to + programatically add rake task libraries. + +* You can specific backtrace suppression patterns (see + --suppress-backtrace) + +* Directory tasks can now take prerequisites and actions + +* Use --backtrace to request a full backtrace without the task trace. + +* You can say "--backtrace=stdout" and "--trace=stdout" to route trace + output to standard output rather than standard error. + +* Optional 'phony' target (enable with 'require 'rake/phony'") for + special purpose builds. + +* Task#clear now clears task comments as well as actions and + prerequisites. Task#clear_comment will specifically target comments. + +* The --all option will force -T and -D to consider all the tasks, + with and without descriptions. + +===== Bug Fixes (in 0.9.3) + +* Semi-colons in windows rakefile paths now work. + +* Improved Control-C support when invoking multiple test suites. + +* egrep method now reads files in text mode (better support for + Windows) + +* Better deprecation line number reporting. + +* The -W option now works with all tasks, whether they have a + description or not. + +* File globs in rake should not be sorted alphabetically, independent + of file system and platform. + +* Numerous internal improvements. + +* Documentation typos and fixes. + +===== Bug Fixes (in 0.9.4) + +* Exit status with failing tests is not correctly set to non-zero. + +* Simplified syntax for phony task (for older versions of RDoc). + +* Stand alone FileList usage gets glob function (without loading in + extra dependencies) + +===== Bug Fixes (in 0.9.5) + +* --trace and --backtrace no longer swallow following task names. + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 10.0.2 + +==== Changes + +===== Bug Fixes + +* --trace and --backtrace no longer swallow following task names. + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 10.0.1 + +==== Changes + +===== Bug Fixes + +* Exit status with failing tests is not correctly set to non-zero. + +* Simplified syntax for phony task (for older versions of RDoc). + +* Stand alone FileList usage gets glob function (without loading in + extra dependencies) + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 10.0.0 + + "Jim, when will Rake reach version 1.0?" + +Over the past several years I've been asked that question at +conferences, panels and over twitter. Due to historical reasons (or +maybe just plain laziness) Rake has (incorrectly) been treating the +second digit of the version as the major release number. So in my head +Rake was already at version 9. + +Well, it's time to fix things. This next version of Rake drops old, +crufty, backwards compatibility hacks such as top level constants, DSL +methods defined in Object and numerous other features that are just no +longer desired. It's also time to drop the leading zero from the +version number as well and call this new version of rake what it +really is: Version 10. + +So, welcome to Rake 10.0! + +Rake 10 is actually feature identical to the latest version of Rake 9 +(that would be the version spelled 0.9.3), *except* that Rake 10 drops +all the sundry deprecated features that have accumulated over the years. + +If your Rakefile is up to date and current with all the new features +of Rake 10, you are ready to go. If your Rakefile still uses a few +deprecated feeatures, feel free to use Rake 9 (0.9.3) with the same +feature set. Just be aware that future features will be in Rake 10 +family line. + +==== Changes in 10.0 + +As mentioned above, there are no new features in Rake 10. However, +there are a number of features missing: + +* Classic namespaces are now gone. Rake is no longer able to reflect + the options settings in the global variables ($rakefile, $show\_tasks, + $show\_prereqs, $trace, $dryrun and $silent). The + --classic-namespace option is no longer supported. + +* Global constants are no longer supported. This includes + Task, FileTask, FileCreationTask and + RakeApp). The constant missing hook to warn about using + global rake constants has been removed. + +* The Rake DSL methods (task, file, directory, etc) are in their own + module (Rake::DSL). The stub versions of these methods (that printed + warnings) in Object have been removed. However, the DSL methods are + added to the top-level main object. Since main is + not in the inheritance tree, the presence of the DSL methods in main + should be low impact on other libraries. + + If you want to use the Rake DSL commands from your own code, just + include Rake::DSL into your own classes and modules. + +* The deprecated syntax for task arguments (the one using + :needs) has been removed. + +* The --reduce-compat flag has been removed (it's not needed + anymore). + +* The deprecated rake/sys.rb library has been removed. + +* The deprecated rake/rdoctask.rb library has been removed. + RDoc supplies its own rake task now. + +* The deprecated rake/gempackagetask.rb library has been + removed. Gem supplies its own package task now. + +There is one small behavioral change: + +* Non-file tasks now always report the current time as their time + stamp. This is different from the previous behavior where non-file + tasks reported current time only if there were no prerequisites, and + the max prerequisite timestamp otherwise. This lead to inconsistent + and surprising behavior when adding prerequisites to tasks that in + turn were prequisites to file tasks. The new behavior is more + consistent and predictable. + +==== Changes (from 0.9.3) + +Since Rake 10 includes the changes from the last version of Rake 9, +we'll repeat the changes for version 0.9.3 here. + +===== New Features + +* Multitask tasks now use a thread pool. Use -j to limit the number of + available threads. + +* Use -m to turn regular tasks into multitasks (use at your own risk). + +* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to + programatically add rake task libraries. + +* You can specific backtrace suppression patterns (see + --suppress-backtrace) + +* Directory tasks can now take prerequisites and actions + +* Use --backtrace to request a full backtrace without the task trace. + +* You can say "--backtrace=stdout" and "--trace=stdout" to route trace + output to standard output rather than standard error. + +* Optional 'phony' target (enable with 'require 'rake/phony'") for + special purpose builds. + +* Task#clear now clears task comments as well as actions and + prerequisites. Task#clear_comment will specifically target comments. + +* The --all option will force -T and -D to consider all the tasks, + with and without descriptions. + +===== Bug Fixes + +* Semi-colons in windows rakefile paths now work. + +* Improved Control-C support when invoking multiple test suites. + +* egrep method now reads files in text mode (better support for + Windows) + +* Better deprecation line number reporting. + +* The -W option now works with all tasks, whether they have a + description or not. + +* File globs in rake should not be sorted alphabetically, independent + of file system and platform. + +* Numerous internal improvements. + +* Documentation typos and fixes. + + +==== Thanks + +As usual, it was input from users that drove a lot of these changes. The +following people contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.6 + +Rake version 0.9.6 contains a number of fixes mainly for merging +Rake into the Ruby source tree and fixing tests. + +==== Changes + +===== Bug Fixes (0.9.6) + +* Better trace output when using a multi-threaded Rakefile. +* Arg parsing is now consistent for tasks and multitasks. +* Skip exit code test in versions of Ruby that don't support it well. + +Changes for better integration with the Ruby source tree: + +* Fix version literal for Ruby source tree build. +* Better loading of libraries for testing in Ruby build. +* Use the ruby version provided by Ruby's tests. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.5 + +Rake version 0.9.5 contains a number of bug fixes. + +==== Changes + +===== Bug Fixes (0.9.5) + +* --trace and --backtrace no longer swallow following task names. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.4 + +Rake version 0.9.4 contains a number of bug fixes. + +==== Changes + +===== Bug Fixes (0.9.4) + +* Exit status with failing tests is not correctly set to non-zero. + +* Simplified syntax for phony task (for older versions of RDoc). + +* Stand alone FileList usage gets glob function (without loading in + extra dependencies) + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== 0.9.3 + +Rake version 0.9.3 contains some new, backwards compatible features and +a number of bug fixes. + +==== Changes + +===== New Features + +* Multitask tasks now use a thread pool. Use -j to limit the number of + available threads. + +* Use -m to turn regular tasks into multitasks (use at your own risk). + +* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to + programatically add rake task libraries. + +* You can specific backtrace suppression patterns (see + --suppress-backtrace) + +* Directory tasks can now take prerequisites and actions + +* Use --backtrace to request a full backtrace without the task trace. + +* You can say "--backtrace=stdout" and "--trace=stdout" to route trace + output to standard output rather than standard error. + +* Optional 'phony' target (enable with 'require 'rake/phony'") for + special purpose builds. + +* Task#clear now clears task comments as well as actions and + prerequisites. Task#clear_comment will specifically target comments. + +* The --all option will force -T and -D to consider all the tasks, + with and without descriptions. + +===== Bug Fixes + +* Semi-colons in windows rakefile paths now work. + +* Improved Control-C support when invoking multiple test suites. + +* egrep method now reads files in text mode (better support for + Windows) + +* Better deprecation line number reporting. + +* The -W option now works with all tasks, whether they have a + description or not. + +* File globs in rake should not be sorted alphabetically, independent + of file system and platform. + +* Numerous internal improvements. + +* Documentation typos and fixes. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Aaron Patterson +* Dylan Smith +* Jo Liss +* Jonas Pfenniger +* Kazuki Tsujimoto +* Michael Bishop +* Michael Elufimov +* NAKAMURA Usaku +* Ryan Davis +* Sam Grönblom +* Sam Phippen +* Sergio Wong +* Tay Ray Chuan +* grosser +* quix + +Also, many thanks to Eric Hodel for assisting with getting this release +out the door. + +-- Jim Weirich + +=== Rake 0.9.2.2 + +Rake version 0.9.2.2 is mainly bug fixes. + +==== Changes + +* The rake test loader now removes arguments it has processed. Issue #51 +* Rake::TaskArguments now responds to #values\_at +* RakeFileUtils.verbose_flag = nil silences output the same as 0.8.7 +* Rake tests are now directory-independent +* Rake tests are no longer require flexmock +* Commands constant is no longer polluting top level namespace. +* Show only the interesting portion of the backtrace by default (James M. Lawrence). +* Added --reduce-compat option to remove backward compatible DSL hacks (James M. Lawrence). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + +=== 0.9.2 + +Rake version 0.9.2 has a few small fixes. See below for details. + +==== Changes + +* Support for Ruby 1.8.6 was fixed. +* Global DSL warnings now honor --no-deprecate + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + +=== 0.9.1 + +Rake version 0.9.1 has a number of bug fixes and enhancments (see +below for more details). Additionally, the internals have be slightly +restructured and improved. + +==== Changes + +Rake 0.9.1 adds back the global DSL methods, but with deprecation +messages. This allows Rake 0.9.1 to be used with older rakefiles with +warning messages. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + +=== 0.9.0 + +Rake version 0.9.0 has a number of bug fixes and enhancments (see +below for more details). Additionally, the internals have be slightly +restructured and improved. + +==== Changes + +===== New Features / Enhancements / Bug Fixes in Version 0.9.0 + +* Rake now warns when the deprecated :needs syntax used (and suggests + the proper syntax in the warning). + +* Moved Rake DSL commands to top level ruby object 'main'. Rake DSL + commands are no longer private methods in Object. (Suggested by + James M. Lawrence/quix) + +* Rake now uses case-insensitive comparisons to find the Rakefile on Windows. + Based on patch by Roger Pack. + +* Rake now requires (instead of loads) files in the test task. Patch by Cezary + Baginski. + +* Fixed typos. Patches by Sean Scot August Moon and R.T. Lechow. + +* Rake now prints the Rakefile directory only when it's different from the + current directory. Patch by Alex Chaffee. + +* Improved rakefile_location discovery on Windows. Patch by James Tucker. + +* Rake now recognizes "Windows Server" as a windows system. Patch by Matthias + Lüdtke + +* Rake::RDocTask is deprecated. Use RDoc::Task from RDoc 2.4.2+ (require + 'rdoc/task') + +* Rake::GemPackageTask is deprecated. Use Gem::PackageTask (require + 'rubygems/package\_task') + +* Rake now outputs various messages to $stderr instead of $stdout. + +* Rake no longer emits warnings for Config. Patch by Santiago Pastorino. + +* Removed Rake's DSL methods from the top level scope. If you need to + call 'task :xzy' in your code, include Rake::DSL into your class, or + put the code in a Rake::DSL.environment do ... end block. + +* Split rake.rb into individual files. + +* Support for the --where (-W) flag for showing where a task is defined. + +* Fixed quoting in test task. + (http://onestepback.org/redmine/issues/show/44, + http://www.pivotaltracker.com/story/show/1223138) + +* Fixed the silent option parsing problem. + (http://onestepback.org/redmine/issues/show/47) + +* Fixed :verbose=>false flag on sh and ruby commands. + +* Rake command line options may be given by default in a RAKEOPT + environment variable. + +* Errors in Rake will now display the task invocation chain in effect + at the time of the error. + +* Accepted change by warnickr to not expand test patterns in shell + (allowing more files in the test suite). + +* Fixed that file tasks did not perform prereq lookups in scope + (Redmine #57). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence (quix) +* Roger Pack +* Cezary Baginski +* Sean Scot August Moon +* R.T. Lechow +* Alex Chaffee +* James Tucker +* Matthias Lüdtke +* Santiago Pastorino + +Also, bit thanks to Eric Hodel for assisting with getting this release +out the door (where "assisting" includes, but is not by any means +limited to, "pushing" me to get it done). + +-- Jim Weirich + + +=== 0.8.7 + +Rake version 0.8.5 introduced greatly improved support for executing +commands on Windows. The "sh" command now has the same semantics on +Windows that it has on Unix based platforms. + +Rake version 0.8.6 includes minor fixes the the RDoc generation. +Rake version 0.8.7 includes a minor fix for JRuby running on windows. + +==== Changes + +===== New Features / Enhancements in Version 0.8.5 + +* Improved implementation of the Rake system command for Windows. + (patch from James M. Lawrence/quix) + +* Support for Ruby 1.9's improved system command. (patch from James + M. Lawrence/quix) + +* Rake now includes the configured extension when invoking an + executable (Config::CONFIG['EXEEXT]) + +===== Bug Fixes in Version 0.8.5 + +* Environment variable keys are now correctly cased (it matters in + some implementations). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Charles Nutter + +-- Jim Weirich + +=== 0.8.6 + +Rake version 0.8.5 introduced greatly improved support for executing +commands on Windows. The "sh" command now has the same semantics on +Windows that it has on Unix based platforms. + +Rake version 0.8.5 includes minor fixes the the RDoc generation. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence/quix +* Luis Lavena + +-- Jim Weirich + +=== 0.8.5 + +Rake version 0.8.5 is a new release of Rake with greatly improved +support for executing commands on Windows. The "sh" command now has +the same semantics on Windows that it has on Unix based platforms. + +==== Changes + +===== New Features / Enhancements in Version 0.8.5 + +* Improved implementation of the Rake system command for Windows. + (patch from James M. Lawrence/quix) + +* Support for Ruby 1.9's improved system command. (patch from James + M. Lawrence/quix) + +* Rake now includes the configured extension when invoking an + executable (Config::CONFIG['EXEEXT]) + +===== Bug Fixes in Version 0.8.5 + +* Environment variable keys are now correctly cased (it matters in + some implementations). + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence/quix +* Luis Lavena + +-- Jim Weirich + +=== 0.8.4 + +Rake version 0.8.4 is a bug-fix release of rake. + +NOTE: The version of Rake that comes with Ruby 1.9 has diverged + slightly from the core Rake code base. Rake 0.8.4 will work + with Ruby 1.9, but is not a strict upgrade for the Rake that + comes with Ruby 1.9. A (near) future release of Rake will unify + those two codebases. + +==== Letter Writing Campaign + +Thanks to Aaron Patterson (@tenderlove) and Eric Hodel (@drbrain) for +their encouraging support in organizing a letter writing campaign to +lobby for the "Warning Free" release of rake 0.8.4. A special callout +goes to Jonathan D. Lord, Sr (Dr. Wingnut) whose postcard was the +first to actually reach me. (see +http://tenderlovemaking.com/2009/02/26/we-need-a-new-version-of-rake/ +for details) + +==== Changes + +===== New Features / Enhancements in Version 0.8.4 + +* Case is preserved on rakefile names. (patch from James + M. Lawrence/quix) + +* Improved Rakefile case insensitivity testing (patch from Luis + Lavena). + +* Windows system dir search order is now: HOME, HOMEDRIVE + HOMEPATH, + APPDATA, USERPROFILE (patch from Luis Lavena) + +* MingGW is now recognized as a windows platform. (patch from Luis + Lavena) + +===== Bug Fixes in Version 0.8.4 + +* Removed reference to manage_gem to fix the warning produced by the + gem package task. + +* Fixed stray ARGV option problem that was interfering with + Test::Unit::Runner. (patch from Pivotal Labs) + +===== Infrastructure Improvements in Version 0.8.4 + +* Numerous fixes to the windows test suite (patch from Luis Lavena). + +* Improved Rakefile case insensitivity testing (patch from Luis + Lavena). + +* Better support for windows paths in the test task (patch from Simon + Chiang/bahuvrihi) + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* James M. Lawrence/quix +* Luis Lavena +* Pivotal Labs +* Simon Chiang/bahuvrihi + +-- Jim Weirich + +=== 0.8.3 + +Rake version 0.8.3 is a bug-fix release of rake. + +==== Changes + +===== Bug Fixes in Version 0.8.3 + +* Enhanced the system directory detection in windows. We now check + HOMEDRIVE/HOMEPATH and USERPROFILE if APPDATA isn't found. (Patch + supplied by James Tucker). Rake no long aborts if it can't find the + directory. + +* Added fix to handle ruby installations in directories with spaces in + their name. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Edwin Pratomo +* Gavin Stark +* Adam Q. Salter +* Adam Majer +* Emanuel Indermühle +* Ittay Dror +* Bheeshmar Redheendran (for spending an afternoon with me debugging + windows issues) + +-- Jim Weirich + + +=== 0.8.2 + +Rake version 0.8.2 is a new release of rake that includes a number of +new features and numerous bug fixes. + +==== Changes + +===== New Features in Version 0.8.2 + +* Switched from getoptlong to optparse (patches supplied by Edwin + Pratomo). + +* The -T option will now attempt to dynamically sense the size of the + terminal. The -T output will only self-truncate if the output is a + tty. However, if RAKE_COLUMNS is explicitly set, it will be honored + in any case. (Patch provided by Gavin Stark). + +* The following public methods have been added to rake task objects: + + * task.clear -- Clear both the prerequisites and actions of the + target rake task. + * task.clear_prerequisites -- Clear all the existing prerequisites + from the target rake task. + * task.clear_actions -- Clear all the existing actions from the + target rake task. + * task.reenable -- Re-enable a task, allowing its actions to be + executed again if the task is invoked. + +* Changed RDoc test task to have no default template. This makes it + easier for the tempate to pick up the template from the environment. + +* Default values for task arguments can easily be specified with the + :with_defaults method. (Idea for default argument merging supplied + by (Adam Q. Salter) + +===== Bug Fixes in Version 0.8.2 + +* Fixed bug in package task so that it will include the subdir + directory in the package for testing. (Bug found by Adam Majer) + +* Fixed filename dependency order bug in test\_inspect\_pending and + test\_to\_s\_pending. (Bug found by Adam Majer) + +* Fixed check for file utils options to make them immune to the + symbol/string differences. (Patch supplied by Edwin Pratomo) + +* Fixed bug with rules involving multiple source, where only the first + dependency of a rule has any effect (Patch supplied by Emanuel + Indermühle) + +* FileList#clone and FileList#dup have better sematics w.r.t. taint + and freeze. + +* Changed from using Mutex to Monitor. Evidently Mutex causes thread + join errors when Ruby is compiled with -disable-pthreads. (Patch + supplied by Ittay Dror) + +* Fixed bug in makefile parser that had problems with extra spaces in + file task names. (Patch supplied by Ittay Dror) + +==== Other changes in Version 0.8.2 + +* Added ENV var to rake's own Rakefile to prevent OS X from including + extended attribute junk in the rake package tar file. (Bug found by + Adam Majer) + +* Added a performance patch for reading large makefile dependency + files. (Patch supplied by Ittay Dror) + +==== Task Argument Examples + +Prior to version 0.8.0, rake was only able to handle command line +arguments of the form NAME=VALUE that were passed into Rake via the +ENV hash. Many folks had asked for some kind of simple command line +arguments, perhaps using "--" to separate regular task names from +argument values on the command line. The problem is that there was no +easy way to associate positional arguments on the command line with +different tasks. Suppose both tasks :a and :b expect a command line +argument: does the first value go with :a? What if :b is run first? +Should it then get the first command line argument. + +Rake 0.8.0 solves this problem by explicitly passing values directly +to the tasks that need them. For example, if I had a release task +that required a version number, I could say: + + rake release[0.8.2] + +And the string "0.8.2" will be passed to the :release task. Multiple +arguments can be passed by separating them with a comma, for example: + + rake name[john,doe] + +Just a few words of caution. The rake task name and its arguments +need to be a single command line argument to rake. This generally +means no spaces. If spaces are needed, then the entire rake + +argument string should be quoted. Something like this: + + rake "name[billy bob, smith]" + +(Quoting rules vary between operating systems and shells, so make sure +you consult the proper docs for your OS/shell). + +===== Tasks that Expect Parameters + +Parameters are only given to tasks that are setup to expect them. In +order to handle named parameters, the task declaration syntax for +tasks has been extended slightly. + +For example, a task that needs a first name and last name might be +declared as: + + task :name, :first_name, :last_name + +The first argument is still the name of the task (:name in this case). +The next to argumements are the names of the parameters expected by +:name (:first_name and :last_name in the example). + +To access the values of the parameters, the block defining the task +behaviour can now accept a second parameter: + + task :name, :first_name, :last_name do |t, args| + puts "First name is #{args.first_name}" + puts "Last name is #{args.last_name}" + end + +The first argument of the block "t" is always bound to the current +task object. The second argument "args" is an open-struct like object +that allows access to the task arguments. Extra command line +arguments to a task are ignored. Missing command line arguments are +given the nil value. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Edwin Pratomo +* Gavin Stark +* Adam Q. Salter +* Adam Majer +* Emanuel Indermühle +* Ittay Dror +* Bheeshmar Redheendran (for spending an afternoon with me debugging + windows issues) + +-- Jim Weirich + +=== 0.8.0/0.8.1 + +Rake version 0.8.0 is a new release of rake that includes serveral new +features. + +==== Changes + +===== New Features in Version 0.8.0 + +* Tasks can now receive command line parameters. See the examples + below for more details. + +* Comments are limited to 80 columns on output, but full comments can + be seen by using the -D parameter. (feature suggested by Jamis + Buck). + +* Explicit exit(n) calls will now set the exit status to n. (patch + provided by Stephen Touset). + +* Rake is now compatible with Ruby 1.9. + +Version 0.8.1 is a minor update that includes additional Ruby 1.9 +compatibility fixes. + +==== Task Argument Examples + +Prior to version 0.8.0, rake was only able to handle command line +arguments of the form NAME=VALUE that were passed into Rake via the +ENV hash. Many folks had asked for some kind of simple command line +arguments, perhaps using "--" to separate regular task names from +argument values on the command line. The problem is that there was no +easy way to associate positional arguments on the command line with +different tasks. Suppose both tasks :a and :b expect a command line +argument: does the first value go with :a? What if :b is run first? +Should it then get the first command line argument. + +Rake 0.8.0 solves this problem by explicitly passing values directly +to the tasks that need them. For example, if I had a release task +that required a version number, I could say: + + rake release[0.8.0] + +And the string "0.8.0" will be passed to the :release task. Multiple +arguments can be passed by separating them with a comma, for example: + + rake name[john,doe] + +Just a few words of caution. The rake task name and its arguments +need to be a single command line argument to rake. This generally +means no spaces. If spaces are needed, then the entire rake + +argument string should be quoted. Something like this: + + rake "name[billy bob, smith]" + +(Quoting rules vary between operating systems and shells, so make sure +you consult the proper docs for your OS/shell). + +===== Tasks that Expect Parameters + +Parameters are only given to tasks that are setup to expect them. In +order to handle named parameters, the task declaration syntax for +tasks has been extended slightly. + +For example, a task that needs a first name and last name might be +declared as: + + task :name, :first_name, :last_name + +The first argument is still the name of the task (:name in this case). +The next to argumements are the names of the parameters expected by +:name (:first_name and :last_name in the example). + +To access the values of the parameters, the block defining the task +behaviour can now accept a second parameter: + + task :name, :first_name, :last_name do |t, args| + puts "First name is #{args.first_name}" + puts "Last name is #{args.last_name}" + end + +The first argument of the block "t" is always bound to the current +task object. The second argument "args" is an open-struct like object +that allows access to the task arguments. Extra command line +arguments to a task are ignored. Missing command line arguments are +given the nil value. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +* Jamis Buck (for comment formatting suggestions) +* Stephen Touset (for exit status patch). + +-- Jim Weirich + + +=== 0.7.3 + +Rake version 0.7.3 is a minor release that includes some refactoring to better +support custom Rake applications. + +==== Changes + +===== New Features in Version 0.7.3 + +* Added the +init+ and +top_level+ methods to make the creation of custom Rake applications a bit easier. E.g. + + gem 'rake', ">= 0.7.3" + require 'rake' + + Rake.application.init('myrake') + + task :default do + something_interesting + end + + Rake.application.top_level + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. The +following people either contributed patches, made suggestions or made +otherwise helpful comments. Thanks to ... + +-- Jim Weirich + + +=== 0.7.2 + + +Version 0.7.2 supplies a bug fix and a few minor enhancements. In +particular, the new version fixes an incompatibility with the soon to +be released Ruby 1.8.6. We strongly recommend upgrading to Rake 0.7.2 +in order to be compatible with the new version of Ruby. + +==== Changes + +===== Bug Fixes in 0.7.2 + +There are quite a number of bug fixes in the new 0.7.2 version of +Rake: + +* Removed dependency on internal fu_xxx functions from FileUtils. + +* Error messages are now send to stderr rather than stdout (from + Payton Quackenbush). + +* Better error handling on invalid command line arguments (from Payton + Quackenbush). + +* Fixed some bugs where the application object was going to the global + appliation instead of using its own data. + +* Fixed the method name leak from FileUtils (bug found by Glenn + Vanderburg). + +* Added test for noop, bad_option and verbose flags to sh command. + +* Added a description to the gem task in GemPackageTask. + +* Fixed a bug when rules have multiple prerequisites (patch by Joel + VanderWerf) + +* Added the handful of RakeFileUtils to the private method as well. + +===== New Features in 0.7.2 + +The following new features are available in Rake version 0.7.2: + +* Added square and curly bracket patterns to FileList#include (Tilman + Sauerbeck). + +* FileLists can now pass a block to FileList#exclude to exclude files + based on calculated values. + +* Added plain filename support to rule dependents (suggested by Nobu + Nakada). + +* Added pathmap support to rule dependents. In other words, if a + pathmap format (beginning with a '%') is given as a Rake rule + dependent, then the name of the depend will be the name of the + target with the pathmap format applied. + +* Added a 'tasks' method to a namespace to get a list of tasks + associated with the namespace. + +* Added tar_command and zip_command options to the Package task. + +* The clean task will no longer delete 'core' if it is a directory. + +===== Internal Rake Improvements + +The following changes will are mainly internal improvements and +refactorings and have little effect on the end user. But they may be +of interest to the general public. + +* Added rcov task and updated unit testing for better code coverage. + +* Added a 'shame' task to the Rakefile. + +* Added rake_extension to handle detection of extension collisions. + +* Added a protected 'require "rubygems"' to test/test_application to + unbreak cruisecontrol.rb. + +* Removed rake\_dup. Now we just simply rescue a bad dup. + +* Refactored the FileList reject logic to remove duplication. + +* Removed if \_\_FILE\_\_ at the end of the rake.rb file. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* Payton Quackenbush -- For several error handling improvements. + +* Glenn Vanderburg -- For finding and fixing the method name leak from + FileUtils. + +* Joel VanderWerf -- for finding and fixing a bug in the handling of + multiple prerequisites. + +* Tilman Sauerbeck -- For some enhancing FileList to support more + advanced file globbing. + +* Nobu Nakada -- For suggesting plain file name support to rule dependents. + +-- Jim Weirich + +=== 0.7.1 + +Version 0.7.1 supplies a bug fix and a few minor enhancements. + +==== Changes + +===== Bug Fixes in 0.7.1 + +* Changes in the exception reported for the FileUtils.ln caused + safe_ln to fail with a NotImplementedError. Rake 0.7.1 will now + catch that error or any StandardError and properly fall back to + using +cp+. + +===== New Features in 0.7.1 + +* You can filter the results of the --task option by supplying an + optional regular expression. This allows the user to easily find a + particular task name in a long list of possible names. + +* Transforming procs in a rule may now return a list of prerequisites. + This allows more flexible rule formation. + +* FileList and String now support a +pathmap+ melthod that makes the + transforming paths a bit easier. See the API docs for +pathmap+ for + details. + +* The -f option without a value will disable the search for a + Rakefile. This allows the Rakefile to be defined entirely in a + library (and loaded with the -r option). The current working + directory is not changed when this is done. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* James Britt and Assaph Mehr for reporting and helping to debug the + safe_ln issue. + +-- Jim Weirich + + +=== 0.7.0 + +These changes for Rake have been brewing for a long time. Here they +are, I hope you enjoy them. + +==== Changes + +===== New Features + +* Name space support for task names (see below). +* Prerequisites can be executed in parallel (see below). +* Added safe_ln support for openAFS (via Ludvig Omholt). +* RDoc defaults to internal (in-process) invocation. The old behavior + is still available by setting the +external+ flag to true. +* Rakefiles are now loaded with the expanded path to prevent + accidental pollution from the Ruby load path. +* Task objects my now be used in prerequisite lists directly. +* Task objects (in addition to task names) may now be included in the + prerequisite list of a task. +* Internals cleanup and refactoring. + +===== Bug Fixes + +* Compatibility fixes for Ruby 1.8.4 FileUtils changes. + +===== Namespaces + +Tasks can now be nested inside their own namespaces. Tasks within one +namespace will not accidentally interfer with tasks named in a different +namespace. + +For example: + + namespace "main" do + task :build do + # Build the main program + end + end + + namespace "samples" do + task :build do + # Build the sample programs + end + end + + task :build_all => ["main:build", "samples:build"] + +Even though both tasks are named :build, they are separate tasks in +their own namespaces. The :build_all task (defined in the toplevel +namespace) references both build tasks in its prerequisites. + +You may invoke each of the individual build tasks with the following +commands: + + rake main:build + rake samples:build + +Or invoke both via the :build_all command: + + rake build_all + +Namespaces may be nested arbitrarily. Since the name of file tasks +correspond to the name of a file in the external file system, +FileTasks are not affected by the namespaces. + +See the Rakefile format documentation (in the Rake API documents) for +more information. + +===== Parallel Tasks + +Sometimes you have several tasks that can be executed in parallel. By +specifying these tasks as prerequisites to a +multitask+ task. + +In the following example the tasks copy\_src, copy\_doc and copy\_bin +will all execute in parallel in their own thread. + + multitask :copy_files => [:copy_src, :copy_doc, :copy_bin] do + puts "All Copies Complete" + end + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* Doug Young (inspiration for the parallel task) +* David Heinemeier Hansson (for --trace message enhancement and for + pushing for namespace support). +* Ludvig Omholt (for the openAFS fix) + +-- Jim Weirich + +=== 0.6.1 + +* Rebuilt 0.6.0 gem without signing. + +=== 0.6.0 + +Its time for some long requested enhancements and lots of bug fixes +... And a whole new web page. + +==== New Web Page + +The primary documentation for rake has moved from the RubyForge based +wiki to its own Hieraki based web site. Constant spam on the wiki +made it a difficult to keep clean. The new site will be easier to +update and organize. + +Check out the new documentation at: http://docs.rubyrake.org + +We will be adding new documentation to the site as time goes on. + +In addition to the new docs page, make sure you check out Martin +Fowlers article on rake at http://martinfowler.com/articles/rake.html + +==== Changes + +===== New Features + +* Multiple prerequisites on Rake rules now allowed. However, keep the + following in mind: + + 1. All the prerequisites of a rule must be available before a rule + is triggered, where "enabled" means (a) an existing file, (b) a + defined rule, or (c) another rule which also must be + trigger-able. + 2. Rules are checked in order of definition, so it is important to + order your rules properly. If a file can be created by two + different rules, put the more specific rule first (otherwise the + more general rule will trigger first and the specific one will + never be triggered). + 3. The source method now returns the name of the first + prerequisite listed in the rule. sources returns the + names of all the rule prerequisites, ordered as they are defined + in the rule. If the task has other prerequisites not defined in + the rule (but defined in an explicit task definition), then they + will _not_ be included in the sources list. + +* FileLists may now use the egrep command. This popular enhancement + is now a core part of the FileList object. If you want to get a + list of all your to-dos, fixmes and TBD comments, add the following + to your Rakefile. + + desc "Look for TODO and FIXME tags in the code" + task :todo do + FileList['**/*.rb'].egrep /#.*(FIXME|TODO|TBD)/ + end + +* The investigation method was added to task object to dump + out some important values. This makes it a bit easier to debug Rake + tasks. + + For example, if you are having problems with a particular task, just + print it out: + + task :huh do + puts Rake::Task['huh'].investigation + end + +* The Rake::TestTask class now supports a "ruby\_opts" option to pass + arbitrary ruby options to a test subprocess. + +===== Some Incompatibilities + +* When using the ruby command to start a Ruby subprocess, the + Ruby interpreter that is currently running rake is used by default. + This makes it easier to use rake in an environment with multiple + ruby installation. (Previously, the first ruby command found in the + PATH was used). + + If you wish to chose a different Ruby interpreter, you can + explicitly choose the interpreter via the sh command. + +* The major rake classes (Task, FileTask, FileCreationTask, RakeApp) + have been moved out of the toplevel scope and are now accessible as + Rake::Task, Rake::FileTask, Rake::FileCreationTask and + Rake::Application. If your Rakefile + directly references any one of these tasks, you may: + + 1. Update your Rakefile to use the new classnames + 2. Use the --classic-namespace option on the rake command to get the + old behavior, + 3. Add require 'rake/classic_namespace' to the + Rakefile to get the old behavior. + + rake will print a rather annoying warning whenever a + deprecated class name is referenced without enabling classic + namespace. + +===== Bug Fixes + +* Several unit tests and functional tests were fixed to run better + under windows. + +* Directory tasks are now a specialized version of a File task. A + directory task will only be triggered if it doesn't exist. It will + not be triggered if it is out of date w.r.t. any of its + prerequisites. + +* Fixed a bug in the Rake::GemPackageTask class so that the gem now + properly contains the platform name. + +* Fixed a bug where a prerequisite on a file task would cause + an exception if the prerequisite did not exist. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +The following people either contributed patches, made suggestions or +made otherwise helpful comments. Thanks to ... + +* Greg Fast (better ruby_opt test options) +* Kelly Felkins (requested by better namespace support) +* Martin Fowler (suggested Task.investigation) +* Stuart Jansen (send initial patch for multiple prerequisites). +* Masao Mutch (better support for non-ruby Gem platforms) +* Philipp Neubeck (patch for file task exception fix) + +-- Jim Weirich + +=== 0.5.4 + +Time for some minor bug fixes and small enhancements + +==== Changes + +Here are the changes for version 0.5.4 ... + +* Added double quotes to the test runner. This allows the location of + the tests (and runner) to be in a directory path that contains + spaces (e.g. "C:/Program Files/ruby/bin"). +* Added .svn to default ignore list. Now subversion project metadata + is automatically ignored by Rake's FileList. +* Updated FileList#include to support nested arrays and filelists. + FileLists are flat lists of file names. Using a FileList in an + include will flatten out the nested file names. + +== Thanks + +As usual, it was input from users that drove a alot of these changes. +Thanks to ... + +* Tilman Sauerbeck for the nested FileList suggestion. +* Josh Knowles for pointing out the spaces in directory name problem. + +-- Jim Weirich + +=== 0.5.3 + +Although it has only been two weeks since the last release, we have +enough updates to the Rake program to make it time for another +release. + +==== Changes + +Here are the changes for version 0.5.3 ... + +* FileLists have been extensively changed so that they mimic the + behavior of real arrays even more closely. In particular, + operations on FileLists that return a new collection (e.g. collect, + reject) will now return a FileList rather than an array. In + addition, several places where FileLists were not properly expanded + before use have been fixed. +* A method (+ext+) to simplify the handling of file extensions was + added to String and to Array. +* The 'testrb' script in test/unit tends to silently swallow syntax + errors in test suites. Because of that, the default test loader is + now a rake-provided script. You can still use 'testrb' by setting + the loader flag in the test task to :testrb. (See the API documents + for TestTask for all the loader flag values). +* FileUtil methods (e.g. cp, mv, install) are now declared to be + private. This will cut down on the interference with user defined + methods of the same name. +* Fixed the verbose flag in the TestTask so that the test code is + controlled by the flag. Also shortened up some failure messages. + (Thanks to Tobias Luetke for the suggestion). +* Rules will now properly detect a task that can generate a source + file. Previously rules would only consider source files that were + already present. +* Added an +import+ command that allows Rake to dynamically import + dependendencies into a running Rake session. The +import+ command + can run tasks to update the dependency file before loading them. + Dependency files can be in rake or make format, allowing rake to + work with tools designed to generate dependencies for make. + +==== Thanks + +As usual, it was input from users that drove a alot of these changes. +Thanks to ... + +* Brian Gernhardt for the rules fix (especially for the patience to + explain the problem to me until I got what he was talking about). +* Stefan Lang for pointing out problems in the dark corners of the + FileList implementation. +* Alexey Verkhovsky pointing out the silently swallows syntax errors + in tests. +* Tobias Luetke for beautifying the test task output. +* Sam Roberts for some of the ideas behind dependency loading. + +-- Jim Weirich + + +=== 0.5.0 + +It has been a long time in coming, but we finally have a new version +of Rake available. + +==== Changes + +* Fixed documentation that was lacking the Rake module name (Tilman + Sauerbeck). +* Added tar.gz and tar.bz2 support to package task (Tilman Sauerbeck). +* Recursive rules are now supported (Tilman Sauerbeck). +* Added warning option for the Test Task (requested by Eric Hodel). +* The jamis rdoc template is only used if it exists. +* Added fix for Ruby 1.8.2 test/unit and rails problem. +* Added contributed rake man file (Jani Monoses). +* Added Brian Candler's fix for problems in --trace and --dry-run + mode. + +==== Thanks + +Lots of people provided input to this release. Thanks to Tilman +Sauerbeck for numerous patches, documentation fixes and suggestions. +And for also pushing me to get this release out. Also, thanks to +Brian Candler for the finding and fixing --trace/dry-run fix. That +was an obscure bug. Also to Eric Hodel for some good suggestions. + +-- Jim Weirich + +=== 0.4.15 + +==== Changes + +Version 0.4.15 is a bug fix update for the Ruby 1.8.2 compatibility +changes. This release includes: + +* Fixed a bug that prevented the TESTOPTS flag from working with the + revised for 1.8.2 test task. +* Updated the docs on --trace to indicate that it also enables a full + backtrace on errors. +* Several fixes for new warnings generated. + +==== Mini-Roadmap + +I will continue to issue Rake updates in the 0.4.xx series as new +Ruby-1.8.2 issues become manifest. Once the codebase stabilizes, I +will release a 0.5.0 version incorporating all the changes. If you +are not using Ruby-1.8.2 and wish to avoid version churn, I recommend +staying with a release prior to Rake-0.4.14. + +=== 0.4.14 + +Version 0.4.14 is a compatibility fix to allow Rake's test task to +work under Ruby 1.8.2. A change in the Test::Unit autorun feature +prevented Rake from running any tests. This release fixes the +problem. + +Rake 0.4.14 is the recommended release for anyone using Ruby 1.8.2. + +=== 0.4.13 + +* Fixed the dry-run flag so it is operating again. +* Multiple arguments to sh and ruby commands will not be interpreted + by the shell (patch provided by Jonathan Paisley). + +=== 0.4.12 + +* Added --silent (-s) to suppress the (in directory) rake message. + +=== 0.4.11 + +* Changed the "don't know how to rake" message (finally) +* Changes references to a literal "Rakefile" to reference the global + variable $rakefile (which contains the actual name of the rakefile). + +=== 0.4.10 + +* Added block support to the "sh" command, allowing users to take + special actions on the result of the system call. E.g. + + sh "shell_command" do |ok, res| + puts "Program returned #{res.exitstatus}" if ! ok + end + +=== 0.4.9 + +* Switched to Jamis Buck's RDoc template. +* Removed autorequire from Rake's gem spec. This prevents the Rake + libraries from loading while using rails. + +=== 0.4.8 + +* Added support for .rb versions of Rakefile. +* Removed \\\n's from test task. +* Fixed Ruby 1.9 compatibility issue with FileList. + +=== 0.4.7 + +* Fixed problem in FileList that caused Ruby 1.9 to go into infinite + recursion. Since to_a was removed from Object, it does not need to + added back into the list of methods to rewrite in FileList. (Thanks + to Kent Sibilev for pointing this out). + +=== 0.4.6 +* Removed test version of ln in FileUtils that prevented safe_ln from + using ln. + +=== 0.4.5 +* Upgraded comments in TestTask. +* FileList to_s and inspect now automatically resolve pending changes. +* FileList#exclude properly returns the FileList. + +=== 0.4.4 +* Fixed initialization problem with @comment. +* Now using multi -r technique in TestTask. Switch Rakefile back to + using the built-in test task macros because the rake runtime is no + longer needed. +* Added 'TEST=filename' and 'TESTOPTS=options' to the Test Task + macros. +* Allow a +test_files+ attribute in test tasks. This allows more + flexibility in specifying test files. + +=== 0.4.3 +* Fixed Comment leakage. + +=== 0.4.2 +* Added safe_ln that falls back to a copy if a file link is not supported. +* Package builder now uses safe\_ln. + +=== 0.4.1 +* Task comments are now additive, combined with "/". +* Works with (soon to be released) rubygems 0.6.2 (or 0.7.0) + +=== 0.4.0 +* FileList now uses deferred loading. The file system is not searched + until the first call that needs the file names. +* VAR=VALUE options are now accepted on the command line and are + treated like environment variables. The values may be tested in a + Rakefile by referencing ENV['VAR']. +* File.mtime is now used (instead of File.new().mtime). + +=== 0.3.2.x + +* Removed some hidden dependencies on rubygems. Tests now will test + gems only if they are installed. +* Removed Sys from some example files. I believe that is that last + reference to Sys outside of the contrib area. +* Updated all copyright notices to include 2004. + +=== 0.3.2 + +* GEM Installation now works with the application stub. + +=== 0.3.1 + +* FileLists now automatically ignore CVS, .bak, ! +* GEM Installation now works. + +=== 0.3.0 + +Promoted 0.2.10. + +=== 0.2.10 +General + +* Added title to Rake's rdocs +* Contrib packages are no longer included in the documentation. + +RDoc Issues + +* Removed default for the '--main' option +* Fixed rendering of the rdoc options +* Fixed clean/clobber confusion with rerdoc +* 'title' attribute added + +Package Task Library Issues + +* Version (or explicit :noversion) is required. +* +package_file+ attribute is now writable + +FileList Issues + +* Dropped bang version of exclude. Now using ant-like include/exclude semantics. +* Enabled the "yield self" idiom in FileList#initialize. + +=== 0.2.9 + +This version contains numerous changes as the RubyConf.new(2003) +presentation was being prepared. The changes include: + +* The monolithic rubyapp task library is in the process of being + dropped in favor of lighter weight task libraries. + +=== 0.2.7 + +* Added "desc" for task descriptions. +* -T will now display tasks with descriptions. +* -P will display tasks and prerequisites. +* Dropped the Sys module in favor of the 1.8.x FileUtils module. Sys + is still supported in the contrib area. + +=== 0.2.6 + +* Moved to RubyForge + +=== 0.2.5 + +* Switched to standard ruby app builder. +* Added no_match option to file matcher. + +=== 0.2.4 + +* Fixed indir, which neglected to actually change directories. + +=== 0.2.3 + +* Added rake module for a help target +* Added 'for\_files' to Sys +* Added a $rakefile constant +* Added test for selecting proper rule with multiple targets. diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/MIT-LICENSE b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/MIT-LICENSE new file mode 100644 index 00000000..4292f3b3 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/MIT-LICENSE @@ -0,0 +1,21 @@ +Copyright (c) Jim Weirich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/README.rdoc b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/README.rdoc new file mode 100644 index 00000000..5449303a --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/README.rdoc @@ -0,0 +1,156 @@ += RAKE -- Ruby Make + +home :: https://github.com/ruby/rake +bugs :: https://github.com/ruby/rake/issues +docs :: https://ruby.github.io/rake +build status :: {travis-ci}[https://travis-ci.org/ruby/rake] {appveyor}[https://ci.appveyor.com/project/ruby/rake] + +== Description + +Rake is a Make-like program implemented in Ruby. Tasks and dependencies are +specified in standard Ruby syntax. + +Rake has the following features: + +* Rakefiles (rake's version of Makefiles) are completely defined in + standard Ruby syntax. No XML files to edit. No quirky Makefile + syntax to worry about (is that a tab or a space?) + +* Users can specify tasks with prerequisites. + +* Rake supports rule patterns to synthesize implicit tasks. + +* Flexible FileLists that act like arrays but know about manipulating + file names and paths. + +* A library of prepackaged tasks to make building rakefiles easier. For example, + tasks for building tarballs. (Formerly + tasks for building RDoc, Gems, and publishing to FTP were included in rake but they're now + available in RDoc, RubyGems, and rake-contrib respectively.) + +* Supports parallel execution of tasks. + +== Installation + +=== Gem Installation + +Download and install rake with the following. + + gem install rake + +== Usage + +=== Simple Example + +First, you must write a "Rakefile" file which contains the build rules. Here's +a simple example: + + task default: %w[test] + + task :test do + ruby "test/unittest.rb" + end + +This Rakefile has two tasks: + +* A task named "test", which -- upon invocation -- will run a unit test file + in Ruby. +* A task named "default". This task does nothing by itself, but it has exactly + one dependency, namely the "test" task. Invoking the "default" task will + cause Rake to invoke the "test" task as well. + +Running the "rake" command without any options will cause it to run the +"default" task in the Rakefile: + + % ls + Rakefile test/ + % rake + (in /home/some_user/Projects/rake) + ruby test/unittest.rb + ....unit test output here... + +Type "rake --help" for all available options. + +== Resources + +=== Rake Information + +* {Rake command-line}[rdoc-ref:doc/command_line_usage.rdoc] +* {Writing Rakefiles}[rdoc-ref:doc/rakefile.rdoc] +* The original {Rake announcement}[rdoc-ref:doc/rational.rdoc] +* Rake {glossary}[rdoc-ref:doc/glossary.rdoc] + +=== Presentations and Articles about Rake + +* Avdi Grimm's rake series: + 1. {Rake Basics}[http://devblog.avdi.org/2014/04/21/rake-part-1-basics/] + 2. {Rake File Lists}[http://devblog.avdi.org/2014/04/22/rake-part-2-file-lists/] + 3. {Rake Rules}[http://devblog.avdi.org/2014/04/23/rake-part-3-rules/] + 4. {Rake Pathmap}[http://devblog.avdi.org/2014/04/24/rake-part-4-pathmap/] + 5. {File Operations}[http://devblog.avdi.org/2014/04/25/rake-part-5-file-operations/] + 6. {Clean and Clobber}[http://devblog.avdi.org/2014/04/28/rake-part-6-clean-and-clobber/] + 7. {MultiTask}[http://devblog.avdi.org/2014/04/29/rake-part-7-multitask/] +* {Jim Weirich's 2003 RubyConf presentation}[http://web.archive.org/web/20140221123354/http://onestepback.org/articles/buildingwithrake/] +* Martin Fowler's article on Rake: http://martinfowler.com/articles/rake.html + +== Other Make Re-envisionings ... + +Rake is a late entry in the make replacement field. Here are links to +other projects with similar (and not so similar) goals. + +* http://directory.fsf.org/wiki/Bras -- Bras, one of earliest + implementations of "make in a scripting language". +* http://www.a-a-p.org -- Make in Python +* http://ant.apache.org -- The Ant project +* http://search.cpan.org/search?query=PerlBuildSystem -- The Perl Build System +* http://www.rubydoc.info/gems/rant/0.5.7/frames -- Rant, another Ruby make tool. + +== Credits + +[Jim Weirich] Who originally created Rake. + +[Ryan Dlugosz] For the initial conversation that sparked Rake. + +[Nobuyoshi Nakada ] For the initial patch for rule support. + +[Tilman Sauerbeck ] For the recursive rule patch. + +[Eric Hodel] For aid in maintaining rake. + +[Hiroshi SHIBATA] Maintainer of Rake 10.X and Rake 11.X + +== License + +Rake is available under an MIT-style license. + +:include: MIT-LICENSE + +--- + += Other stuff + +Author:: Jim Weirich +Requires:: Ruby 2.0.0 or later +License:: Copyright Jim Weirich. + Released under an MIT-style license. See the MIT-LICENSE + file included in the distribution. + +== Warranty + +This software is provided "as is" and without any express or implied +warranties, including, without limitation, the implied warranties of +merchantability and fitness for a particular purpose. + +== Historical + +Rake was originally created by Jim Weirich, who unfortunately passed away in +February 2014. This repository was originally hosted at +{github.com/jimweirich/rake}[https://github.com/jimweirich/rake/], however +with his passing, has been moved to {ruby/rake}[https://github.com/ruby/rake]. + +You can view Jim's last commit here: +https://github.com/jimweirich/rake/tree/336559f28f55bce418e2ebcc0a57548dcbac4025 + +You can {read more about Jim}[https://en.wikipedia.org/wiki/Jim_Weirich] at Wikipedia. + +Thank you for this great tool, Jim. We'll remember you. diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/Rakefile b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/Rakefile new file mode 100644 index 00000000..e03dc6fe --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/Rakefile @@ -0,0 +1,41 @@ +# Rakefile for rake -*- ruby -*- + +# Copyright 2003, 2004, 2005 by Jim Weirich (jim@weirichhouse.org) +# All rights reserved. + +# This file may be distributed under an MIT style license. See +# MIT-LICENSE for details. + +lib = File.expand_path("../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) + +begin + require "bundler/gem_tasks" +rescue LoadError +end + +require "rake/testtask" +Rake::TestTask.new(:test) do |t| + t.libs << "test" + t.verbose = true + t.test_files = FileList["test/**/test_*.rb"] +end + +require "rdoc/task" +RDoc::Task.new do |doc| + doc.main = "README.rdoc" + doc.title = "Rake -- Ruby Make" + doc.rdoc_files = FileList.new %w[lib MIT-LICENSE doc/**/*.rdoc *.rdoc] + doc.rdoc_dir = "html" +end + +task ghpages: :rdoc do + %x[git checkout gh-pages] + require "fileutils" + FileUtils.rm_rf "/tmp/html" + FileUtils.mv "html", "/tmp" + FileUtils.rm_rf "*" + FileUtils.cp_r Dir.glob("/tmp/html/*"), "." +end + +task default: :test diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/console b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/console new file mode 100755 index 00000000..b8342352 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/console @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby + +require "bundler/setup" +require "rake" + +require "irb" +IRB.start diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/setup b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/setup new file mode 100755 index 00000000..cf4ad25e --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/bin/setup @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' +set -vx + +bundle install diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/exe/rake b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/exe/rake new file mode 100755 index 00000000..a00975f3 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/exe/rake @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby + +#-- +# Copyright (c) 2003, 2004, 2005, 2006, 2007 Jim Weirich +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +#++ + +require "rake" + +Rake.application.run diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake.rb new file mode 100644 index 00000000..0dfd0531 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true +#-- +# Copyright 2003-2010 by Jim Weirich (jim.weirich@gmail.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +#++ + +module Rake; end + +require "rake/version" + +require "rbconfig" +require "fileutils" +require "singleton" +require "monitor" +require "optparse" +require "ostruct" + +require "rake/ext/string" + +require "rake/win32" + +require "rake/linked_list" +require "rake/cpu_counter" +require "rake/scope" +require "rake/task_argument_error" +require "rake/rule_recursion_overflow_error" +require "rake/rake_module" +require "rake/trace_output" +require "rake/pseudo_status" +require "rake/task_arguments" +require "rake/invocation_chain" +require "rake/task" +require "rake/file_task" +require "rake/file_creation_task" +require "rake/multi_task" +require "rake/dsl_definition" +require "rake/file_utils_ext" +require "rake/file_list" +require "rake/default_loader" +require "rake/early_time" +require "rake/late_time" +require "rake/name_space" +require "rake/task_manager" +require "rake/application" +require "rake/backtrace" + +$trace = false + +# :stopdoc: +# +# Some top level Constants. + +FileList = Rake::FileList +RakeFileUtils = Rake::FileUtilsExt diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/application.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/application.rb new file mode 100644 index 00000000..c86cb1fa --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/application.rb @@ -0,0 +1,824 @@ +# frozen_string_literal: true +require "optparse" + +require "rake/task_manager" +require "rake/file_list" +require "rake/thread_pool" +require "rake/thread_history_display" +require "rake/trace_output" +require "rake/win32" + +module Rake + + CommandLineOptionError = Class.new(StandardError) + + ## + # Rake main application object. When invoking +rake+ from the + # command line, a Rake::Application object is created and run. + + class Application + include TaskManager + include TraceOutput + + # The name of the application (typically 'rake') + attr_reader :name + + # The original directory where rake was invoked. + attr_reader :original_dir + + # Name of the actual rakefile used. + attr_reader :rakefile + + # Number of columns on the terminal + attr_accessor :terminal_columns + + # List of the top level task names (task names from the command line). + attr_reader :top_level_tasks + + # Override the detected TTY output state (mostly for testing) + attr_writer :tty_output + + DEFAULT_RAKEFILES = [ + "rakefile", + "Rakefile", + "rakefile.rb", + "Rakefile.rb" + ].freeze + + # Initialize a Rake::Application object. + def initialize + super + @name = "rake" + @rakefiles = DEFAULT_RAKEFILES.dup + @rakefile = nil + @pending_imports = [] + @imported = [] + @loaders = {} + @default_loader = Rake::DefaultLoader.new + @original_dir = Dir.pwd + @top_level_tasks = [] + add_loader("rb", DefaultLoader.new) + add_loader("rf", DefaultLoader.new) + add_loader("rake", DefaultLoader.new) + @tty_output = STDOUT.tty? + @terminal_columns = ENV["RAKE_COLUMNS"].to_i + + set_default_options + end + + # Run the Rake application. The run method performs the following + # three steps: + # + # * Initialize the command line options (+init+). + # * Define the tasks (+load_rakefile+). + # * Run the top level tasks (+top_level+). + # + # If you wish to build a custom rake command, you should call + # +init+ on your application. Then define any tasks. Finally, + # call +top_level+ to run your top level tasks. + def run(argv = ARGV) + standard_exception_handling do + init "rake", argv + load_rakefile + top_level + end + end + + # Initialize the command line parameters and app name. + def init(app_name="rake", argv = ARGV) + standard_exception_handling do + @name = app_name + begin + args = handle_options argv + rescue ArgumentError + # Backword compatibility for capistrano + args = handle_options + end + collect_command_line_tasks(args) + end + end + + # Find the rakefile and then load it and any pending imports. + def load_rakefile + standard_exception_handling do + raw_load_rakefile + end + end + + # Run the top level tasks of a Rake application. + def top_level + run_with_threads do + if options.show_tasks + display_tasks_and_comments + elsif options.show_prereqs + display_prerequisites + else + top_level_tasks.each { |task_name| invoke_task(task_name) } + end + end + end + + # Run the given block with the thread startup and shutdown. + def run_with_threads + thread_pool.gather_history if options.job_stats == :history + + yield + + thread_pool.join + if options.job_stats + stats = thread_pool.statistics + puts "Maximum active threads: #{stats[:max_active_threads]} + main" + puts "Total threads in play: #{stats[:total_threads_in_play]} + main" + end + ThreadHistoryDisplay.new(thread_pool.history).show if + options.job_stats == :history + end + + # Add a loader to handle imported files ending in the extension + # +ext+. + def add_loader(ext, loader) + ext = ".#{ext}" unless ext =~ /^\./ + @loaders[ext] = loader + end + + # Application options from the command line + def options + @options ||= OpenStruct.new + end + + # Return the thread pool used for multithreaded processing. + def thread_pool # :nodoc: + @thread_pool ||= ThreadPool.new(options.thread_pool_size || Rake.suggested_thread_count-1) + end + + # internal ---------------------------------------------------------------- + + # Invokes a task with arguments that are extracted from +task_string+ + def invoke_task(task_string) # :nodoc: + name, args = parse_task_string(task_string) + t = self[name] + t.invoke(*args) + end + + def parse_task_string(string) # :nodoc: + /^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s + + name = $1 + remaining_args = $2 + + return string, [] unless name + return name, [] if remaining_args.empty? + + args = [] + + begin + /\s*((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args + + remaining_args = $2 + args << $1.gsub(/\\(.)/, '\1') + end while remaining_args + + return name, args + end + + # Provide standard exception handling for the given block. + def standard_exception_handling # :nodoc: + yield + rescue SystemExit + # Exit silently with current status + raise + rescue OptionParser::InvalidOption => ex + $stderr.puts ex.message + exit(false) + rescue Exception => ex + # Exit with error message + display_error_message(ex) + exit_because_of_exception(ex) + end + + # Exit the program because of an unhandled exception. + # (may be overridden by subclasses) + def exit_because_of_exception(ex) # :nodoc: + exit(false) + end + + # Display the error message that caused the exception. + def display_error_message(ex) # :nodoc: + trace "#{name} aborted!" + display_exception_details(ex) + trace "Tasks: #{ex.chain}" if has_chain?(ex) + trace "(See full trace by running task with --trace)" unless + options.backtrace + end + + def display_exception_details(ex) # :nodoc: + display_exception_details_seen << ex + + display_exception_message_details(ex) + display_exception_backtrace(ex) + display_cause_details(ex.cause) if has_cause?(ex) + end + + def display_cause_details(ex) # :nodoc: + return if display_exception_details_seen.include? ex + + trace "\nCaused by:" + display_exception_details(ex) + end + + def display_exception_details_seen # :nodoc: + Thread.current[:rake_display_exception_details_seen] ||= [] + end + + def has_cause?(ex) # :nodoc: + ex.respond_to?(:cause) && ex.cause + end + + def display_exception_message_details(ex) # :nodoc: + if ex.instance_of?(RuntimeError) + trace ex.message + else + trace "#{ex.class.name}: #{ex.message}" + end + end + + def display_exception_backtrace(ex) # :nodoc: + if options.backtrace + trace ex.backtrace.join("\n") + else + trace Backtrace.collapse(ex.backtrace).join("\n") + end + end + + # Warn about deprecated usage. + # + # Example: + # Rake.application.deprecate("import", "Rake.import", caller.first) + # + def deprecate(old_usage, new_usage, call_site) # :nodoc: + unless options.ignore_deprecate + $stderr.puts "WARNING: '#{old_usage}' is deprecated. " + + "Please use '#{new_usage}' instead.\n" + + " at #{call_site}" + end + end + + # Does the exception have a task invocation chain? + def has_chain?(exception) # :nodoc: + exception.respond_to?(:chain) && exception.chain + end + private :has_chain? + + # True if one of the files in RAKEFILES is in the current directory. + # If a match is found, it is copied into @rakefile. + def have_rakefile # :nodoc: + @rakefiles.each do |fn| + if File.exist?(fn) + others = FileList.glob(fn, File::FNM_CASEFOLD) + return others.size == 1 ? others.first : fn + elsif fn == "" + return fn + end + end + return nil + end + + # True if we are outputting to TTY, false otherwise + def tty_output? # :nodoc: + @tty_output + end + + # We will truncate output if we are outputting to a TTY or if we've been + # given an explicit column width to honor + def truncate_output? # :nodoc: + tty_output? || @terminal_columns.nonzero? + end + + # Display the tasks and comments. + def display_tasks_and_comments # :nodoc: + displayable_tasks = tasks.select { |t| + (options.show_all_tasks || t.comment) && + t.name =~ options.show_task_pattern + } + case options.show_tasks + when :tasks + width = displayable_tasks.map { |t| t.name_with_args.length }.max || 10 + if truncate_output? + max_column = terminal_width - name.size - width - 7 + else + max_column = nil + end + + displayable_tasks.each do |t| + printf("#{name} %-#{width}s # %s\n", + t.name_with_args, + max_column ? truncate(t.comment, max_column) : t.comment) + end + when :describe + displayable_tasks.each do |t| + puts "#{name} #{t.name_with_args}" + comment = t.full_comment || "" + comment.split("\n").each do |line| + puts " #{line}" + end + puts + end + when :lines + displayable_tasks.each do |t| + t.locations.each do |loc| + printf "#{name} %-30s %s\n", t.name_with_args, loc + end + end + else + fail "Unknown show task mode: '#{options.show_tasks}'" + end + end + + def terminal_width # :nodoc: + if @terminal_columns.nonzero? + result = @terminal_columns + else + result = unix? ? dynamic_width : 80 + end + (result < 10) ? 80 : result + rescue + 80 + end + + # Calculate the dynamic width of the + def dynamic_width # :nodoc: + @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput) + end + + def dynamic_width_stty # :nodoc: + %x{stty size 2>/dev/null}.split[1].to_i + end + + def dynamic_width_tput # :nodoc: + %x{tput cols 2>/dev/null}.to_i + end + + def unix? # :nodoc: + RbConfig::CONFIG["host_os"] =~ + /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i + end + + def windows? # :nodoc: + Win32.windows? + end + + def truncate(string, width) # :nodoc: + if string.nil? + "" + elsif string.length <= width + string + else + (string[0, width - 3] || "") + "..." + end + end + + # Display the tasks and prerequisites + def display_prerequisites # :nodoc: + tasks.each do |t| + puts "#{name} #{t.name}" + t.prerequisites.each { |pre| puts " #{pre}" } + end + end + + def trace(*strings) # :nodoc: + options.trace_output ||= $stderr + trace_on(options.trace_output, *strings) + end + + def sort_options(options) # :nodoc: + options.sort_by { |opt| + opt.select { |o| o =~ /^-/ }.map(&:downcase).sort.reverse + } + end + private :sort_options + + # A list of all the standard options used in rake, suitable for + # passing to OptionParser. + def standard_rake_options # :nodoc: + sort_options( + [ + ["--all", "-A", + "Show all tasks, even uncommented ones (in combination with -T or -D)", + lambda { |value| + options.show_all_tasks = value + } + ], + ["--backtrace=[OUT]", + "Enable full backtrace. OUT can be stderr (default) or stdout.", + lambda { |value| + options.backtrace = true + select_trace_output(options, "backtrace", value) + } + ], + ["--build-all", "-B", + "Build all prerequisites, including those which are up-to-date.", + lambda { |value| + options.build_all = true + } + ], + ["--comments", + "Show commented tasks only", + lambda { |value| + options.show_all_tasks = !value + } + ], + ["--describe", "-D [PATTERN]", + "Describe the tasks (matching optional PATTERN), then exit.", + lambda { |value| + select_tasks_to_show(options, :describe, value) + } + ], + ["--dry-run", "-n", + "Do a dry run without executing actions.", + lambda { |value| + Rake.verbose(true) + Rake.nowrite(true) + options.dryrun = true + options.trace = true + } + ], + ["--execute", "-e CODE", + "Execute some Ruby code and exit.", + lambda { |value| + eval(value) + exit + } + ], + ["--execute-print", "-p CODE", + "Execute some Ruby code, print the result, then exit.", + lambda { |value| + puts eval(value) + exit + } + ], + ["--execute-continue", "-E CODE", + "Execute some Ruby code, " + + "then continue with normal task processing.", + lambda { |value| eval(value) } + ], + ["--jobs", "-j [NUMBER]", + "Specifies the maximum number of tasks to execute in parallel. " + + "(default is number of CPU cores + 4)", + lambda { |value| + if value.nil? || value == "" + value = Float::INFINITY + elsif value =~ /^\d+$/ + value = value.to_i + else + value = Rake.suggested_thread_count + end + value = 1 if value < 1 + options.thread_pool_size = value - 1 + } + ], + ["--job-stats [LEVEL]", + "Display job statistics. " + + "LEVEL=history displays a complete job list", + lambda { |value| + if value =~ /^history/i + options.job_stats = :history + else + options.job_stats = true + end + } + ], + ["--libdir", "-I LIBDIR", + "Include LIBDIR in the search path for required modules.", + lambda { |value| $:.push(value) } + ], + ["--multitask", "-m", + "Treat all tasks as multitasks.", + lambda { |value| options.always_multitask = true } + ], + ["--no-search", "--nosearch", + "-N", "Do not search parent directories for the Rakefile.", + lambda { |value| options.nosearch = true } + ], + ["--prereqs", "-P", + "Display the tasks and dependencies, then exit.", + lambda { |value| options.show_prereqs = true } + ], + ["--quiet", "-q", + "Do not log messages to standard output.", + lambda { |value| Rake.verbose(false) } + ], + ["--rakefile", "-f [FILENAME]", + "Use FILENAME as the rakefile to search for.", + lambda { |value| + value ||= "" + @rakefiles.clear + @rakefiles << value + } + ], + ["--rakelibdir", "--rakelib", "-R RAKELIBDIR", + "Auto-import any .rake files in RAKELIBDIR. " + + "(default is 'rakelib')", + lambda { |value| + options.rakelib = value.split(File::PATH_SEPARATOR) + } + ], + ["--require", "-r MODULE", + "Require MODULE before executing rakefile.", + lambda { |value| + begin + require value + rescue LoadError => ex + begin + rake_require value + rescue LoadError + raise ex + end + end + } + ], + ["--rules", + "Trace the rules resolution.", + lambda { |value| options.trace_rules = true } + ], + ["--silent", "-s", + "Like --quiet, but also suppresses the " + + "'in directory' announcement.", + lambda { |value| + Rake.verbose(false) + options.silent = true + } + ], + ["--suppress-backtrace PATTERN", + "Suppress backtrace lines matching regexp PATTERN. " + + "Ignored if --trace is on.", + lambda { |value| + options.suppress_backtrace_pattern = Regexp.new(value) + } + ], + ["--system", "-g", + "Using system wide (global) rakefiles " + + "(usually '~/.rake/*.rake').", + lambda { |value| options.load_system = true } + ], + ["--no-system", "--nosystem", "-G", + "Use standard project Rakefile search paths, " + + "ignore system wide rakefiles.", + lambda { |value| options.ignore_system = true } + ], + ["--tasks", "-T [PATTERN]", + "Display the tasks (matching optional PATTERN) " + + "with descriptions, then exit. " + + "-AT combination displays all of tasks contained no description.", + lambda { |value| + select_tasks_to_show(options, :tasks, value) + } + ], + ["--trace=[OUT]", "-t", + "Turn on invoke/execute tracing, enable full backtrace. " + + "OUT can be stderr (default) or stdout.", + lambda { |value| + options.trace = true + options.backtrace = true + select_trace_output(options, "trace", value) + Rake.verbose(true) + } + ], + ["--verbose", "-v", + "Log message to standard output.", + lambda { |value| Rake.verbose(true) } + ], + ["--version", "-V", + "Display the program version.", + lambda { |value| + puts "rake, version #{Rake::VERSION}" + exit + } + ], + ["--where", "-W [PATTERN]", + "Describe the tasks (matching optional PATTERN), then exit.", + lambda { |value| + select_tasks_to_show(options, :lines, value) + options.show_all_tasks = true + } + ], + ["--no-deprecation-warnings", "-X", + "Disable the deprecation warnings.", + lambda { |value| + options.ignore_deprecate = true + } + ], + ]) + end + + def select_tasks_to_show(options, show_tasks, value) # :nodoc: + options.show_tasks = show_tasks + options.show_task_pattern = Regexp.new(value || "") + Rake::TaskManager.record_task_metadata = true + end + private :select_tasks_to_show + + def select_trace_output(options, trace_option, value) # :nodoc: + value = value.strip unless value.nil? + case value + when "stdout" + options.trace_output = $stdout + when "stderr", nil + options.trace_output = $stderr + else + fail CommandLineOptionError, + "Unrecognized --#{trace_option} option '#{value}'" + end + end + private :select_trace_output + + # Read and handle the command line options. Returns the command line + # arguments that we didn't understand, which should (in theory) be just + # task names and env vars. + def handle_options(argv) # :nodoc: + set_default_options + + OptionParser.new do |opts| + opts.banner = "#{Rake.application.name} [-f rakefile] {options} targets..." + opts.separator "" + opts.separator "Options are ..." + + opts.on_tail("-h", "--help", "-H", "Display this help message.") do + puts opts + exit + end + + standard_rake_options.each { |args| opts.on(*args) } + opts.environment("RAKEOPT") + end.parse(argv) + end + + # Similar to the regular Ruby +require+ command, but will check + # for *.rake files in addition to *.rb files. + def rake_require(file_name, paths=$LOAD_PATH, loaded=$") # :nodoc: + fn = file_name + ".rake" + return false if loaded.include?(fn) + paths.each do |path| + full_path = File.join(path, fn) + if File.exist?(full_path) + Rake.load_rakefile(full_path) + loaded << fn + return true + end + end + fail LoadError, "Can't find #{file_name}" + end + + def find_rakefile_location # :nodoc: + here = Dir.pwd + until (fn = have_rakefile) + Dir.chdir("..") + return nil if Dir.pwd == here || options.nosearch + here = Dir.pwd + end + [fn, here] + ensure + Dir.chdir(Rake.original_dir) + end + + def print_rakefile_directory(location) # :nodoc: + $stderr.puts "(in #{Dir.pwd})" unless + options.silent or original_dir == location + end + + def raw_load_rakefile # :nodoc: + rakefile, location = find_rakefile_location + if (! options.ignore_system) && + (options.load_system || rakefile.nil?) && + system_dir && File.directory?(system_dir) + print_rakefile_directory(location) + glob("#{system_dir}/*.rake") do |name| + add_import name + end + else + fail "No Rakefile found (looking for: #{@rakefiles.join(', ')})" if + rakefile.nil? + @rakefile = rakefile + Dir.chdir(location) + print_rakefile_directory(location) + Rake.load_rakefile(File.expand_path(@rakefile)) if + @rakefile && @rakefile != "" + options.rakelib.each do |rlib| + glob("#{rlib}/*.rake") do |name| + add_import name + end + end + end + load_imports + end + + def glob(path, &block) # :nodoc: + FileList.glob(path.tr("\\", "/")).each(&block) + end + private :glob + + # The directory path containing the system wide rakefiles. + def system_dir # :nodoc: + @system_dir ||= + begin + if ENV["RAKE_SYSTEM"] + ENV["RAKE_SYSTEM"] + else + standard_system_dir + end + end + end + + # The standard directory containing system wide rake files. + if Win32.windows? + def standard_system_dir #:nodoc: + Win32.win32_system_dir + end + else + def standard_system_dir #:nodoc: + File.join(File.expand_path("~"), ".rake") + end + end + private :standard_system_dir + + # Collect the list of tasks on the command line. If no tasks are + # given, return a list containing only the default task. + # Environmental assignments are processed at this time as well. + # + # `args` is the list of arguments to peruse to get the list of tasks. + # It should be the command line that was given to rake, less any + # recognised command-line options, which OptionParser.parse will + # have taken care of already. + def collect_command_line_tasks(args) # :nodoc: + @top_level_tasks = [] + args.each do |arg| + if arg =~ /^(\w+)=(.*)$/m + ENV[$1] = $2 + else + @top_level_tasks << arg unless arg =~ /^-/ + end + end + @top_level_tasks.push(default_task_name) if @top_level_tasks.empty? + end + + # Default task name ("default"). + # (May be overridden by subclasses) + def default_task_name # :nodoc: + "default" + end + + # Add a file to the list of files to be imported. + def add_import(fn) # :nodoc: + @pending_imports << fn + end + + # Load the pending list of imported files. + def load_imports # :nodoc: + while fn = @pending_imports.shift + next if @imported.member?(fn) + fn_task = lookup(fn) and fn_task.invoke + ext = File.extname(fn) + loader = @loaders[ext] || @default_loader + loader.load(fn) + if fn_task = lookup(fn) and fn_task.needed? + fn_task.reenable + fn_task.invoke + loader.load(fn) + end + @imported << fn + end + end + + def rakefile_location(backtrace=caller) # :nodoc: + backtrace.map { |t| t[/([^:]+):/, 1] } + + re = /^#{@rakefile}$/ + re = /#{re.source}/i if windows? + + backtrace.find { |str| str =~ re } || "" + end + + def set_default_options + options.always_multitask = false + options.backtrace = false + options.build_all = false + options.dryrun = false + options.ignore_deprecate = false + options.ignore_system = false + options.job_stats = false + options.load_system = false + options.nosearch = false + options.rakelib = %w[rakelib] + options.show_all_tasks = false + options.show_prereqs = false + options.show_task_pattern = nil + options.show_tasks = nil + options.silent = false + options.suppress_backtrace_pattern = nil + options.thread_pool_size = Rake.suggested_thread_count + options.trace = false + options.trace_output = $stderr + options.trace_rules = false + end + + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/backtrace.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/backtrace.rb new file mode 100644 index 00000000..31ff0545 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/backtrace.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module Rake + module Backtrace # :nodoc: all + SYS_KEYS = RbConfig::CONFIG.keys.grep(/(?:[a-z]prefix|libdir)\z/) + SYS_PATHS = RbConfig::CONFIG.values_at(*SYS_KEYS).uniq + + [ File.join(File.dirname(__FILE__), "..") ] + + SUPPRESSED_PATHS = SYS_PATHS. + map { |s| s.tr("\\", "/") }. + map { |f| File.expand_path(f) }. + reject { |s| s.nil? || s =~ /^ *$/ } + SUPPRESSED_PATHS_RE = SUPPRESSED_PATHS.map { |f| Regexp.quote(f) }.join("|") + SUPPRESSED_PATHS_RE << "|^org\\/jruby\\/\\w+\\.java" if + Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == "jruby" + + SUPPRESS_PATTERN = %r!(\A(#{SUPPRESSED_PATHS_RE})|bin/rake:\d+)!i + + def self.collapse(backtrace) + pattern = Rake.application.options.suppress_backtrace_pattern || + SUPPRESS_PATTERN + backtrace.reject { |elem| elem =~ pattern } + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/clean.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/clean.rb new file mode 100644 index 00000000..5af44015 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/clean.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true +# The 'rake/clean' file defines two file lists (CLEAN and CLOBBER) and +# two rake tasks (:clean and :clobber). +# +# [:clean] Clean up the project by deleting scratch files and backup +# files. Add files to the CLEAN file list to have the :clean +# target handle them. +# +# [:clobber] Clobber all generated and non-source files in a project. +# The task depends on :clean, so all the clean files will +# be deleted as well as files in the CLOBBER file list. +# The intent of this task is to return a project to its +# pristine, just unpacked state. + +require "rake" + +# :stopdoc: + +module Rake + module Cleaner + extend FileUtils + + module_function + + def cleanup_files(file_names) + file_names.each do |file_name| + cleanup(file_name) + end + end + + def cleanup(file_name, opts={}) + begin + opts = { verbose: Rake.application.options.trace }.merge(opts) + rm_r file_name, opts + rescue StandardError => ex + puts "Failed to remove #{file_name}: #{ex}" unless file_already_gone?(file_name) + end + end + + def file_already_gone?(file_name) + return false if File.exist?(file_name) + + path = file_name + prev = nil + + while path = File.dirname(path) + return false if cant_be_deleted?(path) + break if [prev, "."].include?(path) + prev = path + end + true + end + private_class_method :file_already_gone? + + def cant_be_deleted?(path_name) + File.exist?(path_name) && + (!File.readable?(path_name) || !File.executable?(path_name)) + end + private_class_method :cant_be_deleted? + end +end + +CLEAN = ::Rake::FileList["**/*~", "**/*.bak", "**/core"] +CLEAN.clear_exclude.exclude { |fn| + fn.pathmap("%f").downcase == "core" && File.directory?(fn) +} + +desc "Remove any temporary products." +task :clean do + Rake::Cleaner.cleanup_files(CLEAN) +end + +CLOBBER = ::Rake::FileList.new + +desc "Remove any generated files." +task clobber: [:clean] do + Rake::Cleaner.cleanup_files(CLOBBER) +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cloneable.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cloneable.rb new file mode 100644 index 00000000..eddb77e2 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cloneable.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module Rake + ## + # Mixin for creating easily cloned objects. + + module Cloneable # :nodoc: + # The hook that is invoked by 'clone' and 'dup' methods. + def initialize_copy(source) + super + source.instance_variables.each do |var| + src_value = source.instance_variable_get(var) + value = src_value.clone rescue src_value + instance_variable_set(var, value) + end + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cpu_counter.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cpu_counter.rb new file mode 100644 index 00000000..f3bf6d63 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/cpu_counter.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true +module Rake + + # Based on a script at: + # http://stackoverflow.com/questions/891537/ruby-detect-number-of-cpus-installed + class CpuCounter # :nodoc: all + def self.count + new.count_with_default + end + + def count_with_default(default=4) + count || default + rescue StandardError + default + end + + begin + require "etc" + rescue LoadError + else + if Etc.respond_to?(:nprocessors) + def count + return Etc.nprocessors + end + end + end + end +end + +unless Rake::CpuCounter.method_defined?(:count) + Rake::CpuCounter.class_eval <<-'end;', __FILE__, __LINE__+1 + require 'rbconfig' + + def count + if defined?(Java::Java) + count_via_java_runtime + else + case RbConfig::CONFIG['host_os'] + when /linux/ + count_via_cpuinfo + when /darwin|bsd/ + count_via_sysctl + when /mswin|mingw/ + count_via_win32 + else + # Try everything + count_via_win32 || + count_via_sysctl || + count_via_cpuinfo + end + end + end + + def count_via_java_runtime + Java::Java.lang.Runtime.getRuntime.availableProcessors + rescue StandardError + nil + end + + def count_via_win32 + require 'win32ole' + wmi = WIN32OLE.connect("winmgmts://") + cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this + cpu.to_enum.first.NumberOfCores + rescue StandardError, LoadError + nil + end + + def count_via_cpuinfo + open('/proc/cpuinfo') { |f| f.readlines }.grep(/processor/).size + rescue StandardError + nil + end + + def count_via_sysctl + run 'sysctl', '-n', 'hw.ncpu' + end + + def run(command, *args) + cmd = resolve_command(command) + if cmd + IO.popen [cmd, *args] do |io| + io.read.to_i + end + else + nil + end + end + + def resolve_command(command) + look_for_command("/usr/sbin", command) || + look_for_command("/sbin", command) || + in_path_command(command) + end + + def look_for_command(dir, command) + path = File.join(dir, command) + File.exist?(path) ? path : nil + end + + def in_path_command(command) + IO.popen ['which', command] do |io| + io.eof? ? nil : command + end + end + end; +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/default_loader.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/default_loader.rb new file mode 100644 index 00000000..d3b4650d --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/default_loader.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module Rake + + # Default Rakefile loader used by +import+. + class DefaultLoader + + ## + # Loads a rakefile into the current application from +fn+ + + def load(fn) + Rake.load_rakefile(File.expand_path(fn)) + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/dsl_definition.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/dsl_definition.rb new file mode 100644 index 00000000..3962c167 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/dsl_definition.rb @@ -0,0 +1,195 @@ +# frozen_string_literal: true +# Rake DSL functions. +require "rake/file_utils_ext" + +module Rake + + ## + # DSL is a module that provides #task, #desc, #namespace, etc. Use this + # when you'd like to use rake outside the top level scope. + # + # For a Rakefile you run from the command line this module is automatically + # included. + + module DSL + + #-- + # Include the FileUtils file manipulation functions in the top + # level module, but mark them private so that they don't + # unintentionally define methods on other objects. + #++ + + include FileUtilsExt + private(*FileUtils.instance_methods(false)) + private(*FileUtilsExt.instance_methods(false)) + + private + + # :call-seq: + # task task_name + # task task_name: dependencies + # task task_name, arguments => dependencies + # + # Declare a basic task. The +task_name+ is always the first argument. If + # the task name contains a ":" it is defined in that namespace. + # + # The +dependencies+ may be a single task name or an Array of task names. + # The +argument+ (a single name) or +arguments+ (an Array of names) define + # the arguments provided to the task. + # + # The task, argument and dependency names may be either symbols or + # strings. + # + # A task with a single dependency: + # + # task clobber: %w[clean] do + # rm_rf "html" + # end + # + # A task with an argument and a dependency: + # + # task :package, [:version] => :test do |t, args| + # # ... + # end + # + # To invoke this task from the command line: + # + # $ rake package[1.2.3] + # + def task(*args, &block) # :doc: + Rake::Task.define_task(*args, &block) + end + + # Declare a file task. + # + # Example: + # file "config.cfg" => ["config.template"] do + # open("config.cfg", "w") do |outfile| + # open("config.template") do |infile| + # while line = infile.gets + # outfile.puts line + # end + # end + # end + # end + # + def file(*args, &block) # :doc: + Rake::FileTask.define_task(*args, &block) + end + + # Declare a file creation task. + # (Mainly used for the directory command). + def file_create(*args, &block) + Rake::FileCreationTask.define_task(*args, &block) + end + + # Declare a set of files tasks to create the given directories on + # demand. + # + # Example: + # directory "testdata/doc" + # + def directory(*args, &block) # :doc: + result = file_create(*args, &block) + dir, _ = *Rake.application.resolve_args(args) + dir = Rake.from_pathname(dir) + Rake.each_dir_parent(dir) do |d| + file_create d do |t| + mkdir_p t.name unless File.exist?(t.name) + end + end + result + end + + # Declare a task that performs its prerequisites in + # parallel. Multitasks does *not* guarantee that its prerequisites + # will execute in any given order (which is obvious when you think + # about it) + # + # Example: + # multitask deploy: %w[deploy_gem deploy_rdoc] + # + def multitask(*args, &block) # :doc: + Rake::MultiTask.define_task(*args, &block) + end + + # Create a new rake namespace and use it for evaluating the given + # block. Returns a NameSpace object that can be used to lookup + # tasks defined in the namespace. + # + # Example: + # + # ns = namespace "nested" do + # # the "nested:run" task + # task :run + # end + # task_run = ns[:run] # find :run in the given namespace. + # + # Tasks can also be defined in a namespace by using a ":" in the task + # name: + # + # task "nested:test" do + # # ... + # end + # + def namespace(name=nil, &block) # :doc: + name = name.to_s if name.kind_of?(Symbol) + name = name.to_str if name.respond_to?(:to_str) + unless name.kind_of?(String) || name.nil? + raise ArgumentError, "Expected a String or Symbol for a namespace name" + end + Rake.application.in_namespace(name, &block) + end + + # Declare a rule for auto-tasks. + # + # Example: + # rule '.o' => '.c' do |t| + # sh 'cc', '-o', t.name, t.source + # end + # + def rule(*args, &block) # :doc: + Rake::Task.create_rule(*args, &block) + end + + # Describes the next rake task. Duplicate descriptions are discarded. + # Descriptions are shown with rake -T (up to the first + # sentence) and rake -D (the entire description). + # + # Example: + # desc "Run the Unit Tests" + # task test: [:build] + # # ... run tests + # end + # + def desc(description) # :doc: + Rake.application.last_description = description + end + + # Import the partial Rakefiles +fn+. Imported files are loaded + # _after_ the current file is completely loaded. This allows the + # import statement to appear anywhere in the importing file, and yet + # allowing the imported files to depend on objects defined in the + # importing file. + # + # A common use of the import statement is to include files + # containing dependency declarations. + # + # See also the --rakelibdir command line option. + # + # Example: + # import ".depend", "my_rules" + # + def import(*fns) # :doc: + fns.each do |fn| + Rake.application.add_import(fn) + end + end + end + extend FileUtilsExt +end + +# Extend the main object with the DSL commands. This allows top-level +# calls to task, etc. to work from a Rakefile without polluting the +# object inheritance tree. +self.extend Rake::DSL diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/early_time.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/early_time.rb new file mode 100644 index 00000000..80cc6bfa --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/early_time.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module Rake + + # EarlyTime is a fake timestamp that occurs _before_ any other time value. + class EarlyTime + include Comparable + include Singleton + + ## + # The EarlyTime always comes before +other+! + + def <=>(other) + -1 + end + + def to_s # :nodoc: + "" + end + end + + EARLY = EarlyTime.instance +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/core.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/core.rb new file mode 100644 index 00000000..226f2125 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/core.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +class Module + # Check for an existing method in the current class before extending. If + # the method already exists, then a warning is printed and the extension is + # not added. Otherwise the block is yielded and any definitions in the + # block will take effect. + # + # Usage: + # + # class String + # rake_extension("xyz") do + # def xyz + # ... + # end + # end + # end + # + def rake_extension(method) # :nodoc: + if method_defined?(method) + $stderr.puts "WARNING: Possible conflict with Rake extension: " + + "#{self}##{method} already exists" + else + yield + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/string.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/string.rb new file mode 100644 index 00000000..c70236ae --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/ext/string.rb @@ -0,0 +1,176 @@ +# frozen_string_literal: true +require "rake/ext/core" + +class String + + rake_extension("ext") do + # Replace the file extension with +newext+. If there is no extension on + # the string, append the new extension to the end. If the new extension + # is not given, or is the empty string, remove any existing extension. + # + # +ext+ is a user added method for the String class. + # + # This String extension comes from Rake + def ext(newext="") + return self.dup if [".", ".."].include? self + if newext != "" + newext = "." + newext unless newext =~ /^\./ + end + self.chomp(File.extname(self)) << newext + end + end + + rake_extension("pathmap") do + # Explode a path into individual components. Used by +pathmap+. + # + # This String extension comes from Rake + def pathmap_explode + head, tail = File.split(self) + return [self] if head == self + return [tail] if head == "." || tail == "/" + return [head, tail] if head == "/" + return head.pathmap_explode + [tail] + end + protected :pathmap_explode + + # Extract a partial path from the path. Include +n+ directories from the + # front end (left hand side) if +n+ is positive. Include |+n+| + # directories from the back end (right hand side) if +n+ is negative. + # + # This String extension comes from Rake + def pathmap_partial(n) + dirs = File.dirname(self).pathmap_explode + partial_dirs = + if n > 0 + dirs[0...n] + elsif n < 0 + dirs.reverse[0...-n].reverse + else + "." + end + File.join(partial_dirs) + end + protected :pathmap_partial + + # Perform the pathmap replacement operations on the given path. The + # patterns take the form 'pat1,rep1;pat2,rep2...'. + # + # This String extension comes from Rake + def pathmap_replace(patterns, &block) + result = self + patterns.split(";").each do |pair| + pattern, replacement = pair.split(",") + pattern = Regexp.new(pattern) + if replacement == "*" && block_given? + result = result.sub(pattern, &block) + elsif replacement + result = result.sub(pattern, replacement) + else + result = result.sub(pattern, "") + end + end + result + end + protected :pathmap_replace + + # Map the path according to the given specification. The specification + # controls the details of the mapping. The following special patterns are + # recognized: + # + # %p :: The complete path. + # %f :: The base file name of the path, with its file extension, + # but without any directories. + # %n :: The file name of the path without its file extension. + # %d :: The directory list of the path. + # %x :: The file extension of the path. An empty string if there + # is no extension. + # %X :: Everything *but* the file extension. + # %s :: The alternate file separator if defined, otherwise use # + # the standard file separator. + # %% :: A percent sign. + # + # The %d specifier can also have a numeric prefix (e.g. '%2d'). + # If the number is positive, only return (up to) +n+ directories in the + # path, starting from the left hand side. If +n+ is negative, return (up + # to) +n+ directories from the right hand side of the path. + # + # Examples: + # + # 'a/b/c/d/file.txt'.pathmap("%2d") => 'a/b' + # 'a/b/c/d/file.txt'.pathmap("%-2d") => 'c/d' + # + # Also the %d, %p, %f, %n, + # %x, and %X operators can take a pattern/replacement + # argument to perform simple string substitutions on a particular part of + # the path. The pattern and replacement are separated by a comma and are + # enclosed by curly braces. The replacement spec comes after the % + # character but before the operator letter. (e.g. "%{old,new}d"). + # Multiple replacement specs should be separated by semi-colons (e.g. + # "%{old,new;src,bin}d"). + # + # Regular expressions may be used for the pattern, and back refs may be + # used in the replacement text. Curly braces, commas and semi-colons are + # excluded from both the pattern and replacement text (let's keep parsing + # reasonable). + # + # For example: + # + # "src/org/onestepback/proj/A.java".pathmap("%{^src,class}X.class") + # + # returns: + # + # "class/org/onestepback/proj/A.class" + # + # If the replacement text is '*', then a block may be provided to perform + # some arbitrary calculation for the replacement. + # + # For example: + # + # "/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext| + # ext.downcase + # } + # + # Returns: + # + # "/path/to/file.txt" + # + # This String extension comes from Rake + def pathmap(spec=nil, &block) + return self if spec.nil? + result = "".dup + spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag| + case frag + when "%f" + result << File.basename(self) + when "%n" + result << File.basename(self).ext + when "%d" + result << File.dirname(self) + when "%x" + result << File.extname(self) + when "%X" + result << self.ext + when "%p" + result << self + when "%s" + result << (File::ALT_SEPARATOR || File::SEPARATOR) + when "%-" + # do nothing + when "%%" + result << "%" + when /%(-?\d+)d/ + result << pathmap_partial($1.to_i) + when /^%\{([^}]*)\}(\d*[dpfnxX])/ + patterns, operator = $1, $2 + result << pathmap("%" + operator).pathmap_replace(patterns, &block) + when /^%/ + fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'" + else + result << frag + end + end + result + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_creation_task.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_creation_task.rb new file mode 100644 index 00000000..2eb251bf --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_creation_task.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true +require "rake/file_task" +require "rake/early_time" + +module Rake + + # A FileCreationTask is a file task that when used as a dependency will be + # needed if and only if the file has not been created. Once created, it is + # not re-triggered if any of its dependencies are newer, nor does trigger + # any rebuilds of tasks that depend on it whenever it is updated. + # + class FileCreationTask < FileTask + # Is this file task needed? Yes if it doesn't exist. + def needed? + ! File.exist?(name) + end + + # Time stamp for file creation task. This time stamp is earlier + # than any other time stamp. + def timestamp + Rake::EARLY + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_list.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_list.rb new file mode 100644 index 00000000..e27de8db --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_list.rb @@ -0,0 +1,435 @@ +# frozen_string_literal: true +require "rake/cloneable" +require "rake/file_utils_ext" +require "rake/ext/string" + +module Rake + + ## + # A FileList is essentially an array with a few helper methods defined to + # make file manipulation a bit easier. + # + # FileLists are lazy. When given a list of glob patterns for possible files + # to be included in the file list, instead of searching the file structures + # to find the files, a FileList holds the pattern for latter use. + # + # This allows us to define a number of FileList to match any number of + # files, but only search out the actual files when then FileList itself is + # actually used. The key is that the first time an element of the + # FileList/Array is requested, the pending patterns are resolved into a real + # list of file names. + # + class FileList + + include Cloneable + + # == Method Delegation + # + # The lazy evaluation magic of FileLists happens by implementing all the + # array specific methods to call +resolve+ before delegating the heavy + # lifting to an embedded array object (@items). + # + # In addition, there are two kinds of delegation calls. The regular kind + # delegates to the @items array and returns the result directly. Well, + # almost directly. It checks if the returned value is the @items object + # itself, and if so will return the FileList object instead. + # + # The second kind of delegation call is used in methods that normally + # return a new Array object. We want to capture the return value of these + # methods and wrap them in a new FileList object. We enumerate these + # methods in the +SPECIAL_RETURN+ list below. + + # List of array methods (that are not in +Object+) that need to be + # delegated. + ARRAY_METHODS = (Array.instance_methods - Object.instance_methods).map(&:to_s) + + # List of additional methods that must be delegated. + MUST_DEFINE = %w[inspect <=>] + + # List of methods that should not be delegated here (we define special + # versions of them explicitly below). + MUST_NOT_DEFINE = %w[to_a to_ary partition * <<] + + # List of delegated methods that return new array values which need + # wrapping. + SPECIAL_RETURN = %w[ + map collect sort sort_by select find_all reject grep + compact flatten uniq values_at + + - & | + ] + + DELEGATING_METHODS = (ARRAY_METHODS + MUST_DEFINE - MUST_NOT_DEFINE).map(&:to_s).sort.uniq + + # Now do the delegation. + DELEGATING_METHODS.each do |sym| + if SPECIAL_RETURN.include?(sym) + ln = __LINE__ + 1 + class_eval %{ + def #{sym}(*args, &block) + resolve + result = @items.send(:#{sym}, *args, &block) + self.class.new.import(result) + end + }, __FILE__, ln + else + ln = __LINE__ + 1 + class_eval %{ + def #{sym}(*args, &block) + resolve + result = @items.send(:#{sym}, *args, &block) + result.object_id == @items.object_id ? self : result + end + }, __FILE__, ln + end + end + + GLOB_PATTERN = %r{[*?\[\{]} + + # Create a file list from the globbable patterns given. If you wish to + # perform multiple includes or excludes at object build time, use the + # "yield self" pattern. + # + # Example: + # file_list = FileList.new('lib/**/*.rb', 'test/test*.rb') + # + # pkg_files = FileList.new('lib/**/*') do |fl| + # fl.exclude(/\bCVS\b/) + # end + # + def initialize(*patterns) + @pending_add = [] + @pending = false + @exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup + @exclude_procs = DEFAULT_IGNORE_PROCS.dup + @items = [] + patterns.each { |pattern| include(pattern) } + yield self if block_given? + end + + # Add file names defined by glob patterns to the file list. If an array + # is given, add each element of the array. + # + # Example: + # file_list.include("*.java", "*.cfg") + # file_list.include %w( math.c lib.h *.o ) + # + def include(*filenames) + # TODO: check for pending + filenames.each do |fn| + if fn.respond_to? :to_ary + include(*fn.to_ary) + else + @pending_add << Rake.from_pathname(fn) + end + end + @pending = true + self + end + alias :add :include + + # Register a list of file name patterns that should be excluded from the + # list. Patterns may be regular expressions, glob patterns or regular + # strings. In addition, a block given to exclude will remove entries that + # return true when given to the block. + # + # Note that glob patterns are expanded against the file system. If a file + # is explicitly added to a file list, but does not exist in the file + # system, then an glob pattern in the exclude list will not exclude the + # file. + # + # Examples: + # FileList['a.c', 'b.c'].exclude("a.c") => ['b.c'] + # FileList['a.c', 'b.c'].exclude(/^a/) => ['b.c'] + # + # If "a.c" is a file, then ... + # FileList['a.c', 'b.c'].exclude("a.*") => ['b.c'] + # + # If "a.c" is not a file, then ... + # FileList['a.c', 'b.c'].exclude("a.*") => ['a.c', 'b.c'] + # + def exclude(*patterns, &block) + patterns.each do |pat| + if pat.respond_to? :to_ary + exclude(*pat.to_ary) + else + @exclude_patterns << Rake.from_pathname(pat) + end + end + @exclude_procs << block if block_given? + resolve_exclude unless @pending + self + end + + # Clear all the exclude patterns so that we exclude nothing. + def clear_exclude + @exclude_patterns = [] + @exclude_procs = [] + self + end + + # A FileList is equal through array equality. + def ==(array) + to_ary == array + end + + # Return the internal array object. + def to_a + resolve + @items + end + + # Return the internal array object. + def to_ary + to_a + end + + # Lie about our class. + def is_a?(klass) + klass == Array || super(klass) + end + alias kind_of? is_a? + + # Redefine * to return either a string or a new file list. + def *(other) + result = @items * other + case result + when Array + self.class.new.import(result) + else + result + end + end + + def <<(obj) + resolve + @items << Rake.from_pathname(obj) + self + end + + # Resolve all the pending adds now. + def resolve + if @pending + @pending = false + @pending_add.each do |fn| resolve_add(fn) end + @pending_add = [] + resolve_exclude + end + self + end + + def resolve_add(fn) # :nodoc: + case fn + when GLOB_PATTERN + add_matching(fn) + else + self << fn + end + end + private :resolve_add + + def resolve_exclude # :nodoc: + reject! { |fn| excluded_from_list?(fn) } + self + end + private :resolve_exclude + + # Return a new FileList with the results of running +sub+ against each + # element of the original list. + # + # Example: + # FileList['a.c', 'b.c'].sub(/\.c$/, '.o') => ['a.o', 'b.o'] + # + def sub(pat, rep) + inject(self.class.new) { |res, fn| res << fn.sub(pat, rep) } + end + + # Return a new FileList with the results of running +gsub+ against each + # element of the original list. + # + # Example: + # FileList['lib/test/file', 'x/y'].gsub(/\//, "\\") + # => ['lib\\test\\file', 'x\\y'] + # + def gsub(pat, rep) + inject(self.class.new) { |res, fn| res << fn.gsub(pat, rep) } + end + + # Same as +sub+ except that the original file list is modified. + def sub!(pat, rep) + each_with_index { |fn, i| self[i] = fn.sub(pat, rep) } + self + end + + # Same as +gsub+ except that the original file list is modified. + def gsub!(pat, rep) + each_with_index { |fn, i| self[i] = fn.gsub(pat, rep) } + self + end + + # Apply the pathmap spec to each of the included file names, returning a + # new file list with the modified paths. (See String#pathmap for + # details.) + def pathmap(spec=nil, &block) + collect { |fn| fn.pathmap(spec, &block) } + end + + # Return a new FileList with String#ext method applied to + # each member of the array. + # + # This method is a shortcut for: + # + # array.collect { |item| item.ext(newext) } + # + # +ext+ is a user added method for the Array class. + def ext(newext="") + collect { |fn| fn.ext(newext) } + end + + # Grep each of the files in the filelist using the given pattern. If a + # block is given, call the block on each matching line, passing the file + # name, line number, and the matching line of text. If no block is given, + # a standard emacs style file:linenumber:line message will be printed to + # standard out. Returns the number of matched items. + def egrep(pattern, *options) + matched = 0 + each do |fn| + begin + open(fn, "r", *options) do |inf| + count = 0 + inf.each do |line| + count += 1 + if pattern.match(line) + matched += 1 + if block_given? + yield fn, count, line + else + puts "#{fn}:#{count}:#{line}" + end + end + end + end + rescue StandardError => ex + $stderr.puts "Error while processing '#{fn}': #{ex}" + end + end + matched + end + + # Return a new file list that only contains file names from the current + # file list that exist on the file system. + def existing + select { |fn| File.exist?(fn) }.uniq + end + + # Modify the current file list so that it contains only file name that + # exist on the file system. + def existing! + resolve + @items = @items.select { |fn| File.exist?(fn) }.uniq + self + end + + # FileList version of partition. Needed because the nested arrays should + # be FileLists in this version. + def partition(&block) # :nodoc: + resolve + result = @items.partition(&block) + [ + self.class.new.import(result[0]), + self.class.new.import(result[1]), + ] + end + + # Convert a FileList to a string by joining all elements with a space. + def to_s + resolve + self.join(" ") + end + + # Add matching glob patterns. + def add_matching(pattern) + self.class.glob(pattern).each do |fn| + self << fn unless excluded_from_list?(fn) + end + end + private :add_matching + + # Should the given file name be excluded from the list? + # + # NOTE: This method was formerly named "exclude?", but Rails + # introduced an exclude? method as an array method and setup a + # conflict with file list. We renamed the method to avoid + # confusion. If you were using "FileList#exclude?" in your user + # code, you will need to update. + def excluded_from_list?(fn) + return true if @exclude_patterns.any? do |pat| + case pat + when Regexp + fn =~ pat + when GLOB_PATTERN + flags = File::FNM_PATHNAME + # Ruby <= 1.9.3 does not support File::FNM_EXTGLOB + flags |= File::FNM_EXTGLOB if defined? File::FNM_EXTGLOB + File.fnmatch?(pat, fn, flags) + else + fn == pat + end + end + @exclude_procs.any? { |p| p.call(fn) } + end + + DEFAULT_IGNORE_PATTERNS = [ + /(^|[\/\\])CVS([\/\\]|$)/, + /(^|[\/\\])\.svn([\/\\]|$)/, + /\.bak$/, + /~$/ + ] + DEFAULT_IGNORE_PROCS = [ + proc { |fn| fn =~ /(^|[\/\\])core$/ && ! File.directory?(fn) } + ] + + def import(array) # :nodoc: + @items = array + self + end + + class << self + # Create a new file list including the files listed. Similar to: + # + # FileList.new(*args) + def [](*args) + new(*args) + end + + # Get a sorted list of files matching the pattern. This method + # should be preferred to Dir[pattern] and Dir.glob(pattern) because + # the files returned are guaranteed to be sorted. + def glob(pattern, *args) + Dir.glob(pattern, *args).sort + end + end + end +end + +module Rake + class << self + + # Yield each file or directory component. + def each_dir_parent(dir) # :nodoc: + old_length = nil + while dir != "." && dir.length != old_length + yield(dir) + old_length = dir.length + dir = File.dirname(dir) + end + end + + # Convert Pathname and Pathname-like objects to strings; + # leave everything else alone + def from_pathname(path) # :nodoc: + path = path.to_path if path.respond_to?(:to_path) + path = path.to_str if path.respond_to?(:to_str) + path + end + end +end # module Rake diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_task.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_task.rb new file mode 100644 index 00000000..364d8e39 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_task.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +require "rake/task.rb" +require "rake/early_time" + +module Rake + + # A FileTask is a task that includes time based dependencies. If any of a + # FileTask's prerequisites have a timestamp that is later than the file + # represented by this task, then the file must be rebuilt (using the + # supplied actions). + # + class FileTask < Task + + # Is this file task needed? Yes if it doesn't exist, or if its time stamp + # is out of date. + def needed? + ! File.exist?(name) || out_of_date?(timestamp) || @application.options.build_all + end + + # Time stamp for file task. + def timestamp + if File.exist?(name) + File.mtime(name.to_s) + else + Rake::LATE + end + end + + private + + # Are there any prerequisites with a later time than the given time stamp? + def out_of_date?(stamp) + all_prerequisite_tasks.any? { |prereq| + prereq_task = application[prereq, @scope] + if prereq_task.instance_of?(Rake::FileTask) + prereq_task.timestamp > stamp || @application.options.build_all + else + prereq_task.timestamp > stamp + end + } + end + + # ---------------------------------------------------------------- + # Task class methods. + # + class << self + # Apply the scope to the task name according to the rules for this kind + # of task. File based tasks ignore the scope when creating the name. + def scope_name(scope, task_name) + Rake.from_pathname(task_name) + end + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils.rb new file mode 100644 index 00000000..3439befa --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils.rb @@ -0,0 +1,137 @@ +# frozen_string_literal: true +require "rbconfig" +require "fileutils" + +#-- +# This a FileUtils extension that defines several additional commands to be +# added to the FileUtils utility functions. +module FileUtils + # Path to the currently running Ruby program + RUBY = ENV["RUBY"] || File.join( + RbConfig::CONFIG["bindir"], + RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"]). + sub(/.*\s.*/m, '"\&"') + + # Run the system command +cmd+. If multiple arguments are given the command + # is run directly (without the shell, same semantics as Kernel::exec and + # Kernel::system). + # + # It is recommended you use the multiple argument form over interpolating + # user input for both usability and security reasons. With the multiple + # argument form you can easily process files with spaces or other shell + # reserved characters in them. With the multiple argument form your rake + # tasks are not vulnerable to users providing an argument like + # ; rm # -rf /. + # + # If a block is given, upon command completion the block is called with an + # OK flag (true on a zero exit status) and a Process::Status object. + # Without a block a RuntimeError is raised when the command exits non-zero. + # + # Examples: + # + # sh 'ls -ltr' + # + # sh 'ls', 'file with spaces' + # + # # check exit status after command runs + # sh %{grep pattern file} do |ok, res| + # if ! ok + # puts "pattern not found (status = #{res.exitstatus})" + # end + # end + # + def sh(*cmd, &block) + options = (Hash === cmd.last) ? cmd.pop : {} + shell_runner = block_given? ? block : create_shell_runner(cmd) + + set_verbose_option(options) + verbose = options.delete :verbose + noop = options.delete(:noop) || Rake::FileUtilsExt.nowrite_flag + + Rake.rake_output_message sh_show_command cmd if verbose + + unless noop + res = (Hash === cmd.last) ? system(*cmd) : system(*cmd, options) + status = $? + status = Rake::PseudoStatus.new(1) if !res && status.nil? + shell_runner.call(res, status) + end + end + + def create_shell_runner(cmd) # :nodoc: + show_command = sh_show_command cmd + show_command = show_command[0, 42] + "..." unless $trace + + lambda do |ok, status| + ok or + fail "Command failed with status (#{status.exitstatus}): " + + "[#{show_command}]" + end + end + private :create_shell_runner + + def sh_show_command(cmd) # :nodoc: + cmd = cmd.dup + + if Hash === cmd.first + env = cmd.first + env = env.map { |name, value| "#{name}=#{value}" }.join " " + cmd[0] = env + end + + cmd.join " " + end + private :sh_show_command + + def set_verbose_option(options) # :nodoc: + unless options.key? :verbose + options[:verbose] = + (Rake::FileUtilsExt.verbose_flag == Rake::FileUtilsExt::DEFAULT) || + Rake::FileUtilsExt.verbose_flag + end + end + private :set_verbose_option + + # Run a Ruby interpreter with the given arguments. + # + # Example: + # ruby %{-pe '$_.upcase!' 1 + sh(*([RUBY] + args + [options]), &block) + else + sh("#{RUBY} #{args.first}", options, &block) + end + end + + LN_SUPPORTED = [true] + + # Attempt to do a normal file link, but fall back to a copy if the link + # fails. + def safe_ln(*args) + if ! LN_SUPPORTED[0] + cp(*args) + else + begin + ln(*args) + rescue StandardError, NotImplementedError + LN_SUPPORTED[0] = false + cp(*args) + end + end + end + + # Split a file path into individual directory names. + # + # Example: + # split_all("a/b/c") => ['a', 'b', 'c'] + # + def split_all(path) + head, tail = File.split(path) + return [tail] if head == "." || tail == "/" + return [head, tail] if head == "/" + return split_all(head) + [tail] + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils_ext.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils_ext.rb new file mode 100644 index 00000000..bf558b74 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/file_utils_ext.rb @@ -0,0 +1,145 @@ +# frozen_string_literal: true +require "rake/file_utils" + +module Rake + # + # FileUtilsExt provides a custom version of the FileUtils methods + # that respond to the verbose and nowrite + # commands. + # + module FileUtilsExt + include FileUtils + + class << self + attr_accessor :verbose_flag, :nowrite_flag + end + + DEFAULT = Object.new + + FileUtilsExt.verbose_flag = DEFAULT + FileUtilsExt.nowrite_flag = false + + FileUtils.commands.each do |name| + opts = FileUtils.options_of name + default_options = [] + if opts.include?("verbose") + default_options << ":verbose => FileUtilsExt.verbose_flag" + end + if opts.include?("noop") + default_options << ":noop => FileUtilsExt.nowrite_flag" + end + + next if default_options.empty? + module_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{name}( *args, &block ) + super( + *rake_merge_option(args, + #{default_options.join(', ')} + ), &block) + end + EOS + end + + # Get/set the verbose flag controlling output from the FileUtils + # utilities. If verbose is true, then the utility method is + # echoed to standard output. + # + # Examples: + # verbose # return the current value of the + # # verbose flag + # verbose(v) # set the verbose flag to _v_. + # verbose(v) { code } # Execute code with the verbose flag set + # # temporarily to _v_. Return to the + # # original value when code is done. + def verbose(value=nil) + oldvalue = FileUtilsExt.verbose_flag + FileUtilsExt.verbose_flag = value unless value.nil? + if block_given? + begin + yield + ensure + FileUtilsExt.verbose_flag = oldvalue + end + end + FileUtilsExt.verbose_flag + end + + # Get/set the nowrite flag controlling output from the FileUtils + # utilities. If verbose is true, then the utility method is + # echoed to standard output. + # + # Examples: + # nowrite # return the current value of the + # # nowrite flag + # nowrite(v) # set the nowrite flag to _v_. + # nowrite(v) { code } # Execute code with the nowrite flag set + # # temporarily to _v_. Return to the + # # original value when code is done. + def nowrite(value=nil) + oldvalue = FileUtilsExt.nowrite_flag + FileUtilsExt.nowrite_flag = value unless value.nil? + if block_given? + begin + yield + ensure + FileUtilsExt.nowrite_flag = oldvalue + end + end + oldvalue + end + + # Use this function to prevent potentially destructive ruby code + # from running when the :nowrite flag is set. + # + # Example: + # + # when_writing("Building Project") do + # project.build + # end + # + # The following code will build the project under normal + # conditions. If the nowrite(true) flag is set, then the example + # will print: + # + # DRYRUN: Building Project + # + # instead of actually building the project. + # + def when_writing(msg=nil) + if FileUtilsExt.nowrite_flag + $stderr.puts "DRYRUN: #{msg}" if msg + else + yield + end + end + + # Merge the given options with the default values. + def rake_merge_option(args, defaults) + if Hash === args.last + defaults.update(args.last) + args.pop + end + args.push defaults + args + end + + # Send the message to the default rake output (which is $stderr). + def rake_output_message(message) + $stderr.puts(message) + end + + # Check that the options do not contain options not listed in + # +optdecl+. An ArgumentError exception is thrown if non-declared + # options are found. + def rake_check_options(options, *optdecl) + h = options.dup + optdecl.each do |name| + h.delete name + end + raise ArgumentError, "no such option: #{h.keys.join(' ')}" unless + h.empty? + end + + extend self + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_chain.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_chain.rb new file mode 100644 index 00000000..44a99549 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_chain.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +module Rake + + # InvocationChain tracks the chain of task invocations to detect + # circular dependencies. + class InvocationChain < LinkedList + + # Is the invocation already in the chain? + def member?(invocation) + head == invocation || tail.member?(invocation) + end + + # Append an invocation to the chain of invocations. It is an error + # if the invocation already listed. + def append(invocation) + if member?(invocation) + fail RuntimeError, "Circular dependency detected: #{to_s} => #{invocation}" + end + conj(invocation) + end + + # Convert to string, ie: TOP => invocation => invocation + def to_s + "#{prefix}#{head}" + end + + # Class level append. + def self.append(invocation, chain) + chain.append(invocation) + end + + private + + def prefix + "#{tail} => " + end + + # Null object for an empty chain. + class EmptyInvocationChain < LinkedList::EmptyLinkedList + @parent = InvocationChain + + def member?(obj) + false + end + + def append(invocation) + conj(invocation) + end + + def to_s + "TOP" + end + end + + EMPTY = EmptyInvocationChain.new + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_exception_mixin.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_exception_mixin.rb new file mode 100644 index 00000000..b0d307a4 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/invocation_exception_mixin.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module Rake + module InvocationExceptionMixin + # Return the invocation chain (list of Rake tasks) that were in + # effect when this exception was detected by rake. May be null if + # no tasks were active. + def chain + @rake_invocation_chain ||= nil + end + + # Set the invocation chain in effect when this exception was + # detected. + def chain=(value) + @rake_invocation_chain = value + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/late_time.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/late_time.rb new file mode 100644 index 00000000..8fe02494 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/late_time.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true +module Rake + # LateTime is a fake timestamp that occurs _after_ any other time value. + class LateTime + include Comparable + include Singleton + + def <=>(other) + 1 + end + + def to_s + "" + end + end + + LATE = LateTime.instance +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/linked_list.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/linked_list.rb new file mode 100644 index 00000000..11fa46f0 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/linked_list.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true +module Rake + + # Polylithic linked list structure used to implement several data + # structures in Rake. + class LinkedList + include Enumerable + attr_reader :head, :tail + + # Polymorphically add a new element to the head of a list. The + # type of head node will be the same list type as the tail. + def conj(item) + self.class.cons(item, self) + end + + # Is the list empty? + # .make guards against a list being empty making any instantiated LinkedList + # object not empty by default + # You should consider overriding this method if you implement your own .make method + def empty? + false + end + + # Lists are structurally equivalent. + def ==(other) + current = self + while !current.empty? && !other.empty? + return false if current.head != other.head + current = current.tail + other = other.tail + end + current.empty? && other.empty? + end + + # Convert to string: LL(item, item...) + def to_s + items = map(&:to_s).join(", ") + "LL(#{items})" + end + + # Same as +to_s+, but with inspected items. + def inspect + items = map(&:inspect).join(", ") + "LL(#{items})" + end + + # For each item in the list. + def each + current = self + while !current.empty? + yield(current.head) + current = current.tail + end + self + end + + # Make a list out of the given arguments. This method is + # polymorphic + def self.make(*args) + # return an EmptyLinkedList if there are no arguments + return empty if !args || args.empty? + + # build a LinkedList by starting at the tail and iterating + # through each argument + # inject takes an EmptyLinkedList to start + args.reverse.inject(empty) do |list, item| + list = cons(item, list) + list # return the newly created list for each item in the block + end + end + + # Cons a new head onto the tail list. + def self.cons(head, tail) + new(head, tail) + end + + # The standard empty list class for the given LinkedList class. + def self.empty + self::EMPTY + end + + protected + + def initialize(head, tail=EMPTY) + @head = head + @tail = tail + end + + # Represent an empty list, using the Null Object Pattern. + # + # When inheriting from the LinkedList class, you should implement + # a type specific Empty class as well. Make sure you set the class + # instance variable @parent to the associated list class (this + # allows conj, cons and make to work polymorphically). + class EmptyLinkedList < LinkedList + @parent = LinkedList + + def initialize + end + + def empty? + true + end + + def self.cons(head, tail) + @parent.cons(head, tail) + end + end + + EMPTY = EmptyLinkedList.new + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/loaders/makefile.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/loaders/makefile.rb new file mode 100644 index 00000000..46f4beaa --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/loaders/makefile.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true +module Rake + + # Makefile loader to be used with the import file loader. Use this to + # import dependencies from make dependency tools: + # + # require 'rake/loaders/makefile' + # + # file ".depends.mf" => [SRC_LIST] do |t| + # sh "makedepend -f- -- #{CFLAGS} -- #{t.prerequisites} > #{t.name}" + # end + # + # import ".depends.mf" + # + # See {Importing Dependencies}[link:doc/rakefile_rdoc.html#label-Importing+Dependencies] + # for further details. + + class MakefileLoader + include Rake::DSL + + SPACE_MARK = "\0" # :nodoc: + + # Load the makefile dependencies in +fn+. + def load(fn) # :nodoc: + lines = File.read fn + lines.gsub!(/\\ /, SPACE_MARK) + lines.gsub!(/#[^\n]*\n/m, "") + lines.gsub!(/\\\n/, " ") + lines.each_line do |line| + process_line(line) + end + end + + private + + # Process one logical line of makefile data. + def process_line(line) # :nodoc: + file_tasks, args = line.split(":", 2) + return if args.nil? + dependents = args.split.map { |d| respace(d) } + file_tasks.scan(/\S+/) do |file_task| + file_task = respace(file_task) + file file_task => dependents + end + end + + def respace(str) # :nodoc: + str.tr SPACE_MARK, " " + end + end + + # Install the handler + Rake.application.add_loader("mf", MakefileLoader.new) +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/multi_task.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/multi_task.rb new file mode 100644 index 00000000..3ae363cb --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/multi_task.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Rake + + # Same as a regular task, but the immediate prerequisites are done in + # parallel using Ruby threads. + # + class MultiTask < Task + private + + def invoke_prerequisites(task_args, invocation_chain) # :nodoc: + invoke_prerequisites_concurrently(task_args, invocation_chain) + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/name_space.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/name_space.rb new file mode 100644 index 00000000..32f8139f --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/name_space.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true +## +# The NameSpace class will lookup task names in the scope defined by a +# +namespace+ command. + +class Rake::NameSpace + + ## + # Create a namespace lookup object using the given task manager + # and the list of scopes. + + def initialize(task_manager, scope_list) + @task_manager = task_manager + @scope = scope_list.dup + end + + ## + # Lookup a task named +name+ in the namespace. + + def [](name) + @task_manager.lookup(name, @scope) + end + + ## + # The scope of the namespace (a LinkedList) + + def scope + @scope.dup + end + + ## + # Return the list of tasks defined in this and nested namespaces. + + def tasks + @task_manager.tasks_in_scope(@scope) + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/packagetask.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/packagetask.rb new file mode 100644 index 00000000..f65affa6 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/packagetask.rb @@ -0,0 +1,211 @@ +# frozen_string_literal: true +# Define a package task library to aid in the definition of +# redistributable package files. + +require "rake" +require "rake/tasklib" + +module Rake + + # Create a packaging task that will package the project into + # distributable files (e.g zip archive or tar files). + # + # The PackageTask will create the following targets: + # + # +:package+ :: + # Create all the requested package files. + # + # +:clobber_package+ :: + # Delete all the package files. This target is automatically + # added to the main clobber target. + # + # +:repackage+ :: + # Rebuild the package files from scratch, even if they are not out + # of date. + # + # "package_dir/name-version.tgz" :: + # Create a gzipped tar package (if need_tar is true). + # + # "package_dir/name-version.tar.gz" :: + # Create a gzipped tar package (if need_tar_gz is true). + # + # "package_dir/name-version.tar.bz2" :: + # Create a bzip2'd tar package (if need_tar_bz2 is true). + # + # "package_dir/name-version.zip" :: + # Create a zip package archive (if need_zip is true). + # + # Example: + # + # Rake::PackageTask.new("rake", "1.2.3") do |p| + # p.need_tar = true + # p.package_files.include("lib/**/*.rb") + # end + # + class PackageTask < TaskLib + # Name of the package (from the GEM Spec). + attr_accessor :name + + # Version of the package (e.g. '1.3.2'). + attr_accessor :version + + # Directory used to store the package files (default is 'pkg'). + attr_accessor :package_dir + + # True if a gzipped tar file (tgz) should be produced (default is + # false). + attr_accessor :need_tar + + # True if a gzipped tar file (tar.gz) should be produced (default + # is false). + attr_accessor :need_tar_gz + + # True if a bzip2'd tar file (tar.bz2) should be produced (default + # is false). + attr_accessor :need_tar_bz2 + + # True if a xz'd tar file (tar.xz) should be produced (default is false) + attr_accessor :need_tar_xz + + # True if a zip file should be produced (default is false) + attr_accessor :need_zip + + # List of files to be included in the package. + attr_accessor :package_files + + # Tar command for gzipped or bzip2ed archives. The default is 'tar'. + attr_accessor :tar_command + + # Zip command for zipped archives. The default is 'zip'. + attr_accessor :zip_command + + # Create a Package Task with the given name and version. Use +:noversion+ + # as the version to build a package without a version or to provide a + # fully-versioned package name. + + def initialize(name=nil, version=nil) + init(name, version) + yield self if block_given? + define unless name.nil? + end + + # Initialization that bypasses the "yield self" and "define" step. + def init(name, version) + @name = name + @version = version + @package_files = Rake::FileList.new + @package_dir = "pkg" + @need_tar = false + @need_tar_gz = false + @need_tar_bz2 = false + @need_tar_xz = false + @need_zip = false + @tar_command = "tar" + @zip_command = "zip" + end + + # Create the tasks defined by this task library. + def define + fail "Version required (or :noversion)" if @version.nil? + @version = nil if :noversion == @version + + desc "Build all the packages" + task :package + + desc "Force a rebuild of the package files" + task repackage: [:clobber_package, :package] + + desc "Remove package products" + task :clobber_package do + rm_r package_dir rescue nil + end + + task clobber: [:clobber_package] + + [ + [need_tar, tgz_file, "z"], + [need_tar_gz, tar_gz_file, "z"], + [need_tar_bz2, tar_bz2_file, "j"], + [need_tar_xz, tar_xz_file, "J"] + ].each do |need, file, flag| + if need + task package: ["#{package_dir}/#{file}"] + file "#{package_dir}/#{file}" => + [package_dir_path] + package_files do + chdir(package_dir) do + sh @tar_command, "#{flag}cvf", file, package_name + end + end + end + end + + if need_zip + task package: ["#{package_dir}/#{zip_file}"] + file "#{package_dir}/#{zip_file}" => + [package_dir_path] + package_files do + chdir(package_dir) do + sh @zip_command, "-r", zip_file, package_name + end + end + end + + directory package_dir_path => @package_files do + @package_files.each do |fn| + f = File.join(package_dir_path, fn) + fdir = File.dirname(f) + mkdir_p(fdir) unless File.exist?(fdir) + if File.directory?(fn) + mkdir_p(f) + else + rm_f f + safe_ln(fn, f) + end + end + end + self + end + + # The name of this package + + def package_name + @version ? "#{@name}-#{@version}" : @name + end + + # The directory this package will be built in + + def package_dir_path + "#{package_dir}/#{package_name}" + end + + # The package name with .tgz added + + def tgz_file + "#{package_name}.tgz" + end + + # The package name with .tar.gz added + + def tar_gz_file + "#{package_name}.tar.gz" + end + + # The package name with .tar.bz2 added + + def tar_bz2_file + "#{package_name}.tar.bz2" + end + + # The package name with .tar.xz added + + def tar_xz_file + "#{package_name}.tar.xz" + end + + # The package name with .zip added + + def zip_file + "#{package_name}.zip" + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/phony.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/phony.rb new file mode 100644 index 00000000..8caa5de1 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/phony.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true +# Defines a :phony task that you can use as a dependency. This allows +# file-based tasks to use non-file-based tasks as prerequisites +# without forcing them to rebuild. +# +# See FileTask#out_of_date? and Task#timestamp for more info. + +require "rake" + +task :phony + +Rake::Task[:phony].tap do |task| + def task.timestamp # :nodoc: + Time.at 0 + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/private_reader.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/private_reader.rb new file mode 100644 index 00000000..2815ce64 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/private_reader.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module Rake + + # Include PrivateReader to use +private_reader+. + module PrivateReader # :nodoc: all + + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + + # Declare a list of private accessors + def private_reader(*names) + attr_reader(*names) + private(*names) + end + end + + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/promise.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/promise.rb new file mode 100644 index 00000000..ecff4321 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/promise.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true +module Rake + + # A Promise object represents a promise to do work (a chore) in the + # future. The promise is created with a block and a list of + # arguments for the block. Calling value will return the value of + # the promised chore. + # + # Used by ThreadPool. + # + class Promise # :nodoc: all + NOT_SET = Object.new.freeze # :nodoc: + + attr_accessor :recorder + + # Create a promise to do the chore specified by the block. + def initialize(args, &block) + @mutex = Mutex.new + @result = NOT_SET + @error = NOT_SET + @args = args + @block = block + end + + # Return the value of this promise. + # + # If the promised chore is not yet complete, then do the work + # synchronously. We will wait. + def value + unless complete? + stat :sleeping_on, item_id: object_id + @mutex.synchronize do + stat :has_lock_on, item_id: object_id + chore + stat :releasing_lock_on, item_id: object_id + end + end + error? ? raise(@error) : @result + end + + # If no one else is working this promise, go ahead and do the chore. + def work + stat :attempting_lock_on, item_id: object_id + if @mutex.try_lock + stat :has_lock_on, item_id: object_id + chore + stat :releasing_lock_on, item_id: object_id + @mutex.unlock + else + stat :bailed_on, item_id: object_id + end + end + + private + + # Perform the chore promised + def chore + if complete? + stat :found_completed, item_id: object_id + return + end + stat :will_execute, item_id: object_id + begin + @result = @block.call(*@args) + rescue Exception => e + @error = e + end + stat :did_execute, item_id: object_id + discard + end + + # Do we have a result for the promise + def result? + ! @result.equal?(NOT_SET) + end + + # Did the promise throw an error + def error? + ! @error.equal?(NOT_SET) + end + + # Are we done with the promise + def complete? + result? || error? + end + + # free up these items for the GC + def discard + @args = nil + @block = nil + end + + # Record execution statistics if there is a recorder + def stat(*args) + @recorder.call(*args) if @recorder + end + + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/pseudo_status.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/pseudo_status.rb new file mode 100644 index 00000000..8b3c9894 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/pseudo_status.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true +module Rake + + ## + # Exit status class for times the system just gives us a nil. + class PseudoStatus # :nodoc: all + attr_reader :exitstatus + + def initialize(code=0) + @exitstatus = code + end + + def to_i + @exitstatus << 8 + end + + def >>(n) + to_i >> n + end + + def stopped? + false + end + + def exited? + true + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_module.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_module.rb new file mode 100644 index 00000000..03c29562 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_module.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true +require "rake/application" + +module Rake + + class << self + # Current Rake Application + def application + @application ||= Rake::Application.new + end + + # Set the current Rake application object. + def application=(app) + @application = app + end + + def suggested_thread_count # :nodoc: + @cpu_count ||= Rake::CpuCounter.count + @cpu_count + 4 + end + + # Return the original directory where the Rake application was started. + def original_dir + application.original_dir + end + + # Load a rakefile. + def load_rakefile(path) + load(path) + end + + # Add files to the rakelib list + def add_rakelib(*files) + application.options.rakelib ||= [] + application.options.rakelib.concat(files) + end + + # Make +block_application+ the default rake application inside a block so + # you can load rakefiles into a different application. + # + # This is useful when you want to run rake tasks inside a library without + # running rake in a sub-shell. + # + # Example: + # + # Dir.chdir 'other/directory' + # + # other_rake = Rake.with_application do |rake| + # rake.load_rakefile + # end + # + # puts other_rake.tasks + + def with_application(block_application = Rake::Application.new) + orig_application = Rake.application + + Rake.application = block_application + + yield block_application + + block_application + ensure + Rake.application = orig_application + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_test_loader.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_test_loader.rb new file mode 100644 index 00000000..f0f7772b --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rake_test_loader.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true +require "rake" + +# Load the test files from the command line. +argv = ARGV.select do |argument| + begin + case argument + when /^-/ then + argument + when /\*/ then + FileList[argument].to_a.each do |file| + require File.expand_path file + end + + false + else + require File.expand_path argument + + false + end + rescue LoadError => e + raise unless e.path + abort "\nFile does not exist: #{e.path}\n\n" + end +end + +ARGV.replace argv diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rule_recursion_overflow_error.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rule_recursion_overflow_error.rb new file mode 100644 index 00000000..a51e7748 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/rule_recursion_overflow_error.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +module Rake + + # Error indicating a recursion overflow error in task selection. + class RuleRecursionOverflowError < StandardError + def initialize(*args) + super + @targets = [] + end + + def add_target(target) + @targets << target + end + + def message + super + ": [" + @targets.reverse.join(" => ") + "]" + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/scope.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/scope.rb new file mode 100644 index 00000000..27c05da8 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/scope.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +module Rake + class Scope < LinkedList # :nodoc: all + + # Path for the scope. + def path + map(&:to_s).reverse.join(":") + end + + # Path for the scope + the named path. + def path_with_task_name(task_name) + "#{path}:#{task_name}" + end + + # Trim +n+ innermost scope levels from the scope. In no case will + # this trim beyond the toplevel scope. + def trim(n) + result = self + while n > 0 && ! result.empty? + result = result.tail + n -= 1 + end + result + end + + # Scope lists always end with an EmptyScope object. See Null + # Object Pattern) + class EmptyScope < EmptyLinkedList + @parent = Scope + + def path + "" + end + + def path_with_task_name(task_name) + task_name + end + end + + # Singleton null object for an empty scope. + EMPTY = EmptyScope.new + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task.rb new file mode 100644 index 00000000..c7e0a1d9 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task.rb @@ -0,0 +1,411 @@ +# frozen_string_literal: true +require "rake/invocation_exception_mixin" + +module Rake + + ## + # A Task is the basic unit of work in a Rakefile. Tasks have associated + # actions (possibly more than one) and a list of prerequisites. When + # invoked, a task will first ensure that all of its prerequisites have an + # opportunity to run and then it will execute its own actions. + # + # Tasks are not usually created directly using the new method, but rather + # use the +file+ and +task+ convenience methods. + # + class Task + # List of prerequisites for a task. + attr_reader :prerequisites + + # List of actions attached to a task. + attr_reader :actions + + # Application owning this task. + attr_accessor :application + + # Array of nested namespaces names used for task lookup by this task. + attr_reader :scope + + # File/Line locations of each of the task definitions for this + # task (only valid if the task was defined with the detect + # location option set). + attr_reader :locations + + # Has this task already been invoked? Already invoked tasks + # will be skipped unless you reenable them. + attr_reader :already_invoked + + # Return task name + def to_s + name + end + + def inspect # :nodoc: + "<#{self.class} #{name} => [#{prerequisites.join(', ')}]>" + end + + # List of sources for task. + attr_writer :sources + def sources + if defined?(@sources) + @sources + else + prerequisites + end + end + + # List of prerequisite tasks + def prerequisite_tasks + prerequisites.map { |pre| lookup_prerequisite(pre) } + end + + def lookup_prerequisite(prerequisite_name) # :nodoc: + scoped_prerequisite_task = application[prerequisite_name, @scope] + if scoped_prerequisite_task == self + unscoped_prerequisite_task = application[prerequisite_name] + end + unscoped_prerequisite_task || scoped_prerequisite_task + end + private :lookup_prerequisite + + # List of all unique prerequisite tasks including prerequisite tasks' + # prerequisites. + # Includes self when cyclic dependencies are found. + def all_prerequisite_tasks + seen = {} + collect_prerequisites(seen) + seen.values + end + + def collect_prerequisites(seen) # :nodoc: + prerequisite_tasks.each do |pre| + next if seen[pre.name] + seen[pre.name] = pre + pre.collect_prerequisites(seen) + end + end + protected :collect_prerequisites + + # First source from a rule (nil if no sources) + def source + sources.first + end + + # Create a task named +task_name+ with no actions or prerequisites. Use + # +enhance+ to add actions and prerequisites. + def initialize(task_name, app) + @name = task_name.to_s + @prerequisites = [] + @actions = [] + @already_invoked = false + @comments = [] + @lock = Monitor.new + @application = app + @scope = app.current_scope + @arg_names = nil + @locations = [] + @invocation_exception = nil + end + + # Enhance a task with prerequisites or actions. Returns self. + def enhance(deps=nil, &block) + @prerequisites |= deps if deps + @actions << block if block_given? + self + end + + # Name of the task, including any namespace qualifiers. + def name + @name.to_s + end + + # Name of task with argument list description. + def name_with_args # :nodoc: + if arg_description + "#{name}#{arg_description}" + else + name + end + end + + # Argument description (nil if none). + def arg_description # :nodoc: + @arg_names ? "[#{arg_names.join(',')}]" : nil + end + + # Name of arguments for this task. + def arg_names + @arg_names || [] + end + + # Reenable the task, allowing its tasks to be executed if the task + # is invoked again. + def reenable + @already_invoked = false + end + + # Clear the existing prerequisites, actions, comments, and arguments of a rake task. + def clear + clear_prerequisites + clear_actions + clear_comments + clear_args + self + end + + # Clear the existing prerequisites of a rake task. + def clear_prerequisites + prerequisites.clear + self + end + + # Clear the existing actions on a rake task. + def clear_actions + actions.clear + self + end + + # Clear the existing comments on a rake task. + def clear_comments + @comments = [] + self + end + + # Clear the existing arguments on a rake task. + def clear_args + @arg_names = nil + self + end + + # Invoke the task if it is needed. Prerequisites are invoked first. + def invoke(*args) + task_args = TaskArguments.new(arg_names, args) + invoke_with_call_chain(task_args, InvocationChain::EMPTY) + end + + # Same as invoke, but explicitly pass a call chain to detect + # circular dependencies. + # + # If multiple tasks depend on this + # one in parallel, they will all fail if the first execution of + # this task fails. + def invoke_with_call_chain(task_args, invocation_chain) + new_chain = Rake::InvocationChain.append(self, invocation_chain) + @lock.synchronize do + begin + if application.options.trace + application.trace "** Invoke #{name} #{format_trace_flags}" + end + + if @already_invoked + if @invocation_exception + if application.options.trace + application.trace "** Previous invocation of #{name} failed #{format_trace_flags}" + end + raise @invocation_exception + else + return + end + end + + @already_invoked = true + + invoke_prerequisites(task_args, new_chain) + execute(task_args) if needed? + rescue Exception => ex + add_chain_to(ex, new_chain) + @invocation_exception = ex + raise ex + end + end + end + protected :invoke_with_call_chain + + def add_chain_to(exception, new_chain) # :nodoc: + exception.extend(InvocationExceptionMixin) unless + exception.respond_to?(:chain) + exception.chain = new_chain if exception.chain.nil? + end + private :add_chain_to + + # Invoke all the prerequisites of a task. + def invoke_prerequisites(task_args, invocation_chain) # :nodoc: + if application.options.always_multitask + invoke_prerequisites_concurrently(task_args, invocation_chain) + else + prerequisite_tasks.each { |p| + prereq_args = task_args.new_scope(p.arg_names) + p.invoke_with_call_chain(prereq_args, invocation_chain) + } + end + end + + # Invoke all the prerequisites of a task in parallel. + def invoke_prerequisites_concurrently(task_args, invocation_chain)# :nodoc: + futures = prerequisite_tasks.map do |p| + prereq_args = task_args.new_scope(p.arg_names) + application.thread_pool.future(p) do |r| + r.invoke_with_call_chain(prereq_args, invocation_chain) + end + end + futures.each(&:value) + end + + # Format the trace flags for display. + def format_trace_flags + flags = [] + flags << "first_time" unless @already_invoked + flags << "not_needed" unless needed? + flags.empty? ? "" : "(" + flags.join(", ") + ")" + end + private :format_trace_flags + + # Execute the actions associated with this task. + def execute(args=nil) + args ||= EMPTY_TASK_ARGS + if application.options.dryrun + application.trace "** Execute (dry run) #{name}" + return + end + application.trace "** Execute #{name}" if application.options.trace + application.enhance_with_matching_rule(name) if @actions.empty? + @actions.each { |act| act.call(self, args) } + end + + # Is this task needed? + def needed? + true + end + + # Timestamp for this task. Basic tasks return the current time for their + # time stamp. Other tasks can be more sophisticated. + def timestamp + Time.now + end + + # Add a description to the task. The description can consist of an option + # argument list (enclosed brackets) and an optional comment. + def add_description(description) + return unless description + comment = description.strip + add_comment(comment) if comment && ! comment.empty? + end + + def comment=(comment) # :nodoc: + add_comment(comment) + end + + def add_comment(comment) # :nodoc: + return if comment.nil? + @comments << comment unless @comments.include?(comment) + end + private :add_comment + + # Full collection of comments. Multiple comments are separated by + # newlines. + def full_comment + transform_comments("\n") + end + + # First line (or sentence) of all comments. Multiple comments are + # separated by a "/". + def comment + transform_comments(" / ") { |c| first_sentence(c) } + end + + # Transform the list of comments as specified by the block and + # join with the separator. + def transform_comments(separator, &block) + if @comments.empty? + nil + else + block ||= lambda { |c| c } + @comments.map(&block).join(separator) + end + end + private :transform_comments + + # Get the first sentence in a string. The sentence is terminated + # by the first period, exclamation mark, or the end of the line. + # Decimal points do not count as periods. + def first_sentence(string) + string.split(/(?<=\w)(\.|!)[ \t]|(\.$|!)|\n/).first + end + private :first_sentence + + # Set the names of the arguments for this task. +args+ should be + # an array of symbols, one for each argument name. + def set_arg_names(args) + @arg_names = args.map(&:to_sym) + end + + # Return a string describing the internal state of a task. Useful for + # debugging. + def investigation + result = "------------------------------\n".dup + result << "Investigating #{name}\n" + result << "class: #{self.class}\n" + result << "task needed: #{needed?}\n" + result << "timestamp: #{timestamp}\n" + result << "pre-requisites: \n" + prereqs = prerequisite_tasks + prereqs.sort! { |a, b| a.timestamp <=> b.timestamp } + prereqs.each do |p| + result << "--#{p.name} (#{p.timestamp})\n" + end + latest_prereq = prerequisite_tasks.map(&:timestamp).max + result << "latest-prerequisite time: #{latest_prereq}\n" + result << "................................\n\n" + return result + end + + # ---------------------------------------------------------------- + # Rake Module Methods + # + class << self + + # Clear the task list. This cause rake to immediately forget all the + # tasks that have been assigned. (Normally used in the unit tests.) + def clear + Rake.application.clear + end + + # List of all defined tasks. + def tasks + Rake.application.tasks + end + + # Return a task with the given name. If the task is not currently + # known, try to synthesize one from the defined rules. If no rules are + # found, but an existing file matches the task name, assume it is a file + # task with no dependencies or actions. + def [](task_name) + Rake.application[task_name] + end + + # TRUE if the task name is already defined. + def task_defined?(task_name) + Rake.application.lookup(task_name) != nil + end + + # Define a task given +args+ and an option block. If a rule with the + # given name already exists, the prerequisites and actions are added to + # the existing task. Returns the defined task. + def define_task(*args, &block) + Rake.application.define_task(self, *args, &block) + end + + # Define a rule for synthesizing tasks. + def create_rule(*args, &block) + Rake.application.create_rule(*args, &block) + end + + # Apply the scope to the task name according to the rules for + # this kind of task. Generic tasks will accept the scope as + # part of the name. + def scope_name(scope, task_name) + scope.path_with_task_name(task_name) + end + + end # class << Rake::Task + end # class Rake::Task +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_argument_error.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_argument_error.rb new file mode 100644 index 00000000..ef20076c --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_argument_error.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +module Rake + + # Error indicating an ill-formed task declaration. + class TaskArgumentError < ArgumentError + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_arguments.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_arguments.rb new file mode 100644 index 00000000..0d3001af --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_arguments.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true +module Rake + + ## + # TaskArguments manage the arguments passed to a task. + # + class TaskArguments + include Enumerable + + # Argument names + attr_reader :names + + # Create a TaskArgument object with a list of argument +names+ and a set + # of associated +values+. +parent+ is the parent argument object. + def initialize(names, values, parent=nil) + @names = names + @parent = parent + @hash = {} + @values = values + names.each_with_index { |name, i| + next if values[i].nil? || values[i] == "" + @hash[name.to_sym] = values[i] + } + end + + # Retrieve the complete array of sequential values + def to_a + @values.dup + end + + # Retrieve the list of values not associated with named arguments + def extras + @values[@names.length..-1] || [] + end + + # Create a new argument scope using the prerequisite argument + # names. + def new_scope(names) + values = names.map { |n| self[n] } + self.class.new(names, values + extras, self) + end + + # Find an argument value by name or index. + def [](index) + lookup(index.to_sym) + end + + # Specify a hash of default values for task arguments. Use the + # defaults only if there is no specific value for the given + # argument. + def with_defaults(defaults) + @hash = defaults.merge(@hash) + end + + # Enumerates the arguments and their values + def each(&block) + @hash.each(&block) + end + + # Extracts the argument values at +keys+ + def values_at(*keys) + keys.map { |k| lookup(k) } + end + + # Returns the value of the given argument via method_missing + def method_missing(sym, *args) + lookup(sym.to_sym) + end + + # Returns a Hash of arguments and their values + def to_hash + @hash.dup + end + + def to_s # :nodoc: + inspect + end + + def inspect # :nodoc: + inspection = @hash.map do |k,v| + "#{k.to_s}: #{v.to_s}" + end.join(", ") + + "#<#{self.class} #{inspection}>" + end + + # Returns true if +key+ is one of the arguments + def has_key?(key) + @hash.has_key?(key) + end + alias key? has_key? + + def fetch(*args, &block) + @hash.fetch(*args, &block) + end + + protected + + def lookup(name) # :nodoc: + if @hash.has_key?(name) + @hash[name] + elsif @parent + @parent.lookup(name) + end + end + end + + EMPTY_TASK_ARGS = TaskArguments.new([], []) # :nodoc: +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_manager.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_manager.rb new file mode 100644 index 00000000..c1e60b95 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/task_manager.rb @@ -0,0 +1,323 @@ +# frozen_string_literal: true +module Rake + + # The TaskManager module is a mixin for managing tasks. + module TaskManager + # Track the last comment made in the Rakefile. + attr_accessor :last_description + + def initialize # :nodoc: + super + @tasks = Hash.new + @rules = Array.new + @scope = Scope.make + @last_description = nil + end + + def create_rule(*args, &block) # :nodoc: + pattern, args, deps = resolve_args(args) + pattern = Regexp.new(Regexp.quote(pattern) + "$") if String === pattern + @rules << [pattern, args, deps, block] + end + + def define_task(task_class, *args, &block) # :nodoc: + task_name, arg_names, deps = resolve_args(args) + + original_scope = @scope + if String === task_name and + not task_class.ancestors.include? Rake::FileTask + task_name, *definition_scope = *(task_name.split(":").reverse) + @scope = Scope.make(*(definition_scope + @scope.to_a)) + end + + task_name = task_class.scope_name(@scope, task_name) + deps = [deps] unless deps.respond_to?(:to_ary) + deps = deps.map { |d| Rake.from_pathname(d).to_s } + task = intern(task_class, task_name) + task.set_arg_names(arg_names) unless arg_names.empty? + if Rake::TaskManager.record_task_metadata + add_location(task) + task.add_description(get_description(task)) + end + task.enhance(deps, &block) + ensure + @scope = original_scope + end + + # Lookup a task. Return an existing task if found, otherwise + # create a task of the current type. + def intern(task_class, task_name) + @tasks[task_name.to_s] ||= task_class.new(task_name, self) + end + + # Find a matching task for +task_name+. + def [](task_name, scopes=nil) + task_name = task_name.to_s + self.lookup(task_name, scopes) or + enhance_with_matching_rule(task_name) or + synthesize_file_task(task_name) or + fail generate_message_for_undefined_task(task_name) + end + + def generate_message_for_undefined_task(task_name) + message = "Don't know how to build task '#{task_name}' (see --tasks)" + message + generate_did_you_mean_suggestions(task_name) + end + + def generate_did_you_mean_suggestions(task_name) + return "" unless defined?(::DidYouMean::SpellChecker) + + suggestions = ::DidYouMean::SpellChecker.new(dictionary: @tasks.keys).correct(task_name.to_s) + if ::DidYouMean.respond_to?(:formatter)# did_you_mean v1.2.0 or later + ::DidYouMean.formatter.message_for(suggestions) + elsif defined?(::DidYouMean::Formatter) # before did_you_mean v1.2.0 + ::DidYouMean::Formatter.new(suggestions).to_s + else + "" + end + end + + def synthesize_file_task(task_name) # :nodoc: + return nil unless File.exist?(task_name) + define_task(Rake::FileTask, task_name) + end + + # Resolve the arguments for a task/rule. Returns a triplet of + # [task_name, arg_name_list, prerequisites]. + def resolve_args(args) + if args.last.is_a?(Hash) + deps = args.pop + resolve_args_with_dependencies(args, deps) + else + resolve_args_without_dependencies(args) + end + end + + # Resolve task arguments for a task or rule when there are no + # dependencies declared. + # + # The patterns recognized by this argument resolving function are: + # + # task :t + # task :t, [:a] + # + def resolve_args_without_dependencies(args) + task_name = args.shift + if args.size == 1 && args.first.respond_to?(:to_ary) + arg_names = args.first.to_ary + else + arg_names = args + end + [task_name, arg_names, []] + end + private :resolve_args_without_dependencies + + # Resolve task arguments for a task or rule when there are + # dependencies declared. + # + # The patterns recognized by this argument resolving function are: + # + # task :t => [:d] + # task :t, [a] => [:d] + # + def resolve_args_with_dependencies(args, hash) # :nodoc: + fail "Task Argument Error" if hash.size != 1 + key, value = hash.map { |k, v| [k, v] }.first + if args.empty? + task_name = key + arg_names = [] + deps = value || [] + else + task_name = args.shift + arg_names = key + deps = value + end + deps = [deps] unless deps.respond_to?(:to_ary) + [task_name, arg_names, deps] + end + private :resolve_args_with_dependencies + + # If a rule can be found that matches the task name, enhance the + # task with the prerequisites and actions from the rule. Set the + # source attribute of the task appropriately for the rule. Return + # the enhanced task or nil of no rule was found. + def enhance_with_matching_rule(task_name, level=0) + fail Rake::RuleRecursionOverflowError, + "Rule Recursion Too Deep" if level >= 16 + @rules.each do |pattern, args, extensions, block| + if pattern && pattern.match(task_name) + task = attempt_rule(task_name, pattern, args, extensions, block, level) + return task if task + end + end + nil + rescue Rake::RuleRecursionOverflowError => ex + ex.add_target(task_name) + fail ex + end + + # List of all defined tasks in this application. + def tasks + @tasks.values.sort_by { |t| t.name } + end + + # List of all the tasks defined in the given scope (and its + # sub-scopes). + def tasks_in_scope(scope) + prefix = scope.path + tasks.select { |t| + /^#{prefix}:/ =~ t.name + } + end + + # Clear all tasks in this application. + def clear + @tasks.clear + @rules.clear + end + + # Lookup a task, using scope and the scope hints in the task name. + # This method performs straight lookups without trying to + # synthesize file tasks or rules. Special scope names (e.g. '^') + # are recognized. If no scope argument is supplied, use the + # current scope. Return nil if the task cannot be found. + def lookup(task_name, initial_scope=nil) + initial_scope ||= @scope + task_name = task_name.to_s + if task_name =~ /^rake:/ + scopes = Scope.make + task_name = task_name.sub(/^rake:/, "") + elsif task_name =~ /^(\^+)/ + scopes = initial_scope.trim($1.size) + task_name = task_name.sub(/^(\^+)/, "") + else + scopes = initial_scope + end + lookup_in_scope(task_name, scopes) + end + + # Lookup the task name + def lookup_in_scope(name, scope) + loop do + tn = scope.path_with_task_name(name) + task = @tasks[tn] + return task if task + break if scope.empty? + scope = scope.tail + end + nil + end + private :lookup_in_scope + + # Return the list of scope names currently active in the task + # manager. + def current_scope + @scope + end + + # Evaluate the block in a nested namespace named +name+. Create + # an anonymous namespace if +name+ is nil. + def in_namespace(name) + name ||= generate_name + @scope = Scope.new(name, @scope) + ns = NameSpace.new(self, @scope) + yield(ns) + ns + ensure + @scope = @scope.tail + end + + private + + # Add a location to the locations field of the given task. + def add_location(task) + loc = find_location + task.locations << loc if loc + task + end + + # Find the location that called into the dsl layer. + def find_location + locations = caller + i = 0 + while locations[i] + return locations[i + 1] if locations[i] =~ /rake\/dsl_definition.rb/ + i += 1 + end + nil + end + + # Generate an anonymous namespace name. + def generate_name + @seed ||= 0 + @seed += 1 + "_anon_#{@seed}" + end + + def trace_rule(level, message) # :nodoc: + options.trace_output.puts "#{" " * level}#{message}" if + Rake.application.options.trace_rules + end + + # Attempt to create a rule given the list of prerequisites. + def attempt_rule(task_name, task_pattern, args, extensions, block, level) + sources = make_sources(task_name, task_pattern, extensions) + prereqs = sources.map { |source| + trace_rule level, "Attempting Rule #{task_name} => #{source}" + if File.exist?(source) || Rake::Task.task_defined?(source) + trace_rule level, "(#{task_name} => #{source} ... EXIST)" + source + elsif parent = enhance_with_matching_rule(source, level + 1) + trace_rule level, "(#{task_name} => #{source} ... ENHANCE)" + parent.name + else + trace_rule level, "(#{task_name} => #{source} ... FAIL)" + return nil + end + } + task = FileTask.define_task(task_name, { args => prereqs }, &block) + task.sources = prereqs + task + end + + # Make a list of sources from the list of file name extensions / + # translation procs. + def make_sources(task_name, task_pattern, extensions) + result = extensions.map { |ext| + case ext + when /%/ + task_name.pathmap(ext) + when %r{/} + ext + when /^\./ + source = task_name.sub(task_pattern, ext) + source == ext ? task_name.ext(ext) : source + when String + ext + when Proc, Method + if ext.arity == 1 + ext.call(task_name) + else + ext.call + end + else + fail "Don't know how to handle rule dependent: #{ext.inspect}" + end + } + result.flatten + end + + # Return the current description, clearing it in the process. + def get_description(task) + desc = @last_description + @last_description = nil + desc + end + + class << self + attr_accessor :record_task_metadata # :nodoc: + TaskManager.record_task_metadata = false + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/tasklib.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/tasklib.rb new file mode 100644 index 00000000..5354b4f9 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/tasklib.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +require "rake" + +module Rake + + # Base class for Task Libraries. + class TaskLib + include Cloneable + include Rake::DSL + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/testtask.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/testtask.rb new file mode 100644 index 00000000..53762756 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/testtask.rb @@ -0,0 +1,224 @@ +# frozen_string_literal: true +require "rake" +require "rake/tasklib" + +module Rake + + # Create a task that runs a set of tests. + # + # Example: + # require "rake/testtask" + # + # Rake::TestTask.new do |t| + # t.libs << "test" + # t.test_files = FileList['test/test*.rb'] + # t.verbose = true + # end + # + # If rake is invoked with a "TEST=filename" command line option, + # then the list of test files will be overridden to include only the + # filename specified on the command line. This provides an easy way + # to run just one test. + # + # If rake is invoked with a "TESTOPTS=options" command line option, + # then the given options are passed to the test process after a + # '--'. This allows Test::Unit options to be passed to the test + # suite. + # + # Examples: + # + # rake test # run tests normally + # rake test TEST=just_one_file.rb # run just one test file. + # rake test TESTOPTS="-v" # run in verbose mode + # rake test TESTOPTS="--runner=fox" # use the fox test runner + # + class TestTask < TaskLib + + # Name of test task. (default is :test) + attr_accessor :name + + # List of directories added to $LOAD_PATH before running the + # tests. (default is 'lib') + attr_accessor :libs + + # True if verbose test output desired. (default is false) + attr_accessor :verbose + + # Test options passed to the test suite. An explicit + # TESTOPTS=opts on the command line will override this. (default + # is NONE) + attr_accessor :options + + # Request that the tests be run with the warning flag set. + # E.g. warning=true implies "ruby -w" used to run the tests. + # (default is true) + attr_accessor :warning + + # Glob pattern to match test files. (default is 'test/test*.rb') + attr_accessor :pattern + + # Style of test loader to use. Options are: + # + # * :rake -- Rake provided test loading script (default). + # * :testrb -- Ruby provided test loading script. + # * :direct -- Load tests using command line loader. + # + attr_accessor :loader + + # Array of command line options to pass to ruby when running test loader. + attr_accessor :ruby_opts + + # Description of the test task. (default is 'Run tests') + attr_accessor :description + + # Task prerequisites. + attr_accessor :deps + + # Explicitly define the list of test files to be included in a + # test. +list+ is expected to be an array of file names (a + # FileList is acceptable). If both +pattern+ and +test_files+ are + # used, then the list of test files is the union of the two. + def test_files=(list) + @test_files = list + end + + # Create a testing task. + def initialize(name=:test) + @name = name + @libs = ["lib"] + @pattern = nil + @options = nil + @test_files = nil + @verbose = false + @warning = true + @loader = :rake + @ruby_opts = [] + @description = "Run tests" + (@name == :test ? "" : " for #{@name}") + @deps = [] + if @name.is_a?(Hash) + @deps = @name.values.first + @name = @name.keys.first + end + yield self if block_given? + @pattern = "test/test*.rb" if @pattern.nil? && @test_files.nil? + define + end + + # Create the tasks defined by this task lib. + def define + desc @description + task @name => Array(deps) do + FileUtilsExt.verbose(@verbose) do + puts "Use TESTOPTS=\"--verbose\" to pass --verbose" \ + ", etc. to runners." if ARGV.include? "--verbose" + args = + "#{ruby_opts_string} #{run_code} " + + "#{file_list_string} #{option_list}" + ruby args do |ok, status| + if !ok && status.respond_to?(:signaled?) && status.signaled? + raise SignalException.new(status.termsig) + elsif !ok + status = "Command failed with status (#{status.exitstatus})" + details = ": [ruby #{args}]" + message = + if Rake.application.options.trace or @verbose + status + details + else + status + end + + fail message + end + end + end + end + self + end + + def option_list # :nodoc: + (ENV["TESTOPTS"] || + ENV["TESTOPT"] || + ENV["TEST_OPTS"] || + ENV["TEST_OPT"] || + @options || + "") + end + + def ruby_opts_string # :nodoc: + opts = @ruby_opts.dup + opts.unshift("-I\"#{lib_path}\"") unless @libs.empty? + opts.unshift("-w") if @warning + opts.join(" ") + end + + def lib_path # :nodoc: + @libs.join(File::PATH_SEPARATOR) + end + + def file_list_string # :nodoc: + file_list.map { |fn| "\"#{fn}\"" }.join(" ") + end + + def file_list # :nodoc: + if ENV["TEST"] + FileList[ENV["TEST"]] + else + result = [] + result += @test_files.to_a if @test_files + result += FileList[@pattern].to_a if @pattern + result + end + end + + def ruby_version # :nodoc: + RUBY_VERSION + end + + def run_code # :nodoc: + case @loader + when :direct + "-e \"ARGV.each{|f| require f}\"" + when :testrb + "-S testrb" + when :rake + "#{rake_include_arg} \"#{rake_loader}\"" + end + end + + def rake_loader # :nodoc: + find_file("rake/rake_test_loader") or + fail "unable to find rake test loader" + end + + def find_file(fn) # :nodoc: + $LOAD_PATH.each do |path| + file_path = File.join(path, "#{fn}.rb") + return file_path if File.exist? file_path + end + nil + end + + def rake_include_arg # :nodoc: + spec = Gem.loaded_specs["rake"] + if spec.respond_to?(:default_gem?) && spec.default_gem? + "" + else + "-I\"#{rake_lib_dir}\"" + end + end + + def rake_lib_dir # :nodoc: + find_dir("rake") or + fail "unable to find rake lib" + end + + def find_dir(fn) # :nodoc: + $LOAD_PATH.each do |path| + file_path = File.join(path, "#{fn}.rb") + return path if File.exist? file_path + end + nil + end + + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_history_display.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_history_display.rb new file mode 100644 index 00000000..412ea37b --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_history_display.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true +require "rake/private_reader" + +module Rake + + class ThreadHistoryDisplay # :nodoc: all + include Rake::PrivateReader + + private_reader :stats, :items, :threads + + def initialize(stats) + @stats = stats + @items = { _seq_: 1 } + @threads = { _seq_: "A" } + end + + def show + puts "Job History:" + stats.each do |stat| + stat[:data] ||= {} + rename(stat, :thread, threads) + rename(stat[:data], :item_id, items) + rename(stat[:data], :new_thread, threads) + rename(stat[:data], :deleted_thread, threads) + printf("%8d %2s %-20s %s\n", + (stat[:time] * 1_000_000).round, + stat[:thread], + stat[:event], + stat[:data].map do |k, v| "#{k}:#{v}" end.join(" ")) + end + end + + private + + def rename(hash, key, renames) + if hash && hash[key] + original = hash[key] + value = renames[original] + unless value + value = renames[:_seq_] + renames[:_seq_] = renames[:_seq_].succ + renames[original] = value + end + hash[key] = value + end + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_pool.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_pool.rb new file mode 100644 index 00000000..b01a5efe --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/thread_pool.rb @@ -0,0 +1,163 @@ +# frozen_string_literal: true +require "set" + +require "rake/promise" + +module Rake + + class ThreadPool # :nodoc: all + + # Creates a ThreadPool object. The +thread_count+ parameter is the size + # of the pool. + def initialize(thread_count) + @max_active_threads = [thread_count, 0].max + @threads = Set.new + @threads_mon = Monitor.new + @queue = Queue.new + @join_cond = @threads_mon.new_cond + + @history_start_time = nil + @history = [] + @history_mon = Monitor.new + @total_threads_in_play = 0 + end + + # Creates a future executed by the +ThreadPool+. + # + # The args are passed to the block when executing (similarly to + # Thread#new) The return value is an object representing + # a future which has been created and added to the queue in the + # pool. Sending #value to the object will sleep the + # current thread until the future is finished and will return the + # result (or raise an exception thrown from the future) + def future(*args, &block) + promise = Promise.new(args, &block) + promise.recorder = lambda { |*stats| stat(*stats) } + + @queue.enq promise + stat :queued, item_id: promise.object_id + start_thread + promise + end + + # Waits until the queue of futures is empty and all threads have exited. + def join + @threads_mon.synchronize do + begin + stat :joining + @join_cond.wait unless @threads.empty? + stat :joined + rescue Exception => e + stat :joined + $stderr.puts e + $stderr.print "Queue contains #{@queue.size} items. " + + "Thread pool contains #{@threads.count} threads\n" + $stderr.print "Current Thread #{Thread.current} status = " + + "#{Thread.current.status}\n" + $stderr.puts e.backtrace.join("\n") + @threads.each do |t| + $stderr.print "Thread #{t} status = #{t.status}\n" + $stderr.puts t.backtrace.join("\n") + end + raise e + end + end + end + + # Enable the gathering of history events. + def gather_history #:nodoc: + @history_start_time = Time.now if @history_start_time.nil? + end + + # Return a array of history events for the thread pool. + # + # History gathering must be enabled to be able to see the events + # (see #gather_history). Best to call this when the job is + # complete (i.e. after ThreadPool#join is called). + def history # :nodoc: + @history_mon.synchronize { @history.dup }. + sort_by { |i| i[:time] }. + each { |i| i[:time] -= @history_start_time } + end + + # Return a hash of always collected statistics for the thread pool. + def statistics # :nodoc: + { + total_threads_in_play: @total_threads_in_play, + max_active_threads: @max_active_threads, + } + end + + private + + # processes one item on the queue. Returns true if there was an + # item to process, false if there was no item + def process_queue_item #:nodoc: + return false if @queue.empty? + + # Even though we just asked if the queue was empty, it + # still could have had an item which by this statement + # is now gone. For this reason we pass true to Queue#deq + # because we will sleep indefinitely if it is empty. + promise = @queue.deq(true) + stat :dequeued, item_id: promise.object_id + promise.work + return true + + rescue ThreadError # this means the queue is empty + false + end + + def safe_thread_count + @threads_mon.synchronize do + @threads.count + end + end + + def start_thread # :nodoc: + @threads_mon.synchronize do + next unless @threads.count < @max_active_threads + + t = Thread.new do + begin + while safe_thread_count <= @max_active_threads + break unless process_queue_item + end + ensure + @threads_mon.synchronize do + @threads.delete Thread.current + stat :ended, thread_count: @threads.count + @join_cond.broadcast if @threads.empty? + end + end + end + + @threads << t + stat( + :spawned, + new_thread: t.object_id, + thread_count: @threads.count) + @total_threads_in_play = @threads.count if + @threads.count > @total_threads_in_play + end + end + + def stat(event, data=nil) # :nodoc: + return if @history_start_time.nil? + info = { + event: event, + data: data, + time: Time.now, + thread: Thread.current.object_id, + } + @history_mon.synchronize { @history << info } + end + + # for testing only + + def __queue__ # :nodoc: + @queue + end + end + +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/trace_output.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/trace_output.rb new file mode 100644 index 00000000..d713a092 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/trace_output.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module Rake + module TraceOutput # :nodoc: all + + # Write trace output to output stream +out+. + # + # The write is done as a single IO call (to print) to lessen the + # chance that the trace output is interrupted by other tasks also + # producing output. + def trace_on(out, *strings) + sep = $\ || "\n" + if strings.empty? + output = sep + else + output = strings.map { |s| + next if s.nil? + s.end_with?(sep) ? s : s + sep + }.join + end + out.print(output) + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/version.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/version.rb new file mode 100644 index 00000000..2d66a8f7 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/version.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Rake + VERSION = "12.3.1" + + module Version # :nodoc: all + MAJOR, MINOR, BUILD, *OTHER = Rake::VERSION.split "." + + NUMBERS = [MAJOR, MINOR, BUILD, *OTHER] + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/win32.rb b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/win32.rb new file mode 100644 index 00000000..6e620318 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/lib/rake/win32.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true +require "rbconfig" + +module Rake + # Win 32 interface methods for Rake. Windows specific functionality + # will be placed here to collect that knowledge in one spot. + module Win32 # :nodoc: all + + # Error indicating a problem in locating the home directory on a + # Win32 system. + class Win32HomeError < RuntimeError + end + + class << self + # True if running on a windows system. + def windows? + RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw|[Ww]indows)! + end + + # The standard directory containing system wide rake files on + # Win 32 systems. Try the following environment variables (in + # order): + # + # * HOME + # * HOMEDRIVE + HOMEPATH + # * APPDATA + # * USERPROFILE + # + # If the above are not defined, the return nil. + def win32_system_dir #:nodoc: + win32_shared_path = ENV["HOME"] + if win32_shared_path.nil? && ENV["HOMEDRIVE"] && ENV["HOMEPATH"] + win32_shared_path = ENV["HOMEDRIVE"] + ENV["HOMEPATH"] + end + + win32_shared_path ||= ENV["APPDATA"] + win32_shared_path ||= ENV["USERPROFILE"] + raise Win32HomeError, + "Unable to determine home path environment variable." if + win32_shared_path.nil? or win32_shared_path.empty? + normalize(File.join(win32_shared_path, "Rake")) + end + + # Normalize a win32 path so that the slashes are all forward slashes. + def normalize(path) + path.gsub(/\\/, "/") + end + + end + end +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/rake.gemspec b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/rake.gemspec new file mode 100644 index 00000000..ddc9f2a6 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/gems/rake-12.3.1/rake.gemspec @@ -0,0 +1,42 @@ +# frozen_string_literal: true +$LOAD_PATH.unshift File.expand_path('../lib', __FILE__) +require 'rake/version' + +Gem::Specification.new do |s| + s.name = "rake".freeze + s.version = Rake::VERSION + s.authors = ["Hiroshi SHIBATA".freeze, "Eric Hodel".freeze, "Jim Weirich".freeze] + s.email = ["hsbt@ruby-lang.org".freeze, "drbrain@segment7.net".freeze, "".freeze] + + s.summary = "Rake is a Make-like program implemented in Ruby".freeze + s.description = <<-DESCRIPTION +Rake is a Make-like program implemented in Ruby. Tasks and dependencies are +specified in standard Ruby syntax. +Rake has the following features: + * Rakefiles (rake's version of Makefiles) are completely defined in standard Ruby syntax. + No XML files to edit. No quirky Makefile syntax to worry about (is that a tab or a space?) + * Users can specify tasks with prerequisites. + * Rake supports rule patterns to synthesize implicit tasks. + * Flexible FileLists that act like arrays but know about manipulating file names and paths. + * Supports parallel execution of tasks. + DESCRIPTION + s.homepage = "https://github.com/ruby/rake".freeze + s.licenses = ["MIT".freeze] + + s.files = %x[git ls-files -z].split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } - + %w[.rubocop.yml .travis.yml appveyor.yml] + s.bindir = "exe" + s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) } + s.require_paths = ["lib".freeze] + + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubygems_version = "2.6.1".freeze + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.2".freeze) + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] + + s.add_development_dependency(%q.freeze) + s.add_development_dependency(%q.freeze) + s.add_development_dependency(%q.freeze) + s.add_development_dependency(%q.freeze) + s.add_development_dependency(%q.freeze) +end diff --git a/spec/sample_bundler/vendor/bundle/jruby/2.3.0/specifications/rake-12.3.1.gemspec b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/specifications/rake-12.3.1.gemspec new file mode 100644 index 00000000..22645302 --- /dev/null +++ b/spec/sample_bundler/vendor/bundle/jruby/2.3.0/specifications/rake-12.3.1.gemspec @@ -0,0 +1,49 @@ +# -*- encoding: utf-8 -*- +# stub: rake 12.3.1 ruby lib + +Gem::Specification.new do |s| + s.name = "rake".freeze + s.version = "12.3.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.2".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Hiroshi SHIBATA".freeze, "Eric Hodel".freeze, "Jim Weirich".freeze] + s.bindir = "exe".freeze + s.date = "2018-03-22" + s.description = "Rake is a Make-like program implemented in Ruby. Tasks and dependencies are\nspecified in standard Ruby syntax.\nRake has the following features:\n * Rakefiles (rake's version of Makefiles) are completely defined in standard Ruby syntax.\n No XML files to edit. No quirky Makefile syntax to worry about (is that a tab or a space?)\n * Users can specify tasks with prerequisites.\n * Rake supports rule patterns to synthesize implicit tasks.\n * Flexible FileLists that act like arrays but know about manipulating file names and paths.\n * Supports parallel execution of tasks.\n".freeze + s.email = ["hsbt@ruby-lang.org".freeze, "drbrain@segment7.net".freeze, "".freeze] + s.executables = ["rake".freeze] + s.files = ["exe/rake".freeze] + s.homepage = "https://github.com/ruby/rake".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubygems_version = "2.6.13".freeze + s.summary = "Rake is a Make-like program implemented in Ruby".freeze + + s.installed_by_version = "2.6.13" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + s.add_development_dependency(%q.freeze, [">= 0"]) + else + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + end + else + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + s.add_dependency(%q.freeze, [">= 0"]) + end +end diff --git a/spec/warbler/bundler_spec.rb b/spec/warbler/bundler_spec.rb index 466e9180..9c5d55ab 100644 --- a/spec/warbler/bundler_spec.rb +++ b/spec/warbler/bundler_spec.rb @@ -194,15 +194,18 @@ def bundle_install(*args) end context "with the runnable feature" do + let(:bundle_gemfile) { nil } + before do File.open("Rakefile", "w") do |f| f << <<-RUBY task :test_task do - puts "success" + puts Rake::VERSION end RUBY end + ENV['BUNDLE_GEMFILE'] = bundle_gemfile if bundle_gemfile use_config do |config| config.features = %w{runnable} end @@ -221,10 +224,24 @@ def bundle_install(*args) it "can run commands in the generated warfile" do jar.create('foo.war') + ENV['BUNDLE_GEMFILE'] = nil stdin, stdout, stderr, wait_thr = Open3.popen3('java -jar foo.war -S rake test_task') wait_thr.value.success?.should be(true) stderr.readlines.join.should eq("") - stdout.readlines.join.should eq("success\n") + stdout.readlines.join.should eq("10.5.0\n") + end + + context "with a custom Gemfile" do + let(:bundle_gemfile) { 'Special-Gemfile' } + + it "uses the correct gems" do + jar.create('foo.war') + ENV['BUNDLE_GEMFILE'] = nil + stdin, stdout, stderr, wait_thr = Open3.popen3('java -jar foo.war -S rake test_task') + wait_thr.value.success?.should be(true) + stderr.readlines.join.should eq("") + stdout.readlines.join.should eq("12.3.1\n") + end end end end