cuke_modeler 0.4.1 → 1.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 +4 -4
- data/.gitignore +17 -17
- data/.travis.yml +1 -1
- data/Gemfile +4 -0
- data/History.rdoc +71 -3
- data/LICENSE.txt +22 -22
- data/README.md +24 -10
- data/Rakefile +2 -12
- data/cuke_modeler.gemspec +1 -1
- data/features/analysis/test_comparison.feature +37 -122
- data/features/modeling/background_modeling.feature +77 -0
- data/features/modeling/background_output.feature +42 -0
- data/features/modeling/cell_modeling.feature +23 -0
- data/features/modeling/cell_output.feature +22 -0
- data/features/modeling/directory_modeling.feature +65 -0
- data/features/modeling/directory_output.feature +12 -0
- data/features/modeling/doc_string_modeling.feature +61 -0
- data/features/modeling/doc_string_output.feature +32 -0
- data/features/modeling/example_modeling.feature +125 -0
- data/features/modeling/example_output.feature +39 -0
- data/features/modeling/feature_file_modeling.feature +40 -0
- data/features/modeling/feature_file_output.feature +12 -0
- data/features/modeling/feature_modeling.feature +109 -0
- data/features/modeling/feature_output.feature +104 -0
- data/features/modeling/model_output.feature +22 -0
- data/features/modeling/model_structure.feature +48 -0
- data/features/modeling/outline_modeling.feature +144 -0
- data/features/modeling/outline_output.feature +69 -0
- data/features/modeling/row_modeling.feature +48 -0
- data/features/modeling/row_output.feature +22 -0
- data/features/modeling/scenario_modeling.feature +118 -0
- data/features/modeling/scenario_output.feature +45 -0
- data/features/modeling/step_modeling.feature +84 -0
- data/features/modeling/step_output.feature +29 -0
- data/features/modeling/table_modeling.feature +50 -0
- data/features/modeling/table_output.feature +24 -0
- data/features/modeling/tag_modeling.feature +43 -0
- data/features/modeling/tag_output.feature +22 -0
- data/features/step_definitions/action_steps.rb +11 -1
- data/features/step_definitions/background_steps.rb +1 -85
- data/features/step_definitions/directory_steps.rb +2 -48
- data/features/step_definitions/doc_string_steps.rb +1 -67
- data/features/step_definitions/feature_file_steps.rb +2 -37
- data/features/step_definitions/feature_steps.rb +4 -100
- data/features/step_definitions/modeling_steps.rb +44 -0
- data/features/step_definitions/setup_steps.rb +19 -41
- data/features/step_definitions/step_steps.rb +2 -166
- data/features/step_definitions/table_steps.rb +1 -58
- data/features/step_definitions/tag_steps.rb +2 -72
- data/features/step_definitions/verification_steps.rb +152 -4
- data/features/support/env.rb +4 -6
- data/gemfiles/{gherkin.gemfile → gherkin2.gemfile} +4 -0
- data/gemfiles/gherkin3.gemfile +4 -0
- data/gemfiles/gherkin4.gemfile +4 -0
- data/lib/cuke_modeler.rb +24 -22
- data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +103 -31
- data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +103 -40
- data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +111 -50
- data/lib/cuke_modeler/containing.rb +255 -4
- data/lib/cuke_modeler/described.rb +28 -0
- data/lib/cuke_modeler/models/background.rb +66 -0
- data/lib/cuke_modeler/models/cell.rb +48 -0
- data/lib/cuke_modeler/models/directory.rb +95 -0
- data/lib/cuke_modeler/models/doc_string.rb +59 -0
- data/lib/cuke_modeler/models/example.rb +167 -0
- data/lib/cuke_modeler/models/feature.rb +106 -0
- data/lib/cuke_modeler/models/feature_file.rb +64 -0
- data/lib/cuke_modeler/models/model.rb +32 -0
- data/lib/cuke_modeler/models/outline.rb +79 -0
- data/lib/cuke_modeler/models/row.rb +49 -0
- data/lib/cuke_modeler/models/scenario.rb +69 -0
- data/lib/cuke_modeler/models/step.rb +68 -0
- data/lib/cuke_modeler/models/table.rb +67 -0
- data/lib/cuke_modeler/models/tag.rb +46 -0
- data/lib/cuke_modeler/named.rb +19 -0
- data/lib/cuke_modeler/nested.rb +22 -15
- data/lib/cuke_modeler/parsed.rb +11 -0
- data/lib/cuke_modeler/parsing.rb +66 -83
- data/lib/cuke_modeler/sourceable.rb +3 -11
- data/lib/cuke_modeler/stepped.rb +24 -0
- data/lib/cuke_modeler/taggable.rb +6 -29
- data/lib/cuke_modeler/version.rb +2 -1
- data/spec/integration/background_integration_spec.rb +332 -7
- data/spec/integration/cell_integration_spec.rb +321 -0
- data/spec/integration/directory_integration_spec.rb +175 -9
- data/spec/integration/doc_string_integration_spec.rb +318 -7
- data/spec/integration/example_integration_spec.rb +602 -19
- data/spec/integration/feature_file_integration_spec.rb +98 -3
- data/spec/integration/feature_integration_spec.rb +445 -27
- data/spec/integration/gherkin_2_adapter_spec.rb +122 -0
- data/spec/integration/gherkin_3_adapter_spec.rb +125 -0
- data/spec/integration/gherkin_4_adapter_spec.rb +123 -0
- data/spec/integration/model_integration_spec.rb +15 -0
- data/spec/integration/nested_integration_spec.rb +91 -0
- data/spec/integration/outline_integration_spec.rb +485 -12
- data/spec/integration/parsing_integration_spec.rb +85 -0
- data/spec/integration/row_integration_spec.rb +221 -18
- data/spec/integration/scenario_integration_spec.rb +368 -14
- data/spec/integration/shared/models_integration_specs.rb +18 -0
- data/spec/integration/step_integration_spec.rb +328 -77
- data/spec/integration/table_integration_spec.rb +242 -20
- data/spec/integration/tag_integration_spec.rb +178 -13
- data/spec/spec_helper.rb +32 -18
- data/spec/unit/background_unit_spec.rb +24 -44
- data/spec/unit/cell_unit_spec.rb +73 -0
- data/spec/unit/described_unit_spec.rb +23 -0
- data/spec/unit/directory_unit_spec.rb +52 -62
- data/spec/unit/doc_string_unit_spec.rb +47 -100
- data/spec/unit/example_unit_spec.rb +50 -296
- data/spec/unit/feature_file_unit_spec.rb +53 -52
- data/spec/unit/feature_unit_spec.rb +39 -83
- data/spec/unit/model_unit_spec.rb +15 -0
- data/spec/unit/named_unit_spec.rb +23 -0
- data/spec/unit/nested_unit_spec.rb +24 -21
- data/spec/unit/outline_unit_spec.rb +46 -69
- data/spec/unit/parsed_unit_spec.rb +27 -0
- data/spec/unit/parsing_unit_spec.rb +2 -70
- data/spec/unit/row_unit_spec.rb +22 -51
- data/spec/unit/scenario_unit_spec.rb +27 -59
- data/spec/unit/{bare_bones_unit_specs.rb → shared/bare_bones_models_unit_specs.rb} +2 -2
- data/spec/unit/shared/containing_models_unit_specs.rb +18 -0
- data/spec/unit/shared/described_models_unit_specs.rb +38 -0
- data/spec/unit/shared/models_unit_specs.rb +15 -0
- data/spec/unit/shared/named_models_unit_specs.rb +39 -0
- data/spec/unit/shared/nested_models_unit_specs.rb +51 -0
- data/spec/unit/shared/parsed_models_unit_specs.rb +39 -0
- data/spec/unit/shared/prepopulated_models_unit_specs.rb +18 -0
- data/spec/unit/shared/sourced_models_unit_specs.rb +39 -0
- data/spec/unit/shared/stepped_models_unit_specs.rb +46 -0
- data/spec/unit/shared/stringifiable_models_unit_specs.rb +18 -0
- data/spec/unit/shared/tagged_models_unit_specs.rb +72 -0
- data/spec/unit/sourceable_unit_spec.rb +12 -4
- data/spec/unit/step_unit_spec.rb +40 -231
- data/spec/unit/stepped_unit_spec.rb +23 -0
- data/spec/unit/table_unit_spec.rb +27 -89
- data/spec/unit/tag_unit_spec.rb +30 -53
- data/spec/unit/taggable_unit_spec.rb +26 -42
- data/todo.txt +32 -0
- metadata +135 -217
- data/features/analysis/test_manipulation.feature +0 -37
- data/features/modeling/gherkin/background_modeling.feature +0 -65
- data/features/modeling/gherkin/background_output.feature +0 -131
- data/features/modeling/gherkin/directory_modeling.feature +0 -110
- data/features/modeling/gherkin/directory_output.feature +0 -14
- data/features/modeling/gherkin/doc_string_modeling.feature +0 -53
- data/features/modeling/gherkin/doc_string_output.feature +0 -72
- data/features/modeling/gherkin/example_modeling.feature +0 -101
- data/features/modeling/gherkin/example_output.feature +0 -193
- data/features/modeling/gherkin/feature_file_modeling.feature +0 -54
- data/features/modeling/gherkin/feature_file_output.feature +0 -14
- data/features/modeling/gherkin/feature_modeling.feature +0 -154
- data/features/modeling/gherkin/feature_output.feature +0 -245
- data/features/modeling/gherkin/outline_modeling.feature +0 -90
- data/features/modeling/gherkin/outline_output.feature +0 -198
- data/features/modeling/gherkin/row_modeling.feature +0 -68
- data/features/modeling/gherkin/row_output.feature +0 -28
- data/features/modeling/gherkin/scenario_modeling.feature +0 -79
- data/features/modeling/gherkin/scenario_output.feature +0 -148
- data/features/modeling/gherkin/step_modeling.feature +0 -75
- data/features/modeling/gherkin/step_output.feature +0 -53
- data/features/modeling/gherkin/table_modeling.feature +0 -42
- data/features/modeling/gherkin/table_output.feature +0 -43
- data/features/modeling/gherkin/table_row_modeling.feature +0 -57
- data/features/modeling/gherkin/table_row_output.feature +0 -28
- data/features/modeling/gherkin/tag_modeling.feature +0 -48
- data/features/modeling/gherkin/tag_output.feature +0 -17
- data/features/modeling/gherkin3/background_modeling.feature +0 -64
- data/features/modeling/gherkin3/background_output.feature +0 -131
- data/features/modeling/gherkin3/directory_modeling.feature +0 -110
- data/features/modeling/gherkin3/directory_output.feature +0 -14
- data/features/modeling/gherkin3/doc_string_modeling.feature +0 -53
- data/features/modeling/gherkin3/doc_string_output.feature +0 -72
- data/features/modeling/gherkin3/example_modeling.feature +0 -100
- data/features/modeling/gherkin3/example_output.feature +0 -207
- data/features/modeling/gherkin3/feature_file_modeling.feature +0 -54
- data/features/modeling/gherkin3/feature_file_output.feature +0 -14
- data/features/modeling/gherkin3/feature_modeling.feature +0 -155
- data/features/modeling/gherkin3/feature_output.feature +0 -249
- data/features/modeling/gherkin3/outline_modeling.feature +0 -89
- data/features/modeling/gherkin3/outline_output.feature +0 -255
- data/features/modeling/gherkin3/row_modeling.feature +0 -68
- data/features/modeling/gherkin3/row_output.feature +0 -28
- data/features/modeling/gherkin3/scenario_modeling.feature +0 -78
- data/features/modeling/gherkin3/scenario_output.feature +0 -148
- data/features/modeling/gherkin3/step_modeling.feature +0 -75
- data/features/modeling/gherkin3/step_output.feature +0 -53
- data/features/modeling/gherkin3/table_modeling.feature +0 -42
- data/features/modeling/gherkin3/table_output.feature +0 -43
- data/features/modeling/gherkin3/table_row_modeling.feature +0 -57
- data/features/modeling/gherkin3/table_row_output.feature +0 -28
- data/features/modeling/gherkin3/tag_modeling.feature +0 -49
- data/features/modeling/gherkin3/tag_output.feature +0 -17
- data/features/modeling/gherkin4/background_modeling.feature +0 -64
- data/features/modeling/gherkin4/background_output.feature +0 -131
- data/features/modeling/gherkin4/directory_modeling.feature +0 -110
- data/features/modeling/gherkin4/directory_output.feature +0 -14
- data/features/modeling/gherkin4/doc_string_modeling.feature +0 -53
- data/features/modeling/gherkin4/doc_string_output.feature +0 -72
- data/features/modeling/gherkin4/example_modeling.feature +0 -100
- data/features/modeling/gherkin4/example_output.feature +0 -193
- data/features/modeling/gherkin4/feature_file_modeling.feature +0 -54
- data/features/modeling/gherkin4/feature_file_output.feature +0 -14
- data/features/modeling/gherkin4/feature_modeling.feature +0 -153
- data/features/modeling/gherkin4/feature_output.feature +0 -245
- data/features/modeling/gherkin4/outline_modeling.feature +0 -89
- data/features/modeling/gherkin4/outline_output.feature +0 -198
- data/features/modeling/gherkin4/row_modeling.feature +0 -68
- data/features/modeling/gherkin4/row_output.feature +0 -28
- data/features/modeling/gherkin4/scenario_modeling.feature +0 -78
- data/features/modeling/gherkin4/scenario_output.feature +0 -148
- data/features/modeling/gherkin4/step_modeling.feature +0 -75
- data/features/modeling/gherkin4/step_output.feature +0 -53
- data/features/modeling/gherkin4/table_modeling.feature +0 -42
- data/features/modeling/gherkin4/table_output.feature +0 -43
- data/features/modeling/gherkin4/table_row_modeling.feature +0 -57
- data/features/modeling/gherkin4/table_row_output.feature +0 -28
- data/features/modeling/gherkin4/tag_modeling.feature +0 -48
- data/features/modeling/gherkin4/tag_output.feature +0 -17
- data/features/step_definitions/outline_steps.rb +0 -258
- data/features/step_definitions/test_steps.rb +0 -123
- data/lib/cuke_modeler/background.rb +0 -38
- data/lib/cuke_modeler/directory.rb +0 -83
- data/lib/cuke_modeler/doc_string.rb +0 -87
- data/lib/cuke_modeler/example.rb +0 -195
- data/lib/cuke_modeler/feature.rb +0 -147
- data/lib/cuke_modeler/feature_element.rb +0 -73
- data/lib/cuke_modeler/feature_file.rb +0 -77
- data/lib/cuke_modeler/outline.rb +0 -68
- data/lib/cuke_modeler/raw.rb +0 -20
- data/lib/cuke_modeler/row.rb +0 -64
- data/lib/cuke_modeler/scenario.rb +0 -45
- data/lib/cuke_modeler/step.rb +0 -216
- data/lib/cuke_modeler/table.rb +0 -90
- data/lib/cuke_modeler/table_row.rb +0 -64
- data/lib/cuke_modeler/tag.rb +0 -62
- data/lib/cuke_modeler/test_element.rb +0 -79
- data/lib/cuke_modeler/world.rb +0 -113
- data/spec/integration/table_row_integration_spec.rb +0 -76
- data/spec/integration/world_integration_spec.rb +0 -14
- data/spec/unit/containing_element_unit_specs.rb +0 -18
- data/spec/unit/feature_element_unit_spec.rb +0 -19
- data/spec/unit/feature_element_unit_specs.rb +0 -52
- data/spec/unit/nested_element_unit_specs.rb +0 -39
- data/spec/unit/prepopulated_unit_specs.rb +0 -14
- data/spec/unit/raw_element_unit_specs.rb +0 -27
- data/spec/unit/raw_unit_spec.rb +0 -28
- data/spec/unit/sourced_element_unit_specs.rb +0 -18
- data/spec/unit/table_row_unit_spec.rb +0 -102
- data/spec/unit/tagged_element_unit_specs.rb +0 -67
- data/spec/unit/test_element_unit_spec.rb +0 -54
- data/spec/unit/test_element_unit_specs.rb +0 -34
- data/spec/unit/world_unit_spec.rb +0 -140
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling a step's table.
|
|
4
|
+
|
|
5
|
+
class Table < Model
|
|
6
|
+
|
|
7
|
+
include Parsed
|
|
8
|
+
include Sourceable
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# The row models that make up the table
|
|
12
|
+
attr_accessor :rows
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Creates a new Table object and, if *source_text* is provided, populates
|
|
16
|
+
# the object.
|
|
17
|
+
def initialize(source_text = nil)
|
|
18
|
+
@rows = []
|
|
19
|
+
|
|
20
|
+
super(source_text)
|
|
21
|
+
|
|
22
|
+
if source_text
|
|
23
|
+
parsed_table_data = parse_source(source_text)
|
|
24
|
+
populate_table(self, parsed_table_data)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Returns the model objects that belong to this model.
|
|
29
|
+
def children
|
|
30
|
+
rows
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Returns a string representation of this model. For a table model,
|
|
34
|
+
# this will be Gherkin text that is equivalent to the table being modeled.
|
|
35
|
+
def to_s
|
|
36
|
+
rows.empty? ? '' : rows.collect { |row| row_output_string(row) }.join("\n")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def parse_source(source_text)
|
|
44
|
+
base_file_string = "Feature:\nScenario:\n* step\n"
|
|
45
|
+
source_text = base_file_string + source_text
|
|
46
|
+
|
|
47
|
+
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_table.feature')
|
|
48
|
+
|
|
49
|
+
parsed_file.first['elements'].first['steps'].first['table']
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def row_output_string(row)
|
|
53
|
+
row_text = '|'
|
|
54
|
+
|
|
55
|
+
row.cells.count.times do |count|
|
|
56
|
+
row_text << " #{row.cells[count].to_s.ljust(determine_buffer_size(count))} |"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
row_text
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def determine_buffer_size(index)
|
|
63
|
+
rows.collect { |row| row.cells[index].to_s.length }.max || 0
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A class modeling a tag.
|
|
4
|
+
|
|
5
|
+
class Tag < Model
|
|
6
|
+
|
|
7
|
+
include Parsed
|
|
8
|
+
include Sourceable
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# The name of the tag
|
|
12
|
+
attr_accessor :name
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Creates a new Tag object and, if *source_text* is provided, populates the
|
|
16
|
+
# object.
|
|
17
|
+
def initialize(source_text = nil)
|
|
18
|
+
super(source_text)
|
|
19
|
+
|
|
20
|
+
if source_text
|
|
21
|
+
parsed_tag_data = parse_source(source_text)
|
|
22
|
+
populate_tag(self, parsed_tag_data)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns a string representation of this model. For a tag model,
|
|
27
|
+
# this will be Gherkin text that is equivalent to the tag being modeled.
|
|
28
|
+
def to_s
|
|
29
|
+
name || ''
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def parse_source(source_text)
|
|
37
|
+
base_file_string = "\nFeature: Fake feature to parse"
|
|
38
|
+
source_text = source_text + base_file_string
|
|
39
|
+
|
|
40
|
+
parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_tag.feature')
|
|
41
|
+
|
|
42
|
+
parsed_file.first['tags'].first
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A mix-in module containing methods used by models that represent an element that has a name.
|
|
4
|
+
|
|
5
|
+
module Named
|
|
6
|
+
|
|
7
|
+
# The name of the element
|
|
8
|
+
attr_accessor :name
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def name_output_string
|
|
15
|
+
(name.nil? || name.empty?) ? '' : " #{name}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/cuke_modeler/nested.rb
CHANGED
|
@@ -1,32 +1,39 @@
|
|
|
1
1
|
module CukeModeler
|
|
2
2
|
|
|
3
|
-
# A mix-in module containing methods used by
|
|
4
|
-
# of other
|
|
3
|
+
# A mix-in module containing methods used by models that are nested inside
|
|
4
|
+
# of other models.
|
|
5
5
|
|
|
6
6
|
module Nested
|
|
7
7
|
|
|
8
|
-
# The parent
|
|
9
|
-
attr_accessor :
|
|
8
|
+
# The parent model that contains this model
|
|
9
|
+
attr_accessor :parent_model
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
# Returns the ancestor of
|
|
12
|
+
# Returns the ancestor model of this model that matches the given type.
|
|
13
13
|
def get_ancestor(ancestor_type)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
:
|
|
17
|
-
:
|
|
18
|
-
:
|
|
19
|
-
:
|
|
20
|
-
:
|
|
21
|
-
:
|
|
14
|
+
target_type = {:directory => [Directory],
|
|
15
|
+
:feature_file => [FeatureFile],
|
|
16
|
+
:feature => [Feature],
|
|
17
|
+
:test => [Scenario, Outline, Background],
|
|
18
|
+
:background => [Background],
|
|
19
|
+
:scenario => [Scenario],
|
|
20
|
+
:outline => [Outline],
|
|
21
|
+
:step => [Step],
|
|
22
|
+
:table => [Table],
|
|
23
|
+
:example => [Example],
|
|
24
|
+
:row => [Row]
|
|
22
25
|
}[ancestor_type]
|
|
23
26
|
|
|
24
27
|
raise(ArgumentError, "Unknown ancestor type '#{ancestor_type}'.") if target_type.nil?
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
|
|
30
|
+
ancestor = self.parent_model
|
|
31
|
+
|
|
32
|
+
until target_type.include?(ancestor.class) || ancestor.nil?
|
|
33
|
+
ancestor = ancestor.parent_model
|
|
28
34
|
end
|
|
29
35
|
|
|
36
|
+
|
|
30
37
|
ancestor
|
|
31
38
|
end
|
|
32
39
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A mix-in module containing methods used by models that are parsed from source text.
|
|
4
|
+
|
|
5
|
+
module Parsed
|
|
6
|
+
|
|
7
|
+
# The parsing data for this element that was generated by the parsing engine (i.e. the *gherkin* gem)
|
|
8
|
+
attr_accessor :parsing_data
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
end
|
data/lib/cuke_modeler/parsing.rb
CHANGED
|
@@ -1,113 +1,96 @@
|
|
|
1
|
-
|
|
2
|
-
begin
|
|
3
|
-
require 'gherkin'
|
|
4
|
-
rescue LoadError => e
|
|
5
|
-
require 'gherkin/parser'
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
# Parsing will be with an 'adapter' appropriate to the version of the 'gherkin' gem that has been activated
|
|
9
|
-
case
|
|
10
|
-
when Gem.loaded_specs['gherkin'].version.version[/^4/]
|
|
11
|
-
|
|
12
|
-
require 'gherkin/parser'
|
|
13
|
-
require 'cuke_modeler/adapters/gherkin_4_adapter'
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
module CukeModeler
|
|
17
|
-
|
|
18
|
-
module Parsing
|
|
19
|
-
class << self
|
|
1
|
+
module CukeModeler
|
|
20
2
|
|
|
21
|
-
|
|
22
|
-
raise(ArgumentError, "Cannot parse #{source_text.class} objects. Strings only.") unless source_text.is_a?(String)
|
|
3
|
+
# A module providing source text parsing functionality.
|
|
23
4
|
|
|
24
|
-
|
|
25
|
-
parsed_result = Gherkin::Parser.new.parse(source_text)
|
|
26
|
-
rescue => e
|
|
27
|
-
raise(ArgumentError, "Error encountered while parsing '#{filename}'\n#{e.class} - #{e.message}")
|
|
28
|
-
end
|
|
5
|
+
module Parsing
|
|
29
6
|
|
|
30
|
-
adapted_result = CukeModeler::Gherkin4Adapter.new.adapt(parsed_result)
|
|
31
7
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
8
|
+
# Have to at least load some version of the gem before which version of the gem has been loaded can
|
|
9
|
+
# be determined and the rest of the needed files can be loaded. Try the old one first and then the
|
|
10
|
+
# new one.
|
|
11
|
+
begin
|
|
12
|
+
require 'gherkin'
|
|
13
|
+
rescue LoadError
|
|
14
|
+
require 'gherkin/parser'
|
|
36
15
|
end
|
|
37
16
|
|
|
38
|
-
when Gem.loaded_specs['gherkin'].version.version[/^3/]
|
|
39
|
-
|
|
40
|
-
require 'gherkin/parser'
|
|
41
|
-
require 'cuke_modeler/adapters/gherkin_3_adapter'
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
module CukeModeler
|
|
45
|
-
|
|
46
|
-
module Parsing
|
|
47
|
-
class << self
|
|
48
17
|
|
|
49
|
-
|
|
50
|
-
|
|
18
|
+
# The *gherkin* gem loads differently and has different grammar rules across major versions. Parsing
|
|
19
|
+
# will be done with an 'adapter' appropriate to the version of the *gherkin* gem that has been activated.
|
|
51
20
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
end
|
|
21
|
+
case
|
|
22
|
+
when Gem.loaded_specs['gherkin'].version.version[/^4/]
|
|
23
|
+
require 'gherkin/parser'
|
|
24
|
+
require 'cuke_modeler/adapters/gherkin_4_adapter'
|
|
57
25
|
|
|
58
|
-
adapted_result = CukeModeler::Gherkin3Adapter.new.adapt(parsed_result)
|
|
59
26
|
|
|
60
|
-
|
|
61
|
-
|
|
27
|
+
# todo - make these methods private?
|
|
28
|
+
def self.parsing_method(source_text, _filename)
|
|
29
|
+
Gherkin::Parser.new.parse(source_text)
|
|
62
30
|
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
31
|
|
|
66
|
-
|
|
32
|
+
def self.adapter_class
|
|
33
|
+
CukeModeler::Gherkin4Adapter
|
|
34
|
+
end
|
|
67
35
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
require 'json'
|
|
72
|
-
require 'multi_json'
|
|
73
|
-
require 'cuke_modeler/adapters/gherkin_2_adapter'
|
|
36
|
+
when Gem.loaded_specs['gherkin'].version.version[/^3/]
|
|
37
|
+
require 'gherkin/parser'
|
|
38
|
+
require 'cuke_modeler/adapters/gherkin_3_adapter'
|
|
74
39
|
|
|
75
40
|
|
|
76
|
-
|
|
41
|
+
def self.parsing_method(source_text, _filename)
|
|
42
|
+
Gherkin::Parser.new.parse(source_text)
|
|
43
|
+
end
|
|
77
44
|
|
|
78
|
-
|
|
45
|
+
def self.adapter_class
|
|
46
|
+
CukeModeler::Gherkin3Adapter
|
|
47
|
+
end
|
|
79
48
|
|
|
80
|
-
|
|
49
|
+
else # Assume version 2.x
|
|
50
|
+
require 'stringio'
|
|
51
|
+
require 'gherkin/formatter/json_formatter'
|
|
52
|
+
require 'gherkin'
|
|
53
|
+
require 'json'
|
|
54
|
+
require 'multi_json'
|
|
55
|
+
require 'cuke_modeler/adapters/gherkin_2_adapter'
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def self.parsing_method(source_text, filename)
|
|
59
|
+
io = StringIO.new
|
|
60
|
+
formatter = Gherkin::Formatter::JSONFormatter.new(io)
|
|
61
|
+
parser = Gherkin::Parser::Parser.new(formatter)
|
|
62
|
+
parser.parse(source_text, filename, 0)
|
|
63
|
+
formatter.done
|
|
64
|
+
MultiJson.load(io.string)
|
|
65
|
+
end
|
|
81
66
|
|
|
82
|
-
|
|
67
|
+
def self.adapter_class
|
|
68
|
+
CukeModeler::Gherkin2Adapter
|
|
69
|
+
end
|
|
83
70
|
|
|
84
|
-
|
|
85
|
-
# containing the hash representation of its logical structure.
|
|
86
|
-
def parse_text(source_text, filename = 'cuke_modeler_fake_file.feature')
|
|
87
|
-
raise(ArgumentError, "Cannot parse #{source_text.class} objects. Strings only.") unless source_text.is_a?(String)
|
|
71
|
+
end
|
|
88
72
|
|
|
89
|
-
io = StringIO.new
|
|
90
|
-
formatter = Gherkin::Formatter::JSONFormatter.new(io)
|
|
91
|
-
parser = Gherkin::Parser::Parser.new(formatter)
|
|
92
73
|
|
|
93
|
-
|
|
94
|
-
parser.parse(source_text, filename, 0)
|
|
95
|
-
rescue => e
|
|
96
|
-
raise(ArgumentError, "Error encountered while parsing '#{filename}'\n#{e.class} - #{e.message}")
|
|
97
|
-
end
|
|
74
|
+
class << self
|
|
98
75
|
|
|
99
|
-
|
|
76
|
+
# Parses the Cucumber feature given in *source_text* and returns an array
|
|
77
|
+
# containing the hash representation of its logical structure.
|
|
78
|
+
def parse_text(source_text, filename = 'cuke_modeler_fake_file.feature')
|
|
79
|
+
raise(ArgumentError, "Text to parse must be a String but got #{source_text.class}") unless source_text.is_a?(String)
|
|
100
80
|
|
|
101
81
|
|
|
102
|
-
|
|
103
|
-
|
|
82
|
+
begin
|
|
83
|
+
parsed_result = parsing_method(source_text, filename)
|
|
84
|
+
rescue => e
|
|
85
|
+
raise(ArgumentError, "Error encountered while parsing '#{filename}'\n#{e.class} - #{e.message}")
|
|
86
|
+
end
|
|
104
87
|
|
|
105
|
-
|
|
106
|
-
end
|
|
88
|
+
adapted_result = adapter_class.new.adapt(parsed_result)
|
|
107
89
|
|
|
108
|
-
end
|
|
109
90
|
|
|
91
|
+
adapted_result
|
|
110
92
|
end
|
|
111
|
-
end
|
|
112
93
|
|
|
94
|
+
end
|
|
95
|
+
end
|
|
113
96
|
end
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
module CukeModeler
|
|
2
2
|
|
|
3
|
-
# A mix-in module containing methods used by
|
|
4
|
-
# source code
|
|
3
|
+
# A mix-in module containing methods used by models that know from which line of
|
|
4
|
+
# source code they originate.
|
|
5
5
|
|
|
6
6
|
module Sourceable
|
|
7
7
|
|
|
8
8
|
# The line number where the element began in the source code
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def populate_element_source_line(parsed_element)
|
|
16
|
-
@source_line = parsed_element['line']
|
|
17
|
-
end
|
|
9
|
+
attr_accessor :source_line
|
|
18
10
|
|
|
19
11
|
end
|
|
20
12
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module CukeModeler
|
|
2
|
+
|
|
3
|
+
# A mix-in module containing methods used by models that represent an element that has steps.
|
|
4
|
+
|
|
5
|
+
module Stepped
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# The step models contained by this model
|
|
9
|
+
attr_accessor :steps
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def steps_output_string
|
|
16
|
+
steps.collect { |step| indented_step_text(step) }.join("\n")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def indented_step_text(step)
|
|
20
|
+
step.to_s.split("\n").collect { |line| " #{line}" }.join("\n")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -1,53 +1,30 @@
|
|
|
1
1
|
module CukeModeler
|
|
2
2
|
|
|
3
|
-
# A mix-in module containing methods used by
|
|
3
|
+
# A mix-in module containing methods used by models that represent an element that can be tagged.
|
|
4
4
|
|
|
5
5
|
module Taggable
|
|
6
6
|
|
|
7
|
-
# The tags which are directly assigned to the element
|
|
7
|
+
# The models for tags which are directly assigned to the element
|
|
8
8
|
attr_accessor :tags
|
|
9
9
|
|
|
10
|
-
# The tag elements belonging to the element
|
|
11
|
-
attr_accessor :tag_elements
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
# Returns the tags which are indirectly assigned to the element (i.e. they
|
|
11
|
+
# Returns the models for tags which are indirectly assigned to the element (i.e. they
|
|
15
12
|
# have been inherited from a parent element).
|
|
16
13
|
def applied_tags
|
|
17
|
-
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Returns the tags elements which are indirectly assigned to the element
|
|
21
|
-
# (i.e. they have been inherited from a parent element).
|
|
22
|
-
def applied_tag_elements
|
|
23
|
-
@parent_element.respond_to?(:all_tag_elements) ? @parent_element.all_tag_elements : []
|
|
14
|
+
parent_model.respond_to?(:all_tags) ? parent_model.all_tags : []
|
|
24
15
|
end
|
|
25
16
|
|
|
26
|
-
# Returns all of the tags which are applicable to the element.
|
|
17
|
+
# Returns models for all of the tags which are applicable to the element.
|
|
27
18
|
def all_tags
|
|
28
19
|
applied_tags + @tags
|
|
29
20
|
end
|
|
30
21
|
|
|
31
|
-
# Returns all of the tag elements which are applicable to the element.
|
|
32
|
-
def all_tag_elements
|
|
33
|
-
applied_tag_elements + @tag_elements
|
|
34
|
-
end
|
|
35
|
-
|
|
36
22
|
|
|
37
23
|
private
|
|
38
24
|
|
|
39
25
|
|
|
40
|
-
def populate_element_tags(parsed_element)
|
|
41
|
-
if parsed_element['tags']
|
|
42
|
-
parsed_element['tags'].each do |tag|
|
|
43
|
-
@tags << tag['name']
|
|
44
|
-
@tag_elements << build_child_element(Tag, tag)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
26
|
def tag_output_string
|
|
50
|
-
|
|
27
|
+
tags.collect { |tag| tag.name }.join(' ')
|
|
51
28
|
end
|
|
52
29
|
|
|
53
30
|
end
|