gurke 2.4.2 → 3.0.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 +5 -5
- data/CHANGELOG.md +4 -0
- data/bin/gurke +2 -0
- data/features/gurke.feature +2 -5
- data/features/gurke.rb +2 -1
- data/features/gurke/backtrace_filtering.feature +3 -4
- data/features/gurke/context_in_hooks.feature +1 -2
- data/features/gurke/filter_by_tags.feature +5 -6
- data/features/gurke/include_by_tags.feature +1 -2
- data/features/gurke/other_reporter.feature +3 -4
- data/features/gurke/pending_steps.feature +1 -4
- data/features/gurke/run_specific_directories.feature +4 -5
- data/features/gurke/run_specific_scenarios.feature +5 -6
- data/features/gurke/step_specific_definitions.feature +1 -4
- data/features/support/steps/cli_steps.rb +17 -8
- data/features/support/steps/file_steps.rb +2 -9
- data/gurke.gemspec +10 -9
- data/lib/gurke.rb +3 -0
- data/lib/gurke/background.rb +2 -0
- data/lib/gurke/builder.rb +10 -11
- data/lib/gurke/capybara.rb +2 -0
- data/lib/gurke/cli.rb +35 -27
- data/lib/gurke/configuration.rb +9 -6
- data/lib/gurke/dsl.rb +9 -5
- data/lib/gurke/feature.rb +6 -8
- data/lib/gurke/feature_list.rb +11 -7
- data/lib/gurke/reporter.rb +41 -34
- data/lib/gurke/reporters/compact_reporter.rb +137 -0
- data/lib/gurke/reporters/default_reporter.rb +57 -16
- data/lib/gurke/reporters/null_reporter.rb +4 -2
- data/lib/gurke/reporters/team_city_reporter.rb +11 -13
- data/lib/gurke/rspec.rb +2 -0
- data/lib/gurke/run_list.rb +2 -0
- data/lib/gurke/runner.rb +12 -6
- data/lib/gurke/scenario.rb +41 -2
- data/lib/gurke/step.rb +24 -14
- data/lib/gurke/step_definition.rb +3 -1
- data/lib/gurke/steps.rb +3 -1
- data/lib/gurke/tag.rb +5 -1
- data/lib/gurke/version.rb +5 -3
- data/spec/gurke/feature_list_spec.rb +4 -2
- data/spec/gurke/reporters/default_reporter_spec.rb +201 -0
- data/spec/gurke/run_list_spec.rb +2 -0
- data/spec/gurke/scenario_spec.rb +5 -3
- data/spec/gurke/step_definition_spec.rb +3 -1
- data/spec/spec_helper.rb +10 -1
- metadata +8 -6
data/lib/gurke/step.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gurke
|
2
4
|
class Step
|
3
5
|
#
|
@@ -20,21 +22,23 @@ module Gurke
|
|
20
22
|
|
21
23
|
# @api private
|
22
24
|
def initialize(file, line, type, raw)
|
23
|
-
@file
|
24
|
-
@
|
25
|
+
@file = file
|
26
|
+
@line = line
|
27
|
+
@type = type
|
28
|
+
@raw = raw
|
25
29
|
end
|
26
30
|
|
27
31
|
def name
|
28
32
|
raw.name
|
29
33
|
end
|
30
|
-
|
34
|
+
alias to_s name
|
31
35
|
|
32
36
|
def keyword
|
33
|
-
raw.keyword
|
37
|
+
raw.keyword.strip
|
34
38
|
end
|
35
39
|
|
36
40
|
def doc_string
|
37
|
-
raw.doc_string
|
41
|
+
raw.doc_string&.value
|
38
42
|
end
|
39
43
|
|
40
44
|
# @api private
|
@@ -55,10 +59,14 @@ module Gurke
|
|
55
59
|
reporter.invoke :start_step, self, scenario
|
56
60
|
|
57
61
|
result = find_and_run_step runner, scenario, world
|
62
|
+
rescue Interrupt
|
63
|
+
scenario.abort!
|
64
|
+
result = StepResult.new self, :aborted
|
65
|
+
raise
|
58
66
|
rescue StepPending => e
|
59
67
|
scenario.pending! e
|
60
68
|
result = StepResult.new self, :pending, e
|
61
|
-
rescue Exception => e
|
69
|
+
rescue Exception => e # rubocop:disable RescueException
|
62
70
|
scenario.failed! e
|
63
71
|
result = StepResult.new self, :failed, e
|
64
72
|
ensure
|
@@ -69,14 +77,14 @@ module Gurke
|
|
69
77
|
runner.with_filtered_backtrace do
|
70
78
|
match = Steps.find_step self, world, type
|
71
79
|
|
72
|
-
if scenario.pending? || scenario.failed?
|
80
|
+
if scenario.pending? || scenario.failed? || scenario.aborted?
|
73
81
|
return StepResult.new self, :skipped
|
74
82
|
end
|
75
83
|
|
76
84
|
m = world.method match.method_name
|
77
85
|
world.send match.method_name, *(match.params + [self])[0...m.arity]
|
78
86
|
|
79
|
-
StepResult.new self, :
|
87
|
+
StepResult.new self, :passed
|
80
88
|
end
|
81
89
|
end
|
82
90
|
|
@@ -85,13 +93,15 @@ module Gurke
|
|
85
93
|
attr_reader :step, :exception, :state
|
86
94
|
|
87
95
|
def initialize(step, state, err = nil)
|
88
|
-
@step
|
96
|
+
@step = step
|
97
|
+
@state = state
|
98
|
+
@exception = err
|
89
99
|
end
|
90
100
|
|
91
101
|
Step.public_instance_methods(false).each do |mth|
|
92
|
-
class_eval <<-
|
93
|
-
def #{mth}(*args) @step.send
|
94
|
-
|
102
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
103
|
+
def #{mth}(*args) @step.send(:#{mth}, *args); end
|
104
|
+
RUBY
|
95
105
|
end
|
96
106
|
|
97
107
|
def failed?
|
@@ -106,8 +116,8 @@ module Gurke
|
|
106
116
|
@state == :skipped
|
107
117
|
end
|
108
118
|
|
109
|
-
def
|
110
|
-
@state == :
|
119
|
+
def passed?
|
120
|
+
@state == :passed
|
111
121
|
end
|
112
122
|
end
|
113
123
|
end
|
data/lib/gurke/steps.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gurke
|
4
4
|
module Steps
|
5
|
+
# rubocop:disable MethodName
|
5
6
|
def Given(step)
|
6
7
|
rst = self.class.find_step(step, self, :given)
|
7
8
|
send rst.method_name
|
@@ -16,6 +17,7 @@ module Gurke
|
|
16
17
|
rst = self.class.find_step(step, self, :then)
|
17
18
|
send rst.method_name
|
18
19
|
end
|
20
|
+
# rubocop:enable MethodName
|
19
21
|
|
20
22
|
class << self
|
21
23
|
def find_step(step, world, type)
|
data/lib/gurke/tag.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gurke
|
2
4
|
class Tag
|
3
5
|
#
|
@@ -18,7 +20,9 @@ module Gurke
|
|
18
20
|
|
19
21
|
# @api private
|
20
22
|
def initialize(file, line, raw)
|
21
|
-
@file
|
23
|
+
@file = file
|
24
|
+
@line = line
|
25
|
+
@raw = raw
|
22
26
|
end
|
23
27
|
|
24
28
|
def name
|
data/lib/gurke/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Gurke::FeatureList do
|
@@ -42,8 +44,8 @@ describe Gurke::FeatureList do
|
|
42
44
|
|
43
45
|
subject
|
44
46
|
|
45
|
-
expect(@scopes).to eq [
|
46
|
-
|
47
|
+
expect(@scopes).to eq %i[before_features start_features
|
48
|
+
end_features after_features]
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable MissingCopEnableDirective
|
4
|
+
# rubocop:disable Style/Semicolon
|
5
|
+
|
6
|
+
require 'spec_helper'
|
7
|
+
|
8
|
+
RSpec.describe Gurke::Reporters::DefaultReporter do
|
9
|
+
let(:output) { StringIO.new }
|
10
|
+
let(:reporter) { described_class.new(output) }
|
11
|
+
subject { output.string }
|
12
|
+
|
13
|
+
describe '#before_feature' do
|
14
|
+
let(:feature) { double('feature') }
|
15
|
+
|
16
|
+
before do
|
17
|
+
expect(feature).to receive(:name).and_return 'Demo feature'
|
18
|
+
expect(feature).to receive(:file).and_return \
|
19
|
+
File.join(Dir.getwd, 'features', 'file.feature')
|
20
|
+
expect(feature).to receive(:line).and_return 1
|
21
|
+
expect(feature).to receive(:description).and_return \
|
22
|
+
"As a developer\nI would like have this spec passed\nIn order to work on"
|
23
|
+
end
|
24
|
+
|
25
|
+
subject { reporter.before_feature(feature); super() }
|
26
|
+
|
27
|
+
it do
|
28
|
+
is_expected.to eq unindent <<~TEXT
|
29
|
+
Feature: Demo feature # features/file.feature:1
|
30
|
+
As a developer
|
31
|
+
I would like have this spec passed
|
32
|
+
In order to work on
|
33
|
+
.
|
34
|
+
.
|
35
|
+
TEXT
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#start_background' do
|
40
|
+
let(:feature) { double('feature') }
|
41
|
+
|
42
|
+
subject { reporter.start_background(feature); super() }
|
43
|
+
|
44
|
+
it do
|
45
|
+
is_expected.to eq unindent <<~TEXT
|
46
|
+
. Background:
|
47
|
+
.
|
48
|
+
TEXT
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#before_scenario' do
|
53
|
+
let(:scenario) { double('scenario') }
|
54
|
+
|
55
|
+
before do
|
56
|
+
expect(scenario).to receive(:name).and_return 'Running the scenario'
|
57
|
+
expect(scenario).to receive(:file).and_return \
|
58
|
+
File.join(Dir.getwd, 'features', 'file.feature')
|
59
|
+
expect(scenario).to receive(:line).and_return 5
|
60
|
+
end
|
61
|
+
|
62
|
+
subject { reporter.before_scenario(scenario); super() }
|
63
|
+
|
64
|
+
it do
|
65
|
+
is_expected.to eq unindent <<~TEXT
|
66
|
+
. Scenario: Running the scenario # features/file.feature:5
|
67
|
+
.
|
68
|
+
TEXT
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#before_step' do
|
73
|
+
let(:step) { double('step') }
|
74
|
+
|
75
|
+
before do
|
76
|
+
expect(step).to receive(:name).and_return 'the scenario is passing'
|
77
|
+
expect(step).to receive(:keyword).and_return 'Given'
|
78
|
+
end
|
79
|
+
|
80
|
+
subject { reporter.before_step(step); super() }
|
81
|
+
|
82
|
+
it do
|
83
|
+
is_expected.to eq unindent <<~TEXT
|
84
|
+
. Given the scenario is passing
|
85
|
+
TEXT
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#after_step' do
|
90
|
+
let(:step) { double('step') }
|
91
|
+
|
92
|
+
before do
|
93
|
+
expect(step).to receive(:state).and_return state
|
94
|
+
end
|
95
|
+
|
96
|
+
subject { reporter.after_step(step); super() }
|
97
|
+
|
98
|
+
context 'with step passing' do
|
99
|
+
let(:state) { :passed }
|
100
|
+
|
101
|
+
it do
|
102
|
+
is_expected.to eq unindent <<~TEXT
|
103
|
+
. (passed)
|
104
|
+
.
|
105
|
+
TEXT
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'with step pending' do
|
110
|
+
let(:state) { :pending }
|
111
|
+
|
112
|
+
it do
|
113
|
+
is_expected.to eq unindent <<~TEXT
|
114
|
+
. (pending)
|
115
|
+
.
|
116
|
+
TEXT
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'with step failing' do
|
121
|
+
let(:state) { :failed }
|
122
|
+
|
123
|
+
before do
|
124
|
+
e = double 'exception'
|
125
|
+
c = double 'exception'
|
126
|
+
|
127
|
+
allow(e).to receive(:class).and_return(RuntimeError)
|
128
|
+
allow(e).to receive(:message).and_return('An error occurred')
|
129
|
+
allow(e).to receive(:backtrace).and_return([
|
130
|
+
'/path/to/file.rb:5:in `block (4 levels) in <top (required)>\'',
|
131
|
+
'/path/to/file.rb:24:in in `fail_with\''
|
132
|
+
])
|
133
|
+
|
134
|
+
allow(e).to receive(:cause).and_return(c)
|
135
|
+
|
136
|
+
allow(c).to receive(:class).and_return(IOError)
|
137
|
+
allow(c).to receive(:message).and_return('Socket closed')
|
138
|
+
allow(c).to receive(:backtrace).and_return([
|
139
|
+
'script.rb:5:in `a\'',
|
140
|
+
'script.rb:10:in `b\''
|
141
|
+
])
|
142
|
+
|
143
|
+
expect(step).to receive(:exception).and_return e
|
144
|
+
end
|
145
|
+
|
146
|
+
it do
|
147
|
+
is_expected.to eq unindent <<~TEXT
|
148
|
+
. (failure)
|
149
|
+
. RuntimeError: An error occurred
|
150
|
+
. /path/to/file.rb:5:in `block (4 levels) in <top (required)>'
|
151
|
+
. /path/to/file.rb:24:in in `fail_with'
|
152
|
+
. caused by: IOError: Socket closed
|
153
|
+
. script.rb:5:in `a'
|
154
|
+
. script.rb:10:in `b'
|
155
|
+
.
|
156
|
+
.
|
157
|
+
TEXT
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe '#after_scenario' do
|
163
|
+
let(:scenario) { double('scenario') }
|
164
|
+
|
165
|
+
subject { reporter.after_scenario(scenario); super() }
|
166
|
+
|
167
|
+
it do
|
168
|
+
is_expected.to eq unindent <<~TEXT
|
169
|
+
.
|
170
|
+
.
|
171
|
+
TEXT
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe '#after_feature' do
|
176
|
+
let(:feature) { double('feature') }
|
177
|
+
|
178
|
+
subject { reporter.after_feature(feature); super() }
|
179
|
+
|
180
|
+
it do
|
181
|
+
is_expected.to eq unindent <<~TEXT
|
182
|
+
.
|
183
|
+
.
|
184
|
+
TEXT
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe '#after_features' do
|
189
|
+
let(:features) { [] }
|
190
|
+
|
191
|
+
subject { reporter.after_features(features); super() }
|
192
|
+
|
193
|
+
it do
|
194
|
+
is_expected.to eq unindent <<~TEXT
|
195
|
+
.0 scenarios: 0 failing, 0 pending
|
196
|
+
.
|
197
|
+
.
|
198
|
+
TEXT
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
data/spec/gurke/run_list_spec.rb
CHANGED
data/spec/gurke/scenario_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Gurke::Scenario do
|
@@ -7,7 +9,7 @@ describe Gurke::Scenario do
|
|
7
9
|
let(:backgrounds) { double('backgrounds') }
|
8
10
|
|
9
11
|
before do
|
10
|
-
allow(feature).to receive(:backgrounds).
|
12
|
+
allow(feature).to receive(:backgrounds).and_return(backgrounds)
|
11
13
|
allow(backgrounds).to receive(:run)
|
12
14
|
allow(runner).to receive(:hook) {|_, _, &block| block.call }
|
13
15
|
end
|
@@ -44,8 +46,8 @@ describe Gurke::Scenario do
|
|
44
46
|
|
45
47
|
subject
|
46
48
|
|
47
|
-
expect(@scopes).to eq [
|
48
|
-
|
49
|
+
expect(@scopes).to eq %i[before_scenario start_scenario
|
50
|
+
end_scenario after_scenario]
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
require 'spec_helper'
|
4
6
|
|
5
7
|
describe Gurke::StepDefinition do
|
6
|
-
let(:pattern)
|
8
|
+
let(:pattern) { nil }
|
7
9
|
let(:step_definition) { described_class.new pattern }
|
8
10
|
subject { step_definition }
|
9
11
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
if ENV['CI'] || (defined?(:RUBY_ENGINE) && RUBY_ENGINE != 'rbx')
|
2
4
|
require 'coveralls'
|
3
5
|
Coveralls.wear! do
|
@@ -10,8 +12,15 @@ Bundler.require
|
|
10
12
|
|
11
13
|
require 'gurke'
|
12
14
|
|
13
|
-
Dir[File.expand_path('spec/support/**/*.rb')].each{|f| require f }
|
15
|
+
Dir[File.expand_path('spec/support/**/*.rb')].each {|f| require f }
|
16
|
+
|
17
|
+
module Helper
|
18
|
+
def unindent(str)
|
19
|
+
str.rstrip.gsub(/^\./, '')
|
20
|
+
end
|
21
|
+
end
|
14
22
|
|
15
23
|
RSpec.configure do |config|
|
16
24
|
config.order = 'random'
|
25
|
+
config.include Helper
|
17
26
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gurke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Graichen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: colorize
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: trollop
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- lib/gurke/feature.rb
|
103
103
|
- lib/gurke/feature_list.rb
|
104
104
|
- lib/gurke/reporter.rb
|
105
|
+
- lib/gurke/reporters/compact_reporter.rb
|
105
106
|
- lib/gurke/reporters/default_reporter.rb
|
106
107
|
- lib/gurke/reporters/null_reporter.rb
|
107
108
|
- lib/gurke/reporters/team_city_reporter.rb
|
@@ -115,6 +116,7 @@ files:
|
|
115
116
|
- lib/gurke/tag.rb
|
116
117
|
- lib/gurke/version.rb
|
117
118
|
- spec/gurke/feature_list_spec.rb
|
119
|
+
- spec/gurke/reporters/default_reporter_spec.rb
|
118
120
|
- spec/gurke/run_list_spec.rb
|
119
121
|
- spec/gurke/scenario_spec.rb
|
120
122
|
- spec/gurke/step_definition_spec.rb
|
@@ -139,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
141
|
version: '0'
|
140
142
|
requirements: []
|
141
143
|
rubyforge_project:
|
142
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.7.3
|
143
145
|
signing_key:
|
144
146
|
specification_version: 4
|
145
147
|
summary: An alternative gherkin feature runner inspired by rspec and turnip.
|
@@ -158,8 +160,8 @@ test_files:
|
|
158
160
|
- features/support/steps/cli_steps.rb
|
159
161
|
- features/support/steps/file_steps.rb
|
160
162
|
- spec/gurke/feature_list_spec.rb
|
163
|
+
- spec/gurke/reporters/default_reporter_spec.rb
|
161
164
|
- spec/gurke/run_list_spec.rb
|
162
165
|
- spec/gurke/scenario_spec.rb
|
163
166
|
- spec/gurke/step_definition_spec.rb
|
164
167
|
- spec/spec_helper.rb
|
165
|
-
has_rdoc:
|