turbo_tests 1.0.0 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/snyk_ruby-analysis.yml +33 -0
- data/.github/workflows/tests.yml +25 -0
- data/.gitignore +57 -0
- data/.rspec +1 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +21 -22
- data/README.md +14 -23
- data/Rakefile +1 -0
- data/bin/turbo_tests +11 -0
- data/fixtures/rspec/errors_outside_of_examples_spec.rb +5 -0
- data/lib/turbo_tests.rb +22 -22
- data/lib/turbo_tests/cli.rb +26 -4
- data/lib/turbo_tests/json_rows_formatter.rb +80 -29
- data/lib/turbo_tests/reporter.rb +26 -3
- data/lib/turbo_tests/runner.rb +135 -42
- data/lib/turbo_tests/version.rb +1 -1
- data/lib/utils/hash_extension.rb +9 -0
- data/turbo_tests.gemspec +9 -9
- metadata +26 -24
- data/bin/console +0 -7
- data/bin/setup +0 -8
- data/exe/turbo_tests +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 748a8d1ce5e4bd659cbef9af59b3f896b2c5b1940ae252a1a9c000c8a0237f39
|
4
|
+
data.tar.gz: 30dfc4c96dd9d624114fba30f628b500396da5775db3298b8aefeaca1407eb9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 568f6fec127a34381085a8465f1929a6324a12e010a4cdb78ba3956cbf9922840b199f2472520a37f0a013dc8e78d143b80748a029d9f15999aa49d974447a56
|
7
|
+
data.tar.gz: f655769722f00cbe2e6d3bc756666c3bb0cababb646466717952f11c99c15868ff144e6bc321e488e2a57d07bb959b39e86f7dac321c0c05d67f24e943168867
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# A sample workflow which checks out your Infrastructure as Code Configuration files,
|
2
|
+
# such as Kubernetes, Helm & Terraform and scans them for any security issues.
|
3
|
+
# The results are then uploaded to GitHub Security Code Scanning
|
4
|
+
#
|
5
|
+
# For more examples, including how to limit scans to only high-severity issues
|
6
|
+
# and fail PR checks, see https://github.com/snyk/actions/
|
7
|
+
|
8
|
+
name: Snyk Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
# The branches below must be a subset of the branches above
|
15
|
+
branches: [ master ]
|
16
|
+
schedule:
|
17
|
+
- cron: '0 0 * * 0'
|
18
|
+
|
19
|
+
jobs:
|
20
|
+
snyk:
|
21
|
+
runs-on: ubuntu-latest
|
22
|
+
steps:
|
23
|
+
- uses: actions/checkout@v2
|
24
|
+
- name: Run Snyk to check configuration files for security issues
|
25
|
+
# Snyk can be used to break the build when it detects security issues.
|
26
|
+
# In this case we want to upload the issues to GitHub Code Scanning
|
27
|
+
continue-on-error: true
|
28
|
+
uses: snyk/actions/ruby@master
|
29
|
+
env:
|
30
|
+
# In order to use the Snyk Action you will need to have a Snyk API token.
|
31
|
+
# More details in https://github.com/snyk/actions#getting-your-snyk-token
|
32
|
+
# or you can signup for free at https://snyk.io/login
|
33
|
+
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
name: Tests
|
2
|
+
|
3
|
+
on: [push, pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
|
9
|
+
strategy:
|
10
|
+
matrix:
|
11
|
+
ruby:
|
12
|
+
- 2.6
|
13
|
+
- 2.7
|
14
|
+
|
15
|
+
steps:
|
16
|
+
- uses: actions/checkout@v2
|
17
|
+
- uses: ruby/setup-ruby@master
|
18
|
+
with:
|
19
|
+
ruby-version: ${{matrix.ruby}}
|
20
|
+
bundler-cache: true
|
21
|
+
|
22
|
+
- name: Run tests
|
23
|
+
timeout-minutes: 5
|
24
|
+
run: |
|
25
|
+
${{matrix.env}} bundle exec turbo_tests -n4
|
data/.gitignore
CHANGED
@@ -9,3 +9,60 @@
|
|
9
9
|
|
10
10
|
# rspec failure tracking
|
11
11
|
.rspec_status
|
12
|
+
|
13
|
+
|
14
|
+
# Created by https://www.toptal.com/developers/gitignore/api/macos,vim
|
15
|
+
# Edit at https://www.toptal.com/developers/gitignore?templates=macos,vim
|
16
|
+
|
17
|
+
### macOS ###
|
18
|
+
# General
|
19
|
+
.DS_Store
|
20
|
+
.AppleDouble
|
21
|
+
.LSOverride
|
22
|
+
|
23
|
+
# Icon must end with two \r
|
24
|
+
Icon
|
25
|
+
|
26
|
+
|
27
|
+
# Thumbnails
|
28
|
+
._*
|
29
|
+
|
30
|
+
# Files that might appear in the root of a volume
|
31
|
+
.DocumentRevisions-V100
|
32
|
+
.fseventsd
|
33
|
+
.Spotlight-V100
|
34
|
+
.TemporaryItems
|
35
|
+
.Trashes
|
36
|
+
.VolumeIcon.icns
|
37
|
+
.com.apple.timemachine.donotpresent
|
38
|
+
|
39
|
+
# Directories potentially created on remote AFP share
|
40
|
+
.AppleDB
|
41
|
+
.AppleDesktop
|
42
|
+
Network Trash Folder
|
43
|
+
Temporary Items
|
44
|
+
.apdisk
|
45
|
+
|
46
|
+
### Vim ###
|
47
|
+
# Swap
|
48
|
+
[._]*.s[a-v][a-z]
|
49
|
+
!*.svg # comment out if you don't need vector files
|
50
|
+
[._]*.sw[a-p]
|
51
|
+
[._]s[a-rt-v][a-z]
|
52
|
+
[._]ss[a-gi-z]
|
53
|
+
[._]sw[a-p]
|
54
|
+
|
55
|
+
# Session
|
56
|
+
Session.vim
|
57
|
+
Sessionx.vim
|
58
|
+
|
59
|
+
# Temporary
|
60
|
+
.netrwhist
|
61
|
+
*~
|
62
|
+
# Auto-generated tag files
|
63
|
+
tags
|
64
|
+
# Persistent undo
|
65
|
+
[._]*.un~
|
66
|
+
|
67
|
+
# End of https://www.toptal.com/developers/gitignore/api/macos,vim
|
68
|
+
|
data/.rspec
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
turbo_tests (
|
5
|
-
|
6
|
-
parallel_tests
|
7
|
-
rspec
|
4
|
+
turbo_tests (1.2.4)
|
5
|
+
bundler
|
6
|
+
parallel_tests (~> 3.3)
|
7
|
+
rspec (~> 3.10.0)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -12,34 +12,33 @@ GEM
|
|
12
12
|
coderay (1.1.3)
|
13
13
|
diff-lcs (1.4.4)
|
14
14
|
method_source (1.0.0)
|
15
|
-
|
16
|
-
|
17
|
-
parallel_tests (3.3.0)
|
15
|
+
parallel (1.20.1)
|
16
|
+
parallel_tests (3.5.2)
|
18
17
|
parallel
|
19
|
-
pry (0.
|
18
|
+
pry (0.14.0)
|
20
19
|
coderay (~> 1.1)
|
21
20
|
method_source (~> 1.0)
|
22
|
-
rake (
|
23
|
-
rspec (3.
|
24
|
-
rspec-core (~> 3.
|
25
|
-
rspec-expectations (~> 3.
|
26
|
-
rspec-mocks (~> 3.
|
27
|
-
rspec-core (3.
|
28
|
-
rspec-support (~> 3.
|
29
|
-
rspec-expectations (3.
|
21
|
+
rake (13.0.3)
|
22
|
+
rspec (3.10.0)
|
23
|
+
rspec-core (~> 3.10.0)
|
24
|
+
rspec-expectations (~> 3.10.0)
|
25
|
+
rspec-mocks (~> 3.10.0)
|
26
|
+
rspec-core (3.10.1)
|
27
|
+
rspec-support (~> 3.10.0)
|
28
|
+
rspec-expectations (3.10.1)
|
30
29
|
diff-lcs (>= 1.2.0, < 2.0)
|
31
|
-
rspec-support (~> 3.
|
32
|
-
rspec-mocks (3.
|
30
|
+
rspec-support (~> 3.10.0)
|
31
|
+
rspec-mocks (3.10.2)
|
33
32
|
diff-lcs (>= 1.2.0, < 2.0)
|
34
|
-
rspec-support (~> 3.
|
35
|
-
rspec-support (3.
|
33
|
+
rspec-support (~> 3.10.0)
|
34
|
+
rspec-support (3.10.2)
|
36
35
|
|
37
36
|
PLATFORMS
|
38
37
|
ruby
|
39
38
|
|
40
39
|
DEPENDENCIES
|
41
|
-
pry
|
42
|
-
rake (~>
|
40
|
+
pry (~> 0.14)
|
41
|
+
rake (~> 13.0)
|
43
42
|
turbo_tests!
|
44
43
|
|
45
44
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
![Tests](https://github.com/serpapi/turbo_tests/workflows/Tests/badge.svg)
|
2
|
+
|
1
3
|
# TurboTests
|
2
4
|
|
3
5
|
Runner for [`grosser/parallel_tests`](https://github.com/grosser/parallel_tests) with incremental summarized output. Based on [Discourse](https://github.com/discourse/discourse/blob/6b9784cf8a18636bce281a7e4d18e65a0cbc6290/lib/turbo_tests.rb) and [RubyGems](https://github.com/rubygems/rubygems/tree/390335ceb351668cd433bd5bb9823dd021f82533/bundler/tool) work in this area.
|
@@ -11,23 +13,17 @@ This feature [doesn't fit vision of `parallel_tests` author](https://github.com/
|
|
11
13
|
```bash
|
12
14
|
|
13
15
|
$ bundle exec rake parallel_tests:spec[^spec/search]
|
14
|
-
|
15
|
-
...........................................................................................................................................................................................
|
16
|
-
...........................................................................................................................................................................................
|
16
|
+
.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
|
17
17
|
|
18
18
|
Finished in 1 minute 6.92 seconds (files took 6.95 seconds to load)
|
19
19
|
2616 examples, 0 failures
|
20
20
|
|
21
|
-
.........................................................................................................................................F
|
22
|
-
.......................................................................................F...................................................................................................
|
23
|
-
...........................................................................................................................................................................................
|
21
|
+
.........................................................................................................................................F........................................................................................................................................F..............................................................................................................................................................................................................................................................................................
|
24
22
|
|
25
23
|
Finished in 1 minute 35.05 seconds (files took 6.26 seconds to load)
|
26
24
|
2158 examples, 2 failures
|
27
25
|
|
28
|
-
|
29
|
-
...........................................................................................................................................................................................
|
30
|
-
...........................................................................................................................................................................................
|
26
|
+
.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
|
31
27
|
|
32
28
|
Finished in 1 minute 35.05 seconds (files took 6.26 seconds to load)
|
33
29
|
2158 examples, 0 failures
|
@@ -36,16 +32,8 @@ Finished in 1 minute 35.05 seconds (files took 6.26 seconds to load)
|
|
36
32
|
`turbo_tests` output looks like regular `rspec`:
|
37
33
|
|
38
34
|
```bash
|
39
|
-
$ bundle exec
|
40
|
-
|
41
|
-
...........................................................................................................................................................................................
|
42
|
-
...........................................................................................................................................................................................
|
43
|
-
.........................................................................................................................................F.................................................
|
44
|
-
.......................................................................................F...................................................................................................
|
45
|
-
...........................................................................................................................................................................................
|
46
|
-
...........................................................................................................................................................................................
|
47
|
-
...........................................................................................................................................................................................
|
48
|
-
...........................................................................................................................................................................................
|
35
|
+
$ bundle exec turbo_tests
|
36
|
+
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................F........................................................................................................................................F..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
|
49
37
|
|
50
38
|
Finished in 2 minute 25.15 seconds (files took 0 seconds to load)
|
51
39
|
6873 examples, 2 failures
|
@@ -80,17 +68,20 @@ Show help:
|
|
80
68
|
```bash
|
81
69
|
$ bundle exec turbo_tests -h
|
82
70
|
Usage: turbo_tests [options]
|
71
|
+
|
72
|
+
[optional] Only selected files & folders:
|
73
|
+
turbo_tests spec/bar spec/baz/xxx_spec.rb
|
74
|
+
|
75
|
+
Options:
|
76
|
+
-n [PROCESSES] How many processes to use, default: available CPUs
|
83
77
|
-r, --require PATH Require a file.
|
84
|
-
-f, --format FORMATTER Choose a formatter.
|
78
|
+
-f, --format FORMATTER Choose a formatter. Available formatters: progress (p), documentation (d). Default: progress
|
85
79
|
-t, --tag TAG Run examples with the specified tag.
|
86
80
|
-o, --out FILE Write output to a file instead of $stdout
|
87
81
|
-v, --verbose More output
|
88
82
|
--fail-fast=[N]
|
89
83
|
```
|
90
84
|
|
91
|
-
## Roadmap
|
92
|
-
- [ ] Capture time to load files #1
|
93
|
-
|
94
85
|
## Development
|
95
86
|
|
96
87
|
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.
|
data/Rakefile
CHANGED
data/bin/turbo_tests
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
# Enable local usage from cloned repo
|
6
|
+
root = File.expand_path("../..", __FILE__)
|
7
|
+
$LOAD_PATH << "#{root}/lib" if File.exist?("#{root}/Gemfile")
|
8
|
+
|
9
|
+
require "turbo_tests"
|
10
|
+
|
11
|
+
TurboTests::CLI.new(ARGV).run
|
data/lib/turbo_tests.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "turbo_tests/version"
|
4
|
-
require "bundler/setup"
|
5
|
-
|
6
3
|
require "open3"
|
7
4
|
require "fileutils"
|
8
5
|
require "json"
|
@@ -16,6 +13,9 @@ require "turbo_tests/runner"
|
|
16
13
|
require "turbo_tests/json_rows_formatter"
|
17
14
|
|
18
15
|
module TurboTests
|
16
|
+
autoload :CLI, "turbo_tests/cli"
|
17
|
+
autoload :VERSION, "turbo_tests/version"
|
18
|
+
|
19
19
|
FakeException = Struct.new(:backtrace, :message, :cause)
|
20
20
|
class FakeException
|
21
21
|
def self.from_obj(obj)
|
@@ -23,14 +23,14 @@ module TurboTests
|
|
23
23
|
klass =
|
24
24
|
Class.new(FakeException) {
|
25
25
|
define_singleton_method(:name) do
|
26
|
-
obj[
|
26
|
+
obj[:class_name]
|
27
27
|
end
|
28
28
|
}
|
29
29
|
|
30
30
|
klass.new(
|
31
|
-
obj[
|
32
|
-
obj[
|
33
|
-
FakeException.from_obj(obj[
|
31
|
+
obj[:backtrace],
|
32
|
+
obj[:message],
|
33
|
+
FakeException.from_obj(obj[:cause])
|
34
34
|
)
|
35
35
|
end
|
36
36
|
end
|
@@ -40,11 +40,11 @@ module TurboTests
|
|
40
40
|
class FakeExecutionResult
|
41
41
|
def self.from_obj(obj)
|
42
42
|
new(
|
43
|
-
obj[
|
44
|
-
obj[
|
45
|
-
obj[
|
46
|
-
obj[
|
47
|
-
FakeException.from_obj(obj[
|
43
|
+
obj[:example_skipped?],
|
44
|
+
obj[:pending_message],
|
45
|
+
obj[:status].to_sym,
|
46
|
+
obj[:pending_fixed?],
|
47
|
+
FakeException.from_obj(obj[:exception])
|
48
48
|
)
|
49
49
|
end
|
50
50
|
end
|
@@ -52,24 +52,24 @@ module TurboTests
|
|
52
52
|
FakeExample = Struct.new(:execution_result, :location, :description, :full_description, :metadata, :location_rerun_argument)
|
53
53
|
class FakeExample
|
54
54
|
def self.from_obj(obj)
|
55
|
-
metadata = obj[
|
55
|
+
metadata = obj[:metadata]
|
56
56
|
|
57
|
-
metadata[
|
57
|
+
metadata[:shared_group_inclusion_backtrace].map! do |frame|
|
58
58
|
RSpec::Core::SharedExampleGroupInclusionStackFrame.new(
|
59
|
-
frame[
|
60
|
-
frame[
|
59
|
+
frame[:shared_group_name],
|
60
|
+
frame[:inclusion_location]
|
61
61
|
)
|
62
62
|
end
|
63
63
|
|
64
|
-
metadata[:shared_group_inclusion_backtrace] = metadata.delete(
|
64
|
+
metadata[:shared_group_inclusion_backtrace] = metadata.delete(:shared_group_inclusion_backtrace)
|
65
65
|
|
66
66
|
new(
|
67
|
-
FakeExecutionResult.from_obj(obj[
|
68
|
-
obj[
|
69
|
-
obj[
|
70
|
-
obj[
|
67
|
+
FakeExecutionResult.from_obj(obj[:execution_result]),
|
68
|
+
obj[:location],
|
69
|
+
obj[:description],
|
70
|
+
obj[:full_description],
|
71
71
|
metadata,
|
72
|
-
obj[
|
72
|
+
obj[:location_rerun_argument]
|
73
73
|
)
|
74
74
|
end
|
75
75
|
|
data/lib/turbo_tests/cli.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "turbo_tests"
|
4
3
|
require "optparse"
|
5
4
|
|
6
5
|
module TurboTests
|
@@ -13,15 +12,31 @@ module TurboTests
|
|
13
12
|
requires = []
|
14
13
|
formatters = []
|
15
14
|
tags = []
|
15
|
+
count = nil
|
16
16
|
verbose = false
|
17
17
|
fail_fast = nil
|
18
18
|
|
19
19
|
OptionParser.new { |opts|
|
20
|
+
opts.banner = <<~BANNER
|
21
|
+
Run all tests in parallel, giving each process ENV['TEST_ENV_NUMBER'] ('1', '2', '3', ...).
|
22
|
+
|
23
|
+
Uses parallel_tests under the hood, but reports test results incrementally. Based on Discourse and RubyGems work in this area.
|
24
|
+
|
25
|
+
Usage: turbo_tests [options]
|
26
|
+
|
27
|
+
[optional] Only selected files & folders:
|
28
|
+
turbo_tests spec/bar spec/baz/xxx_spec.rb
|
29
|
+
|
30
|
+
Options:
|
31
|
+
BANNER
|
32
|
+
|
33
|
+
opts.on("-n [PROCESSES]", Integer, "How many processes to use, default: available CPUs") { |n| count = n }
|
34
|
+
|
20
35
|
opts.on("-r", "--require PATH", "Require a file.") do |filename|
|
21
36
|
requires << filename
|
22
37
|
end
|
23
38
|
|
24
|
-
opts.on("-f", "--format FORMATTER", "Choose a formatter.") do |name|
|
39
|
+
opts.on("-f", "--format FORMATTER", "Choose a formatter. Available formatters: progress (p), documentation (d). Default: progress") do |name|
|
25
40
|
formatters << {
|
26
41
|
name: name,
|
27
42
|
outputs: []
|
@@ -71,13 +86,20 @@ module TurboTests
|
|
71
86
|
end
|
72
87
|
end
|
73
88
|
|
74
|
-
|
89
|
+
success = TurboTests::Runner.run(
|
75
90
|
formatters: formatters,
|
76
91
|
tags: tags,
|
77
92
|
files: @argv.empty? ? ["spec"] : @argv,
|
78
93
|
verbose: verbose,
|
79
|
-
fail_fast: fail_fast
|
94
|
+
fail_fast: fail_fast,
|
95
|
+
count: count,
|
80
96
|
)
|
97
|
+
|
98
|
+
if success
|
99
|
+
exit 0
|
100
|
+
else
|
101
|
+
exit 1
|
102
|
+
end
|
81
103
|
end
|
82
104
|
end
|
83
105
|
end
|
@@ -22,10 +22,15 @@ module TurboTests
|
|
22
22
|
class JsonRowsFormatter
|
23
23
|
RSpec::Core::Formatters.register(
|
24
24
|
self,
|
25
|
+
:start,
|
25
26
|
:close,
|
26
27
|
:example_failed,
|
27
28
|
:example_passed,
|
28
29
|
:example_pending,
|
30
|
+
:example_group_started,
|
31
|
+
:example_group_finished,
|
32
|
+
:example_pending,
|
33
|
+
:message,
|
29
34
|
:seed
|
30
35
|
)
|
31
36
|
|
@@ -35,37 +40,65 @@ module TurboTests
|
|
35
40
|
@output = output
|
36
41
|
end
|
37
42
|
|
43
|
+
def start(notification)
|
44
|
+
output_row(
|
45
|
+
type: :load_summary,
|
46
|
+
summary: load_summary_to_json(notification)
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
def example_group_started(notification)
|
51
|
+
output_row(
|
52
|
+
type: :group_started,
|
53
|
+
group: group_to_json(notification)
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def example_group_finished(notification)
|
58
|
+
output_row(
|
59
|
+
type: :group_finished,
|
60
|
+
group: group_to_json(notification)
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
38
64
|
def example_passed(notification)
|
39
65
|
output_row(
|
40
|
-
|
41
|
-
|
66
|
+
type: :example_passed,
|
67
|
+
example: example_to_json(notification.example)
|
42
68
|
)
|
43
69
|
end
|
44
70
|
|
45
71
|
def example_pending(notification)
|
46
72
|
output_row(
|
47
|
-
|
48
|
-
|
73
|
+
type: :example_pending,
|
74
|
+
example: example_to_json(notification.example)
|
49
75
|
)
|
50
76
|
end
|
51
77
|
|
52
78
|
def example_failed(notification)
|
53
79
|
output_row(
|
54
|
-
|
55
|
-
|
80
|
+
type: :example_failed,
|
81
|
+
example: example_to_json(notification.example)
|
56
82
|
)
|
57
83
|
end
|
58
84
|
|
59
85
|
def seed(notification)
|
60
86
|
output_row(
|
61
|
-
|
62
|
-
|
87
|
+
type: :seed,
|
88
|
+
seed: notification.seed
|
63
89
|
)
|
64
90
|
end
|
65
91
|
|
66
92
|
def close(notification)
|
67
93
|
output_row(
|
68
|
-
|
94
|
+
type: :close
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
def message(notification)
|
99
|
+
output_row(
|
100
|
+
type: :message,
|
101
|
+
message: notification.message
|
69
102
|
)
|
70
103
|
end
|
71
104
|
|
@@ -74,47 +107,65 @@ module TurboTests
|
|
74
107
|
def exception_to_json(exception)
|
75
108
|
if exception
|
76
109
|
{
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
110
|
+
class_name: exception.class.name.to_s,
|
111
|
+
backtrace: exception.backtrace,
|
112
|
+
message: exception.message,
|
113
|
+
cause: exception_to_json(exception.cause)
|
81
114
|
}
|
82
115
|
end
|
83
116
|
end
|
84
117
|
|
85
118
|
def execution_result_to_json(result)
|
86
119
|
{
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
120
|
+
example_skipped?: result.example_skipped?,
|
121
|
+
pending_message: result.pending_message,
|
122
|
+
status: result.status,
|
123
|
+
pending_fixed?: result.pending_fixed?,
|
124
|
+
exception: exception_to_json(result.exception)
|
92
125
|
}
|
93
126
|
end
|
94
127
|
|
95
128
|
def stack_frame_to_json(frame)
|
96
129
|
{
|
97
|
-
|
98
|
-
|
130
|
+
shared_group_name: frame.shared_group_name,
|
131
|
+
inclusion_location: frame.inclusion_location
|
99
132
|
}
|
100
133
|
end
|
101
134
|
|
102
135
|
def example_to_json(example)
|
103
136
|
{
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
example
|
137
|
+
execution_result: execution_result_to_json(example.execution_result),
|
138
|
+
location: example.location,
|
139
|
+
description: example.description,
|
140
|
+
full_description: example.full_description,
|
141
|
+
metadata: {
|
142
|
+
shared_group_inclusion_backtrace:
|
143
|
+
example
|
144
|
+
.metadata[:shared_group_inclusion_backtrace]
|
145
|
+
.map { |frame| stack_frame_to_json(frame) }
|
111
146
|
},
|
112
|
-
|
147
|
+
location_rerun_argument: example.location_rerun_argument
|
148
|
+
}
|
149
|
+
end
|
150
|
+
|
151
|
+
def load_summary_to_json(notification)
|
152
|
+
{
|
153
|
+
count: notification.count,
|
154
|
+
load_time: notification.load_time,
|
155
|
+
}
|
156
|
+
end
|
157
|
+
|
158
|
+
def group_to_json(notification)
|
159
|
+
{
|
160
|
+
group: {
|
161
|
+
description: notification.group.description
|
162
|
+
}
|
113
163
|
}
|
114
164
|
end
|
115
165
|
|
116
166
|
def output_row(obj)
|
117
|
-
output.puts
|
167
|
+
output.puts(obj.to_json)
|
168
|
+
output.flush
|
118
169
|
end
|
119
170
|
end
|
120
171
|
end
|
data/lib/turbo_tests/reporter.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module TurboTests
|
4
4
|
class Reporter
|
5
|
+
attr_writer :load_time
|
6
|
+
|
5
7
|
def self.from_config(formatter_config, start_time)
|
6
8
|
reporter = new(start_time)
|
7
9
|
|
@@ -26,7 +28,10 @@ module TurboTests
|
|
26
28
|
@pending_examples = []
|
27
29
|
@failed_examples = []
|
28
30
|
@all_examples = []
|
31
|
+
@messages = []
|
29
32
|
@start_time = start_time
|
33
|
+
@load_time = 0
|
34
|
+
@errors_outside_of_examples_count = 0
|
30
35
|
end
|
31
36
|
|
32
37
|
def add(name, outputs)
|
@@ -45,6 +50,14 @@ module TurboTests
|
|
45
50
|
end
|
46
51
|
end
|
47
52
|
|
53
|
+
def group_started(notification)
|
54
|
+
delegate_to_formatters(:example_group_started, notification)
|
55
|
+
end
|
56
|
+
|
57
|
+
def group_finished
|
58
|
+
delegate_to_formatters(:example_group_finished, nil)
|
59
|
+
end
|
60
|
+
|
48
61
|
def example_passed(example)
|
49
62
|
delegate_to_formatters(:example_passed, example.notification)
|
50
63
|
|
@@ -65,8 +78,18 @@ module TurboTests
|
|
65
78
|
@failed_examples << example
|
66
79
|
end
|
67
80
|
|
81
|
+
def message(message)
|
82
|
+
delegate_to_formatters(:message, RSpec::Core::Notifications::MessageNotification.new(message))
|
83
|
+
@messages << message
|
84
|
+
end
|
85
|
+
|
86
|
+
def error_outside_of_examples
|
87
|
+
@errors_outside_of_examples_count += 1
|
88
|
+
end
|
89
|
+
|
68
90
|
def finish
|
69
|
-
|
91
|
+
# SEE: https://bit.ly/2NP87Cz
|
92
|
+
end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
70
93
|
|
71
94
|
delegate_to_formatters(:start_dump,
|
72
95
|
RSpec::Core::Notifications::NullNotification)
|
@@ -84,8 +107,8 @@ module TurboTests
|
|
84
107
|
@all_examples,
|
85
108
|
@failed_examples,
|
86
109
|
@pending_examples,
|
87
|
-
|
88
|
-
|
110
|
+
@load_time,
|
111
|
+
@errors_outside_of_examples_count
|
89
112
|
))
|
90
113
|
delegate_to_formatters(:close,
|
91
114
|
RSpec::Core::Notifications::NullNotification)
|
data/lib/turbo_tests/runner.rb
CHANGED
@@ -1,18 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "json"
|
4
|
-
|
5
4
|
require "parallel_tests/rspec/runner"
|
6
5
|
|
6
|
+
require_relative "../utils/hash_extension"
|
7
|
+
|
7
8
|
module TurboTests
|
8
9
|
class Runner
|
10
|
+
using CoreExtensions
|
11
|
+
|
9
12
|
def self.run(opts = {})
|
10
13
|
files = opts[:files]
|
11
14
|
formatters = opts[:formatters]
|
12
15
|
tags = opts[:tags]
|
13
|
-
|
16
|
+
|
17
|
+
# SEE: https://bit.ly/2NP87Cz
|
18
|
+
start_time = opts.fetch(:start_time) { Process.clock_gettime(Process::CLOCK_MONOTONIC) }
|
14
19
|
verbose = opts.fetch(:verbose, false)
|
15
20
|
fail_fast = opts.fetch(:fail_fast, nil)
|
21
|
+
count = opts.fetch(:count, nil)
|
22
|
+
|
23
|
+
if verbose
|
24
|
+
STDERR.puts "VERBOSE"
|
25
|
+
end
|
16
26
|
|
17
27
|
reporter = Reporter.from_config(formatters, start_time)
|
18
28
|
|
@@ -21,7 +31,8 @@ module TurboTests
|
|
21
31
|
files: files,
|
22
32
|
tags: tags,
|
23
33
|
verbose: verbose,
|
24
|
-
fail_fast: fail_fast
|
34
|
+
fail_fast: fail_fast,
|
35
|
+
count: count
|
25
36
|
).run
|
26
37
|
end
|
27
38
|
|
@@ -31,25 +42,49 @@ module TurboTests
|
|
31
42
|
@tags = opts[:tags]
|
32
43
|
@verbose = opts[:verbose]
|
33
44
|
@fail_fast = opts[:fail_fast]
|
45
|
+
@count = opts[:count]
|
46
|
+
@load_time = 0
|
47
|
+
@load_count = 0
|
34
48
|
@failure_count = 0
|
35
|
-
@runtime_log = "tmp/parallel_runtime_rspec.log"
|
36
49
|
|
37
50
|
@messages = Queue.new
|
38
51
|
@threads = []
|
52
|
+
@error = false
|
39
53
|
end
|
40
54
|
|
41
55
|
def run
|
42
|
-
@num_processes =
|
56
|
+
@num_processes = [
|
57
|
+
ParallelTests.determine_number_of_processes(@count),
|
58
|
+
ParallelTests::RSpec::Runner.tests_with_size(@files, {}).size
|
59
|
+
].min
|
60
|
+
|
61
|
+
use_runtime_info = @files == ["spec"]
|
62
|
+
|
63
|
+
group_opts = {}
|
64
|
+
|
65
|
+
if use_runtime_info
|
66
|
+
group_opts[:runtime_log] = "tmp/turbo_rspec_runtime.log"
|
67
|
+
else
|
68
|
+
group_opts[:group_by] = :filesize
|
69
|
+
end
|
43
70
|
|
44
71
|
tests_in_groups =
|
45
72
|
ParallelTests::RSpec::Runner.tests_in_groups(
|
46
73
|
@files,
|
47
74
|
@num_processes,
|
48
|
-
|
75
|
+
**group_opts
|
49
76
|
)
|
50
77
|
|
51
|
-
|
52
|
-
|
78
|
+
setup_tmp_dir
|
79
|
+
|
80
|
+
subprocess_opts = {
|
81
|
+
record_runtime: use_runtime_info
|
82
|
+
}
|
83
|
+
|
84
|
+
report_number_of_tests(tests_in_groups)
|
85
|
+
|
86
|
+
wait_threads = tests_in_groups.map.with_index do |tests, process_id|
|
87
|
+
start_regular_subprocess(tests, process_id + 1, **subprocess_opts)
|
53
88
|
end
|
54
89
|
|
55
90
|
handle_messages
|
@@ -58,37 +93,64 @@ module TurboTests
|
|
58
93
|
|
59
94
|
@threads.each(&:join)
|
60
95
|
|
61
|
-
@reporter.failed_examples.empty?
|
96
|
+
@reporter.failed_examples.empty? && wait_threads.map(&:value).all?(&:success?)
|
62
97
|
end
|
63
98
|
|
64
|
-
|
99
|
+
private
|
100
|
+
|
101
|
+
def setup_tmp_dir
|
102
|
+
begin
|
103
|
+
FileUtils.rm_r("tmp/test-pipes")
|
104
|
+
rescue Errno::ENOENT
|
105
|
+
end
|
106
|
+
|
107
|
+
FileUtils.mkdir_p("tmp/test-pipes/")
|
108
|
+
end
|
65
109
|
|
66
|
-
def start_regular_subprocess(tests, process_id)
|
110
|
+
def start_regular_subprocess(tests, process_id, **opts)
|
67
111
|
start_subprocess(
|
68
112
|
{"TEST_ENV_NUMBER" => process_id.to_s},
|
69
113
|
@tags.map { |tag| "--tag=#{tag}" },
|
70
114
|
tests,
|
71
|
-
process_id
|
115
|
+
process_id,
|
116
|
+
**opts
|
72
117
|
)
|
73
118
|
end
|
74
119
|
|
75
|
-
def start_subprocess(env, extra_args, tests, process_id)
|
120
|
+
def start_subprocess(env, extra_args, tests, process_id, record_runtime:)
|
76
121
|
if tests.empty?
|
77
122
|
@messages << {
|
78
|
-
|
79
|
-
|
123
|
+
type: "exit",
|
124
|
+
process_id: process_id
|
80
125
|
}
|
81
126
|
else
|
82
|
-
|
83
|
-
|
84
|
-
|
127
|
+
tmp_filename = "tmp/test-pipes/subprocess-#{process_id}"
|
128
|
+
|
129
|
+
begin
|
130
|
+
File.mkfifo(tmp_filename)
|
131
|
+
rescue Errno::EEXIST
|
132
|
+
end
|
133
|
+
|
134
|
+
env["RUBYOPT"] = ["-I#{File.expand_path("..", __dir__)}", ENV["RUBYOPT"]].compact.join(" ")
|
135
|
+
env["RSPEC_SILENCE_FILTER_ANNOUNCEMENTS"] = "1"
|
136
|
+
|
137
|
+
record_runtime_options =
|
138
|
+
if record_runtime
|
139
|
+
[
|
140
|
+
"--format", "ParallelTests::RSpec::RuntimeLogger",
|
141
|
+
"--out", "tmp/turbo_rspec_runtime.log",
|
142
|
+
]
|
143
|
+
else
|
144
|
+
[]
|
145
|
+
end
|
85
146
|
|
86
147
|
command = [
|
87
|
-
"
|
148
|
+
ENV["BUNDLE_BIN_PATH"], "exec", "rspec",
|
88
149
|
*extra_args,
|
89
|
-
"--
|
90
|
-
"--out", @runtime_log,
|
150
|
+
"--seed", rand(0xFFFF).to_s,
|
91
151
|
"--format", "TurboTests::JsonRowsFormatter",
|
152
|
+
"--out", tmp_filename,
|
153
|
+
*record_runtime_options,
|
92
154
|
*tests
|
93
155
|
]
|
94
156
|
|
@@ -101,29 +163,33 @@ module TurboTests
|
|
101
163
|
STDERR.puts "Process #{process_id}: #{command_str}"
|
102
164
|
end
|
103
165
|
|
104
|
-
|
166
|
+
stdin, stdout, stderr, wait_thr = Open3.popen3(env, *command)
|
167
|
+
stdin.close
|
105
168
|
|
106
169
|
@threads <<
|
107
|
-
Thread.new
|
108
|
-
|
109
|
-
|
110
|
-
|
170
|
+
Thread.new do
|
171
|
+
File.open(tmp_filename) do |fd|
|
172
|
+
fd.each_line do |line|
|
173
|
+
message = JSON.parse(line, symbolize_names: true)
|
111
174
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
message = result.shift
|
116
|
-
next unless message
|
117
|
-
|
118
|
-
message = JSON.parse(message)
|
119
|
-
message["process_id"] = process_id
|
120
|
-
@messages << message
|
175
|
+
message[:process_id] = process_id
|
176
|
+
@messages << message
|
177
|
+
end
|
121
178
|
end
|
122
179
|
|
123
|
-
@messages << {
|
124
|
-
|
180
|
+
@messages << {type: "exit", process_id: process_id}
|
181
|
+
end
|
125
182
|
|
183
|
+
@threads << start_copy_thread(stdout, STDOUT)
|
126
184
|
@threads << start_copy_thread(stderr, STDERR)
|
185
|
+
|
186
|
+
@threads << Thread.new {
|
187
|
+
unless wait_thr.value.success?
|
188
|
+
@messages << {type: "error"}
|
189
|
+
end
|
190
|
+
}
|
191
|
+
|
192
|
+
wait_thr
|
127
193
|
end
|
128
194
|
end
|
129
195
|
|
@@ -132,6 +198,7 @@ module TurboTests
|
|
132
198
|
loop do
|
133
199
|
msg = src.readpartial(4096)
|
134
200
|
rescue EOFError
|
201
|
+
src.close
|
135
202
|
break
|
136
203
|
else
|
137
204
|
dst.write(msg)
|
@@ -144,31 +211,47 @@ module TurboTests
|
|
144
211
|
|
145
212
|
loop do
|
146
213
|
message = @messages.pop
|
147
|
-
case message[
|
214
|
+
case message[:type]
|
148
215
|
when "example_passed"
|
149
|
-
example = FakeExample.from_obj(message[
|
216
|
+
example = FakeExample.from_obj(message[:example])
|
150
217
|
@reporter.example_passed(example)
|
218
|
+
when "group_started"
|
219
|
+
@reporter.group_started(message[:group].to_struct)
|
220
|
+
when "group_finished"
|
221
|
+
@reporter.group_finished
|
151
222
|
when "example_pending"
|
152
|
-
example = FakeExample.from_obj(message[
|
223
|
+
example = FakeExample.from_obj(message[:example])
|
153
224
|
@reporter.example_pending(example)
|
225
|
+
when "load_summary"
|
226
|
+
message = message[:summary]
|
227
|
+
# NOTE: notifications order and content is not guaranteed hence the fetch
|
228
|
+
# and count increment tracking to get the latest accumulated load time
|
229
|
+
@reporter.load_time = message[:load_time] if message.fetch(:count, 0) > @load_count
|
154
230
|
when "example_failed"
|
155
|
-
example = FakeExample.from_obj(message[
|
231
|
+
example = FakeExample.from_obj(message[:example])
|
156
232
|
@reporter.example_failed(example)
|
157
233
|
@failure_count += 1
|
158
234
|
if fail_fast_met
|
159
235
|
@threads.each(&:kill)
|
160
236
|
break
|
161
237
|
end
|
238
|
+
when "message"
|
239
|
+
@reporter.message(message[:message])
|
162
240
|
when "seed"
|
163
241
|
when "close"
|
242
|
+
when "error"
|
243
|
+
@reporter.error_outside_of_examples
|
244
|
+
@error = true
|
164
245
|
when "exit"
|
165
246
|
exited += 1
|
166
247
|
if exited == @num_processes
|
167
248
|
break
|
168
249
|
end
|
169
250
|
else
|
170
|
-
|
251
|
+
STDERR.puts("Unhandled message in main process: #{message}")
|
171
252
|
end
|
253
|
+
|
254
|
+
STDOUT.flush
|
172
255
|
end
|
173
256
|
rescue Interrupt
|
174
257
|
end
|
@@ -176,5 +259,15 @@ module TurboTests
|
|
176
259
|
def fail_fast_met
|
177
260
|
!@fail_fast.nil? && @fail_fast >= @failure_count
|
178
261
|
end
|
262
|
+
|
263
|
+
def report_number_of_tests(groups)
|
264
|
+
name = ParallelTests::RSpec::Runner.test_file_name
|
265
|
+
|
266
|
+
num_processes = groups.size
|
267
|
+
num_tests = groups.map(&:size).sum
|
268
|
+
tests_per_process = (num_processes == 0 ? 0 : num_tests.to_f / num_processes).round
|
269
|
+
|
270
|
+
puts "#{num_processes} processes for #{num_tests} #{name}s, ~ #{tests_per_process} #{name}s per process"
|
271
|
+
end
|
179
272
|
end
|
180
273
|
end
|
data/lib/turbo_tests/version.rb
CHANGED
data/turbo_tests.gemspec
CHANGED
@@ -4,22 +4,24 @@ Gem::Specification.new do |spec|
|
|
4
4
|
spec.name = "turbo_tests"
|
5
5
|
spec.version = TurboTests::VERSION
|
6
6
|
spec.authors = ["Ilya Zub"]
|
7
|
-
spec.email = ["
|
7
|
+
spec.email = ["zaoooza92@gmail.com"]
|
8
8
|
|
9
9
|
spec.summary = "Runner for grosser/parallel_tests with incremental summarized output. Based on Discourse and Rubygems work in this area."
|
10
10
|
spec.homepage = "https://github.com/serpapi/turbo_tests"
|
11
11
|
spec.license = "MIT"
|
12
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
13
12
|
|
14
13
|
spec.metadata["homepage_uri"] = spec.homepage
|
15
14
|
spec.metadata["source_code_uri"] = "https://github.com/serpapi/turbo_tests"
|
16
15
|
spec.metadata["changelog_uri"] = "https://github.com/serpapi/turbo_tests/releases"
|
17
16
|
|
18
|
-
spec.
|
19
|
-
spec.add_dependency "parallel_tests"
|
20
|
-
spec.add_dependency "optparse"
|
17
|
+
spec.required_ruby_version = ">= 2.4.0"
|
21
18
|
|
22
|
-
spec.
|
19
|
+
spec.add_dependency "rspec", "~> 3.10.0"
|
20
|
+
spec.add_dependency "parallel_tests", "~> 3.3"
|
21
|
+
|
22
|
+
spec.add_development_dependency "pry", "~> 0.14"
|
23
|
+
|
24
|
+
spec.add_runtime_dependency "bundler"
|
23
25
|
|
24
26
|
# Specify which files should be added to the gem when it is released.
|
25
27
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -27,7 +29,5 @@ Gem::Specification.new do |spec|
|
|
27
29
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
28
30
|
end
|
29
31
|
|
30
|
-
spec.
|
31
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
|
-
spec.require_paths = ["lib"]
|
32
|
+
spec.executables = ["turbo_tests"]
|
33
33
|
end
|
metadata
CHANGED
@@ -1,65 +1,65 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turbo_tests
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilya Zub
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.10.0
|
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:
|
26
|
+
version: 3.10.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: parallel_tests
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.3'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :
|
47
|
+
version: '0.14'
|
48
|
+
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '0.14'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
-
type: :
|
62
|
+
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
@@ -68,12 +68,14 @@ dependencies:
|
|
68
68
|
version: '0'
|
69
69
|
description:
|
70
70
|
email:
|
71
|
-
-
|
71
|
+
- zaoooza92@gmail.com
|
72
72
|
executables:
|
73
73
|
- turbo_tests
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
|
+
- ".github/workflows/snyk_ruby-analysis.yml"
|
78
|
+
- ".github/workflows/tests.yml"
|
77
79
|
- ".gitignore"
|
78
80
|
- ".rspec"
|
79
81
|
- ".travis.yml"
|
@@ -83,15 +85,15 @@ files:
|
|
83
85
|
- LICENSE.txt
|
84
86
|
- README.md
|
85
87
|
- Rakefile
|
86
|
-
- bin/
|
87
|
-
-
|
88
|
-
- exe/turbo_tests
|
88
|
+
- bin/turbo_tests
|
89
|
+
- fixtures/rspec/errors_outside_of_examples_spec.rb
|
89
90
|
- lib/turbo_tests.rb
|
90
91
|
- lib/turbo_tests/cli.rb
|
91
92
|
- lib/turbo_tests/json_rows_formatter.rb
|
92
93
|
- lib/turbo_tests/reporter.rb
|
93
94
|
- lib/turbo_tests/runner.rb
|
94
95
|
- lib/turbo_tests/version.rb
|
96
|
+
- lib/utils/hash_extension.rb
|
95
97
|
- turbo_tests.gemspec
|
96
98
|
homepage: https://github.com/serpapi/turbo_tests
|
97
99
|
licenses:
|
@@ -108,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
110
|
requirements:
|
109
111
|
- - ">="
|
110
112
|
- !ruby/object:Gem::Version
|
111
|
-
version: 2.
|
113
|
+
version: 2.4.0
|
112
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
115
|
requirements:
|
114
116
|
- - ">="
|
data/bin/console
DELETED
data/bin/setup
DELETED