cuke_modeler 3.20.0 → 3.20.1
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 +4 -4
- data/CHANGELOG.md +12 -1
- data/README.md +5 -6
- data/lib/cuke_modeler/adapters/gherkin_10_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_11_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_12_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_13_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_14_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_15_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_16_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_17_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_18_adapter.rb +5 -2
- data/lib/cuke_modeler/adapters/gherkin_19_adapter.rb +5 -2
- data/lib/cuke_modeler/adapters/gherkin_20_adapter.rb +5 -2
- data/lib/cuke_modeler/adapters/gherkin_21_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_22_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_23_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_24_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_25_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_26_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_27_adapter.rb +5 -5
- data/lib/cuke_modeler/adapters/gherkin_9_adapter.rb +5 -2
- data/lib/cuke_modeler/adapters/gherkin_base_adapter.rb +5 -2
- data/lib/cuke_modeler/containing.rb +43 -210
- data/lib/cuke_modeler/described.rb +8 -4
- data/lib/cuke_modeler/models/background.rb +53 -11
- data/lib/cuke_modeler/models/cell.rb +36 -8
- data/lib/cuke_modeler/models/comment.rb +35 -8
- data/lib/cuke_modeler/models/directory.rb +58 -10
- data/lib/cuke_modeler/models/doc_string.rb +41 -9
- data/lib/cuke_modeler/models/example.rb +94 -17
- data/lib/cuke_modeler/models/feature.rb +73 -11
- data/lib/cuke_modeler/models/feature_file.rb +56 -12
- data/lib/cuke_modeler/models/model.rb +50 -7
- data/lib/cuke_modeler/models/outline.rb +59 -10
- data/lib/cuke_modeler/models/row.rb +45 -9
- data/lib/cuke_modeler/models/rule.rb +59 -9
- data/lib/cuke_modeler/models/scenario.rb +51 -10
- data/lib/cuke_modeler/models/step.rb +61 -11
- data/lib/cuke_modeler/models/table.rb +45 -9
- data/lib/cuke_modeler/models/tag.rb +30 -14
- data/lib/cuke_modeler/named.rb +7 -4
- data/lib/cuke_modeler/nested.rb +19 -4
- data/lib/cuke_modeler/parsed.rb +10 -5
- data/lib/cuke_modeler/parsing.rb +25 -13
- data/lib/cuke_modeler/sourceable.rb +11 -5
- data/lib/cuke_modeler/stepped.rb +7 -5
- data/lib/cuke_modeler/taggable.rb +22 -4
- data/lib/cuke_modeler/version.rb +1 -1
- data/testing/cucumber/features/modeling/base_model.feature +3 -0
- metadata +3 -2
@@ -1,6 +1,6 @@
|
|
1
1
|
module CukeModeler
|
2
2
|
|
3
|
-
# A class modeling an element of a Cucumber suite.
|
3
|
+
# A class modeling an element of a Cucumber suite. All model classes should descend from this class.
|
4
4
|
class Model
|
5
5
|
|
6
6
|
include Nested
|
@@ -8,37 +8,80 @@ module CukeModeler
|
|
8
8
|
|
9
9
|
|
10
10
|
# Creates a new Model object and, if *source_text* is provided,
|
11
|
-
# populates the object.
|
11
|
+
# populates the object. For the base model class, there is nothing
|
12
|
+
# to populate.
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# Model.new
|
16
|
+
# Model.new('some source text')
|
17
|
+
#
|
18
|
+
# @param source_text [String] The string that will be used to populate the model. Defaults to nil.
|
19
|
+
# @raise [ArgumentError] If *source_text* is not a String
|
20
|
+
# @return [Model] A new Model instance
|
12
21
|
def initialize(source_text = nil)
|
13
22
|
error_message = "Can only create models from Strings but was given a #{source_text.class}."
|
14
23
|
raise(ArgumentError, error_message) if source_text && !source_text.is_a?(String)
|
15
24
|
|
16
|
-
|
25
|
+
return unless source_text
|
26
|
+
|
27
|
+
source_data = process_source(source_text)
|
28
|
+
populate_model(source_data)
|
17
29
|
end
|
18
30
|
|
19
31
|
# It's a lazy implementation but it's mandatory for the class to define this method
|
20
32
|
# rubocop:disable Lint/UselessMethodDefinition
|
21
33
|
|
22
|
-
# Returns a string representation of this model.
|
34
|
+
# Returns a string representation of this model. Because the base model class
|
35
|
+
# doesn't represent anything specific, its string output is undefined.
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# model.to_s
|
39
|
+
#
|
40
|
+
# @return [String] A string representation of this model
|
23
41
|
def to_s
|
24
|
-
# This should be overridden by a child class
|
25
42
|
super
|
26
43
|
end
|
27
44
|
|
28
45
|
# rubocop:enable Lint/UselessMethodDefinition
|
29
46
|
|
30
|
-
# Returns the model objects that
|
47
|
+
# Returns the model objects that are children of this model.
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
# model.children
|
51
|
+
#
|
52
|
+
# @return [Array<Model>] A collection of child models
|
31
53
|
def children
|
32
54
|
[]
|
33
55
|
end
|
34
56
|
|
35
57
|
# See `Object#inspect`. Returns some basic information about the
|
36
|
-
# object, including its class and object ID.
|
58
|
+
# object, including its class and object ID. If *verbose* is true,
|
59
|
+
# provides default Ruby inspection behavior instead.
|
60
|
+
#
|
61
|
+
# @example
|
62
|
+
# model.inspect
|
63
|
+
# model.inspect(verbose: true)
|
64
|
+
#
|
65
|
+
# @param verbose [Boolean] Whether or not to return the full details of
|
66
|
+
# the object. Defaults to false.
|
67
|
+
# @return [String] A string representation of this model
|
37
68
|
def inspect(verbose: false)
|
38
69
|
return super() if verbose
|
39
70
|
|
40
71
|
"#<#{self.class.name}:#{object_id}>"
|
41
72
|
end
|
42
73
|
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
|
78
|
+
def process_source(source_text)
|
79
|
+
# No-op. Overridden by child classes.
|
80
|
+
end
|
81
|
+
|
82
|
+
def populate_model(model_data)
|
83
|
+
# No-op. Overridden by child classes.
|
84
|
+
end
|
85
|
+
|
43
86
|
end
|
44
87
|
end
|
@@ -21,27 +21,44 @@ module CukeModeler
|
|
21
21
|
|
22
22
|
# Creates a new Outline object and, if *source_text* is provided, populates the
|
23
23
|
# object.
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# Outline.new
|
27
|
+
# Outline.new("Scenario Outline:\n * a step")
|
28
|
+
#
|
29
|
+
# @param source_text [String] The Gherkin text that will be used to populate the model
|
30
|
+
# @raise [ArgumentError] If *source_text* is not a String
|
31
|
+
# @return [Outline] A new Outline instance
|
24
32
|
def initialize(source_text = nil)
|
25
33
|
@steps = []
|
26
34
|
@tags = []
|
27
35
|
@examples = []
|
28
36
|
|
29
37
|
super(source_text)
|
30
|
-
|
31
|
-
return unless source_text
|
32
|
-
|
33
|
-
parsed_outline_data = parse_source(source_text)
|
34
|
-
populate_outline(self, parsed_outline_data)
|
35
38
|
end
|
36
39
|
|
37
|
-
# Returns *true* if the two
|
40
|
+
# Compares this model with another object. Returns *true* if the two objects
|
41
|
+
# have equivalent steps and *false* otherwise.
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# outline_1 == outline_2
|
45
|
+
#
|
46
|
+
# @param other [Object] The object to compare this model with
|
47
|
+
# @return [Boolean] Whether the two objects are equivalent
|
38
48
|
def ==(other)
|
39
49
|
return false unless other.respond_to?(:steps)
|
40
50
|
|
41
51
|
steps == other.steps
|
42
52
|
end
|
43
53
|
|
44
|
-
# Returns the model objects that
|
54
|
+
# Returns the model objects that are children of this model. For
|
55
|
+
# an Outline model, these would be any associated Step, Tag, or
|
56
|
+
# Example models.
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# outline.children
|
60
|
+
#
|
61
|
+
# @return [Array<Step, Tag, Example>] A collection of child models
|
45
62
|
def children
|
46
63
|
examples + steps + tags
|
47
64
|
end
|
@@ -49,8 +66,13 @@ module CukeModeler
|
|
49
66
|
# Building strings just isn't pretty
|
50
67
|
# rubocop:disable Metrics/AbcSize
|
51
68
|
|
52
|
-
# Returns a string representation of this model. For an
|
69
|
+
# Returns a string representation of this model. For an Outline model,
|
53
70
|
# this will be Gherkin text that is equivalent to the outline being modeled.
|
71
|
+
#
|
72
|
+
# @example
|
73
|
+
# outline.to_s
|
74
|
+
#
|
75
|
+
# @return [String] A string representation of this model
|
54
76
|
def to_s
|
55
77
|
text = ''
|
56
78
|
|
@@ -68,7 +90,17 @@ module CukeModeler
|
|
68
90
|
|
69
91
|
# See `Object#inspect`. Returns some basic information about the
|
70
92
|
# object, including its class, object ID, and its most meaningful
|
71
|
-
# attribute. For an
|
93
|
+
# attribute. For an Outline model, this will be the name of the
|
94
|
+
# outline. If *verbose* is true, provides default Ruby inspection
|
95
|
+
# behavior instead.
|
96
|
+
#
|
97
|
+
# @example
|
98
|
+
# outline.inspect
|
99
|
+
# outline.inspect(verbose: true)
|
100
|
+
#
|
101
|
+
# @param verbose [Boolean] Whether or not to return the full details of
|
102
|
+
# the object. Defaults to false.
|
103
|
+
# @return [String] A string representation of this model
|
72
104
|
def inspect(verbose: false)
|
73
105
|
return super(verbose: verbose) if verbose
|
74
106
|
|
@@ -79,7 +111,7 @@ module CukeModeler
|
|
79
111
|
private
|
80
112
|
|
81
113
|
|
82
|
-
def
|
114
|
+
def process_source(source_text)
|
83
115
|
base_file_string = "# language: #{Parsing.dialect}\n#{dialect_feature_keyword}: Fake feature to parse\n"
|
84
116
|
source_text = base_file_string + source_text
|
85
117
|
|
@@ -88,6 +120,23 @@ module CukeModeler
|
|
88
120
|
parsed_file['feature']['elements'].first
|
89
121
|
end
|
90
122
|
|
123
|
+
def populate_model(parsed_outline_data)
|
124
|
+
populate_parsing_data(parsed_outline_data)
|
125
|
+
populate_source_location(parsed_outline_data)
|
126
|
+
populate_keyword(parsed_outline_data)
|
127
|
+
populate_name(parsed_outline_data)
|
128
|
+
populate_description(parsed_outline_data)
|
129
|
+
populate_steps(parsed_outline_data)
|
130
|
+
populate_tags(parsed_outline_data)
|
131
|
+
populate_outline_examples(parsed_outline_data['examples']) if parsed_outline_data['examples']
|
132
|
+
end
|
133
|
+
|
134
|
+
def populate_outline_examples(parsed_examples)
|
135
|
+
parsed_examples.each do |example_data|
|
136
|
+
@examples << build_child_model(Example, example_data)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
91
140
|
def examples_output_string
|
92
141
|
examples.empty? ? '' : examples.join("\n\n")
|
93
142
|
end
|
@@ -13,24 +13,38 @@ module CukeModeler
|
|
13
13
|
|
14
14
|
# Creates a new Row object and, if *source_text* is provided, populates
|
15
15
|
# the object.
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# Row.new
|
19
|
+
# Row.new('|value_1|value_2|')
|
20
|
+
#
|
21
|
+
# @param source_text [String] The Gherkin text that will be used to populate the model
|
22
|
+
# @raise [ArgumentError] If *source_text* is not a String
|
23
|
+
# @return [Row] A new Row instance
|
16
24
|
def initialize(source_text = nil)
|
17
25
|
@cells = []
|
18
26
|
|
19
27
|
super(source_text)
|
20
|
-
|
21
|
-
return unless source_text
|
22
|
-
|
23
|
-
parsed_row_data = parse_source(source_text)
|
24
|
-
populate_row(self, parsed_row_data)
|
25
28
|
end
|
26
29
|
|
27
|
-
# Returns the model objects that
|
30
|
+
# Returns the model objects that are children of this model. For a
|
31
|
+
# Row model, these would be any associated Cell models.
|
32
|
+
#
|
33
|
+
# @example
|
34
|
+
# row.children
|
35
|
+
#
|
36
|
+
# @return [Array<Cell>] A collection of child models
|
28
37
|
def children
|
29
38
|
@cells
|
30
39
|
end
|
31
40
|
|
32
|
-
# Returns a string representation of this model. For a
|
41
|
+
# Returns a string representation of this model. For a Row model,
|
33
42
|
# this will be Gherkin text that is equivalent to the row being modeled.
|
43
|
+
#
|
44
|
+
# @example
|
45
|
+
# row.to_s
|
46
|
+
#
|
47
|
+
# @return [String] A string representation of this model
|
34
48
|
def to_s
|
35
49
|
text_cells = cells.map(&:to_s)
|
36
50
|
|
@@ -39,7 +53,17 @@ module CukeModeler
|
|
39
53
|
|
40
54
|
# See `Object#inspect`. Returns some basic information about the
|
41
55
|
# object, including its class, object ID, and its most meaningful
|
42
|
-
# attribute. For a
|
56
|
+
# attribute. For a Row model, this will be the cells of the row.
|
57
|
+
# If *verbose* is true, provides default Ruby inspection behavior
|
58
|
+
# instead.
|
59
|
+
#
|
60
|
+
# @example
|
61
|
+
# row.inspect
|
62
|
+
# row.inspect(verbose: true)
|
63
|
+
#
|
64
|
+
# @param verbose [Boolean] Whether or not to return the full details of
|
65
|
+
# the object. Defaults to false.
|
66
|
+
# @return [String] A string representation of this model
|
43
67
|
def inspect(verbose: false)
|
44
68
|
return super(verbose: verbose) if verbose
|
45
69
|
|
@@ -52,7 +76,7 @@ module CukeModeler
|
|
52
76
|
private
|
53
77
|
|
54
78
|
|
55
|
-
def
|
79
|
+
def process_source(source_text)
|
56
80
|
base_file_string = "# language: #{Parsing.dialect}
|
57
81
|
#{dialect_feature_keyword}: Fake feature to parse
|
58
82
|
#{dialect_scenario_keyword}:
|
@@ -64,5 +88,17 @@ module CukeModeler
|
|
64
88
|
parsed_file['feature']['elements'].first['steps'].first['table']['rows'].first
|
65
89
|
end
|
66
90
|
|
91
|
+
def populate_model(parsed_row_data)
|
92
|
+
populate_source_location(parsed_row_data)
|
93
|
+
populate_row_cells(parsed_row_data)
|
94
|
+
populate_parsing_data(parsed_row_data)
|
95
|
+
end
|
96
|
+
|
97
|
+
def populate_row_cells(parsed_row_data)
|
98
|
+
parsed_row_data['cells'].each do |cell_data|
|
99
|
+
@cells << build_child_model(Cell, cell_data)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
67
103
|
end
|
68
104
|
end
|
@@ -23,19 +23,27 @@ module CukeModeler
|
|
23
23
|
|
24
24
|
# Creates a new Rule object and, if *source_text* is provided, populates the
|
25
25
|
# object.
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# Rule.new
|
29
|
+
# Rule.new("Rule:\nThis is a rule")
|
30
|
+
#
|
31
|
+
# @param source_text [String] The Gherkin text that will be used to populate the model
|
32
|
+
# @raise [ArgumentError] If *source_text* is not a String
|
33
|
+
# @return [Rule] A new Rule instance
|
26
34
|
def initialize(source_text = nil)
|
27
35
|
@tags = []
|
28
36
|
@tests = []
|
29
37
|
|
30
38
|
super(source_text)
|
31
|
-
|
32
|
-
return unless source_text
|
33
|
-
|
34
|
-
parsed_rule_data = parse_source(source_text)
|
35
|
-
populate_rule(self, parsed_rule_data)
|
36
39
|
end
|
37
40
|
|
38
41
|
# Returns *true* if the rule contains a background, *false* otherwise.
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# rule.background?
|
45
|
+
#
|
46
|
+
# @return [Boolean] Whether the rule contains a background
|
39
47
|
def background?
|
40
48
|
!@background.nil?
|
41
49
|
end
|
@@ -43,16 +51,33 @@ module CukeModeler
|
|
43
51
|
alias has_background? background?
|
44
52
|
|
45
53
|
# Returns the scenario models contained in the rule.
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
# rule.scenarios
|
57
|
+
#
|
58
|
+
# @return [Array<Scenario>] Child Scenario models
|
46
59
|
def scenarios
|
47
60
|
@tests.select { |test| test.is_a? Scenario }
|
48
61
|
end
|
49
62
|
|
50
63
|
# Returns the outline models contained in the rule.
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
# rule.outlines
|
67
|
+
#
|
68
|
+
# @return [Array<Outline>] Child Outline models
|
51
69
|
def outlines
|
52
70
|
@tests.select { |test| test.is_a? Outline }
|
53
71
|
end
|
54
72
|
|
55
|
-
# Returns the model objects that
|
73
|
+
# Returns the model objects that are children of this model. For a
|
74
|
+
# Rule model, these would be any associated Background, Scenario,
|
75
|
+
# Outline, or Tag models.
|
76
|
+
#
|
77
|
+
# @example
|
78
|
+
# rule.children
|
79
|
+
#
|
80
|
+
# @return [Array<Background, Scenario, Outline, Tag>] A collection of child models
|
56
81
|
def children
|
57
82
|
models = tests + tags
|
58
83
|
models << background if background
|
@@ -60,8 +85,13 @@ module CukeModeler
|
|
60
85
|
models
|
61
86
|
end
|
62
87
|
|
63
|
-
# Returns a string representation of this model. For a
|
88
|
+
# Returns a string representation of this model. For a Rule model,
|
64
89
|
# this will be Gherkin text that is equivalent to the rule being modeled.
|
90
|
+
#
|
91
|
+
# @example
|
92
|
+
# rule.to_s
|
93
|
+
#
|
94
|
+
# @return [String] A string representation of this model
|
65
95
|
def to_s
|
66
96
|
text = ''
|
67
97
|
|
@@ -76,7 +106,17 @@ module CukeModeler
|
|
76
106
|
|
77
107
|
# See `Object#inspect`. Returns some basic information about the
|
78
108
|
# object, including its class, object ID, and its most meaningful
|
79
|
-
# attribute. For a
|
109
|
+
# attribute. For a Rule model, this will be the name of the rule.
|
110
|
+
# If *verbose* is true, provides default Ruby inspection behavior
|
111
|
+
# instead.
|
112
|
+
#
|
113
|
+
# @example
|
114
|
+
# rule.inspect
|
115
|
+
# rule.inspect(verbose: true)
|
116
|
+
#
|
117
|
+
# @param verbose [Boolean] Whether or not to return the full details of
|
118
|
+
# the object. Defaults to false.
|
119
|
+
# @return [String] A string representation of this model
|
80
120
|
def inspect(verbose: false)
|
81
121
|
return super(verbose: verbose) if verbose
|
82
122
|
|
@@ -87,7 +127,7 @@ module CukeModeler
|
|
87
127
|
private
|
88
128
|
|
89
129
|
|
90
|
-
def
|
130
|
+
def process_source(source_text)
|
91
131
|
base_file_string = "# language: #{Parsing.dialect}\n#{dialect_feature_keyword}: Fake feature to parse\n"
|
92
132
|
source_text = base_file_string + source_text
|
93
133
|
|
@@ -96,6 +136,16 @@ module CukeModeler
|
|
96
136
|
parsed_file['feature']['elements'].first
|
97
137
|
end
|
98
138
|
|
139
|
+
def populate_model(parsed_rule_data)
|
140
|
+
populate_parsing_data(parsed_rule_data)
|
141
|
+
populate_source_location(parsed_rule_data)
|
142
|
+
populate_keyword(parsed_rule_data)
|
143
|
+
populate_name(parsed_rule_data)
|
144
|
+
populate_description(parsed_rule_data)
|
145
|
+
populate_tags(parsed_rule_data)
|
146
|
+
populate_children(parsed_rule_data)
|
147
|
+
end
|
148
|
+
|
99
149
|
def background_output_string
|
100
150
|
test_output_string(background)
|
101
151
|
end
|
@@ -18,26 +18,42 @@ module CukeModeler
|
|
18
18
|
|
19
19
|
# Creates a new Scenario object and, if *source_text* is provided, populates the
|
20
20
|
# object.
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# Scenario.new
|
24
|
+
# Scenario.new("Scenario:\n * a step")
|
25
|
+
#
|
26
|
+
# @param source_text [String] The Gherkin text that will be used to populate the model
|
27
|
+
# @raise [ArgumentError] If *source_text* is not a String
|
28
|
+
# @return [Scenario] A new Scenario instance
|
21
29
|
def initialize(source_text = nil)
|
22
30
|
@steps = []
|
23
31
|
@tags = []
|
24
32
|
|
25
33
|
super(source_text)
|
26
|
-
|
27
|
-
return unless source_text
|
28
|
-
|
29
|
-
parsed_scenario_data = parse_source(source_text)
|
30
|
-
populate_scenario(self, parsed_scenario_data)
|
31
34
|
end
|
32
35
|
|
33
|
-
# Returns *true* if the two
|
36
|
+
# Compares this model with another object. Returns *true* if the two objects
|
37
|
+
# have equivalent steps and *false* otherwise.
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# scenario_1 == scenario_2
|
41
|
+
#
|
42
|
+
# @param other [Object] The object to compare this model with
|
43
|
+
# @return [Boolean] Whether the two objects are equivalent
|
34
44
|
def ==(other)
|
35
45
|
return false unless other.respond_to?(:steps)
|
36
46
|
|
37
47
|
steps == other.steps
|
38
48
|
end
|
39
49
|
|
40
|
-
# Returns the model objects that
|
50
|
+
# Returns the model objects that are children of this model. For a
|
51
|
+
# Scenario model, these would be any associated Step or Tag models.
|
52
|
+
#
|
53
|
+
# @example
|
54
|
+
# scenario.children
|
55
|
+
#
|
56
|
+
# @return [Array<Step, Tag>] A collection of child models
|
41
57
|
def children
|
42
58
|
steps + tags
|
43
59
|
end
|
@@ -45,8 +61,13 @@ module CukeModeler
|
|
45
61
|
# Building strings just isn't pretty
|
46
62
|
# rubocop:disable Metrics/AbcSize
|
47
63
|
|
48
|
-
# Returns a string representation of this model. For a
|
64
|
+
# Returns a string representation of this model. For a Scenario model,
|
49
65
|
# this will be Gherkin text that is equivalent to the scenario being modeled.
|
66
|
+
#
|
67
|
+
# @example
|
68
|
+
# scenario.to_s
|
69
|
+
#
|
70
|
+
# @return [String] A string representation of this model
|
50
71
|
def to_s
|
51
72
|
text = ''
|
52
73
|
|
@@ -63,7 +84,17 @@ module CukeModeler
|
|
63
84
|
|
64
85
|
# See `Object#inspect`. Returns some basic information about the
|
65
86
|
# object, including its class, object ID, and its most meaningful
|
66
|
-
# attribute. For a
|
87
|
+
# attribute. For a Scenario model, this will be the name of the
|
88
|
+
# scenario. If *verbose* is true, provides default Ruby inspection
|
89
|
+
# behavior instead.
|
90
|
+
#
|
91
|
+
# @example
|
92
|
+
# scenario.inspect
|
93
|
+
# scenario.inspect(verbose: true)
|
94
|
+
#
|
95
|
+
# @param verbose [Boolean] Whether or not to return the full details of
|
96
|
+
# the object. Defaults to false.
|
97
|
+
# @return [String] A string representation of this model
|
67
98
|
def inspect(verbose: false)
|
68
99
|
return super(verbose: verbose) if verbose
|
69
100
|
|
@@ -74,7 +105,7 @@ module CukeModeler
|
|
74
105
|
private
|
75
106
|
|
76
107
|
|
77
|
-
def
|
108
|
+
def process_source(source_text)
|
78
109
|
base_file_string = "# language: #{Parsing.dialect}\n#{dialect_feature_keyword}: Fake feature to parse\n"
|
79
110
|
source_text = base_file_string + source_text
|
80
111
|
|
@@ -83,5 +114,15 @@ module CukeModeler
|
|
83
114
|
parsed_file['feature']['elements'].first
|
84
115
|
end
|
85
116
|
|
117
|
+
def populate_model(parsed_scenario_data)
|
118
|
+
populate_parsing_data(parsed_scenario_data)
|
119
|
+
populate_source_location(parsed_scenario_data)
|
120
|
+
populate_keyword(parsed_scenario_data)
|
121
|
+
populate_name(parsed_scenario_data)
|
122
|
+
populate_description(parsed_scenario_data)
|
123
|
+
populate_steps(parsed_scenario_data)
|
124
|
+
populate_tags(parsed_scenario_data)
|
125
|
+
end
|
126
|
+
|
86
127
|
end
|
87
128
|
end
|
@@ -20,17 +20,26 @@ module CukeModeler
|
|
20
20
|
|
21
21
|
# Creates a new Step object and, if *source_text* is provided, populates the
|
22
22
|
# object.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# Step.new
|
26
|
+
# Step.new("Given a step")
|
27
|
+
#
|
28
|
+
# @param source_text [String] The Gherkin text that will be used to populate the model
|
29
|
+
# @raise [ArgumentError] If *source_text* is not a String
|
30
|
+
# @return [Step] A new Step instance
|
23
31
|
def initialize(source_text = nil)
|
24
32
|
super(source_text)
|
25
|
-
|
26
|
-
return unless source_text
|
27
|
-
|
28
|
-
parsed_step_data = parse_source(source_text)
|
29
|
-
populate_step(self, parsed_step_data)
|
30
33
|
end
|
31
34
|
|
32
|
-
# Returns *true* if the two
|
33
|
-
# table,
|
35
|
+
# Compares this model with another object. Returns *true* if the two objects
|
36
|
+
# have the same base text, table, and doc string and *false* otherwise.
|
37
|
+
#
|
38
|
+
# @example
|
39
|
+
# step_1 == step_2
|
40
|
+
#
|
41
|
+
# @param other [Object] The object to compare this model with
|
42
|
+
# @return [Boolean] Whether the two objects are equivalent
|
34
43
|
def ==(other)
|
35
44
|
return false unless other.is_a?(CukeModeler::Step)
|
36
45
|
|
@@ -39,13 +48,24 @@ module CukeModeler
|
|
39
48
|
doc_string_matches?(other)
|
40
49
|
end
|
41
50
|
|
42
|
-
# Returns the model objects that
|
51
|
+
# Returns the model objects that are children of this model. For a
|
52
|
+
# Step model, these would be any associated Table or DocString models.
|
53
|
+
#
|
54
|
+
# @example
|
55
|
+
# step.children
|
56
|
+
#
|
57
|
+
# @return [Array<Table, DocString>] A collection of child models
|
43
58
|
def children
|
44
59
|
block ? [block] : []
|
45
60
|
end
|
46
61
|
|
47
|
-
# Returns a string representation of this model. For a
|
62
|
+
# Returns a string representation of this model. For a Step model,
|
48
63
|
# this will be Gherkin text that is equivalent to the step being modeled.
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
# step.to_s
|
67
|
+
#
|
68
|
+
# @return [String] A string representation of this model
|
49
69
|
def to_s
|
50
70
|
text = "#{keyword} #{self.text}"
|
51
71
|
text << "\n#{block.to_s.split("\n").collect { |line| " #{line}" }.join("\n")}" if block
|
@@ -55,7 +75,17 @@ module CukeModeler
|
|
55
75
|
|
56
76
|
# See `Object#inspect`. Returns some basic information about the
|
57
77
|
# object, including its class, object ID, and its most meaningful
|
58
|
-
# attribute. For a
|
78
|
+
# attribute. For a Step model, this will be the text of the step.
|
79
|
+
# If *verbose* is true, provides default Ruby inspection behavior
|
80
|
+
# instead.
|
81
|
+
#
|
82
|
+
# @example
|
83
|
+
# step.inspect
|
84
|
+
# step.inspect(verbose: true)
|
85
|
+
#
|
86
|
+
# @param verbose [Boolean] Whether or not to return the full details of
|
87
|
+
# the object. Defaults to false.
|
88
|
+
# @return [String] A string representation of this model
|
59
89
|
def inspect(verbose: false)
|
60
90
|
return super(verbose: verbose) if verbose
|
61
91
|
|
@@ -66,7 +96,7 @@ module CukeModeler
|
|
66
96
|
private
|
67
97
|
|
68
98
|
|
69
|
-
def
|
99
|
+
def process_source(source_text)
|
70
100
|
base_file_string = "# language: #{Parsing.dialect}
|
71
101
|
#{dialect_feature_keyword}: Fake feature to parse
|
72
102
|
#{dialect_scenario_keyword}:\n"
|
@@ -77,6 +107,26 @@ module CukeModeler
|
|
77
107
|
parsed_file['feature']['elements'].first['steps'].first
|
78
108
|
end
|
79
109
|
|
110
|
+
def populate_model(parsed_step_data)
|
111
|
+
populate_text(parsed_step_data)
|
112
|
+
populate_block(parsed_step_data)
|
113
|
+
populate_keyword(parsed_step_data)
|
114
|
+
populate_source_location(parsed_step_data)
|
115
|
+
populate_parsing_data(parsed_step_data)
|
116
|
+
end
|
117
|
+
|
118
|
+
def populate_text(parsed_step_data)
|
119
|
+
@text = parsed_step_data['name']
|
120
|
+
end
|
121
|
+
|
122
|
+
def populate_block(parsed_step_data)
|
123
|
+
@block = if parsed_step_data['table']
|
124
|
+
build_child_model(Table, parsed_step_data['table'])
|
125
|
+
elsif parsed_step_data['doc_string']
|
126
|
+
build_child_model(DocString, parsed_step_data['doc_string'])
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
80
130
|
def text_matches?(other_step)
|
81
131
|
text == other_step.text
|
82
132
|
end
|