semaphore_test_boosters 0.3.0 → 0.4.0
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.
- checksums.yaml +4 -4
- data/lib/test_boosters/cli_parser.rb +3 -1
- data/lib/test_boosters/cucumber_booster.rb +71 -0
- data/lib/test_boosters/display_files.rb +3 -1
- data/lib/test_boosters/executor.rb +3 -1
- data/lib/test_boosters/leftover_files.rb +29 -0
- data/lib/test_boosters/logger.rb +3 -1
- data/lib/test_boosters/rspec_booster.rb +11 -11
- data/lib/test_boosters/version.rb +1 -1
- data/lib/test_boosters.rb +1 -0
- data/script/cucumber_booster +8 -0
- data/test_data/a.feature +1 -0
- data/test_data/b.feature +1 -0
- data/test_data/c.feature +1 -0
- metadata +7 -2
- data/lib/test_boosters/leftover_specs.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19d8e45b1a80f42a4c02d663029c796a6f96151b
|
4
|
+
data.tar.gz: c3a59300fe1bca57b29528310ae48968a11c1fda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f84e35496c067188e94c7d2c0f070dee0f4077db3c24264ef924c2b20cae5ef6fa1abbba92bd1c24e1c0267392ef3b456a0d8f054f345be1f3366a5d2089436
|
7
|
+
data.tar.gz: a2e2bf774eb857ba5d0bbf7d055427e240380dc5467012d5aa0d6e0e03338d8f49a531c026e1901e3c8697ca3c42ad1301cfb9c44186e79e3438465e29b50921
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Semaphore
|
2
|
+
require "json"
|
3
|
+
require "test_boosters/cli_parser"
|
4
|
+
require "test_boosters/logger"
|
5
|
+
require "test_boosters/executor"
|
6
|
+
require "test_boosters/display_files"
|
7
|
+
require "test_boosters/leftover_files"
|
8
|
+
|
9
|
+
class CucumberBooster
|
10
|
+
def initialize(thread_index)
|
11
|
+
@thread_index = thread_index
|
12
|
+
@report_path = ENV["REPORT_PATH"] || "#{ENV["HOME"]}/cucumber_report.json"
|
13
|
+
@spec_path = ENV["SPEC_PATH"] || "features"
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
begin
|
18
|
+
features_to_run = select
|
19
|
+
|
20
|
+
if features_to_run.empty?
|
21
|
+
puts "No feature files in this thread!"
|
22
|
+
else
|
23
|
+
Semaphore::execute("bundle exec cucumber #{features_to_run.join(" ")}")
|
24
|
+
end
|
25
|
+
rescue StandardError => e
|
26
|
+
if @thread_index == 0
|
27
|
+
Semaphore::execute("bundle exec cucumber #{@spec_path}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def select
|
33
|
+
with_fallback do
|
34
|
+
feature_report = JSON.parse(File.read(@report_path))
|
35
|
+
thread_count = feature_report.count
|
36
|
+
thread = feature_report[@thread_index]
|
37
|
+
|
38
|
+
all_features = Dir["#{@spec_path}/**/*.feature"].sort
|
39
|
+
all_known_features = feature_report.map { |t| t["files"] }.flatten.sort
|
40
|
+
|
41
|
+
all_leftover_features = all_features - all_known_features
|
42
|
+
thread_leftover_features = LeftoverFiles::select(all_leftover_features, thread_count, @thread_index)
|
43
|
+
thread_features = all_features & thread["files"].sort
|
44
|
+
features_to_run = thread_features + thread_leftover_features
|
45
|
+
|
46
|
+
Semaphore::display_files("This thread specs:", thread_features)
|
47
|
+
Semaphore::display_files("This thread leftover specs:", thread_leftover_features)
|
48
|
+
Semaphore::display_files("All leftover specs:", all_leftover_features)
|
49
|
+
|
50
|
+
features_to_run
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def with_fallback
|
55
|
+
yield
|
56
|
+
rescue StandardError => e
|
57
|
+
error = %{
|
58
|
+
WARNING: An error detected while parsing the test boosters report file.
|
59
|
+
WARNING: All tests will be executed on the first thread.
|
60
|
+
}
|
61
|
+
|
62
|
+
puts error
|
63
|
+
|
64
|
+
error += %{Exception: #{e.message}}
|
65
|
+
|
66
|
+
Semaphore::log(error)
|
67
|
+
|
68
|
+
raise
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module LeftoverFiles
|
2
|
+
module_function
|
3
|
+
|
4
|
+
def self.select(all_leftover_files, thread_count, thread_index)
|
5
|
+
all_leftover_files = sort_by_size(all_leftover_files)
|
6
|
+
|
7
|
+
return [] if all_leftover_files.empty?
|
8
|
+
|
9
|
+
files = all_leftover_files
|
10
|
+
.each_slice(thread_count)
|
11
|
+
.reduce{ |acc, slice| acc.map{|a| a}.zip(slice.reverse) }
|
12
|
+
.map{ |f| f.kind_of?(Array) ? f.flatten : [f] } [thread_index]
|
13
|
+
|
14
|
+
if files.nil? then []
|
15
|
+
elsif files.kind_of?(Array) then files.compact
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.sort_by_size(files) # descending
|
20
|
+
files
|
21
|
+
.select { |f| File.file?(f) }
|
22
|
+
.map{ |f| [f, File.size(f)] }
|
23
|
+
.sort_by{ |a| a[1] }
|
24
|
+
.map{ |a| a[0] }
|
25
|
+
.reverse
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
end
|
data/lib/test_boosters/logger.rb
CHANGED
@@ -4,11 +4,9 @@ module Semaphore
|
|
4
4
|
require "test_boosters/logger"
|
5
5
|
require "test_boosters/executor"
|
6
6
|
require "test_boosters/display_files"
|
7
|
-
require "test_boosters/
|
7
|
+
require "test_boosters/leftover_files"
|
8
8
|
|
9
9
|
class RspecBooster
|
10
|
-
Error = -1
|
11
|
-
|
12
10
|
def initialize(thread_index)
|
13
11
|
@thread_index = thread_index
|
14
12
|
@report_path = ENV["REPORT_PATH"] || "#{ENV["HOME"]}/rspec_report.json"
|
@@ -16,16 +14,18 @@ module Semaphore
|
|
16
14
|
end
|
17
15
|
|
18
16
|
def run
|
19
|
-
|
17
|
+
begin
|
18
|
+
specs_to_run = select
|
20
19
|
|
21
|
-
|
20
|
+
if specs_to_run.empty?
|
21
|
+
puts "No spec files in this thread!"
|
22
|
+
else
|
23
|
+
Semaphore::execute("bundle exec rspec #{specs_to_run.join(" ")}")
|
24
|
+
end
|
25
|
+
rescue StandardError => e
|
22
26
|
if @thread_index == 0
|
23
27
|
Semaphore::execute("bundle exec rspec #{@spec_path}")
|
24
28
|
end
|
25
|
-
elsif specs_to_run.empty?
|
26
|
-
puts "No spec files in this thread!"
|
27
|
-
else
|
28
|
-
Semaphore::execute("bundle exec rspec #{specs_to_run.join(" ")}")
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -39,7 +39,7 @@ module Semaphore
|
|
39
39
|
all_known_specs = rspec_report.map { |t| t["files"] }.flatten.sort
|
40
40
|
|
41
41
|
all_leftover_specs = all_specs - all_known_specs
|
42
|
-
thread_leftover_specs =
|
42
|
+
thread_leftover_specs = LeftoverFiles::select(all_leftover_specs, thread_count, @thread_index)
|
43
43
|
thread_specs = all_specs & thread["files"].sort
|
44
44
|
specs_to_run = thread_specs + thread_leftover_specs
|
45
45
|
|
@@ -66,7 +66,7 @@ module Semaphore
|
|
66
66
|
|
67
67
|
Semaphore::log(error)
|
68
68
|
|
69
|
-
|
69
|
+
raise
|
70
70
|
end
|
71
71
|
|
72
72
|
end
|
data/lib/test_boosters.rb
CHANGED
data/test_data/a.feature
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
12345678901234567890
|
data/test_data/b.feature
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
123
|
data/test_data/c.feature
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
123456789
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: semaphore_test_boosters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MAINTAINER Rendered Text
|
@@ -70,16 +70,21 @@ files:
|
|
70
70
|
- bin/setup
|
71
71
|
- lib/test_boosters.rb
|
72
72
|
- lib/test_boosters/cli_parser.rb
|
73
|
+
- lib/test_boosters/cucumber_booster.rb
|
73
74
|
- lib/test_boosters/display_files.rb
|
74
75
|
- lib/test_boosters/executor.rb
|
75
|
-
- lib/test_boosters/
|
76
|
+
- lib/test_boosters/leftover_files.rb
|
76
77
|
- lib/test_boosters/logger.rb
|
77
78
|
- lib/test_boosters/rspec_booster.rb
|
78
79
|
- lib/test_boosters/version.rb
|
80
|
+
- script/cucumber_booster
|
79
81
|
- script/rspec_booster
|
80
82
|
- test_boosters.gemspec
|
83
|
+
- test_data/a.feature
|
81
84
|
- test_data/a_spec.rb
|
85
|
+
- test_data/b.feature
|
82
86
|
- test_data/b_spec.rb
|
87
|
+
- test_data/c.feature
|
83
88
|
- test_data/c_spec.rb
|
84
89
|
homepage: https://github.com/renderedtext/test-boosters
|
85
90
|
licenses:
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module LeftoverSpecs
|
2
|
-
def self.select(all_leftover_specs, thread_count, thread_index)
|
3
|
-
all_leftover_specs = sort_by_size(all_leftover_specs)
|
4
|
-
|
5
|
-
return [] if all_leftover_specs.empty?
|
6
|
-
|
7
|
-
specs = all_leftover_specs
|
8
|
-
.each_slice(thread_count)
|
9
|
-
.reduce{|acc, slice| acc.map{|a| a}.zip(slice.reverse)}
|
10
|
-
.map{|f| if f.kind_of?(Array) then f.flatten else [f] end} [thread_index]
|
11
|
-
|
12
|
-
if specs.nil? then []
|
13
|
-
elsif specs.kind_of?(Array) then specs.compact
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.sort_by_size(specs) # descending
|
18
|
-
specs
|
19
|
-
.map{|f| if File.file?(f) then f else nil end}
|
20
|
-
.compact
|
21
|
-
.map{|f| [f, File.size(f)]}
|
22
|
-
.sort_by{|a| a[1]}.map{|a| a[0]}.reverse
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
end
|