vinted-parallel_tests 0.13.3 → 1.7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Readme.md +86 -47
  3. data/bin/parallel_cucumber +5 -1
  4. data/bin/parallel_rspec +5 -1
  5. data/bin/parallel_spinach +9 -0
  6. data/bin/parallel_test +5 -1
  7. data/lib/parallel_tests.rb +15 -2
  8. data/lib/parallel_tests/cli.rb +115 -35
  9. data/lib/parallel_tests/cucumber/failures_logger.rb +9 -7
  10. data/lib/parallel_tests/cucumber/runner.rb +16 -77
  11. data/lib/parallel_tests/cucumber/scenario_line_logger.rb +52 -0
  12. data/lib/parallel_tests/cucumber/scenarios.rb +34 -0
  13. data/lib/parallel_tests/{cucumber → gherkin}/io.rb +1 -1
  14. data/lib/parallel_tests/{cucumber/gherkin_listener.rb → gherkin/listener.rb} +11 -6
  15. data/lib/parallel_tests/gherkin/runner.rb +116 -0
  16. data/lib/parallel_tests/{cucumber → gherkin}/runtime_logger.rb +2 -2
  17. data/lib/parallel_tests/grouper.rb +34 -17
  18. data/lib/parallel_tests/rspec/failures_logger.rb +22 -14
  19. data/lib/parallel_tests/rspec/logger_base.rb +5 -1
  20. data/lib/parallel_tests/rspec/runner.rb +5 -4
  21. data/lib/parallel_tests/rspec/runtime_logger.rb +10 -5
  22. data/lib/parallel_tests/rspec/summary_logger.rb +11 -11
  23. data/lib/parallel_tests/spinach/runner.rb +19 -0
  24. data/lib/parallel_tests/tasks.rb +41 -18
  25. data/lib/parallel_tests/test/runner.rb +80 -28
  26. data/lib/parallel_tests/test/runtime_logger.rb +86 -55
  27. data/lib/parallel_tests/version.rb +1 -1
  28. metadata +18 -35
  29. data/.gitignore +0 -2
  30. data/.rspec +0 -2
  31. data/.travis.yml +0 -6
  32. data/Gemfile +0 -8
  33. data/Gemfile.lock +0 -48
  34. data/Rakefile +0 -6
  35. data/ReadmeRails2.md +0 -48
  36. data/parallel_tests.gemspec +0 -14
  37. data/spec/integration_spec.rb +0 -285
  38. data/spec/parallel_tests/cli_spec.rb +0 -71
  39. data/spec/parallel_tests/cucumber/failure_logger_spec.rb +0 -43
  40. data/spec/parallel_tests/cucumber/gherkin_listener_spec.rb +0 -97
  41. data/spec/parallel_tests/cucumber/runner_spec.rb +0 -179
  42. data/spec/parallel_tests/grouper_spec.rb +0 -52
  43. data/spec/parallel_tests/rspec/failures_logger_spec.rb +0 -82
  44. data/spec/parallel_tests/rspec/runner_spec.rb +0 -187
  45. data/spec/parallel_tests/rspec/runtime_logger_spec.rb +0 -126
  46. data/spec/parallel_tests/rspec/summary_logger_spec.rb +0 -37
  47. data/spec/parallel_tests/tasks_spec.rb +0 -151
  48. data/spec/parallel_tests/test/runner_spec.rb +0 -413
  49. data/spec/parallel_tests/test/runtime_logger_spec.rb +0 -90
  50. data/spec/parallel_tests_spec.rb +0 -137
  51. data/spec/spec_helper.rb +0 -157
@@ -4,70 +4,61 @@ require 'parallel_tests/test/runner'
4
4
  module ParallelTests
5
5
  module Test
6
6
  class RuntimeLogger
7
- @@has_started = false
7
+ @@prepared = false
8
8
 
9
9
  class << self
10
- def log(test, start_time, end_time)
11
- return if test.is_a? ::Test::Unit::TestSuite # don't log for suites-of-suites
10
+ def log_test_run(test)
11
+ prepare
12
12
 
13
- if !@@has_started # make empty log file
14
- File.open(logfile, 'w'){}
15
- @@has_started = true
16
- end
13
+ result = nil
14
+ time = ParallelTests.delta { result = yield }
15
+ log(test, time)
16
+
17
+ result
18
+ end
17
19
 
18
- locked_appending_to(logfile) do |file|
19
- file.puts(message(test, start_time, end_time))
20
+ def unique_log
21
+ lock do
22
+ separator = "\n"
23
+ groups = File.read(logfile).split(separator).map { |line| line.split(":") }.group_by(&:first)
24
+ lines = groups.map do |file, times|
25
+ time = "%.2f" % times.map(&:last).map(&:to_f).inject(:+)
26
+ "#{file}:#{time}"
27
+ end
28
+ File.write(logfile, lines.join(separator) + separator)
20
29
  end
21
30
  end
22
31
 
23
32
  private
24
33
 
25
- def message(test, start_time, end_time)
26
- delta = "%.2f" % (end_time.to_f-start_time.to_f)
27
- filename = class_directory(test.class) + class_to_filename(test.class) + ".rb"
28
- "#{filename}:#{delta}"
34
+ # ensure folder exists + clean out previous log
35
+ # this will happen in multiple processes, but should be roughly at the same time
36
+ # so there should be no log message lost
37
+ def prepare
38
+ return if @@prepared
39
+ @@prepared = true
40
+ FileUtils.mkdir_p(File.dirname(logfile))
41
+ File.write(logfile, '')
29
42
  end
30
43
 
31
- # Note: this is a best guess at conventional test directory structure, and may need
32
- # tweaking / post-processing to match correctly for any given project
33
- def class_directory(suspect)
34
- result = "test/"
35
-
36
- if defined?(Rails)
37
- result += case suspect.superclass.name
38
- when "ActionDispatch::IntegrationTest"
39
- "integration/"
40
- when "ActionDispatch::PerformanceTest"
41
- "performance/"
42
- when "ActionController::TestCase"
43
- "functional/"
44
- when "ActionView::TestCase"
45
- "unit/helpers/"
46
- else
47
- "unit/"
48
- end
44
+ def log(test, time)
45
+ return unless message = message(test, time)
46
+ lock do
47
+ File.open(logfile, 'a') { |f| f.puts message }
49
48
  end
50
- result
51
49
  end
52
50
 
53
- # based on https://github.com/grosser/single_test/blob/master/lib/single_test.rb#L117
54
- def class_to_filename(suspect)
55
- word = suspect.to_s.dup
56
- return word unless word.match /^[A-Z]/ and not word.match %r{/[a-z]}
57
-
58
- word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
59
- word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
60
- word.gsub!(/\:\:/, '/')
61
- word.tr!("-", "_")
62
- word.downcase!
63
- word
51
+ def message(test, delta)
52
+ return unless method = test.public_instance_methods(true).detect { |method| method =~ /^test_/ }
53
+ filename = test.instance_method(method).source_location.first.sub("#{Dir.pwd}/", "")
54
+ "#{filename}:#{delta}"
64
55
  end
65
56
 
66
- def locked_appending_to(file)
67
- File.open(file, 'a') do |f|
57
+ def lock
58
+ File.open(logfile, 'r') do |f|
68
59
  begin
69
60
  f.flock File::LOCK_EX
70
- yield f
61
+ yield
71
62
  ensure
72
63
  f.flock File::LOCK_UN
73
64
  end
@@ -82,16 +73,56 @@ module ParallelTests
82
73
  end
83
74
  end
84
75
 
85
- require 'test/unit/testsuite'
86
- class ::Test::Unit::TestSuite
87
- alias :run_without_timing :run unless defined? @@timing_installed
76
+ if defined?(Minitest::Runnable) # Minitest 5
77
+ class << Minitest::Runnable
78
+ alias_method :run_without_runtime_log, :run
79
+ def run(*args)
80
+ ParallelTests::Test::RuntimeLogger.log_test_run(self) do
81
+ run_without_runtime_log(*args)
82
+ end
83
+ end
84
+ end
88
85
 
89
- def run(result, &progress_block)
90
- start_time = ParallelTests.now
91
- run_without_timing(result, &progress_block)
92
- end_time = ParallelTests.now
93
- ParallelTests::Test::RuntimeLogger.log(self.tests.first, start_time, end_time)
86
+ class << Minitest
87
+ alias_method :run_without_runtime_log, :run
88
+ def run(*args)
89
+ result = run_without_runtime_log(*args)
90
+ ParallelTests::Test::RuntimeLogger.unique_log
91
+ result
92
+ end
93
+ end
94
+ elsif defined?(MiniTest::Unit) # Minitest 4
95
+ MiniTest::Unit.class_eval do
96
+ alias_method :_run_suite_without_runtime_log, :_run_suite
97
+ def _run_suite(*args)
98
+ ParallelTests::Test::RuntimeLogger.log_test_run(args.first) do
99
+ _run_suite_without_runtime_log(*args)
100
+ end
101
+ end
102
+
103
+ alias_method :_run_suites_without_runtime_log, :_run_suites
104
+ def _run_suites(*args)
105
+ result = _run_suites_without_runtime_log(*args)
106
+ ParallelTests::Test::RuntimeLogger.unique_log
107
+ result
108
+ end
94
109
  end
110
+ else # Test::Unit
111
+ require 'test/unit/testsuite'
112
+ class ::Test::Unit::TestSuite
113
+ alias_method :run_without_timing, :run
95
114
 
96
- @@timing_installed = true
115
+ def run(result, &block)
116
+ test = tests.first
117
+
118
+ if test.is_a? ::Test::Unit::TestSuite # all tests ?
119
+ run_without_timing(result, &block)
120
+ ParallelTests::Test::RuntimeLogger.unique_log
121
+ else
122
+ ParallelTests::Test::RuntimeLogger.log_test_run(test.class) do
123
+ run_without_timing(result, &block)
124
+ end
125
+ end
126
+ end
127
+ end
97
128
  end
@@ -1,3 +1,3 @@
1
1
  module ParallelTests
2
- VERSION = Version = '0.13.3'
2
+ VERSION = Version = '1.7.0.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vinted-parallel_tests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.3
4
+ version: 1.7.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurynas Butkus
@@ -10,20 +10,20 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-06-08 00:00:00.000000000 Z
13
+ date: 2015-09-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parallel
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - '>='
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - '>='
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0'
29
29
  description:
@@ -32,30 +32,28 @@ email:
32
32
  - tomas.varaneckas@gmail.com
33
33
  - jjanauskas@gmail.com
34
34
  executables:
35
+ - parallel_spinach
35
36
  - parallel_cucumber
36
37
  - parallel_rspec
37
38
  - parallel_test
38
39
  extensions: []
39
40
  extra_rdoc_files: []
40
41
  files:
41
- - .gitignore
42
- - .rspec
43
- - .travis.yml
44
- - Gemfile
45
- - Gemfile.lock
46
- - Rakefile
47
42
  - Readme.md
48
- - ReadmeRails2.md
49
43
  - bin/parallel_cucumber
50
44
  - bin/parallel_rspec
45
+ - bin/parallel_spinach
51
46
  - bin/parallel_test
52
47
  - lib/parallel_tests.rb
53
48
  - lib/parallel_tests/cli.rb
54
49
  - lib/parallel_tests/cucumber/failures_logger.rb
55
- - lib/parallel_tests/cucumber/gherkin_listener.rb
56
- - lib/parallel_tests/cucumber/io.rb
57
50
  - lib/parallel_tests/cucumber/runner.rb
58
- - lib/parallel_tests/cucumber/runtime_logger.rb
51
+ - lib/parallel_tests/cucumber/scenario_line_logger.rb
52
+ - lib/parallel_tests/cucumber/scenarios.rb
53
+ - lib/parallel_tests/gherkin/io.rb
54
+ - lib/parallel_tests/gherkin/listener.rb
55
+ - lib/parallel_tests/gherkin/runner.rb
56
+ - lib/parallel_tests/gherkin/runtime_logger.rb
59
57
  - lib/parallel_tests/grouper.rb
60
58
  - lib/parallel_tests/railtie.rb
61
59
  - lib/parallel_tests/rspec/failures_logger.rb
@@ -63,26 +61,11 @@ files:
63
61
  - lib/parallel_tests/rspec/runner.rb
64
62
  - lib/parallel_tests/rspec/runtime_logger.rb
65
63
  - lib/parallel_tests/rspec/summary_logger.rb
64
+ - lib/parallel_tests/spinach/runner.rb
66
65
  - lib/parallel_tests/tasks.rb
67
66
  - lib/parallel_tests/test/runner.rb
68
67
  - lib/parallel_tests/test/runtime_logger.rb
69
68
  - lib/parallel_tests/version.rb
70
- - parallel_tests.gemspec
71
- - spec/integration_spec.rb
72
- - spec/parallel_tests/cli_spec.rb
73
- - spec/parallel_tests/cucumber/failure_logger_spec.rb
74
- - spec/parallel_tests/cucumber/gherkin_listener_spec.rb
75
- - spec/parallel_tests/cucumber/runner_spec.rb
76
- - spec/parallel_tests/grouper_spec.rb
77
- - spec/parallel_tests/rspec/failures_logger_spec.rb
78
- - spec/parallel_tests/rspec/runner_spec.rb
79
- - spec/parallel_tests/rspec/runtime_logger_spec.rb
80
- - spec/parallel_tests/rspec/summary_logger_spec.rb
81
- - spec/parallel_tests/tasks_spec.rb
82
- - spec/parallel_tests/test/runner_spec.rb
83
- - spec/parallel_tests/test/runtime_logger_spec.rb
84
- - spec/parallel_tests_spec.rb
85
- - spec/spec_helper.rb
86
69
  homepage: http://github.com/vinted/parallel_tests
87
70
  licenses:
88
71
  - MIT
@@ -93,18 +76,18 @@ require_paths:
93
76
  - lib
94
77
  required_ruby_version: !ruby/object:Gem::Requirement
95
78
  requirements:
96
- - - '>='
79
+ - - ">="
97
80
  - !ruby/object:Gem::Version
98
- version: '0'
81
+ version: 1.9.3
99
82
  required_rubygems_version: !ruby/object:Gem::Requirement
100
83
  requirements:
101
- - - '>='
84
+ - - ">="
102
85
  - !ruby/object:Gem::Version
103
86
  version: '0'
104
87
  requirements: []
105
88
  rubyforge_project:
106
- rubygems_version: 2.0.3
89
+ rubygems_version: 2.2.2
107
90
  signing_key:
108
91
  specification_version: 4
109
- summary: Run Test::Unit / RSpec / Cucumber in parallel
92
+ summary: Run Test::Unit / RSpec / Cucumber / Spinach in parallel
110
93
  test_files: []
data/.gitignore DELETED
@@ -1,2 +0,0 @@
1
- *.sh
2
- tmp
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --backtrace
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- rvm:
2
- - ree
3
- - 1.9.3
4
- - 2.0.0
5
- - jruby-1.7.3
6
- - jruby-head
data/Gemfile DELETED
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
3
-
4
- gem 'bump'
5
- gem 'test-unit'
6
- gem 'rspec', '>=2.4'
7
- gem 'cucumber'
8
- gem 'rake'
data/Gemfile.lock DELETED
@@ -1,48 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- parallel_tests (0.13.3)
5
- parallel
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- builder (3.0.0)
11
- bump (0.3.8)
12
- cucumber (1.1.4)
13
- builder (>= 2.1.2)
14
- diff-lcs (>= 1.1.2)
15
- gherkin (~> 2.7.1)
16
- json (>= 1.4.6)
17
- term-ansicolor (>= 1.0.6)
18
- diff-lcs (1.2.4)
19
- gherkin (2.7.6)
20
- json (>= 1.4.6)
21
- gherkin (2.7.6-java)
22
- json (>= 1.4.6)
23
- json (1.7.5)
24
- json (1.7.5-java)
25
- parallel (0.6.5)
26
- rake (10.0.3)
27
- rspec (2.13.0)
28
- rspec-core (~> 2.13.0)
29
- rspec-expectations (~> 2.13.0)
30
- rspec-mocks (~> 2.13.0)
31
- rspec-core (2.13.1)
32
- rspec-expectations (2.13.0)
33
- diff-lcs (>= 1.1.3, < 2.0)
34
- rspec-mocks (2.13.1)
35
- term-ansicolor (1.0.7)
36
- test-unit (2.4.4)
37
-
38
- PLATFORMS
39
- java
40
- ruby
41
-
42
- DEPENDENCIES
43
- bump
44
- cucumber
45
- parallel_tests!
46
- rake
47
- rspec (>= 2.4)
48
- test-unit
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require 'bump/tasks'
2
- require 'bundler/gem_tasks'
3
-
4
- task :default do
5
- sh "rspec spec/"
6
- end
data/ReadmeRails2.md DELETED
@@ -1,48 +0,0 @@
1
- ### Install
2
-
3
- As gem
4
-
5
- gem install parallel_tests
6
-
7
- # add to config/environments/development.rb
8
- config.gem "parallel_tests"
9
-
10
- # add to Rakefile
11
- begin; require 'parallel_tests/tasks'; rescue LoadError; end
12
-
13
- OR as plugin
14
-
15
- gem install parallel
16
-
17
- # add to config/environments/development.rb
18
- config.gem "parallel"
19
-
20
- ./script/plugin install git://github.com/grosser/parallel_tests.git
21
-
22
- # add to Rakefile
23
- begin; require 'vendor/plugins/parallel_tests/lib/parallel_tests/tasks'; rescue LoadError; end
24
-
25
-
26
- Even process runtimes
27
- -----------------
28
-
29
- RSpec 1.x:
30
- --format progress
31
- --require parallel_tests/rspec/runtime_logger
32
- --format ParallelTests::RSpec::RuntimeLogger:tmp/parallel_runtime_rspec.log
33
-
34
- SpecSummaryLogger
35
- --------------------
36
-
37
- RSpec 1.x:
38
- --format progress
39
- --require parallel_tests/rspec/summary_logger
40
- --format ParallelTests::RSpec::SummaryLogger:tmp/spec_summary.log
41
-
42
- SpecFailuresLogger
43
- -----------------------
44
-
45
- RSpec 1.x:
46
- --format progress
47
- --require parallel_tests/rspec/failures_logger
48
- --format ParallelTests::RSpec::FailuresLogger:tmp/failing_specs.log
@@ -1,14 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
- name = "vinted-parallel_tests"
3
- require "parallel_tests/version"
4
-
5
- Gem::Specification.new name, ParallelTests::VERSION do |s|
6
- s.summary = "Run Test::Unit / RSpec / Cucumber in parallel"
7
- s.authors = ["Laurynas Butkus", "Tomas Varaneckas", "Justas Janauskas"]
8
- s.email = ["laurynas.butkus@gmail.com", "tomas.varaneckas@gmail.com", "jjanauskas@gmail.com"]
9
- s.homepage = "http://github.com/vinted/parallel_tests"
10
- s.files = `git ls-files`.split("\n")
11
- s.license = "MIT"
12
- s.executables = ["parallel_cucumber", "parallel_rspec", "parallel_test"]
13
- s.add_runtime_dependency "parallel"
14
- end