semaphore_test_boosters 1.4.2 → 1.4.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c63a807761af0ba757fcc3464996283978f3c331
4
- data.tar.gz: a84249a96db45e3eb175e176511dc10c9fecbc5e
3
+ metadata.gz: aa0c05a135e2761cbf334e71cacdf310462650f5
4
+ data.tar.gz: 7bdc059143b61f6960cadd5f851975b1405542e1
5
5
  SHA512:
6
- metadata.gz: 0070d612a7e9550180e5da65dab6e274e841626a7dd853ce9e99f198d610671218c6713c7e5f4bb0c1cf2962d932a8852d53aad553039cef061c0f2005c6e13e
7
- data.tar.gz: 0cd1b414e3a818cd1bfc4387804077c86737653faaa98729df882b4a7acf524e4cbd15589aceed9c5545897edcc8a0a04ab8b69f116e5ca1fba4ad6afa0027dc
6
+ metadata.gz: 610f504b0ce4d82b9c0405f8dc924a81f0d29cd3220d8997523cae63b30bf690f16b0322db0dd432e49be8b7c6dde931dcd16ffe83a9421341e9666ff8331e0e
7
+ data.tar.gz: faf3337b8cca83ec87c5472a420976dd0bd5680a102595eebf9473020f1d5e8e045cfc164031965b29e18afb649994cdfa71bb676d74bf091933f20adbc2e330
data/.gitignore CHANGED
@@ -11,3 +11,4 @@
11
11
  /vendor
12
12
  /coverage
13
13
  config/cucumber.yml
14
+ /features
data/.rubocop.yml CHANGED
@@ -6,6 +6,7 @@ AllCops:
6
6
  Exclude:
7
7
  - "*.gemspec"
8
8
  - "vendor/**/*"
9
+ - "features/**/*"
9
10
  - "lib/test_boosters/cucumber_booster.rb"
10
11
  - "test_data_pass/**/*"
11
12
  - "test_data_fail/**/*"
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 Predrag Rakic
3
+ Copyright (c) 2017 Rendered Text
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -2,42 +2,25 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/semaphore_test_boosters.svg)](https://badge.fury.io/rb/semaphore_test_boosters)
4
4
 
5
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/test_boosters`. To experiment with that code, run `bin/console` for an interactive prompt.
6
-
7
- TODO: Delete this and the text above, and describe your gem
5
+ Auto Parallelization — runs test files in multiple threads.
8
6
 
9
7
  ## Installation
10
8
 
11
- Add this line to your application's Gemfile:
12
-
13
- ```ruby
14
- gem 'test_boosters'
15
- ```
16
-
17
- And then execute:
18
-
19
- $ bundle
20
-
21
- Or install it yourself as:
22
-
23
- $ gem install test_boosters
9
+ ``` bash
10
+ gem install test_boosters
11
+ ````
24
12
 
25
13
  ## Usage
26
14
 
27
15
  TODO: Write usage instructions here
28
16
 
29
- ## Development
30
-
31
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
32
-
33
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
34
-
35
17
  ## Contributing
36
18
 
37
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/test_boosters.
19
+ Bug reports and pull requests are welcome on GitHub at
20
+ https://github.com/renderedtext/test-boosters.
38
21
 
39
22
 
40
23
  ## License
41
24
 
42
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
43
-
25
+ The gem is available as open source under the terms of the
26
+ [MIT License](http://opensource.org/licenses/MIT).
data/exe/cucumber_booster CHANGED
@@ -2,14 +2,8 @@
2
2
 
3
3
  require "test_boosters"
4
4
 
5
- TestBoosters.run_cucumber_config
6
-
7
5
  cli_options = TestBoosters::CliParser.parse
8
6
  thread_index = cli_options[:index] - 1
9
- cucumber_booster = TestBoosters::CucumberBooster.new(thread_index)
10
- exit_status = cucumber_booster.run
11
-
12
- report_path = cucumber_booster.report_path
13
- TestBoosters::InsightsUploader.upload("cucumber", report_path)
7
+ cucumber_booster = TestBoosters::Cucumber::Booster.new(thread_index)
14
8
 
15
- exit(exit_status)
9
+ exit(cucumber_booster.run)
@@ -0,0 +1,56 @@
1
+ module TestBoosters
2
+ module Cucumber
3
+ class Booster
4
+
5
+ def initialize(thread_index)
6
+ @thread_index = thread_index
7
+ end
8
+
9
+ def run
10
+ TestBoosters::Shell.display_title("Cucumber Boster v#{TestBoosters::VERSION}")
11
+
12
+ unless split_configuration.valid?
13
+ puts "[ERROR] The split configuration file is malformed!"
14
+
15
+ return 1 # failure exit status
16
+ end
17
+
18
+ threads[@thread_index].run
19
+ end
20
+
21
+ def thread_count
22
+ @thread_count ||= split_configuration.thread_count
23
+ end
24
+
25
+ def threads
26
+ @threads ||= Array.new(thread_count) do |thread_index|
27
+ known_files = all_specs & split_configuration.files_for_thread(thread_index)
28
+ leftover_files = TestBoosters::LeftoverFiles.select(all_leftover_specs, thread_count, thread_index)
29
+
30
+ TestBoosters::Cucumber::Thread.new(known_files, leftover_files)
31
+ end
32
+ end
33
+
34
+ def all_specs
35
+ @all_specs ||= Dir["#{specs_path}/**/*.feature"].sort
36
+ end
37
+
38
+ def all_leftover_specs
39
+ @all_leftover_specs ||= all_specs - split_configuration.all_files
40
+ end
41
+
42
+ def split_configuration
43
+ @split_configuration ||= TestBoosters::SplitConfiguration.new(split_configuration_path)
44
+ end
45
+
46
+ def specs_path
47
+ @specs_path ||= ENV["SPEC_PATH"] || "spec"
48
+ end
49
+
50
+ def split_configuration_path
51
+ ENV["CUCUMBER_SPLIT_CONFIGURATION_PATH"] || "#{ENV["HOME"]}/cucumber_split_configuration.json"
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,71 @@
1
+ module TestBoosters
2
+ module Cucumber
3
+ class Thread
4
+
5
+ attr_reader :files_from_split_configuration
6
+ attr_reader :leftover_files
7
+
8
+ def initialize(files_from_split_configuration, leftover_files)
9
+ @files_from_split_configuration = files_from_split_configuration
10
+ @leftover_files = leftover_files
11
+ end
12
+
13
+ # :reek:TooManyStatements { max_statements: 10 }
14
+ def run
15
+ if all_files.empty?
16
+ puts("No files to run in this thread!")
17
+
18
+ return 0
19
+ end
20
+
21
+ run_cucumber_config
22
+
23
+ display_thread_info
24
+
25
+ exit_status = run_cucumber
26
+
27
+ upload_report
28
+
29
+ exit_status
30
+ end
31
+
32
+ def display_thread_info
33
+ TestBoosters::Shell.display_files(
34
+ "Known specs for this thread",
35
+ files_from_split_configuration)
36
+
37
+ TestBoosters::Shell.display_files(
38
+ "Leftover specs for this thread",
39
+ leftover_files)
40
+ end
41
+
42
+ def run_cucumber_config
43
+ CucumberBoosterConfig::Injection.new(Dir.pwd, report_path).run
44
+ puts "-------------------------------------------------------"
45
+ puts
46
+ end
47
+
48
+ def run_cucumber
49
+ TestBoosters::Shell.display_title("Running Cucumber")
50
+ TestBoosters::Shell.execute(cucumber_command)
51
+ end
52
+
53
+ def upload_report
54
+ TestBoosters::InsightsUploader.upload("cucumber", report_path)
55
+ end
56
+
57
+ def all_files
58
+ @all_files ||= files_from_split_configuration + leftover_files
59
+ end
60
+
61
+ def cucumber_command
62
+ "bundle exec cucumber #{all_files.join(" ")}"
63
+ end
64
+
65
+ def report_path
66
+ @report_path ||= ENV["REPORT_PATH"] || "#{ENV["HOME"]}/cucumber_report.json"
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -3,13 +3,6 @@ module TestBoosters
3
3
 
4
4
  Thread = Struct.new(:files, :thread_index)
5
5
 
6
- def self.for_cucumber
7
- path_from_env = ENV["CUCUMBER_SPLIT_CONFIGURATION_PATH"]
8
- default_path = "#{ENV["HOME"]}/cucumber_split_configuration.json"
9
-
10
- new(path_from_env || default_path)
11
- end
12
-
13
6
  def initialize(path)
14
7
  @path = path
15
8
  end
@@ -1,3 +1,3 @@
1
1
  module TestBoosters
2
- VERSION = "1.4.2".freeze
2
+ VERSION = "1.4.3".freeze
3
3
  end
data/lib/test_boosters.rb CHANGED
@@ -11,19 +11,11 @@ module TestBoosters
11
11
  require "test_boosters/logger"
12
12
  require "test_boosters/shell"
13
13
  require "test_boosters/leftover_files"
14
+ require "test_boosters/insights_uploader"
14
15
 
15
16
  require "test_boosters/rspec/booster"
16
17
  require "test_boosters/rspec/thread"
17
- require "test_boosters/cucumber_booster"
18
- require "test_boosters/insights_uploader"
19
-
20
- module_function
21
-
22
- def run_cucumber_config
23
- puts
24
- puts "================== Running Cucumber Booster Config ==================="
25
- puts
26
18
 
27
- CucumberBoosterConfig::CLI.start ["inject", "."]
28
- end
19
+ require "test_boosters/cucumber/booster"
20
+ require "test_boosters/cucumber/thread"
29
21
  end
@@ -1,12 +1,12 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require "test_boosters/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "semaphore_test_boosters"
8
8
  spec.version = TestBoosters::VERSION
9
- spec.authors = ["MAINTAINER Rendered Text"]
9
+ spec.authors = ["Developers at Rendered Text"]
10
10
  spec.email = ["devops@renderedtext.com"]
11
11
 
12
12
  spec.summary = %q{Semaphore job parallelization.}
@@ -14,20 +14,12 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/renderedtext/test-boosters"
15
15
  spec.license = "MIT"
16
16
 
17
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
- # to allow pushing to a single host or delete this section to allow pushing to any host.
19
- if spec.respond_to?(:metadata)
20
- spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
- else
22
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
- end
24
-
25
17
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
18
  spec.bindir = "exe"
27
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
20
  spec.require_paths = ["lib"]
29
21
 
30
- spec.add_dependency "semaphore_cucumber_booster_config", "~> 1.1"
22
+ spec.add_dependency "semaphore_cucumber_booster_config", "~> 1.3"
31
23
 
32
24
  spec.add_development_dependency "rake", "~> 10.0"
33
25
  spec.add_development_dependency "rspec", "~> 3.5"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semaphore_test_boosters
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.4.3
5
5
  platform: ruby
6
6
  authors:
7
- - MAINTAINER Rendered Text
7
+ - Developers at Rendered Text
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-18 00:00:00.000000000 Z
11
+ date: 2017-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: semaphore_cucumber_booster_config
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: '1.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.1'
26
+ version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -155,12 +155,12 @@ files:
155
155
  - bin/console
156
156
  - bin/setup
157
157
  - config.reek
158
- - config/cucumber.yml
159
158
  - exe/cucumber_booster
160
159
  - exe/rspec_booster
161
160
  - lib/test_boosters.rb
162
161
  - lib/test_boosters/cli_parser.rb
163
- - lib/test_boosters/cucumber_booster.rb
162
+ - lib/test_boosters/cucumber/booster.rb
163
+ - lib/test_boosters/cucumber/thread.rb
164
164
  - lib/test_boosters/insights_uploader.rb
165
165
  - lib/test_boosters/leftover_files.rb
166
166
  - lib/test_boosters/logger.rb
@@ -181,8 +181,7 @@ files:
181
181
  homepage: https://github.com/renderedtext/test-boosters
182
182
  licenses:
183
183
  - MIT
184
- metadata:
185
- allowed_push_host: https://rubygems.org
184
+ metadata: {}
186
185
  post_install_message:
187
186
  rdoc_options: []
188
187
  require_paths:
data/config/cucumber.yml DELETED
@@ -1,13 +0,0 @@
1
- default: --format pretty --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci --profile semaphoreci
2
- semaphoreci: --format json --out=../cucumber_report.json
3
- semaphoreci: --format json --out=../cucumber_report.json
4
- semaphoreci: --format json --out=../cucumber_report.json
5
- semaphoreci: --format json --out=../cucumber_report.json
6
- semaphoreci: --format json --out=../cucumber_report.json
7
- semaphoreci: --format json --out=../cucumber_report.json
8
- semaphoreci: --format json --out=../cucumber_report.json
9
- semaphoreci: --format json --out=../cucumber_report.json
10
- semaphoreci: --format json --out=../cucumber_report.json
11
- semaphoreci: --format json --out=../cucumber_report.json
12
- semaphoreci: --format json --out=../cucumber_report.json
13
- semaphoreci: --format json --out=../cucumber_report.json
@@ -1,75 +0,0 @@
1
- module TestBoosters
2
- class CucumberBooster
3
- attr_reader :report_path
4
-
5
- def initialize(thread_index)
6
- @thread_index = thread_index
7
- @report_path = ENV["REPORT_PATH"] || "#{ENV["HOME"]}/cucumber_report.json"
8
- @spec_path = ENV["SPEC_PATH"] || "features"
9
- end
10
-
11
- def run
12
- exit_code = true
13
- begin
14
- features_to_run = select
15
-
16
- if features_to_run.empty?
17
- puts "No feature files in this thread!"
18
- else
19
- exit_code = run_command(features_to_run.join(" "))
20
- end
21
- rescue StandardError
22
- if @thread_index == 0
23
- exit_code = run_command(@spec_path)
24
- end
25
- end
26
- exit_code
27
- end
28
-
29
- def run_command(specs)
30
- puts
31
- puts "========================= Running Cucumber =========================="
32
- puts
33
-
34
- TestBoosters::Shell.execute("bundle exec cucumber #{specs}")
35
- end
36
-
37
- def select
38
- with_fallback do
39
- split_configuration = TestBoosters::SplitConfiguration.for_cucumber
40
- thread_count = split_configuration.threads.count
41
-
42
- all_features = Dir["#{@spec_path}/**/*.feature"].sort
43
- all_known_features = split_configuration.all_files
44
-
45
- all_leftover_features = all_features - all_known_features
46
- thread_leftover_features = TestBoosters::LeftoverFiles.select(all_leftover_features, thread_count, @thread_index)
47
- thread_features = all_features & split_configuration.files_for_thread(@thread_index)
48
- features_to_run = thread_features + thread_leftover_features
49
-
50
- TestBoosters::Shell.display_files("This thread features:", thread_features)
51
- TestBoosters::Shell.display_title_and_count("All leftover features:", all_leftover_features)
52
- TestBoosters::Shell.display_files("This thread leftover features:", thread_leftover_features)
53
-
54
- features_to_run
55
- end
56
- end
57
-
58
- def with_fallback
59
- yield
60
- rescue StandardError => e
61
- error = %{
62
- WARNING: An error detected while parsing the test boosters report file.
63
- WARNING: All tests will be executed on the first thread.
64
- }
65
-
66
- puts error
67
-
68
- error += "Exception: #{e.message}"
69
-
70
- TestBoosters::Logger.error(error)
71
-
72
- raise
73
- end
74
- end
75
- end