Class: Macros4Cuke::MacroStep
- Inherits:
-
Object
- Object
- Macros4Cuke::MacroStep
- Defined in:
- lib/macros4cuke/macro-step.rb
Overview
A macro-step object is a Cucumber step that is itself an aggregation of lower-level sub-steps. When a macro-step is used in a scenario, then its execution is equivalent to the execution of its sub-steps. A macro-step may have zero or more arguments. The actual values bound to these arguments are passed to the sub-steps at execution time.
Constant Summary collapse
- BuiltinParameters =
The set of predefined macro argument constant values.
{ 'quotes' => '"""' }
Instance Attribute Summary collapse
-
#args ⇒ Object
readonly
The list of macro argument names (as appearing in the substeps and in the macro phrase).
-
#key ⇒ Object
readonly
Unique key of the macro as derived from the macro phrase.
-
#phrase_args ⇒ Object
readonly
The list of macro arguments that appears in the macro phrase.
-
#renderer ⇒ Object
readonly
A template engine that expands the sub-steps upon request.
Class Method Summary collapse
-
.macro_key(aMacroPhrase, useTable, mode) ⇒ String
Compute the identifier of the macro from the given macro phrase.
Instance Method Summary collapse
-
#expand(aPhrase, rawData) ⇒ Object
Render the steps from the template, given the values taken by the parameters [macro argument name, a value].
-
#initialize(aMacroPhrase, theSubsteps, useTable) ⇒ MacroStep
constructor
Constructor.
Constructor Details
#initialize(aMacroPhrase, theSubsteps, useTable) ⇒ MacroStep
Constructor.
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/macros4cuke/macro-step.rb', line 44 def initialize(aMacroPhrase, theSubsteps, useTable) @key = self.class.macro_key(aMacroPhrase, useTable, :definition) # Retrieve the macro arguments embedded in the phrase. @phrase_args = scan_arguments(aMacroPhrase, :definition) # Manipulate the substeps source text substeps_processed = preprocess(theSubsteps) @renderer = Templating::Engine.new(substeps_processed) substeps_vars = renderer.variables @args = validate_phrase_args(@phrase_args, substeps_vars) @args.concat(substeps_vars) @args.uniq! end |
Instance Attribute Details
#args ⇒ Object (readonly)
The list of macro argument names (as appearing in the substeps and in the macro phrase).
35 36 37 |
# File 'lib/macros4cuke/macro-step.rb', line 35 def args @args end |
#key ⇒ Object (readonly)
Unique key of the macro as derived from the macro phrase.
28 29 30 |
# File 'lib/macros4cuke/macro-step.rb', line 28 def key @key end |
#phrase_args ⇒ Object (readonly)
The list of macro arguments that appears in the macro phrase.
31 32 33 |
# File 'lib/macros4cuke/macro-step.rb', line 31 def phrase_args @phrase_args end |
#renderer ⇒ Object (readonly)
A template engine that expands the sub-steps upon request.
25 26 27 |
# File 'lib/macros4cuke/macro-step.rb', line 25 def renderer @renderer end |
Class Method Details
.macro_key(aMacroPhrase, useTable, mode) ⇒ String
Compute the identifier of the macro from the given macro phrase.
A macro phrase is a text that may contain zero or more placeholders.
In definition mode, a placeholder is delimited by chevrons <..>.
In invokation mode, a value bound to a placeholder is delimited
by double quotes.
The rule for building the identifying key are:
- Leading and trailing space(s) are removed.
- Each underscore character is removed.
- Every sequence of one or more space(s) is converted into an underscore
- Each placeholder (i.e. = delimiters + enclosed text)
is converted into a letter X.
- when useTable is true, concatenate: _T
@example: Consider the macro phrase: 'create the following "contactType" contact'
The resulting macro_key is: 'create_the_following_X_contact_T'
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/macros4cuke/macro-step.rb', line 85 def self.macro_key(aMacroPhrase, useTable, mode) stripped_phrase = aMacroPhrase.strip # Remove leading ... trailing space(s) # Remove every underscore stripped_phrase.gsub!(/_/, '') # Replace all consecutive whitespaces by an underscore stripped_phrase.gsub!(/\s+/, '_') # Determine the pattern to isolate # each argument/parameter with its delimiters pattern = case mode when :definition /<(?:[^\\<>]|\\.)*>/ when :invokation /"([^\\"]|\\.)*"/ end # Each text between quotes or chevron is replaced by the letter X normalized = stripped_phrase.gsub(pattern, 'X') key = normalized + (useTable ? '_T' : '') return key end |
Instance Method Details
#expand(aPhrase, rawData) ⇒ Object
Render the steps from the template, given the values taken by the parameters [macro argument name, a value]. Multiple rows with same argument name are acceptable.
120 121 122 123 124 125 126 127 |
# File 'lib/macros4cuke/macro-step.rb', line 120 def (aPhrase, rawData) params = validate_params(aPhrase, rawData) # Add built-in constants if necessary. params = BuiltinParameters.merge(params) return renderer.render(nil, params) end |