macros4cuke 0.2.09 → 0.2.10

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.
data/CHANGELOG.md ADDED
@@ -0,0 +1,112 @@
1
+ ## 0.2.10 / 2013-04-30
2
+
3
+ * [CHANGE] `CHANGELOG.md` replaces `HISTORY.md` file. Partial reformatting of historical entries to [Changelogs Convention](tech-angels.github.com/vandamme/#changelogs-convention)
4
+ * [CHANGE] Method `MacroStep#initialize`: added the detection of two inconsistencies in macro arguments.
5
+ * [CHANGE] New exception class `UselessPhraseArgument`. Raised when the name of an argument from the phrase never appears in a sub-step.
6
+ * [CHANGE] New exception class `UnreachableSubstepArgument`. Raised when the name of an argument from a subset never appears in the phrase and the macro-step doesn't allow table.
7
+ * [CHANGE] New exception class `DataTableNotFound`. Raised when a step expecting a data table arguments gets anything else.
8
+ * [CHANGE] File `macro-step_spec.rb`: Added examples covering the new validation rules in `MacroStep#initialize` method.
9
+ * [FIX] `UnknownArgumentError#initialize` Typo in error message.
10
+
11
+ ## 0.2.09 / 2013-04-29
12
+
13
+ * [CHANGE] Added one capturing group in regexp of macro defining step to detect data passing via table.
14
+ * [CHANGE] Class `MacroStep`: added an explicit argument for data passing via table mode.
15
+
16
+
17
+ ## 0.2.08 / 2013-04-29
18
+
19
+ * [CHANGE] Signature of `MacroStep#expand` changed.
20
+ * [CHANGE] `MacroStep#validate_params` method is now private
21
+ * [CHANGE] File `macro-step_spec.rb` updated.
22
+ * [CHANGE] `MacroCollection#render_steps`method updated.
23
+ * [CHANGE] File `macro-step_spec.rb`: added test case when a macro is called with unknown argument.
24
+ * [FIX] macro-step.rb: added a missing `require 'exceptions'`.
25
+
26
+ ## 0.2.07 / 2013-04-29
27
+
28
+ * [FIX] Editorial improvements in `README.md`, corrected one inaccurate sentence.
29
+
30
+
31
+ ## 0.2.06 / 2013-04-28
32
+
33
+ * [CHANGE] Formatting improvements in `README.md`.
34
+
35
+
36
+ ## 0.2.05 / 2013-04-28
37
+
38
+ * [CHANGE] Expanded `README.md` with macro-step invokation, passing data value via a table.
39
+
40
+
41
+ ## 0.2.04 / 2013-4-27
42
+
43
+ * [FIX] `MacroCollection#add_macro method`: typo correction.
44
+
45
+
46
+ ## 0.2.03 / Unreleased
47
+
48
+ * [CHANGE] Regexp of defining step is more general: it accepts the Gherkin adverbs `Given, When, Then, And`.
49
+
50
+
51
+ ## 0.2.02 / 2013-4-26
52
+
53
+ * [CHANGE] Added an example in `template-engine_spec.rb` file.
54
+ * [CHANGE] Expanded `README.md` file.
55
+
56
+
57
+ ## 0.2.01 / 2013-4-26
58
+
59
+ * [CHANGE] Regexps in step definitions accept escape character sequence.
60
+ * [CHANGE] Expanded `README.md` file.
61
+ * [FIX] Corrected remnant of Mustache template in `travelling_demo.feature` file.
62
+
63
+
64
+ ## 0.2.00 / 2013-4-25 Version number was bumped
65
+
66
+ * [CHANGE] Replaced the Mustache template engine by own lightweight TemplateEngine
67
+ * [CHANGE] Macro-step arguments have a syntax that is closer to Gherkin's scenario outlines.
68
+ * [CHANGE] Upgraded TemplateEngine class to become a simple templating system.
69
+ * [CHANGE] Remove dependency to mustache gem.
70
+ * [CHANGE] All demos updated to new syntax.
71
+ * [CHANGE] examples in `README.md` updated.
72
+
73
+
74
+ ## 0.1.07 / 2013-4-24
75
+
76
+ * [CHANGE] Added new class `TemplateEngine`.
77
+
78
+
79
+ ## 0.1.06 / 2013-4-24
80
+
81
+ * [FIX] Format fix in README.md
82
+ * [FIX] `HISTORY.md` file updated with missing entries/
83
+
84
+
85
+ ## 0.1.05 / Unreleased
86
+
87
+ * [CHANGE] `demo_steps.rb`. Added few step definitions that emit output to the screen (so that at least something is shown in the demo).
88
+ * [CHANGE] `MacroStep` class: regexp slightly reworked to accept escaped double quotes in actual values.
89
+ * [CHANGE] `travelling_demo.feature`: Added one example with escaped quotes in actual value.
90
+
91
+
92
+ ## 0.1.04 / 2013-4-23
93
+
94
+ * [ENHANCEMENT] Gherkin comments are allowed in sub-steps sequence. Previous version supported only Mustache comments.
95
+ * [CHANGE] Added a few more examples in the `travelling-demo.feature` file.
96
+
97
+
98
+ ## 0.1.03 / 2013-4-23
99
+
100
+ * [CHANGE] `README.md` slightly reworked and added link to Mustache.
101
+ * [CHANGE] File `env.rb`: moved all dependencies on Macros4Cuke to the file `macro_support.rb`
102
+ * [CHANGE] File `travelling-demo.feature`: Demo feature file with output on the screen (the other demos don't display any result).
103
+
104
+
105
+ ## 0.0.02 / 2013-04-21
106
+
107
+ * [CHANGE] `README.md`: added a reference to the features folder.
108
+
109
+
110
+ ## 0.0.01 / 2013-04-21
111
+
112
+ * [FEATURE] Initial public working version
data/README.md CHANGED
@@ -168,7 +168,8 @@ Sub-steps can also have macro arguments.
168
168
  ```
169
169
 
170
170
  ### Using (invoking) a macro-step ###
171
- The rules for using a given macro-step in a scenario are pretty straightforward:
171
+ A macro-step can only be invoked after its definition has been read by Cucumber.
172
+ The syntax rules for using a given macro-step in a scenario are pretty straightforward:
172
173
  - Follow closely the syntax of the _quoted sentence_ in the macro definition.
173
174
  - Replace every \<argument\> in the _phrase_ by its actual value between quotes.
174
175
 
data/lib/macro_steps.rb CHANGED
@@ -28,7 +28,7 @@ When(/^I \[((?:[^\\\]]|\\.)+)\]$/) do |macro_phrase|
28
28
  end
29
29
 
30
30
 
31
- # This step is used to invoke a macro-step with a table argument.
31
+ # This step is used to invoke a macro-step with a data table argument.
32
32
  # Example:
33
33
  # When I [enter my credentials as]:
34
34
  # |userid |guest |
@@ -36,7 +36,7 @@ end
36
36
  When(/^I \[([^\]]+)\]:$/) do |macro_phrase, table_argument|
37
37
  # Ensure that the second argument is of the correct type
38
38
  unless table_argument.kind_of?(Cucumber::Ast::Table)
39
- raise StandardError, "This step must have a data table as an argument."
39
+ raise Macros4Cuke::DataTableNotFound, "This step must have a data table as an argument."
40
40
  end
41
41
 
42
42
  # This will call the macro with the given phrase.
@@ -3,7 +3,7 @@
3
3
 
4
4
  module Macros4Cuke # Module used as a namespace
5
5
  # This constant keeps the current version of the gem.
6
- Version = '0.2.09'
6
+ Version = '0.2.10'
7
7
 
8
8
  Description = "Macros for Cucumber"
9
9
 
@@ -15,6 +15,23 @@ class DuplicateMacroError < Macros4CukeError
15
15
  end
16
16
  end # class
17
17
 
18
+ # Raised when one defines an argument name in a macro-step's phrase
19
+ # and that argument name does not appear in any sub-step.
20
+ class UselessPhraseArgument < Macros4CukeError
21
+ def initialize(anArgName)
22
+ super("The phrase argument '#{anArgName}' does not appear in a sub-step.")
23
+ end
24
+ end # class
25
+
26
+
27
+
28
+ # Raised when one defines an argument name in a macro-step's phrase
29
+ # and that argument name does not appear in any sub-step.
30
+ class UnreachableSubstepArgument < Macros4CukeError
31
+ def initialize(anArgName)
32
+ super("The sub-step argument '#{anArgName}' does not appear in the phrase.")
33
+ end
34
+ end # class
18
35
 
19
36
 
20
37
  # Raised when one invokes a macro-step with an unknown phrase.
@@ -30,11 +47,21 @@ end # class
30
47
  # that has an unknown name.
31
48
  class UnknownArgumentError < Macros4CukeError
32
49
  def initialize(argName)
33
- super("Unknown macro-ste argument '#{argName}'.")
50
+ super("Unknown macro-step argument '#{argName}'.")
34
51
  end
35
52
  end # class
36
53
 
37
54
 
55
+
56
+ # Raised when one invokes a macro-step without a required data table argument
57
+ class DataTableNotFound < Macros4CukeError
58
+ def initialize(argName)
59
+ super("The macro-step is missing a data table argument.")
60
+ end
61
+ end # class
62
+
63
+
64
+
38
65
  # Raised when Macros4Cuke encountered an issue
39
66
  # that it can't handle properly.
40
67
  class InternalError < Macros4CukeError
@@ -26,19 +26,22 @@ class MacroStep
26
26
  # Constructor.
27
27
  # [aMacroPhrase] The text from the macro step definition that is between the square brackets.
28
28
  # [theSubsteps] The source text of the steps to be expanded upon macro invokation.
29
- # [useTable] A boolean that indicates whether a table should be used to pass actual values.
29
+ # [useTable] A boolean that indicates whether a data table must be used to pass actual values.
30
30
  def initialize(aMacroPhrase, theSubsteps, useTable)
31
31
  @key = self.class.macro_key(aMacroPhrase, useTable, :definition)
32
32
 
33
33
  # Retrieve the macro arguments embedded in the phrase.
34
34
  @phrase_args = scan_arguments(aMacroPhrase, :definition)
35
- @args = @phrase_args.dup()
36
35
 
37
36
  # Manipulate the substeps source text
38
37
  substeps_processed = preprocess(theSubsteps)
39
38
 
40
39
  @renderer = TemplateEngine.new(substeps_processed)
41
- @args.concat(renderer.variables)
40
+ substeps_vars = renderer.variables
41
+
42
+
43
+ @args = validate_phrase_args(@phrase_args, substeps_vars)
44
+ @args.concat(substeps_vars)
42
45
  @args.uniq!
43
46
  end
44
47
 
@@ -169,6 +172,29 @@ private
169
172
 
170
173
  return processed.join("\n")
171
174
  end
175
+
176
+ # Check for inconsistencies between the argument names in the phrase and the substeps part.
177
+ def validate_phrase_args(thePhraseArgs, substepsVars)
178
+ # Error when the phrase names an argument that never occurs in the substeps
179
+ thePhraseArgs.each do |phrase_arg|
180
+ raise UselessPhraseArgument.new(phrase_arg) unless substepsVars.include? phrase_arg
181
+ end
182
+
183
+ # Error when a substep has an argument that never appears in the phrase and the macro-step does not use data table.
184
+ unless use_table?
185
+ substepsVars.each do |substep_arg|
186
+ raise UnreachableSubstepArgument.new(substep_arg) unless thePhraseArgs.include? substep_arg
187
+ end
188
+ end
189
+
190
+ return thePhraseArgs.dup()
191
+ end
192
+
193
+
194
+ # Return true, if the macro-step requires a data table to pass actual values of the arguments.
195
+ def use_table?()
196
+ return key =~ /_T$/
197
+ end
172
198
 
173
199
  end # class
174
200
 
@@ -29,9 +29,21 @@ end
29
29
 
30
30
  context "Creation & initialization" do
31
31
  it "should be created with a phrase, substeps and a table use indicator" do
32
- lambda { MacroStep.new(sample_phrase, sample_template, true) }.should_not raise_error
33
- lambda { MacroStep.new(sample_phrase, sample_template, false) }.should_not raise_error
32
+ lambda { MacroStep.new(sample_phrase, sample_template, true) }.should_not raise_error
34
33
  end
34
+
35
+
36
+ it "should complain when a sub-step argument can never be assigned a value via the phrase" do
37
+ error_message = "The sub-step argument 'password' does not appear in the phrase."
38
+ lambda { MacroStep.new(sample_phrase, sample_template, false) }.should raise_error(Macros4Cuke::UnreachableSubstepArgument, error_message)
39
+ end
40
+
41
+
42
+ it "should complain when an argument from the phrase never occurs in a substep" do
43
+ a_phrase = "enter my credentials as <foobar>"
44
+ error_message = "The phrase argument 'foobar' does not appear in a sub-step."
45
+ lambda { MacroStep.new(a_phrase, sample_template, true) }.should raise_error(Macros4Cuke::UselessPhraseArgument, error_message)
46
+ end
35
47
 
36
48
 
37
49
  it "should know its key" do
@@ -82,7 +94,7 @@ SNIPPET
82
94
 
83
95
  it "should complain when an unknown variable is used" do
84
96
  # Error case: there is no macro argument called <unknown>
85
- error_message = "Unknown macro-ste argument 'unknown'."
97
+ error_message = "Unknown macro-step argument 'unknown'."
86
98
  lambda { subject.expand(phrase_instance, [ ['unknown', 'anything'] ]) }.should raise_error(UnknownArgumentError, error_message)
87
99
  end
88
100
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: macros4cuke
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.09
4
+ version: 0.2.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-29 00:00:00.000000000 Z
12
+ date: 2013-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -66,7 +66,7 @@ extensions: []
66
66
  extra_rdoc_files: []
67
67
  files:
68
68
  - cucumber.yml
69
- - HISTORY.md
69
+ - CHANGELOG.md
70
70
  - LICENSE.txt
71
71
  - README.md
72
72
  - lib/macros4cuke.rb
data/HISTORY.md DELETED
@@ -1,111 +0,0 @@
1
- ## [0.2.09]
2
- #### Changes:
3
- * Added one dedicated capturing group in regexp of macro defining step.
4
- * Class MacroStep: initialize method and others. Added an explicit argument for use table mode.
5
- * This impacts the MacroSupport module and the MacroCollection class.
6
-
7
-
8
- ## [0.2.08]
9
- #### Changes:
10
- * Class MacroStep: method validate_params is now private, the signature of expand method has changed.
11
- * macro-step.rb: added a missing require 'exceptions'.
12
- * macro-step_spec.rb: updated to taken into account the above change. Added test case when a macro is called with unknown argument.
13
- * Class MacroCollection#render_steps updated for the above change.
14
-
15
- ## [0.2.07]
16
- #### Changes:
17
- * Editorial improvements in README.md, corrected one inaccurate sentence.
18
-
19
-
20
- ## [0.2.06]
21
- #### Changes:
22
- * Formatting improvements in README.md.
23
-
24
-
25
- ## [0.2.05]
26
- #### Changes:
27
- * Expanded README.md with macro-step invokation, passing data value via a table.
28
-
29
- ## [0.2.04]
30
- ### Fixes:
31
- * Class MacroCollection#add_macro: typo correction.
32
-
33
- ## [0.2.03]
34
- ### Changes:
35
- * Regexp of defining step is more general: it accepts the Gherkin adverbs Given, When, Then, And.
36
-
37
-
38
- ## [0.2.02]
39
- ### Changes:
40
- * Added an example in template-engine_spec.rb file.
41
-
42
- ### Documentation:
43
- * Expanded the README.md file.
44
-
45
- ## [0.2.01]
46
- ### Changes:
47
- * Regexp in the step definitions are more robust: they accept escape character sequence.
48
-
49
- ### Fixes:
50
- * Corrected remnant of Mustache template in travelling_demo.feature file.
51
-
52
-
53
- ### Documentation:
54
- * Expanded the README.md file.
55
-
56
-
57
- ## [0.2.00] Version number was bumped
58
- ### Changes:
59
- * Replaced the Mustache template engine by own lightweight TemplateEngine
60
- * Macro-step arguments have a syntax that is closer to Gherkin's scenario outlines.
61
- * Upgraded TemplateEngine class to become a simple templating system.
62
- * Remove dependency to mustache gem.
63
-
64
- ### Documentation:
65
- * All demos updated to new syntax.
66
- * Updated the examples in README.md
67
-
68
-
69
- ## [0.1.07]
70
- ### Changes:
71
- * Added new class TemplateEngine.
72
-
73
-
74
- ## [0.1.06]
75
-
76
- ### Documentation:
77
- * Format fix in README.md
78
- * HISTORY.md file updated
79
-
80
- ## [0.1.05]
81
- ### Changes:
82
- * demo_steps.rb: A few step definitions emits output to the screen (so that at least something is shown in the demo).
83
- * MacroStep class: regexp slightly reworked to accept escaped double quotes in actual values.
84
- * travelling_demo.feature: added one example with escaped quotes in actual value.
85
-
86
-
87
- ## [0.1.04]
88
- ### New features:
89
- * Gherkin comments are allowed in sub-steps sequence. Previous version supported only Mustache comments.
90
-
91
- ### Changes:
92
- * Added a few more examples in the 'travelling-demo.feature' file.
93
-
94
-
95
- ## [0.1.03]
96
- ### Documentation
97
- * README.md: slightly reworked and added link to Mustache.
98
-
99
- ### Changes:
100
- * env.rb: All dependencies on Macros4Cuke were moved to the file macro_support.rb
101
- * travelling-demo.feature: Demo feature file with output on the screen (the other demos don't display any result).
102
-
103
-
104
- ## [0.0.02]
105
- ### Documentation
106
- * In README: added a reference to the features folder.
107
-
108
- ## [0.0.01]
109
-
110
- ### New features
111
- * Initial public working version