diff --git a/.gitignore b/.gitignore index d87d4be..6a3ed78 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ .config .yardoc Gemfile.lock +gemfiles/*.gemfile.lock InstalledFiles _yardoc coverage @@ -11,6 +12,8 @@ doc/ lib/bundler/man pkg rdoc +spec/dummy/Gemfile +spec/dummy/vendor spec/reports test/tmp test/version_tmp diff --git a/.rspec b/.rspec index 97c5f28..4061ad4 100644 --- a/.rspec +++ b/.rspec @@ -1,3 +1,4 @@ --color --format progress ---require spec_helper \ No newline at end of file +--require spec_helper +--exclude-pattern 'spec/dummy/**/*' \ No newline at end of file diff --git a/.rubocop.yml b/.rubocop.yml index ea3e14b..210bc6a 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,6 +1,8 @@ AllCops: Exclude: - bin/**/* + - vendor/**/* + - spec/dummy/vendor/**/* Documentation: Enabled: false diff --git a/Appraisals b/Appraisals new file mode 100644 index 0000000..bbad0b1 --- /dev/null +++ b/Appraisals @@ -0,0 +1,19 @@ +appraise 'rails-3-zeus-0.15' do + gem 'rails', '3.2.21' + gem 'zeus', '0.15.4' +end + +appraise 'rails-4-zeus-0.15' do + gem 'rails', '4.2.3' + gem 'zeus', '0.15.4' +end + +appraise 'rails-3-zeus-0.13' do + gem 'rails', '3.2.21' + gem 'zeus', '0.13.3' +end + +appraise 'rails-4-zeus-0.13' do + gem 'rails', '4.2.3' + gem 'zeus', '0.13.3' +end diff --git a/Rakefile b/Rakefile index 2d6e01b..4c774a2 100644 --- a/Rakefile +++ b/Rakefile @@ -4,14 +4,3 @@ require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) task default: :spec -namespace :circle do - RSpec::Core::RakeTask.new(:spec) do |task| - file_list = FileList['spec/**/*_spec.rb'] - - %w(slow).each do |exclude| - file_list = file_list.exclude("spec/#{exclude}/**/*_spec.rb") - end - - task.pattern = file_list - end -end diff --git a/circle.yml b/circle.yml index 538a563..ad2bb7f 100644 --- a/circle.yml +++ b/circle.yml @@ -1,22 +1,39 @@ dependencies: pre: + - echo rvm_autoupdate_flag=0 >> ~/.rvmrc - rvm install 2.2 - rvm install 2.1 - rvm install 2.0 - rvm install 1.9 cache_directories: - - '~/.rvm/gems/' + - /home/ubuntu/.rvm/gems/ruby-2.2.0 + - /home/ubuntu/.rvm/gems/ruby-2.1.5 + - /home/ubuntu/.rvm/gems/ruby-2.0.0-p598 + - /home/ubuntu/.rvm/gems/ruby-1.9.3-p551 override: - - rvm-exec 2.2 bash -c 'bundle check || bundle install' - - rvm-exec 2.1 bash -c 'bundle check || bundle install' - - rvm-exec 2.0 bash -c 'bundle check || bundle install' - - rvm-exec 1.9 bash -c 'bundle check || bundle install' + - rvm-exec 2.2 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.15.gemfile' + - rvm-exec 2.2 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.15.gemfile' + - rvm-exec 2.2 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.13.gemfile' + - rvm-exec 2.2 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.13.gemfile' + - rvm-exec 2.1 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.15.gemfile' + - rvm-exec 2.1 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.15.gemfile' + - rvm-exec 2.1 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.13.gemfile' + - rvm-exec 2.1 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.13.gemfile' + - rvm-exec 2.0 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.15.gemfile' + - rvm-exec 2.0 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.15.gemfile' + - rvm-exec 2.0 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.13.gemfile' + - rvm-exec 2.0 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.13.gemfile' + - rvm-exec 1.9 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.15.gemfile' + - rvm-exec 1.9 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.15.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.15.gemfile' + - rvm-exec 1.9 bash -c 'bundle check --gemfile=gemfiles/rails_3_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_3_zeus_0.13.gemfile' + - rvm-exec 1.9 bash -c 'bundle check --gemfile=gemfiles/rails_4_zeus_0.13.gemfile || bundle install --gemfile=gemfiles/rails_4_zeus_0.13.gemfile' test: override: - - rvm-exec 2.2 bash -c 'bundle exec rake circle:spec' - - rvm-exec 2.1 bash -c 'bundle exec rake circle:spec' - - rvm-exec 2.0 bash -c 'bundle exec rake circle:spec' - - rvm-exec 1.9 bash -c 'bundle exec rake circle:spec' + - rvm-exec 2.2 bash -c 'bundle exec appraisal rspec' + - rvm-exec 2.1 bash -c 'bundle exec appraisal rspec' + - rvm-exec 2.0 bash -c 'bundle exec appraisal rspec' + - rvm-exec 1.9 bash -c 'bundle exec appraisal rspec' + - rvm-exec 2.2 bash -c 'bundle exec rubocop' diff --git a/gemfiles/rails_3_zeus_0.13.gemfile b/gemfiles/rails_3_zeus_0.13.gemfile new file mode 100644 index 0000000..87a137c --- /dev/null +++ b/gemfiles/rails_3_zeus_0.13.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rails", "3.2.21" +gem "zeus", "0.13.3" + +gemspec :path => "../" diff --git a/gemfiles/rails_3_zeus_0.15.gemfile b/gemfiles/rails_3_zeus_0.15.gemfile new file mode 100644 index 0000000..5cf710a --- /dev/null +++ b/gemfiles/rails_3_zeus_0.15.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rails", "3.2.21" +gem "zeus", "0.15.4" + +gemspec :path => "../" diff --git a/gemfiles/rails_4_zeus_0.13.gemfile b/gemfiles/rails_4_zeus_0.13.gemfile new file mode 100644 index 0000000..42da9b5 --- /dev/null +++ b/gemfiles/rails_4_zeus_0.13.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rails", "4.2.3" +gem "zeus", "0.13.3" + +gemspec :path => "../" diff --git a/gemfiles/rails_4_zeus_0.15.gemfile b/gemfiles/rails_4_zeus_0.15.gemfile new file mode 100644 index 0000000..7729cc2 --- /dev/null +++ b/gemfiles/rails_4_zeus_0.15.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rails", "4.2.3" +gem "zeus", "0.15.4" + +gemspec :path => "../" diff --git a/lib/zeus/parallel_tests/rails.rb b/lib/zeus/parallel_tests/rails.rb index 711ebe9..de77165 100644 --- a/lib/zeus/parallel_tests/rails.rb +++ b/lib/zeus/parallel_tests/rails.rb @@ -5,6 +5,10 @@ module Zeus module ParallelTests class Rails < ::Zeus::Rails def parallel_cucumber + if ENV.key?('RAILS_ENV') + puts "Warning: Deleting RAILS_ENV (which is `#{ENV['RAILS_ENV']}` as Zeus will complain about it." + ENV.delete('RAILS_ENV') + end exec parallel_runner_command 'cucumber', ARGV end @@ -35,11 +39,13 @@ def test(argv = ARGV) end end + def cucumber_environment + require 'cucumber/rspec/disable_option_parser' + require 'cucumber/cli/main' + end + def cucumber(argv = ARGV) - cucumber_main = Cucumber::Cli::Main.new(argv.dup) - had_failures = cucumber_main.execute!(@cucumber_runtime) - exit_code = had_failures ? 1 : 0 - exit exit_code + ::Cucumber::Cli::Main.execute(argv) end # End of patches for Zeus diff --git a/lib/zeus/parallel_tests/version.rb b/lib/zeus/parallel_tests/version.rb index 71e0a8c..763c052 100644 --- a/lib/zeus/parallel_tests/version.rb +++ b/lib/zeus/parallel_tests/version.rb @@ -1,5 +1,5 @@ module Zeus module ParallelTests - VERSION = '0.2.5' + VERSION = '0.3.0' end end diff --git a/spec/dummy/Gemfile b/spec/dummy/Gemfile deleted file mode 100644 index ca38d25..0000000 --- a/spec/dummy/Gemfile +++ /dev/null @@ -1,30 +0,0 @@ -source 'https://rubygems.org' - -gem 'rails', '3.2.13' - -# Bundle edge Rails instead: -# gem 'rails', :git => 'git://github.com/rails/rails.git' - -gem 'sqlite3' - -gem 'rspec-rails' -gem 'cucumber-rails', require: false -gem 'zeus-parallel_tests', path: '../../../zeus-parallel_tests' -gem 'database_cleaner' -gem 'turn', require: false -gem 'guard-rspec' - -# To use ActiveModel has_secure_password -# gem 'bcrypt-ruby', '~> 3.0.0' - -# To use Jbuilder templates for JSON -# gem 'jbuilder' - -# Use unicorn as the app server -# gem 'unicorn' - -# Deploy with Capistrano -# gem 'capistrano' - -# To use debugger -# gem 'debugger' diff --git a/spec/dummy/config/application.rb b/spec/dummy/config/application.rb index 86682a2..f3e419f 100644 --- a/spec/dummy/config/application.rb +++ b/spec/dummy/config/application.rb @@ -54,11 +54,5 @@ class Application < Rails::Application # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql - - # Enforce whitelist mode for mass assignment. - # This will create an empty whitelist of attributes available for mass-assignment for all models - # in your app. As such, your models will need to explicitly whitelist or blacklist accessible - # parameters by using an attr_accessible or attr_protected declaration. - config.active_record.whitelist_attributes = true end end diff --git a/spec/dummy/config/environments/development.rb b/spec/dummy/config/environments/development.rb index 7a6cd73..68c9d89 100644 --- a/spec/dummy/config/environments/development.rb +++ b/spec/dummy/config/environments/development.rb @@ -21,11 +21,4 @@ # Only use best-standards-support built into browsers config.action_dispatch.best_standards_support = :builtin - - # Raise exception on mass assignment protection for Active Record models - config.active_record.mass_assignment_sanitizer = :strict - - # Log the query plan for queries taking more than this (works - # with SQLite, MySQL, and PostgreSQL) - config.active_record.auto_explain_threshold_in_seconds = 0.5 end diff --git a/spec/dummy/config/environments/production.rb b/spec/dummy/config/environments/production.rb index 053eea1..d77396c 100644 --- a/spec/dummy/config/environments/production.rb +++ b/spec/dummy/config/environments/production.rb @@ -45,8 +45,4 @@ # Send deprecation notices to registered listeners config.active_support.deprecation = :notify - - # Log the query plan for queries taking more than this (works - # with SQLite, MySQL, and PostgreSQL) - # config.active_record.auto_explain_threshold_in_seconds = 0.5 end diff --git a/spec/dummy/config/environments/test.rb b/spec/dummy/config/environments/test.rb index d2944e6..f7d264b 100644 --- a/spec/dummy/config/environments/test.rb +++ b/spec/dummy/config/environments/test.rb @@ -29,9 +29,6 @@ # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test - # Raise exception on mass assignment protection for Active Record models - config.active_record.mass_assignment_sanitizer = :strict - # Print deprecation notices to the stderr config.active_support.deprecation = :stderr end diff --git a/spec/dummy/custom_plan.rb b/spec/dummy/custom_plan.rb index 41afd2b..73d7939 100644 --- a/spec/dummy/custom_plan.rb +++ b/spec/dummy/custom_plan.rb @@ -1,3 +1,4 @@ +require 'bundler/setup' require 'zeus/parallel_tests' class CustomPlan < Zeus::ParallelTests::Rails diff --git a/spec/dummy/spec/unit_test_a_spec.rb b/spec/dummy/spec/unit_test_a_spec.rb new file mode 100644 index 0000000..f1f01dd --- /dev/null +++ b/spec/dummy/spec/unit_test_a_spec.rb @@ -0,0 +1,7 @@ +require 'spec_helper' + +describe 'Unit A' do + it 'should be true' do + expect(true).to be true + end +end diff --git a/spec/dummy/spec/unit_test_b_spec.rb b/spec/dummy/spec/unit_test_b_spec.rb new file mode 100644 index 0000000..c2c5596 --- /dev/null +++ b/spec/dummy/spec/unit_test_b_spec.rb @@ -0,0 +1,7 @@ +require 'spec_helper' + +describe 'Unit B' do + it 'should be true' do + expect(true).to be true + end +end diff --git a/spec/parallel_spec.rb b/spec/parallel_spec.rb new file mode 100644 index 0000000..2ca3cc0 --- /dev/null +++ b/spec/parallel_spec.rb @@ -0,0 +1,56 @@ +$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__) + +require 'zeus/parallel_tests/version' +require 'open3' +require 'English' + +describe 'zeus parallel spec' do + def launch_server + pid = fork do + Dir.chdir 'spec/dummy/' do + exec 'bundle exec zeus start > /dev/null' + end + end + sleep 3 + pid + end + + before(:all) do + # Copy current Appraisal gemfile to dummy app. + gemfile = File.read(ENV['BUNDLE_GEMFILE']).gsub(':path => "../"', ':path => "../../"') + File.open('spec/dummy/Gemfile', 'w+') { |f| f.write gemfile } + gemfile_lock = File.read("#{ENV['BUNDLE_GEMFILE']}.lock").gsub('remote: ../', 'remote: ../../') + File.open('spec/dummy/Gemfile.lock', 'w+') { |f| f.write gemfile_lock } + + # Launch Zeus. + @server_pid = launch_server.to_s + end + + it 'connects to server' do + Dir.chdir 'spec/dummy/' do + system('bundle', 'exec', 'zeus', 'r', 'true') + expect($CHILD_STATUS.success?).to be true + end + end + + it 'runs rspec specs in two processes' do + Dir.chdir 'spec/dummy' do + Open3.popen2e('bundle', 'exec', 'zeus', 'parallel_rspec', '-n', '2', 'spec') do |_, output| + expect(output.to_a.map(&:chomp)).to include('2 processes for 2 specs, ~ 1 specs per process') + end + end + end + + it 'runs cucumbers in two processes' do + Dir.chdir 'spec/dummy' do + Open3.popen2e('bundle', 'exec', 'zeus', 'parallel_cucumber', '-n', '2', 'features') do |_, output| + expect(output.to_a.map(&:chomp)).to include('2 processes for 2 features, ~ 1 features per process') + end + end + end + + after(:all) do + system('kill', '-9', @server_pid) + system('rm', '-f', 'spec/dummy/Gemfile', 'spec/dummy/Gemfile.lock', 'spec/dummy/.zeus.sock') + end +end diff --git a/spec/slow/parallel_rspec_spec.rb b/spec/slow/parallel_rspec_spec.rb deleted file mode 100644 index a3f0360..0000000 --- a/spec/slow/parallel_rspec_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__) - -require 'zeus/parallel_tests/version' -require 'open3' - -describe 'zeus parallel_rspec spec' do - def build_gem(_version = Zeus::ParallelTests::VERSION) - system 'gem build zeus-parallel_tests.gemspec &>/dev/null' - end - - def install_gem(version = Zeus::ParallelTests::VERSION) - system "gem install ./zeus-parallel_tests-#{version}.gem --ignore-dependencies &>/dev/null" - end - - def uninstall_gem(version = Zeus::ParallelTests::VERSION) - system "echo y | gem uninstall zeus-parallel_tests -v #{version} --quiet &>/dev/null" - end - - def launch_server - pid = fork do - Dir.chdir 'spec/dummy/' - system 'bundle install' - exec 'bundle exec zeus start &>/dev/null' - end - sleep 3 - pid - end - - before(:all) do - build_gem - install_gem - print 'Launch zeus server for dummy app in separate console and press ENTER ' - $stdin.getc - # @server_pid = launch_server.to_i - Dir.chdir 'spec/dummy/' - end - - it 'connects to server' do - expect(system('zeus r true &>/dev/null')).to be_true - end - - it 'runs specs in two processes' do - Open3.popen2e('zeus', 'parallel_rspec', '-n', '2', 'spec') do |_input, output, _t| - expect(output.to_a.map(&:chomp)).to include('2 processes for 2 specs, ~ 1 specs per process') - end - end - - after(:all) do - # system "kill -9 #{@server_pid.to_s}" - # system "rm -fr .zeus.sock" - uninstall_gem - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 97a9f2c..c4f6902 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,9 +1,5 @@ -# This file was generated by the `rspec --init` command. Conventionally, all -# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. -# Require this file using `require "spec_helper"` to ensure that it is only -# loaded once. -# -# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +require 'rspec' + RSpec.configure do |config| # Run specs in random order to surface order dependencies. If you find an # order dependency and want to debug it, you can fix the order by providing diff --git a/zeus-parallel_tests.gemspec b/zeus-parallel_tests.gemspec index ff0f4e4..cc52605 100644 --- a/zeus-parallel_tests.gemspec +++ b/zeus-parallel_tests.gemspec @@ -18,11 +18,19 @@ Gem::Specification.new do |spec| spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ['lib'] - spec.add_dependency 'zeus', '~> 0.13.3' + spec.add_dependency 'zeus', '>= 0.13.0' spec.add_dependency 'parallel_tests', '>= 0.11.3' + spec.add_development_dependency 'appraisal' spec.add_development_dependency 'bundler' spec.add_development_dependency 'rake' spec.add_development_dependency 'rubocop' spec.add_development_dependency 'rspec', '>= 3.0' + + # Gems used by dummy app in testing. + spec.add_development_dependency 'cucumber-rails' + spec.add_development_dependency 'database_cleaner' + spec.add_development_dependency 'guard-rspec' + spec.add_development_dependency 'rspec-rails' + spec.add_development_dependency 'sqlite3' end