macros4cuke 0.5.03 → 0.5.06
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 +8 -8
- data/.rubocop.yml +8 -5
- data/.travis.yml +0 -1
- data/CHANGELOG.md +14 -0
- data/Gemfile +4 -4
- data/Rakefile +19 -13
- data/features/step_definitions/demo_steps.rb +10 -6
- data/features/support/my_formatter.rb +25 -0
- data/lib/macro_steps.rb +1 -1
- data/lib/macros4cuke/application.rb +7 -5
- data/lib/macros4cuke/cli/cmd-line.rb +1 -1
- data/lib/macros4cuke/coll-walker-factory.rb +1 -1
- data/lib/macros4cuke/constants.rb +3 -3
- data/lib/macros4cuke/formatter/all-notifications.rb +1 -1
- data/lib/macros4cuke/formatter/to-gherkin.rb +4 -4
- data/lib/macros4cuke/formatter/to-null.rb +14 -14
- data/lib/macros4cuke/formatter/to-trace.rb +9 -9
- data/lib/macros4cuke/formatting-service.rb +9 -9
- data/lib/macros4cuke/macro-step.rb +6 -7
- data/lib/macros4cuke/templating/comment.rb +1 -1
- data/lib/macros4cuke/templating/engine.rb +8 -75
- data/lib/macros4cuke/templating/eo-line.rb +1 -1
- data/lib/macros4cuke/templating/section.rb +2 -2
- data/lib/macros4cuke/templating/static-text.rb +1 -1
- data/spec/macros4cuke/application_spec.rb +3 -3
- data/spec/macros4cuke/cli/cmd-line_spec.rb +1 -1
- data/spec/macros4cuke/coll-walker-factory_spec.rb +4 -4
- data/spec/macros4cuke/formatter/to-gherkin_spec.rb +1 -1
- data/spec/macros4cuke/formatter/to-null_spec.rb +1 -1
- data/spec/macros4cuke/formatter/to-trace_spec.rb +1 -1
- data/spec/macros4cuke/formatting-service_spec.rb +17 -17
- data/spec/macros4cuke/macro-collection_spec.rb +1 -1
- data/spec/macros4cuke/macro-step_spec.rb +3 -3
- data/spec/macros4cuke/templating/engine_spec.rb +15 -15
- data/spec/macros4cuke/templating/section_spec.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTZhNThhYzQ3YzBlZjI4NjQwOGZkYzRlMTVkZTk4ODFjZTEzZjE1OQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZDZjNzBjOGVjZGJlNTc3YjY3ZmYwMTI1OTkzYTk4MzRiOWQ2ODA5Ng==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTFhZTcxYzVjOGJiMzlkODcyYzM0ZDk0YzEyYzQ5OWU4MjdkMzRiNjRlMWMx
|
10
|
+
OGYyZDhlMmMxNDY2ZjZkNzNhYTJlMWI2N2EyZGU2Y2E1ZmQ4ZDhjNDVmMjhk
|
11
|
+
OWUzZTJhYjY1NGFiMWY4YjRlZTk5MjExYzllZTMyZTBlMmEzMjY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzNhYTViYTA2MDRkMWZkZjExYTk3Y2RlN2Q1Y2YwMGUzMWU4MWEwZDdkOWNm
|
14
|
+
OTE3NzQ0Y2M2NzY3ZmE3ZmNmNzk0N2I1NTA3NWE5OTU1NmEwODBhYTM0ZTdh
|
15
|
+
NWEyN2M1NjNiZWZhZGE5NDZhMzY0MGFmNzI1ODRlOTQ4YTlhZTE=
|
data/.rubocop.yml
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
AllCops:
|
2
|
-
|
3
|
-
- '
|
4
|
-
- '
|
5
|
-
- '
|
2
|
+
Exclude:
|
3
|
+
- 'examples/**/*'
|
4
|
+
- 'features/**/*'
|
5
|
+
- 'gems/**/*'
|
6
6
|
|
7
7
|
# This is disabled because some demos use UTF-8
|
8
8
|
AsciiComments:
|
@@ -47,7 +47,10 @@ IndentationWidth :
|
|
47
47
|
# Avoid methods longer than 50 lines of code
|
48
48
|
MethodLength:
|
49
49
|
Max: 50
|
50
|
-
CountComments: false
|
50
|
+
CountComments: false
|
51
|
+
|
52
|
+
NonNilCheck:
|
53
|
+
Enabled: false
|
51
54
|
|
52
55
|
NumericLiterals:
|
53
56
|
Enabled: false
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
### 0.5.06 / 2014-06-30
|
2
|
+
* [CHANGE] Spec files upgraded to RSpec3.x.x
|
3
|
+
* [CHANGE] File `Gemfile` updated with dependency on RSpec3
|
4
|
+
* [CHANGE] File `macros4cuke.gemspec` updated with dependency on RSpec3
|
5
|
+
|
6
|
+
|
7
|
+
### 0.5.05 / 2014-06-30
|
8
|
+
* [CHANGE] Many files updated for Rubocop 0.24.0. There remain 4 Rubocop offenses.
|
9
|
+
|
10
|
+
|
11
|
+
### 0.5.04 / 2014-04-07
|
12
|
+
* [CHANGE] File `.rubocop.yml`: Updated for Rubocop 0.20.1. NonNilCheck cop disabled.
|
13
|
+
|
14
|
+
|
1
15
|
### 0.5.03 / 2014-04-01
|
2
16
|
* [CHANGE] File `README.md`: Updated the installation steps.
|
3
17
|
* [CHANGE] Files `macro_support.rb` renamed to `use_macros4cuke.rb`
|
data/Gemfile
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
# Prevent Bundler to load the dependencies from our .gemspec file
|
3
3
|
|
4
|
-
gem
|
4
|
+
gem 'cucumber', [">= 0.5.0"]
|
5
5
|
|
6
6
|
group :development do
|
7
|
-
gem
|
8
|
-
gem
|
9
|
-
gem
|
7
|
+
gem 'rake', '>= 0.8.0'
|
8
|
+
gem 'rspec', '>= 3.0.0'
|
9
|
+
gem 'simplecov', '>= 0.5.0'
|
10
10
|
end
|
data/Rakefile
CHANGED
@@ -17,18 +17,24 @@ require 'cucumber/rake/task'
|
|
17
17
|
# UGLY workaround for bug in Cucumber's rake task
|
18
18
|
if Gem::VERSION[0].to_i >= 2 && Cucumber::VERSION <= '1.3.2'
|
19
19
|
# Monkey-patch a buggy method
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
module Cucumber
|
21
|
+
module Rake
|
22
|
+
class Task
|
23
|
+
class ForkedCucumberRunner
|
24
|
+
def gem_available?(gemname)
|
25
|
+
if Gem::VERSION[0].to_i >= 2
|
26
|
+
gem_available_new_rubygems?(gemname)
|
27
|
+
else
|
28
|
+
gem_available_old_rubygems?(gemname)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end # class
|
32
|
+
end # class
|
33
|
+
end # module
|
34
|
+
end # module
|
29
35
|
end
|
30
36
|
|
31
|
-
Cucumber::Rake::Task.new do |
|
37
|
+
Cucumber::Rake::Task.new do |_|
|
32
38
|
end
|
33
39
|
|
34
40
|
# RSpec as testing tool
|
@@ -41,10 +47,10 @@ end
|
|
41
47
|
|
42
48
|
# Combine RSpec and Cucumber tests
|
43
49
|
desc 'Run tests, with RSpec and Cucumber'
|
44
|
-
task :
|
50
|
+
task test: [:spec, :cucumber]
|
45
51
|
|
46
52
|
|
47
53
|
# Default rake task
|
48
|
-
task :
|
54
|
+
task default: :test
|
49
55
|
|
50
|
-
# End of file
|
56
|
+
# End of file
|
@@ -2,22 +2,26 @@
|
|
2
2
|
# A few step definitions for demo and testing purpose.
|
3
3
|
|
4
4
|
When(/^I landed in the homepage$/) do
|
5
|
-
#trace_steps << 'Invoked step: ... I landed in the homepage'
|
5
|
+
# trace_steps << 'Invoked step: ... I landed in the homepage'
|
6
6
|
end
|
7
7
|
|
8
8
|
When(/^I click "([^"]*)"$/) do |element|
|
9
|
-
|
9
|
+
msg = 'Invoked step: ... I click '
|
10
|
+
msg << "\"#{element}\""
|
11
|
+
# trace_steps << msg
|
10
12
|
end
|
11
13
|
|
12
14
|
|
13
15
|
When(/^I fill in "(.*?)" with "(.*?)"$/) do |element, text|
|
14
|
-
|
16
|
+
msg = "Invoked step: ... I fill in \"#{element}\" with "
|
17
|
+
msg << "\"#{text}\""
|
18
|
+
# trace_steps << msg
|
15
19
|
end
|
16
20
|
|
17
21
|
|
18
22
|
Then(/^I expect the following step trace:$/) do |step_text|
|
19
|
-
#trace_steps.should == step_text.split(/\r?\n|\n/)
|
20
|
-
substeps_trace.chomp.
|
23
|
+
# trace_steps.should == step_text.split(/\r?\n|\n/)
|
24
|
+
expect(substeps_trace.chomp).to eq(step_text)
|
21
25
|
end
|
22
26
|
|
23
27
|
|
@@ -34,7 +38,7 @@ SNIPPET
|
|
34
38
|
rescue Macros4Cuke::DataTableNotFound => exc
|
35
39
|
phrase = '[fill in the form with]:'
|
36
40
|
msg = "The step with phrase #{phrase} requires a data table."
|
37
|
-
exc.message.
|
41
|
+
expect(exc.message).to eq(msg)
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Macros4Cuke # Module used as a namespace
|
2
|
+
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
class MyFormatter
|
6
|
+
attr_reader(:ostream)
|
7
|
+
|
8
|
+
def initialize(_, io, _)
|
9
|
+
@ostream = io
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def step_name(_, step_match, _, _, _, _)
|
14
|
+
pp step_match
|
15
|
+
pp step_match.instance_variables
|
16
|
+
|
17
|
+
# Returns a Cucumber::RbSupport::RbStepDefinition
|
18
|
+
pp step_match.instance_variable_get(:@step_definition).class
|
19
|
+
pp step_match.instance_variable_get(:@step_definition).object_id
|
20
|
+
pp step_match.instance_variable_get(:@name_to_match)
|
21
|
+
pp step_match.instance_variable_get(:@step_arguments)
|
22
|
+
end
|
23
|
+
end # class
|
24
|
+
|
25
|
+
end # module
|
data/lib/macro_steps.rb
CHANGED
@@ -47,7 +47,7 @@ end
|
|
47
47
|
# |password|unguessable|
|
48
48
|
When(/^I \[([^\]]+)\]:$/) do |macro_phrase, table_argument|
|
49
49
|
# Ensure that the second argument is of the correct type
|
50
|
-
unless table_argument.
|
50
|
+
unless table_argument.is_a?(Cucumber::Ast::Table)
|
51
51
|
fail(Macros4Cuke::DataTableNotFound.new(macro_phrase))
|
52
52
|
end
|
53
53
|
|
@@ -19,10 +19,10 @@ class Application
|
|
19
19
|
# Entry point for the application object.
|
20
20
|
def run!(theCmdLineArgs)
|
21
21
|
@options = options_from(theCmdLineArgs)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
return unless options[:setup]
|
23
|
+
|
24
|
+
options[:setup].each do |a_path|
|
25
|
+
setup_project(a_path)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -46,7 +46,8 @@ class Application
|
|
46
46
|
begin
|
47
47
|
fail SupportFileExists.new(destination) if File.exist?(destination)
|
48
48
|
|
49
|
-
template_pathname =
|
49
|
+
template_pathname =
|
50
|
+
Macros4Cuke::RootDir + 'templates/use_macros4cuke.erb'
|
50
51
|
template = File.read(template_pathname)
|
51
52
|
|
52
53
|
|
@@ -62,6 +63,7 @@ class Application
|
|
62
63
|
# Write file contents to file in binary mode in order to avoid eol
|
63
64
|
# consisting of CRLF
|
64
65
|
File.open(destination, 'wb') { |theFile| theFile.write(file_text) }
|
66
|
+
|
65
67
|
rescue Macros4Cuke::CmdLineError => exc
|
66
68
|
$stderr.puts exc.message
|
67
69
|
exit
|
@@ -114,7 +114,7 @@ EOS
|
|
114
114
|
def validated_feature_path(theProjectPath)
|
115
115
|
dirs = [theProjectPath, 'features', 'support']
|
116
116
|
feature_path = dirs.reduce(Pathname.getwd) do |path, dir_name|
|
117
|
-
path
|
117
|
+
path += dir_name
|
118
118
|
unless path.exist?
|
119
119
|
fail DirectoryNotFound.new(path.relative_path_from(Pathname.getwd))
|
120
120
|
end
|
@@ -103,7 +103,7 @@ class CollWalkerFactory
|
|
103
103
|
end
|
104
104
|
|
105
105
|
|
106
|
-
|
106
|
+
# Generate an on_section event
|
107
107
|
def emit_on_section(current_node, nesting_level, backlog)
|
108
108
|
backlog.unshift(StringNode.new(:on_section_end, nil))
|
109
109
|
add_children(current_node.children, backlog)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
module Macros4Cuke # Module used as a namespace
|
5
5
|
# The version number of the gem.
|
6
|
-
Version = '0.5.
|
6
|
+
Version = '0.5.06'
|
7
7
|
|
8
8
|
# Brief description of the gem.
|
9
9
|
Description = 'Add your own macro-steps to Cucumber scenarios'
|
@@ -11,8 +11,8 @@ module Macros4Cuke # Module used as a namespace
|
|
11
11
|
# Constant Macros4Cuke::RootDir contains the absolute path of Macro4Cuke's
|
12
12
|
# root directory. Note: it also ends with a slash character.
|
13
13
|
unless defined?(RootDir)
|
14
|
-
|
15
|
-
|
14
|
+
# The initialisation of constant RootDir is guarded in order
|
15
|
+
# to avoid multiple initialisation (not allowed for constants)
|
16
16
|
|
17
17
|
# The root folder of Macros4Cuke.
|
18
18
|
RootDir = begin
|
@@ -28,9 +28,9 @@ class ToGherkin
|
|
28
28
|
return [:on_collection, :on_step, :on_step_end, :on_phrase, :on_source]
|
29
29
|
end
|
30
30
|
|
31
|
-
def on_collection(
|
31
|
+
def on_collection(_, _)
|
32
32
|
io.print "# Feature file generated by Macro4Cuke #{Macros4Cuke::Version}"
|
33
|
-
io.puts
|
33
|
+
io.puts " on #{Time.now.strftime('%d/%m/%Y %H:%M:%S')}"
|
34
34
|
io.puts ''
|
35
35
|
io.puts 'Feature: the set of macro-step definitions'
|
36
36
|
io.puts "#{indentation(1)}As a feature file writer"
|
@@ -38,12 +38,12 @@ class ToGherkin
|
|
38
38
|
io.puts ''
|
39
39
|
end
|
40
40
|
|
41
|
-
def on_step(aLevel,
|
41
|
+
def on_step(aLevel, _)
|
42
42
|
@step_count += 1
|
43
43
|
io.puts "#{indentation(aLevel)}Scenario: Macro #{step_count}"
|
44
44
|
end
|
45
45
|
|
46
|
-
def on_step_end(
|
46
|
+
def on_step_end(_)
|
47
47
|
io.puts ''
|
48
48
|
end
|
49
49
|
|
@@ -21,59 +21,59 @@ class ToNull
|
|
21
21
|
return Formatter::AllNotifications
|
22
22
|
end
|
23
23
|
|
24
|
-
def on_collection(
|
24
|
+
def on_collection(_, _)
|
25
25
|
; # Do nothing
|
26
26
|
end
|
27
27
|
|
28
|
-
def on_collection_end(
|
28
|
+
def on_collection_end(_)
|
29
29
|
; # Do nothing
|
30
30
|
end
|
31
31
|
|
32
|
-
def on_step(
|
32
|
+
def on_step(_, _)
|
33
33
|
; # Do nothing
|
34
34
|
end
|
35
35
|
|
36
|
-
def on_step_end(
|
36
|
+
def on_step_end(_)
|
37
37
|
; # Do nothing
|
38
38
|
end
|
39
39
|
|
40
|
-
def on_phrase(
|
40
|
+
def on_phrase(_, _, _)
|
41
41
|
; # Do nothing
|
42
42
|
end
|
43
43
|
|
44
|
-
def on_renderer(
|
44
|
+
def on_renderer(_, _)
|
45
45
|
; # Do nothing
|
46
46
|
end
|
47
47
|
|
48
|
-
def on_renderer_end(
|
48
|
+
def on_renderer_end(_)
|
49
49
|
; # Do nothing
|
50
50
|
end
|
51
51
|
|
52
|
-
def on_source(
|
52
|
+
def on_source(_, _)
|
53
53
|
; # Do nothing
|
54
54
|
end
|
55
55
|
|
56
|
-
def on_static_text(
|
56
|
+
def on_static_text(_, _)
|
57
57
|
; # Do nothing
|
58
58
|
end
|
59
59
|
|
60
|
-
def on_comment(
|
60
|
+
def on_comment(_, _)
|
61
61
|
; # Do nothing
|
62
62
|
end
|
63
63
|
|
64
|
-
def on_eol(
|
64
|
+
def on_eol(_)
|
65
65
|
; # Do nothing
|
66
66
|
end
|
67
67
|
|
68
|
-
def on_placeholder(
|
68
|
+
def on_placeholder(_, _)
|
69
69
|
; # Do nothing
|
70
70
|
end
|
71
71
|
|
72
|
-
def on_section(
|
72
|
+
def on_section(_, _)
|
73
73
|
; # Do Nothing
|
74
74
|
end
|
75
75
|
|
76
|
-
def on_section_end(
|
76
|
+
def on_section_end(_)
|
77
77
|
; # Do Nothing
|
78
78
|
end
|
79
79
|
|
@@ -26,7 +26,7 @@ class ToTrace
|
|
26
26
|
return Formatter::AllNotifications
|
27
27
|
end
|
28
28
|
|
29
|
-
def on_collection(aLevel,
|
29
|
+
def on_collection(aLevel, _)
|
30
30
|
trace_event(aLevel, __method__)
|
31
31
|
end
|
32
32
|
|
@@ -34,7 +34,7 @@ class ToTrace
|
|
34
34
|
trace_event(aLevel, __method__)
|
35
35
|
end
|
36
36
|
|
37
|
-
def on_step(aLevel,
|
37
|
+
def on_step(aLevel, _)
|
38
38
|
trace_event(aLevel, __method__)
|
39
39
|
end
|
40
40
|
|
@@ -42,11 +42,11 @@ class ToTrace
|
|
42
42
|
trace_event(aLevel, __method__)
|
43
43
|
end
|
44
44
|
|
45
|
-
def on_phrase(aLevel,
|
45
|
+
def on_phrase(aLevel, _, _)
|
46
46
|
trace_event(aLevel, __method__)
|
47
47
|
end
|
48
48
|
|
49
|
-
def on_renderer(aLevel,
|
49
|
+
def on_renderer(aLevel, _)
|
50
50
|
trace_event(aLevel, __method__)
|
51
51
|
end
|
52
52
|
|
@@ -54,15 +54,15 @@ class ToTrace
|
|
54
54
|
trace_event(aLevel, __method__)
|
55
55
|
end
|
56
56
|
|
57
|
-
def on_source(aLevel,
|
57
|
+
def on_source(aLevel, _)
|
58
58
|
trace_event(aLevel, __method__)
|
59
59
|
end
|
60
60
|
|
61
|
-
def on_static_text(aLevel,
|
61
|
+
def on_static_text(aLevel, _)
|
62
62
|
trace_event(aLevel, __method__)
|
63
63
|
end
|
64
64
|
|
65
|
-
def on_comment(aLevel,
|
65
|
+
def on_comment(aLevel, _)
|
66
66
|
trace_event(aLevel, __method__)
|
67
67
|
end
|
68
68
|
|
@@ -70,11 +70,11 @@ class ToTrace
|
|
70
70
|
trace_event(aLevel, __method__)
|
71
71
|
end
|
72
72
|
|
73
|
-
def on_placeholder(aLevel,
|
73
|
+
def on_placeholder(aLevel, _)
|
74
74
|
trace_event(aLevel, __method__)
|
75
75
|
end
|
76
76
|
|
77
|
-
def on_section(aLevel,
|
77
|
+
def on_section(aLevel, _)
|
78
78
|
trace_event(aLevel, __method__)
|
79
79
|
end
|
80
80
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# File: formatting-service.rb
|
2
|
-
# Purpose: Implementation of the
|
2
|
+
# Purpose: Implementation of the FormattingService class.
|
3
3
|
|
4
4
|
require_relative 'exceptions'
|
5
5
|
require_relative 'coll-walker-factory'
|
@@ -39,9 +39,9 @@ class FormattingService
|
|
39
39
|
|
40
40
|
# Check that each event from the event list the formatter is known.
|
41
41
|
supported_events.each do |event|
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
next if Formatter::AllNotifications.include? event
|
43
|
+
|
44
|
+
fail(UnknownFormattingEvent.new(aFormatter, event))
|
45
45
|
end
|
46
46
|
|
47
47
|
formatters << aFormatter
|
@@ -58,11 +58,11 @@ class FormattingService
|
|
58
58
|
# Notify each formatter of the visit event.
|
59
59
|
formatters.each do |fmt|
|
60
60
|
accepted_notifications = fmt.implements
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
61
|
+
next unless accepted_notifications.include? msg
|
62
|
+
|
63
|
+
# Assumption: all nil argument(s) are at the end
|
64
|
+
arg_vector = visit_event[2..-1].reject { |an_arg| an_arg.nil? }
|
65
|
+
fmt.send(msg, nesting_level, *arg_vector)
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
@@ -145,7 +145,7 @@ class MacroStep
|
|
145
145
|
rawData.each do |a_row|
|
146
146
|
(a_key, value) = validate_row(a_row, macro_parameters)
|
147
147
|
if macro_parameters.include? a_key
|
148
|
-
if macro_parameters[a_key].
|
148
|
+
if macro_parameters[a_key].is_a?(Array)
|
149
149
|
macro_parameters[a_key] << value
|
150
150
|
else
|
151
151
|
macro_parameters[a_key] = [macro_parameters[a_key], value]
|
@@ -206,18 +206,17 @@ class MacroStep
|
|
206
206
|
def validate_phrase_args(thePhraseArgs, substepsVars)
|
207
207
|
# Error when the phrase names an argument that never occurs in the substeps
|
208
208
|
thePhraseArgs.each do |phrase_arg|
|
209
|
-
|
210
|
-
|
211
|
-
end
|
209
|
+
next if substepsVars.include? phrase_arg
|
210
|
+
fail(UselessPhraseArgument.new(phrase_arg))
|
212
211
|
end
|
213
212
|
# Error when a substep has an argument that never appears in the phrase
|
214
213
|
# and the macro-step does not use data table.
|
215
214
|
unless use_table?
|
216
215
|
substepsVars.each do |substep_arg|
|
217
|
-
|
216
|
+
next if thePhraseArgs.include?(substep_arg) ||
|
218
217
|
BuiltinParameters.include?(substep_arg)
|
219
|
-
|
220
|
-
|
218
|
+
|
219
|
+
fail(UnreachableSubstepArgument.new(substep_arg))
|
221
220
|
end
|
222
221
|
end
|
223
222
|
|
@@ -30,7 +30,7 @@ class Comment
|
|
30
30
|
# Cucumber::RbSupport::RbWorld#steps complains when it sees a comment.
|
31
31
|
# This method has the same signature as the {Engine#render} method.
|
32
32
|
# @return [String] Empty string ("as is")
|
33
|
-
def render(
|
33
|
+
def render(_, _)
|
34
34
|
return ''
|
35
35
|
end
|
36
36
|
end # class
|
@@ -4,6 +4,9 @@
|
|
4
4
|
require 'strscan' # Use the StringScanner for lexical analysis.
|
5
5
|
require_relative '../exceptions' # Load the custom exception classes.
|
6
6
|
|
7
|
+
require_relative 'static-text'
|
8
|
+
require_relative 'eo-line'
|
9
|
+
require_relative 'comment'
|
7
10
|
require_relative 'template-element'
|
8
11
|
require_relative 'placeholder'
|
9
12
|
require_relative 'section' # Load the Section and ConditionalSection
|
@@ -16,76 +19,6 @@ module Macros4Cuke # Module used as a namespace
|
|
16
19
|
# used internally in Macros4Cuke.
|
17
20
|
module Templating
|
18
21
|
|
19
|
-
# Class used internally by the template engine.
|
20
|
-
# Represents a static piece of text from a template.
|
21
|
-
# A static text is a text that is reproduced verbatim
|
22
|
-
# when rendering a template.
|
23
|
-
class StaticText
|
24
|
-
# The static text extracted from the original template.
|
25
|
-
attr_reader(:source)
|
26
|
-
|
27
|
-
|
28
|
-
# @param aSourceText [String] A piece of text extracted
|
29
|
-
# from the template that must be rendered verbatim.
|
30
|
-
def initialize(aSourceText)
|
31
|
-
@source = aSourceText
|
32
|
-
end
|
33
|
-
|
34
|
-
public
|
35
|
-
|
36
|
-
# Render the static text.
|
37
|
-
# This method has the same signature as the {Engine#render} method.
|
38
|
-
# @return [String] Static text is returned verbatim ("as is")
|
39
|
-
def render(aContextObject, theLocals)
|
40
|
-
return source
|
41
|
-
end
|
42
|
-
end # class
|
43
|
-
|
44
|
-
|
45
|
-
# Class used internally by the template engine.
|
46
|
-
# Represents a comment from a template.
|
47
|
-
# A static text is a text that is reproduced verbatim
|
48
|
-
# when rendering a template.
|
49
|
-
class Comment
|
50
|
-
# The comment as extracted from the original template.
|
51
|
-
attr_reader(:source)
|
52
|
-
|
53
|
-
|
54
|
-
# @param aSourceText [String] A piece of text extracted
|
55
|
-
# from the template that must be rendered verbatim.
|
56
|
-
def initialize(aSourceText)
|
57
|
-
@source = aSourceText
|
58
|
-
end
|
59
|
-
|
60
|
-
public
|
61
|
-
|
62
|
-
# Render the comment.
|
63
|
-
# Comments are rendered as empty text. This is necessary because
|
64
|
-
# Cucumber::RbSupport::RbWorld#steps complains when it sees a comment.
|
65
|
-
# This method has the same signature as the {Engine#render} method.
|
66
|
-
# @return [String] Empty string ("as is")
|
67
|
-
def render(aContextObject, theLocals)
|
68
|
-
return ''
|
69
|
-
end
|
70
|
-
end # class
|
71
|
-
|
72
|
-
|
73
|
-
# Class used internally by the template engine.
|
74
|
-
# Represents an end of line that must be rendered as such.
|
75
|
-
class EOLine
|
76
|
-
|
77
|
-
public
|
78
|
-
|
79
|
-
# Render an end of line.
|
80
|
-
# This method has the same signature as the {Engine#render} method.
|
81
|
-
# @return [String] An end of line marker. Its exact value is OS-dependent.
|
82
|
-
def render(aContextObject, theLocals)
|
83
|
-
return "\n"
|
84
|
-
end
|
85
|
-
end # class
|
86
|
-
|
87
|
-
|
88
|
-
|
89
22
|
# A very simple implementation of a templating engine.
|
90
23
|
# Earlier versions of Macros4Cuke relied on the logic-less
|
91
24
|
# Mustache template engine.
|
@@ -168,7 +101,7 @@ class Engine
|
|
168
101
|
subResult.concat(element.variables)
|
169
102
|
|
170
103
|
else
|
171
|
-
|
104
|
+
# Do nothing
|
172
105
|
end
|
173
106
|
end
|
174
107
|
|
@@ -213,7 +146,7 @@ class Engine
|
|
213
146
|
def self.identify_parse_error(aTextLine)
|
214
147
|
# Unsuccessful scanning: we typically have improperly balanced chevrons.
|
215
148
|
# We will analyze the opening and closing chevrons...
|
216
|
-
|
149
|
+
# First: replace escaped chevron(s)
|
217
150
|
no_escaped = aTextLine.gsub(/\\[<>]/, '--')
|
218
151
|
|
219
152
|
# var. equals count_of(<) - count_of(>): can only be 0 or temporarily 1
|
@@ -243,9 +176,9 @@ class Engine
|
|
243
176
|
line_items = self.class.parse(line)
|
244
177
|
line_items.each do |(kind, text)|
|
245
178
|
# A tag text cannot be empty nor blank
|
246
|
-
if (kind
|
247
|
-
|
248
|
-
|
179
|
+
next if (kind != :dynamic) || !text.strip.empty?
|
180
|
+
|
181
|
+
fail(EmptyArgumentError.new(line.strip))
|
249
182
|
end
|
250
183
|
|
251
184
|
line_items
|
@@ -18,7 +18,7 @@ class EOLine
|
|
18
18
|
# Render an end of line.
|
19
19
|
# This method has the same signature as the {Engine#render} method.
|
20
20
|
# @return [String] An end of line marker. Its exact value is OS-dependent.
|
21
|
-
def render(
|
21
|
+
def render(_, _)
|
22
22
|
return "\n"
|
23
23
|
end
|
24
24
|
end # class
|
@@ -42,7 +42,7 @@ class Section < UnaryElement
|
|
42
42
|
when Section
|
43
43
|
subResult.concat(a_child.variables)
|
44
44
|
else
|
45
|
-
|
45
|
+
# Do nothing
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -54,7 +54,7 @@ class Section < UnaryElement
|
|
54
54
|
# This method has the same signature as the {Engine#render} method.
|
55
55
|
# @return [String] The text value assigned to the placeholder.
|
56
56
|
# Returns an empty string when no value is assigned to the placeholder.
|
57
|
-
def render(
|
57
|
+
def render(_, _)
|
58
58
|
msg = "Method Section.#{__method__} must be implemented in subclass."
|
59
59
|
fail(NotImplementedError, msg)
|
60
60
|
end
|
@@ -28,7 +28,7 @@ class StaticText
|
|
28
28
|
# Render the static text.
|
29
29
|
# This method has the same signature as the {Engine#render} method.
|
30
30
|
# @return [String] Static text is returned verbatim ("as is")
|
31
|
-
def render(
|
31
|
+
def render(_, _)
|
32
32
|
return source
|
33
33
|
end
|
34
34
|
end # class
|
@@ -75,7 +75,7 @@ describe Application do
|
|
75
75
|
file_name = 'use_macros4cuke.rb'
|
76
76
|
|
77
77
|
subject.run!(%w(--setup ./test_dir))
|
78
|
-
expect(File.exist?(file_path + '/' + file_name)).to
|
78
|
+
expect(File.exist?(file_path + '/' + file_name)).to be true
|
79
79
|
|
80
80
|
File.delete(file_path + '/' + file_name)
|
81
81
|
delete_dirs(file_path)
|
@@ -87,14 +87,14 @@ describe Application do
|
|
87
87
|
file_path = '/test_dir/features/support'
|
88
88
|
file_name = 'use_macros4cuke.rb'
|
89
89
|
args = %w(--setup ./test_dir)
|
90
|
-
|
90
|
+
mydir = File.dirname(__FILE__)
|
91
91
|
|
92
92
|
expect { subject.run!(args) }.not_to raise_error
|
93
93
|
|
94
94
|
hijack_stderr
|
95
95
|
err_msg = <<-MSG_END
|
96
96
|
Error in command-line:
|
97
|
-
The file '#{
|
97
|
+
The file '#{mydir}/test_dir/features/support/use_macros4cuke.rb' already exists.
|
98
98
|
MSG_END
|
99
99
|
|
100
100
|
expect { subject.run!(args) }.to raise_error(SystemExit)
|
@@ -20,7 +20,7 @@ describe CollWalkerFactory do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
after(:all) do
|
23
|
-
|
23
|
+
# Clear the collection to prevent interference between spec files
|
24
24
|
macro_coll.clear
|
25
25
|
end
|
26
26
|
|
@@ -165,7 +165,7 @@ describe CollWalkerFactory do
|
|
165
165
|
second_step = macro_coll.macro_steps.values[1]
|
166
166
|
substep_chunks = second_step.renderer.representation.dup
|
167
167
|
substep_chunks.map! do |ck|
|
168
|
-
if ck.
|
168
|
+
if ck.is_a?(Templating::Section)
|
169
169
|
[ck, ck.children, ck].flatten
|
170
170
|
else
|
171
171
|
ck
|
@@ -241,7 +241,7 @@ describe CollWalkerFactory do
|
|
241
241
|
actual = subject.next
|
242
242
|
expect(actual[0]).to eq(event[0])
|
243
243
|
expect(actual[1]).to eq(event[1])
|
244
|
-
|
244
|
+
if event[2]
|
245
245
|
expected_obj = substep_chunks[i + 1]
|
246
246
|
expect(actual[2]).to eq(expected_obj.send(event[2]))
|
247
247
|
end
|
@@ -256,7 +256,7 @@ describe CollWalkerFactory do
|
|
256
256
|
first_step.renderer.representation.insert(2, :not_a_valid_element)
|
257
257
|
err_type = Macros4Cuke::InternalError
|
258
258
|
err_msg = "Don't know how to format a Symbol."
|
259
|
-
expect { subject.each { |
|
259
|
+
expect { subject.each { |_| } }.to raise_error(err_type, err_msg)
|
260
260
|
end
|
261
261
|
|
262
262
|
end # context
|
@@ -23,7 +23,7 @@ describe FormattingService do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
after(:all) do
|
26
|
-
|
26
|
+
# Clear the collection to prevent interference between spec files
|
27
27
|
macro_coll.clear
|
28
28
|
end
|
29
29
|
|
@@ -34,7 +34,7 @@ describe FormattingService do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'has no formatter at start' do
|
37
|
-
expect(subject).to
|
37
|
+
expect(subject.formatters).to be_empty
|
38
38
|
end
|
39
39
|
|
40
40
|
end # context
|
@@ -43,23 +43,23 @@ describe FormattingService do
|
|
43
43
|
context 'Provided services:' do
|
44
44
|
it 'should know its registered formatter(s)' do
|
45
45
|
formatter1 = double('fake_one')
|
46
|
-
formatter1.
|
46
|
+
expect(formatter1).to receive(:implements).once.and_return([:on_collection])
|
47
47
|
subject.register(formatter1)
|
48
|
-
expect(subject).to
|
48
|
+
expect(subject.formatters.size).to eq(1)
|
49
49
|
|
50
50
|
formatter2 = double('fake_two')
|
51
|
-
formatter2.
|
51
|
+
expect(formatter2).to receive(:implements).once.and_return([:on_step])
|
52
52
|
subject.register(formatter2)
|
53
|
-
expect(subject).to
|
53
|
+
expect(subject.formatters.size).to eq(2)
|
54
54
|
|
55
55
|
expect(subject.formatters).to eq([formatter1, formatter2])
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should complain when a formatter doesn't implement notifications" do
|
59
59
|
formatter1 = double('formatter')
|
60
|
-
formatter1.
|
60
|
+
expect(formatter1).to receive(:implements).once.and_return([])
|
61
61
|
err_type = Macros4Cuke::NoFormattingEventForFormatter
|
62
|
-
err_msg = 'Formatter RSpec::Mocks::
|
62
|
+
err_msg = 'Formatter RSpec::Mocks::Double does not'\
|
63
63
|
' support any formatting event.'
|
64
64
|
expect { subject.register(formatter1) }.to raise_error(err_type, err_msg)
|
65
65
|
end
|
@@ -73,9 +73,9 @@ describe FormattingService do
|
|
73
73
|
:on_step_end
|
74
74
|
]
|
75
75
|
formatter = double('formatter')
|
76
|
-
formatter.
|
76
|
+
expect(formatter).to receive(:implements).once.and_return(notifications)
|
77
77
|
err_type = Macros4Cuke::UnknownFormattingEvent
|
78
|
-
err_msg = "Formatter RSpec::Mocks::
|
78
|
+
err_msg = "Formatter RSpec::Mocks::Double uses\
|
79
79
|
the unknown formatting event 'non_standard'."
|
80
80
|
expect { subject.register(formatter) }.to raise_error(err_type, err_msg)
|
81
81
|
end
|
@@ -89,28 +89,28 @@ describe FormattingService do
|
|
89
89
|
:on_step,
|
90
90
|
:on_step_end
|
91
91
|
]
|
92
|
-
formatter1.
|
92
|
+
expect(formatter1).to receive(:implements)
|
93
93
|
.at_least(69).times
|
94
94
|
.and_return(supported_notifications)
|
95
95
|
subject.register(formatter1)
|
96
96
|
|
97
97
|
# Test the notifications send to the formatter
|
98
|
-
formatter1.
|
98
|
+
expect(formatter1).to receive(:on_collection).once do |level, coll|
|
99
99
|
expect(level).to eq(0)
|
100
100
|
expect(coll).to eq(macro_coll)
|
101
101
|
end
|
102
102
|
|
103
|
-
formatter1.
|
103
|
+
expect(formatter1).to receive(:on_step).twice do |level, a_step|
|
104
104
|
expect(level).to eq(1)
|
105
105
|
expect(macro_coll.macro_steps.values).to include(a_step)
|
106
106
|
end
|
107
107
|
|
108
|
-
formatter1.
|
108
|
+
expect(formatter1).to receive(:on_step_end).twice do |level, arg|
|
109
109
|
expect(level).to eq(1)
|
110
110
|
expect(arg).to be_nil
|
111
111
|
end
|
112
112
|
|
113
|
-
formatter1.
|
113
|
+
expect(formatter1).to receive(:on_collection_end).once do |level, arg|
|
114
114
|
expect(level).to eq(0)
|
115
115
|
expect(arg).to be_nil
|
116
116
|
end
|
@@ -120,7 +120,7 @@ describe FormattingService do
|
|
120
120
|
it 'should support multiple formatters' do
|
121
121
|
formatter1 = double('formatter')
|
122
122
|
supported_notifications = [:on_collection]
|
123
|
-
formatter1.
|
123
|
+
expect(formatter1).to receive(:implements)
|
124
124
|
.at_least(69 * 3).times
|
125
125
|
.and_return(supported_notifications)
|
126
126
|
|
@@ -128,7 +128,7 @@ describe FormattingService do
|
|
128
128
|
3.times { subject.register(formatter1) }
|
129
129
|
|
130
130
|
# ... then the collection is formatted three times
|
131
|
-
formatter1.
|
131
|
+
expect(formatter1).to receive(:on_collection).at_least(3).times
|
132
132
|
subject.start!(macro_coll)
|
133
133
|
end
|
134
134
|
end # context
|
@@ -39,7 +39,7 @@ SNIPPET
|
|
39
39
|
phrase = '[enter my credentials]'
|
40
40
|
args = [phrase, sample_substeps, true]
|
41
41
|
expect { singleton.add_macro(*args) }.not_to raise_error
|
42
|
-
expect(singleton).to
|
42
|
+
expect(singleton.macro_steps.size).to eq(1)
|
43
43
|
|
44
44
|
# Error case: inserting another macro with same phrase.
|
45
45
|
msg = "A macro-step with phrase '[enter my credentials]' already exists."
|
@@ -72,7 +72,7 @@ SNIPPET
|
|
72
72
|
|
73
73
|
context 'Provided services:' do
|
74
74
|
|
75
|
-
let(:phrase_instance) {
|
75
|
+
let(:phrase_instance) { 'enter my credentials as "nobody"' }
|
76
76
|
it 'should render the substeps' do
|
77
77
|
text = subject.expand(phrase_instance, [ %w(password no-secret) ])
|
78
78
|
expectation = <<-SNIPPET
|
@@ -101,7 +101,7 @@ SNIPPET
|
|
101
101
|
end
|
102
102
|
|
103
103
|
it 'should un-escape the double-quotes for phrase arguments' do
|
104
|
-
specific_phrase =
|
104
|
+
specific_phrase = 'enter my credentials as "quotable\""'
|
105
105
|
text = subject.expand(specific_phrase, [ %w(password no-secret) ])
|
106
106
|
expectation = <<-SNIPPET
|
107
107
|
Given I landed in the homepage
|
@@ -126,7 +126,7 @@ SNIPPET
|
|
126
126
|
|
127
127
|
it 'should complain when argument gets a value from phrase and table' do
|
128
128
|
# Error case: there is no macro argument called <unknown>
|
129
|
-
phrase =
|
129
|
+
phrase = 'enter my credentials as "nobody"'
|
130
130
|
msg = "The macro argument 'userid' has value 'nobody' and 'someone'."
|
131
131
|
args = [ %w(userid someone), %w(password no-secret) ]
|
132
132
|
expect { subject.expand(phrase, args) }.to raise_error(
|
@@ -65,7 +65,7 @@ SNIPPET
|
|
65
65
|
|
66
66
|
# Expectation: an array with one couple:
|
67
67
|
# [:static, the source text]
|
68
|
-
expect(result).to
|
68
|
+
expect(result.size).to eq(1)
|
69
69
|
expect(result[0]).to eq([:static, sample_text])
|
70
70
|
end
|
71
71
|
|
@@ -75,7 +75,7 @@ SNIPPET
|
|
75
75
|
|
76
76
|
# Expectation: an array with one couple:
|
77
77
|
# [:static, the source text]
|
78
|
-
expect(result).to
|
78
|
+
expect(result.size).to eq(1)
|
79
79
|
expect(result[0]).to eq([:dynamic, strip_chevrons(sample_text)])
|
80
80
|
end
|
81
81
|
|
@@ -85,7 +85,7 @@ SNIPPET
|
|
85
85
|
|
86
86
|
# Expectation: an array with two couples:
|
87
87
|
# [dynamic, 'some_tag'][:static, some text]
|
88
|
-
expect(result).to
|
88
|
+
expect(result.size).to eq(2)
|
89
89
|
expect(result[0]).to eq([:dynamic, 'some_tag'])
|
90
90
|
expect(result[1]).to eq([:static, 'some text'])
|
91
91
|
end
|
@@ -96,7 +96,7 @@ SNIPPET
|
|
96
96
|
|
97
97
|
# Expectation: an array with two couples:
|
98
98
|
# [:static, some text] [dynamic, 'some_tag']
|
99
|
-
expect(result).to
|
99
|
+
expect(result.size).to eq(2)
|
100
100
|
expect(result[0]).to eq([:static, 'some text'])
|
101
101
|
expect(result[1]).to eq([:dynamic, 'some_tag'])
|
102
102
|
end
|
@@ -106,7 +106,7 @@ SNIPPET
|
|
106
106
|
result = Engine.parse(sample_text)
|
107
107
|
|
108
108
|
# Expectation: an array with three couples:
|
109
|
-
expect(result).to
|
109
|
+
expect(result.size).to eq(3)
|
110
110
|
expect(result[0]).to eq([:static, 'begin '])
|
111
111
|
expect(result[1]).to eq([:dynamic, 'some_tag'])
|
112
112
|
expect(result[2]).to eq([:static, ' end'])
|
@@ -117,19 +117,19 @@ SNIPPET
|
|
117
117
|
result = Engine.parse(sample_text)
|
118
118
|
|
119
119
|
# Expectation: an array with items couples:
|
120
|
-
expect(result).to
|
121
|
-
expect(result[0]).to eq([:static
|
120
|
+
expect(result.size).to eq(5)
|
121
|
+
expect(result[0]).to eq([:static, 'begin '])
|
122
122
|
expect(result[1]).to eq([:dynamic, 'some_tag'])
|
123
|
-
expect(result[2]).to eq([:static
|
123
|
+
expect(result[2]).to eq([:static, 'middle'])
|
124
124
|
expect(result[3]).to eq([:dynamic, 'another_tag'])
|
125
|
-
expect(result[4]).to eq([:static,
|
125
|
+
expect(result[4]).to eq([:static, ' end'])
|
126
126
|
|
127
127
|
# Case: two consecutive tags
|
128
128
|
sample_text = 'begin <some_tag><another_tag> end'
|
129
129
|
result = Engine.parse(sample_text)
|
130
130
|
|
131
131
|
# Expectation: an array with four couples:
|
132
|
-
expect(result).to
|
132
|
+
expect(result.size).to eq(4)
|
133
133
|
expect(result[0]).to eq([:static, 'begin '])
|
134
134
|
expect(result[1]).to eq([:dynamic, 'some_tag'])
|
135
135
|
expect(result[2]).to eq([:dynamic, 'another_tag'])
|
@@ -141,7 +141,7 @@ SNIPPET
|
|
141
141
|
result = Engine.parse(sample_text)
|
142
142
|
|
143
143
|
# Expectation: an array with one couple: [:static, the source text]
|
144
|
-
expect(result).to
|
144
|
+
expect(result.size).to eq(1)
|
145
145
|
expect(result[0]).to eq([:static, sample_text])
|
146
146
|
end
|
147
147
|
|
@@ -150,7 +150,7 @@ SNIPPET
|
|
150
150
|
result = Engine.parse(sample_text)
|
151
151
|
|
152
152
|
# Expectation: an array with three couples:
|
153
|
-
expect(result).to
|
153
|
+
expect(result.size).to eq(3)
|
154
154
|
expect(result[0]).to eq([:static, 'begin '])
|
155
155
|
expect(result[1]).to eq([:dynamic, 'some_\<\\>weird\>_tag'])
|
156
156
|
expect(result[2]).to eq([:static, ' end'])
|
@@ -163,14 +163,14 @@ SNIPPET
|
|
163
163
|
StandardError, error_message)
|
164
164
|
end
|
165
165
|
|
166
|
-
it
|
166
|
+
it 'should complain if a text misses an opening chevron' do
|
167
167
|
sample_text = 'begin <some_tag> > end'
|
168
168
|
error_message = "Missing opening chevron '<'."
|
169
169
|
expect { Engine.parse(sample_text) }.to raise_error(
|
170
170
|
StandardError, error_message)
|
171
171
|
end
|
172
172
|
|
173
|
-
it
|
173
|
+
it 'should complain if a text has nested opening chevrons' do
|
174
174
|
sample_text = 'begin <<some_tag> > end'
|
175
175
|
error_message = "Nested opening chevron '<'."
|
176
176
|
expect { Engine.parse(sample_text) }.to raise_error(
|
@@ -309,7 +309,7 @@ SNIPPET
|
|
309
309
|
|
310
310
|
locals = {
|
311
311
|
'firstname' => 'Anon',
|
312
|
-
'lastname' => 'Eemoos'
|
312
|
+
'lastname' => 'Eemoos',
|
313
313
|
'birthdate' => '1976-04-21'
|
314
314
|
}
|
315
315
|
rendered_text = instance.render(Object.new, locals)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: macros4cuke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.06
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 3.0.0
|
48
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:
|
54
|
+
version: 3.0.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,6 +156,7 @@ files:
|
|
156
156
|
- features/README.md
|
157
157
|
- features/step_definitions/demo_steps.rb
|
158
158
|
- features/support/env.rb
|
159
|
+
- features/support/my_formatter.rb
|
159
160
|
- features/support/use_macros4cuke.rb
|
160
161
|
- spec/macros4cuke/application_spec.rb
|
161
162
|
- spec/macros4cuke/cli/cmd-line_spec.rb
|