cucumber_analytics 0.0.2 → 0.0.3
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/History.rdoc +16 -0
- data/cucumber_analytics.gemspec +1 -0
- data/features/modeling/background_modeling.feature +46 -33
- data/features/modeling/feature_modeling.feature +4 -1
- data/features/modeling/outline_modeling.feature +17 -4
- data/features/modeling/scenario_modeling.feature +24 -11
- data/features/support/env.rb +9 -0
- data/lib/cucumber_analytics.rb +3 -0
- data/lib/cucumber_analytics/feature_element.rb +20 -2
- data/lib/cucumber_analytics/logging.rb +9 -0
- data/lib/cucumber_analytics/outline_example.rb +20 -1
- data/lib/cucumber_analytics/parsed_background.rb +14 -1
- data/lib/cucumber_analytics/parsed_directory.rb +2 -0
- data/lib/cucumber_analytics/parsed_feature.rb +17 -1
- data/lib/cucumber_analytics/parsed_file.rb +44 -37
- data/lib/cucumber_analytics/parsed_scenario.rb +18 -1
- data/lib/cucumber_analytics/parsed_scenario_outline.rb +50 -11
- data/lib/cucumber_analytics/step.rb +12 -0
- data/lib/cucumber_analytics/test_element.rb +26 -6
- data/lib/cucumber_analytics/version.rb +3 -3
- data/lib/cucumber_analytics/world.rb +7 -1
- metadata +20 -2
data/History.rdoc
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
=== Version 0.0.3 / 2012-11-10
|
2
|
+
|
3
|
+
* 'But' has been added to the list of recognized step keywords (formerly Given,
|
4
|
+
When,Then, And, and *)
|
5
|
+
* Bug fix: the number of test cases a feature is considered to contain now
|
6
|
+
properly takes into account an outline's example rows.
|
7
|
+
|
8
|
+
|
9
|
+
=== Version 0.0.2 / 2012-11-1
|
10
|
+
|
11
|
+
* Bug fix: descriptions are no longer cut short due to the presence of keywords
|
12
|
+
|
13
|
+
|
14
|
+
=== Version 0.0.1 / 2012-10-28
|
15
|
+
|
16
|
+
* Initial release
|
data/cucumber_analytics.gemspec
CHANGED
@@ -26,13 +26,14 @@ Feature: Background elements can be modeled.
|
|
26
26
|
# Basically, if it's not a step keyword or tag then I will accept
|
27
27
|
# it as description here. Cucumber might not but but that's between
|
28
28
|
# you and its lexxer/parser. ;)
|
29
|
-
|
29
|
+
Given this *parameterized* step takes a table:
|
30
30
|
| data |
|
31
31
|
| more data |
|
32
|
-
|
32
|
+
When some setup step
|
33
|
+
But some setup step
|
33
34
|
#
|
34
|
-
|
35
|
-
|
35
|
+
Then a step with a *parameter*
|
36
|
+
And some big setup step:
|
36
37
|
#random comment
|
37
38
|
\"\"\"
|
38
39
|
some text
|
@@ -47,6 +48,8 @@ Feature: Background elements can be modeled.
|
|
47
48
|
Given
|
48
49
|
When
|
49
50
|
Then
|
51
|
+
And
|
52
|
+
But
|
50
53
|
*
|
51
54
|
some more text
|
52
55
|
\"\"\"
|
@@ -78,40 +81,45 @@ Feature: Background elements can be modeled.
|
|
78
81
|
|
79
82
|
Scenario: The background steps are modeled.
|
80
83
|
Then the background's steps are as follows:
|
81
|
-
|
|
82
|
-
| \| data \|
|
83
|
-
| \| more data \|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
| ''
|
90
|
-
| '
|
91
|
-
| '
|
92
|
-
| 'Scenario
|
93
|
-
| '
|
94
|
-
| '
|
95
|
-
| '
|
96
|
-
| '
|
97
|
-
| '
|
98
|
-
| '
|
99
|
-
| '
|
100
|
-
| '
|
101
|
-
| '
|
102
|
-
|
|
103
|
-
| *
|
84
|
+
| Given this *parameterized* step takes a table: |
|
85
|
+
| \| data \| |
|
86
|
+
| \| more data \| |
|
87
|
+
| When some setup step |
|
88
|
+
| But some setup step |
|
89
|
+
| Then a step with a *parameter* |
|
90
|
+
| And some big setup step: |
|
91
|
+
| """ |
|
92
|
+
| 'some text' |
|
93
|
+
| '' |
|
94
|
+
| '#some comments' |
|
95
|
+
| 'Scenario:' |
|
96
|
+
| 'Scenario Outline:' |
|
97
|
+
| 'Examples:' |
|
98
|
+
| '@' |
|
99
|
+
| 'Feature:' |
|
100
|
+
| '\|' |
|
101
|
+
| 'Given' |
|
102
|
+
| 'When' |
|
103
|
+
| 'Then' |
|
104
|
+
| 'And' |
|
105
|
+
| 'But' |
|
106
|
+
| '*' |
|
107
|
+
| ' some more text' |
|
108
|
+
| """ |
|
109
|
+
| * *lots* *of* *parameters* |
|
104
110
|
And the background's steps "without" arguments are as follows:
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
| Given this ** step takes a table: |
|
112
|
+
| When some setup step |
|
113
|
+
| But some setup step |
|
114
|
+
| Then a step with a ** |
|
115
|
+
| And some big setup step: |
|
116
|
+
| * ** ** ** |
|
110
117
|
And the background's steps "without" keywords are as follows:
|
111
118
|
| this *parameterized* step takes a table: |
|
112
119
|
| \| data \| |
|
113
120
|
| \| more data \| |
|
114
121
|
| some setup step |
|
122
|
+
| some setup step |
|
115
123
|
| a step with a *parameter* |
|
116
124
|
| some big setup step: |
|
117
125
|
| """ |
|
@@ -127,6 +135,8 @@ Feature: Background elements can be modeled.
|
|
127
135
|
| 'Given' |
|
128
136
|
| 'When' |
|
129
137
|
| 'Then' |
|
138
|
+
| 'And' |
|
139
|
+
| 'But' |
|
130
140
|
| '*' |
|
131
141
|
| ' some more text' |
|
132
142
|
| """ |
|
@@ -134,13 +144,14 @@ Feature: Background elements can be modeled.
|
|
134
144
|
And the background's steps "without" arguments "without" keywords are as follows:
|
135
145
|
| this ** step takes a table: |
|
136
146
|
| some setup step |
|
147
|
+
| some setup step |
|
137
148
|
| a step with a ** |
|
138
149
|
| some big setup step: |
|
139
150
|
| ** ** ** |
|
140
151
|
And step "1" of the background has the following block:
|
141
152
|
| \| data \| |
|
142
153
|
| \| more data \| |
|
143
|
-
And step "
|
154
|
+
And step "5" of the background has the following block:
|
144
155
|
| """ |
|
145
156
|
| 'some text' |
|
146
157
|
| '' |
|
@@ -154,6 +165,8 @@ Feature: Background elements can be modeled.
|
|
154
165
|
| 'Given' |
|
155
166
|
| 'When' |
|
156
167
|
| 'Then' |
|
168
|
+
| 'And' |
|
169
|
+
| 'But' |
|
157
170
|
| '*' |
|
158
171
|
| ' some more text' |
|
159
172
|
| """ |
|
@@ -30,6 +30,7 @@ Feature: Features can be modeled.
|
|
30
30
|
Given some description that uses keywords
|
31
31
|
And more of it
|
32
32
|
When I chuck the kitchen sink at it:
|
33
|
+
But
|
33
34
|
*
|
34
35
|
|
|
35
36
|
|
@@ -79,6 +80,7 @@ Feature: Features can be modeled.
|
|
79
80
|
Examples: some examples with different significance and a tag
|
80
81
|
| param1 | param2 |
|
81
82
|
| a | b |
|
83
|
+
| c | d |
|
82
84
|
|
83
85
|
|
84
86
|
Scenario: The second scenario's name.
|
@@ -113,7 +115,7 @@ Feature: Features can be modeled.
|
|
113
115
|
Then feature "1" is found to have the following properties:
|
114
116
|
| name | The test feature name. |
|
115
117
|
| test_count | 3 |
|
116
|
-
| test_case_count |
|
118
|
+
| test_case_count | 5 |
|
117
119
|
And feature "2" is found to have the following properties:
|
118
120
|
| name | |
|
119
121
|
| test_count | 2 |
|
@@ -132,6 +134,7 @@ Feature: Features can be modeled.
|
|
132
134
|
| Given some description that uses keywords |
|
133
135
|
| And more of it |
|
134
136
|
| When I chuck the kitchen sink at it: |
|
137
|
+
| But |
|
135
138
|
| * |
|
136
139
|
| \| |
|
137
140
|
| Scenario Outline |
|
@@ -36,9 +36,10 @@ Feature: Scenario Outline elements can be modeled.
|
|
36
36
|
| <param1> |
|
37
37
|
| <param2> |
|
38
38
|
And some setup step
|
39
|
+
* some setup step
|
39
40
|
#
|
40
41
|
When a step with a *parameter*
|
41
|
-
|
42
|
+
But a big step:
|
42
43
|
#random comment
|
43
44
|
\"\"\"
|
44
45
|
some text
|
@@ -53,6 +54,8 @@ Feature: Scenario Outline elements can be modeled.
|
|
53
54
|
Given
|
54
55
|
When
|
55
56
|
Then
|
57
|
+
And
|
58
|
+
But
|
56
59
|
*
|
57
60
|
some more text
|
58
61
|
\"\"\"
|
@@ -103,8 +106,9 @@ Feature: Scenario Outline elements can be modeled.
|
|
103
106
|
| \| <param1> \| |
|
104
107
|
| \| <param2> \| |
|
105
108
|
| And some setup step |
|
109
|
+
| * some setup step |
|
106
110
|
| When a step with a *parameter* |
|
107
|
-
|
|
111
|
+
| But a big step: |
|
108
112
|
| """ |
|
109
113
|
| 'some text' |
|
110
114
|
| '' |
|
@@ -118,6 +122,8 @@ Feature: Scenario Outline elements can be modeled.
|
|
118
122
|
| 'Given' |
|
119
123
|
| 'When' |
|
120
124
|
| 'Then' |
|
125
|
+
| 'And' |
|
126
|
+
| 'But' |
|
121
127
|
| '*' |
|
122
128
|
| ' some more text' |
|
123
129
|
| """ |
|
@@ -125,14 +131,16 @@ Feature: Scenario Outline elements can be modeled.
|
|
125
131
|
And the test steps "without" arguments are as follows:
|
126
132
|
| Given this ** step takes a table: |
|
127
133
|
| And some setup step |
|
134
|
+
| * some setup step |
|
128
135
|
| When a step with a ** |
|
129
|
-
|
|
136
|
+
| But a big step: |
|
130
137
|
| Then ** ** ** |
|
131
138
|
And the test steps "without" keywords are as follows:
|
132
139
|
| this *parameterized* step takes a table: |
|
133
140
|
| \| <param1> \| |
|
134
141
|
| \| <param2> \| |
|
135
142
|
| some setup step |
|
143
|
+
| some setup step |
|
136
144
|
| a step with a *parameter* |
|
137
145
|
| a big step: |
|
138
146
|
| """ |
|
@@ -148,6 +156,8 @@ Feature: Scenario Outline elements can be modeled.
|
|
148
156
|
| 'Given' |
|
149
157
|
| 'When' |
|
150
158
|
| 'Then' |
|
159
|
+
| 'And' |
|
160
|
+
| 'But' |
|
151
161
|
| '*' |
|
152
162
|
| ' some more text' |
|
153
163
|
| """ |
|
@@ -155,13 +165,14 @@ Feature: Scenario Outline elements can be modeled.
|
|
155
165
|
And the test steps "without" arguments "without" keywords are as follows:
|
156
166
|
| this ** step takes a table: |
|
157
167
|
| some setup step |
|
168
|
+
| some setup step |
|
158
169
|
| a step with a ** |
|
159
170
|
| a big step: |
|
160
171
|
| ** ** ** |
|
161
172
|
And the test step "1" has the following block:
|
162
173
|
| \| <param1> \| |
|
163
174
|
| \| <param2> \| |
|
164
|
-
And the test step "
|
175
|
+
And the test step "5" has the following block:
|
165
176
|
| """ |
|
166
177
|
| 'some text' |
|
167
178
|
| '' |
|
@@ -175,6 +186,8 @@ Feature: Scenario Outline elements can be modeled.
|
|
175
186
|
| 'Given' |
|
176
187
|
| 'When' |
|
177
188
|
| 'Then' |
|
189
|
+
| 'And' |
|
190
|
+
| 'But' |
|
178
191
|
| '*' |
|
179
192
|
| ' some more text' |
|
180
193
|
| """ |
|
@@ -36,9 +36,10 @@ Feature: Scenario elements can be modeled.
|
|
36
36
|
| data |
|
37
37
|
| more data |
|
38
38
|
And some setup step
|
39
|
+
* some setup step
|
39
40
|
#
|
40
41
|
When a step with a *parameter*
|
41
|
-
|
42
|
+
But a big step:
|
42
43
|
#random comment
|
43
44
|
\"\"\"
|
44
45
|
some text
|
@@ -53,6 +54,8 @@ Feature: Scenario elements can be modeled.
|
|
53
54
|
Given
|
54
55
|
When
|
55
56
|
Then
|
57
|
+
And
|
58
|
+
But
|
56
59
|
*
|
57
60
|
some more text
|
58
61
|
\"\"\"
|
@@ -69,13 +72,13 @@ Feature: Scenario elements can be modeled.
|
|
69
72
|
|
70
73
|
Scenario: The scenario description is modeled.
|
71
74
|
Then the test descriptive lines are as follows:
|
72
|
-
| My big hunk of perfectly valid description:
|
73
|
-
| \|
|
74
|
-
| Scenario Outline
|
75
|
-
| Examples
|
76
|
-
| """
|
77
|
-
| Background
|
78
|
-
| this is still one big valid description
|
75
|
+
| My big hunk of perfectly valid description: |
|
76
|
+
| \| |
|
77
|
+
| Scenario Outline |
|
78
|
+
| Examples |
|
79
|
+
| """ |
|
80
|
+
| Background |
|
81
|
+
| this is still one big valid description |
|
79
82
|
|
80
83
|
Scenario: The scenario steps are modeled.
|
81
84
|
Then the test steps are as follows:
|
@@ -83,8 +86,9 @@ Feature: Scenario elements can be modeled.
|
|
83
86
|
| \| data \| |
|
84
87
|
| \| more data \| |
|
85
88
|
| And some setup step |
|
89
|
+
| * some setup step |
|
86
90
|
| When a step with a *parameter* |
|
87
|
-
|
|
91
|
+
| But a big step: |
|
88
92
|
| """ |
|
89
93
|
| 'some text' |
|
90
94
|
| '' |
|
@@ -98,6 +102,8 @@ Feature: Scenario elements can be modeled.
|
|
98
102
|
| 'Given' |
|
99
103
|
| 'When' |
|
100
104
|
| 'Then' |
|
105
|
+
| 'And' |
|
106
|
+
| 'But' |
|
101
107
|
| '*' |
|
102
108
|
| ' some more text' |
|
103
109
|
| """ |
|
@@ -105,14 +111,16 @@ Feature: Scenario elements can be modeled.
|
|
105
111
|
And the test steps "without" arguments are as follows:
|
106
112
|
| Given this ** step takes a table: |
|
107
113
|
| And some setup step |
|
114
|
+
| * some setup step |
|
108
115
|
| When a step with a ** |
|
109
|
-
|
|
116
|
+
| But a big step: |
|
110
117
|
| Then ** ** ** |
|
111
118
|
And the test steps "without" keywords are as follows:
|
112
119
|
| this *parameterized* step takes a table: |
|
113
120
|
| \| data \| |
|
114
121
|
| \| more data \| |
|
115
122
|
| some setup step |
|
123
|
+
| some setup step |
|
116
124
|
| a step with a *parameter* |
|
117
125
|
| a big step: |
|
118
126
|
| """ |
|
@@ -128,6 +136,8 @@ Feature: Scenario elements can be modeled.
|
|
128
136
|
| 'Given' |
|
129
137
|
| 'When' |
|
130
138
|
| 'Then' |
|
139
|
+
| 'And' |
|
140
|
+
| 'But' |
|
131
141
|
| '*' |
|
132
142
|
| ' some more text' |
|
133
143
|
| """ |
|
@@ -135,13 +145,14 @@ Feature: Scenario elements can be modeled.
|
|
135
145
|
And the test steps "without" arguments "without" keywords are as follows:
|
136
146
|
| this ** step takes a table: |
|
137
147
|
| some setup step |
|
148
|
+
| some setup step |
|
138
149
|
| a step with a ** |
|
139
150
|
| a big step: |
|
140
151
|
| ** ** ** |
|
141
152
|
And the test step "1" has the following block:
|
142
153
|
| \| data \| |
|
143
154
|
| \| more data \| |
|
144
|
-
And the test step "
|
155
|
+
And the test step "5" has the following block:
|
145
156
|
| """ |
|
146
157
|
| 'some text' |
|
147
158
|
| '' |
|
@@ -155,6 +166,8 @@ Feature: Scenario elements can be modeled.
|
|
155
166
|
| 'Given' |
|
156
167
|
| 'When' |
|
157
168
|
| 'Then' |
|
169
|
+
| 'And' |
|
170
|
+
| 'But' |
|
158
171
|
| '*' |
|
159
172
|
| ' some more text' |
|
160
173
|
| """ |
|
data/features/support/env.rb
CHANGED
@@ -6,6 +6,15 @@ include Wrong
|
|
6
6
|
|
7
7
|
require File.dirname(__FILE__) + '/../../lib/cucumber_analytics'
|
8
8
|
|
9
|
+
Log4r::Logger.root.level = Log4r::OFF
|
10
|
+
|
11
|
+
Log4r::FileOutputter.new('logfile',
|
12
|
+
:filename=>'test_log.txt',
|
13
|
+
:trunc=>true,
|
14
|
+
:level=>Log4r::DEBUG)
|
15
|
+
|
16
|
+
CucumberAnalytics::Logging.logger.add('logfile')
|
17
|
+
|
9
18
|
|
10
19
|
DEFAULT_FEATURE_FILE_NAME = 'test_feature.feature'
|
11
20
|
DEFAULT_STEP_FILE_NAME = 'test_steps.rb'
|
data/lib/cucumber_analytics.rb
CHANGED
@@ -8,6 +8,8 @@ module CucumberAnalytics
|
|
8
8
|
|
9
9
|
# Creates a new FeatureElement object.
|
10
10
|
def initialize(source_lines = nil)
|
11
|
+
CucumberAnalytics::Logging.logger.info('FeatureElement#initialize')
|
12
|
+
|
11
13
|
@name = ''
|
12
14
|
@description =[]
|
13
15
|
end
|
@@ -17,25 +19,41 @@ module CucumberAnalytics
|
|
17
19
|
|
18
20
|
|
19
21
|
def parse_feature_element(source_lines)
|
22
|
+
CucumberAnalytics::Logging.logger.info('FeatureElement#parse_feature_element')
|
23
|
+
|
20
24
|
parse_feature_element_name(source_lines)
|
21
25
|
parse_feature_element_description(source_lines)
|
22
26
|
end
|
23
27
|
|
24
28
|
#todo - move this elsewhere
|
25
29
|
def parse_feature_element_tags(source_lines)
|
26
|
-
|
30
|
+
CucumberAnalytics::Logging.logger.info('FeatureElement#parse_feature_element_tags')
|
31
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
32
|
+
source_lines.each do |line|
|
33
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
34
|
+
end
|
35
|
+
|
36
|
+
source_lines.take_while { |line| line !~ /^\s*(?:[A-Z a-z])+:/ }.tap do |tag_lines|
|
37
|
+
tag_lines.delete_if { |line| World.ignored_line?(line)}
|
38
|
+
|
27
39
|
tag_lines.join(' ').delete(' ').split('@').each do |tag|
|
28
40
|
@tags << "@#{tag.strip}"
|
29
41
|
end
|
30
42
|
end
|
31
43
|
@tags.shift
|
32
44
|
|
33
|
-
while source_lines.first
|
45
|
+
while source_lines.first !~ /^\s*(?:[A-Z a-z])+:/
|
34
46
|
source_lines.shift
|
35
47
|
end
|
36
48
|
end
|
37
49
|
|
38
50
|
def parse_feature_element_name(source_lines)
|
51
|
+
CucumberAnalytics::Logging.logger.info('FeatureElement#parse_feature_element_name')
|
52
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
53
|
+
source_lines.each do |line|
|
54
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
55
|
+
end
|
56
|
+
|
39
57
|
@name.replace source_lines.first.match(/^\s*(?:[A-Z a-z])+:(.*)/)[1].strip
|
40
58
|
source_lines.shift
|
41
59
|
end
|
@@ -9,6 +9,12 @@ module CucumberAnalytics
|
|
9
9
|
# Creates a new OutlineExample object and, if *source_lines* is provided,
|
10
10
|
# populates the object.
|
11
11
|
def initialize(source_lines = nil)
|
12
|
+
CucumberAnalytics::Logging.logger.info('OutlineExample#initialize')
|
13
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
14
|
+
source_lines.each do |line|
|
15
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
16
|
+
end
|
17
|
+
|
12
18
|
super
|
13
19
|
|
14
20
|
@tags = []
|
@@ -22,16 +28,29 @@ module CucumberAnalytics
|
|
22
28
|
|
23
29
|
|
24
30
|
def parse_example(source_lines)
|
31
|
+
CucumberAnalytics::Logging.logger.info('OutlineExample#parse_example')
|
32
|
+
|
25
33
|
parse_feature_element_tags(source_lines)
|
26
34
|
parse_feature_element(source_lines)
|
35
|
+
|
36
|
+
source_lines.delete_if { |line| World.ignored_line?(line)}
|
27
37
|
rows.concat source_lines.collect { |line| line.strip }
|
28
38
|
end
|
29
39
|
|
30
40
|
def parse_feature_element_description(source_lines)
|
41
|
+
CucumberAnalytics::Logging.logger.info('OutlineExample#parse_feature_element_description')
|
42
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
43
|
+
source_lines.each do |line|
|
44
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
45
|
+
end
|
46
|
+
|
31
47
|
until source_lines.first =~ /^\s*\|/ or
|
32
48
|
source_lines.empty?
|
33
49
|
|
34
|
-
|
50
|
+
unless World.ignored_line?(source_lines.first)
|
51
|
+
@description << source_lines.first.strip
|
52
|
+
end
|
53
|
+
|
35
54
|
source_lines.shift
|
36
55
|
end
|
37
56
|
end
|
@@ -5,6 +5,8 @@ module CucumberAnalytics
|
|
5
5
|
# Creates a new ParsedBackground object and, if *source_lines* is provided,
|
6
6
|
# populates the object.
|
7
7
|
def initialize(source_lines = nil)
|
8
|
+
CucumberAnalytics::Logging.logger.info('ParsedBackground#initialize')
|
9
|
+
|
8
10
|
super
|
9
11
|
|
10
12
|
parse_background(source_lines) if source_lines
|
@@ -15,15 +17,26 @@ module CucumberAnalytics
|
|
15
17
|
|
16
18
|
|
17
19
|
def parse_background(source_lines)
|
20
|
+
CucumberAnalytics::Logging.logger.info('ParsedBackground#parse_background')
|
21
|
+
|
18
22
|
parse_feature_element(source_lines)
|
19
23
|
parse_test_element_steps(source_lines)
|
20
24
|
end
|
21
25
|
|
22
26
|
def parse_feature_element_description(source_lines)
|
27
|
+
CucumberAnalytics::Logging.logger.info('ParsedBackground#parse_feature_element_description')
|
28
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
29
|
+
source_lines.each do |line|
|
30
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
31
|
+
end
|
32
|
+
|
23
33
|
until source_lines.first =~ /^\s*(?:(?:Given )|(?:When )|(?:Then )|(?:And )|(?:\* ))/ or
|
24
34
|
source_lines.empty?
|
25
35
|
|
26
|
-
|
36
|
+
unless World.ignored_line?(source_lines.first)
|
37
|
+
@description << source_lines.first.strip
|
38
|
+
end
|
39
|
+
|
27
40
|
source_lines.shift
|
28
41
|
end
|
29
42
|
end
|
@@ -9,6 +9,8 @@ module CucumberAnalytics
|
|
9
9
|
# Creates a new ParsedDirectory object and, if *directory_parsed* is
|
10
10
|
# provided, populates the object.
|
11
11
|
def initialize(directory_parsed = nil)
|
12
|
+
CucumberAnalytics::Logging.logger.info('ParsedDirectory#initialize')
|
13
|
+
|
12
14
|
@directory = directory_parsed
|
13
15
|
|
14
16
|
@feature_files = []
|
@@ -10,6 +10,8 @@ module CucumberAnalytics
|
|
10
10
|
# Creates a new ParsedFeature object and, if *source_lines* is provided,
|
11
11
|
# populates the object.
|
12
12
|
def initialize(source_lines = nil)
|
13
|
+
CucumberAnalytics::Logging.logger.info('ParsedFeature#initialize')
|
14
|
+
|
13
15
|
super
|
14
16
|
|
15
17
|
@tags = []
|
@@ -50,7 +52,11 @@ module CucumberAnalytics
|
|
50
52
|
|
51
53
|
# Returns the number of test cases contained in the feature.
|
52
54
|
def test_case_count
|
53
|
-
scenario_count + outlines.reduce(0) { |
|
55
|
+
scenario_count + outlines.reduce(0) { |outline_sum, outline|
|
56
|
+
outline_sum += outline.examples.reduce(0) { |example_sum, example|
|
57
|
+
example_sum += example.rows.count - 1
|
58
|
+
}
|
59
|
+
}
|
54
60
|
end
|
55
61
|
|
56
62
|
def contains
|
@@ -62,11 +68,21 @@ module CucumberAnalytics
|
|
62
68
|
|
63
69
|
|
64
70
|
def parse_feature(source_lines)
|
71
|
+
CucumberAnalytics::Logging.logger.info('ParsedFeature#parse_feature')
|
72
|
+
|
65
73
|
parse_feature_element_tags(source_lines)
|
66
74
|
parse_feature_element(source_lines)
|
67
75
|
end
|
68
76
|
|
69
77
|
def parse_feature_element_description(source_lines)
|
78
|
+
CucumberAnalytics::Logging.logger.info('ParsedFeature#parse_feature_element_description')
|
79
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
80
|
+
source_lines.each do |line|
|
81
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
82
|
+
end
|
83
|
+
|
84
|
+
source_lines.delete_if { |line| World.ignored_line?(line)}
|
85
|
+
|
70
86
|
until source_lines.first =~ /^\s*(?:(?:Scenario: )|(?:Scenario Outline: )|(?:Background: )|(?:@ ))/ or
|
71
87
|
source_lines.empty?
|
72
88
|
|
@@ -8,6 +8,8 @@ module CucumberAnalytics
|
|
8
8
|
# Creates a new ParsedFile object and, if *file_parsed* is provided,
|
9
9
|
# populates the object.
|
10
10
|
def initialize(file_parsed = nil)
|
11
|
+
CucumberAnalytics::Logging.logger.info('ParsedFile#initialize')
|
12
|
+
|
11
13
|
parse_file(file_parsed) if file_parsed
|
12
14
|
end
|
13
15
|
|
@@ -30,6 +32,8 @@ module CucumberAnalytics
|
|
30
32
|
|
31
33
|
|
32
34
|
def parse_file(file_parsed)
|
35
|
+
CucumberAnalytics::Logging.logger.info('ParsedFile#parse_file')
|
36
|
+
|
33
37
|
@file = file_parsed
|
34
38
|
|
35
39
|
file_lines = []
|
@@ -40,47 +44,44 @@ module CucumberAnalytics
|
|
40
44
|
|
41
45
|
# collect feature tag lines
|
42
46
|
until file_lines.first =~ /^s*Feature:/
|
43
|
-
|
44
|
-
feature_lines << file_lines.first
|
45
|
-
end
|
47
|
+
feature_lines << file_lines.first
|
46
48
|
file_lines.shift
|
47
49
|
end
|
48
50
|
|
49
51
|
# collect everything else until the end of the feature section
|
50
|
-
until file_lines.first =~ /^\s*(?:@|Background:|Scenario:|(?:Scenario Outline:))/ or
|
51
|
-
|
52
|
-
|
53
|
-
|
52
|
+
until file_lines.first =~ /^\s*(?:@|Background:|Scenario:|(?:Scenario Outline:))/ or
|
53
|
+
file_lines.empty?
|
54
|
+
|
55
|
+
feature_lines << file_lines.first
|
54
56
|
file_lines.shift
|
55
57
|
end
|
56
58
|
|
59
|
+
# create a new feature bases on the collected lines
|
60
|
+
@feature = ParsedFeature.new(feature_lines)
|
61
|
+
|
57
62
|
if file_lines.first =~ /^\s*Background:/
|
58
63
|
|
59
64
|
# collect the background description lines
|
60
|
-
until (file_lines.first =~ /^\s*(?:(?:Given )|(?:When )|(?:Then )|(?:And )|(?:\* )|@|Scenario:|(?:Scenario Outline:))/) or
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
until (file_lines.first =~ /^\s*(?:(?:Given )|(?:When )|(?:Then )|(?:And )|(?:\* )|@|Scenario:|(?:Scenario Outline:))/) or
|
66
|
+
file_lines.empty?
|
67
|
+
|
68
|
+
background_lines << file_lines.first
|
64
69
|
file_lines.shift
|
65
70
|
end
|
66
71
|
|
67
72
|
# collect everything else up to the first test
|
68
|
-
until file_lines.first =~ /^\s*(?:@|Scenario:|(?:Scenario Outline:))/ or
|
73
|
+
until file_lines.first =~ /^\s*(?:@|Scenario:|(?:Scenario Outline:))/ or
|
74
|
+
file_lines.empty?
|
75
|
+
|
69
76
|
if file_lines.first =~ /^\s*"""/
|
70
77
|
background_lines.concat(extract_doc_string!(file_lines))
|
71
78
|
else
|
72
|
-
|
73
|
-
background_lines << file_lines.first
|
74
|
-
end
|
79
|
+
background_lines << file_lines.first
|
75
80
|
file_lines.shift
|
76
81
|
end
|
77
82
|
end
|
78
83
|
|
79
|
-
|
80
|
-
|
81
|
-
@feature = ParsedFeature.new(feature_lines)
|
82
|
-
|
83
|
-
unless background_lines.empty?
|
84
|
+
# create a new background based on the collected lines
|
84
85
|
@feature.background = ParsedBackground.new(background_lines)
|
85
86
|
end
|
86
87
|
|
@@ -88,18 +89,22 @@ module CucumberAnalytics
|
|
88
89
|
end
|
89
90
|
|
90
91
|
def parse_tests(lines)
|
91
|
-
|
92
|
+
CucumberAnalytics::Logging.logger.info('ParsedFile#parse_tests')
|
93
|
+
CucumberAnalytics::Logging.logger.debug('lines')
|
94
|
+
lines.each do |line|
|
95
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
96
|
+
end
|
92
97
|
|
93
98
|
until lines.empty?
|
94
99
|
# we'll need this in order to figure out whether we are dealing with a
|
95
100
|
# scenario or an outline
|
96
101
|
current_test_line = lines.index { |line| line =~ /^\s*(?:Scenario:|(?:Scenario Outline:))/ }
|
97
102
|
|
103
|
+
test_lines = []
|
104
|
+
|
98
105
|
# collect the tag lines
|
99
106
|
until lines.first =~ /^\s*(?:Scenario:|(?:Scenario Outline:))/
|
100
|
-
|
101
|
-
test_lines << lines.first
|
102
|
-
end
|
107
|
+
test_lines << lines.first
|
103
108
|
lines.shift
|
104
109
|
end
|
105
110
|
|
@@ -107,28 +112,28 @@ module CucumberAnalytics
|
|
107
112
|
lines.shift
|
108
113
|
|
109
114
|
# collect the description lines
|
110
|
-
until (lines.first =~ /^\s*(?:(?:Given )|(?:When )|(?:Then )|(?:And )|(?:\* )|Scenario:|(?:Scenario Outline:))/) or
|
111
|
-
|
112
|
-
|
113
|
-
|
115
|
+
until (lines.first =~ /^\s*(?:(?:Given )|(?:When )|(?:Then )|(?:And )|(?:\* )|Scenario:|(?:Scenario Outline:))/) or
|
116
|
+
lines.empty?
|
117
|
+
|
118
|
+
test_lines << lines.first
|
114
119
|
lines.shift
|
115
120
|
end
|
116
121
|
|
117
122
|
# collect everything else up to the next test
|
118
|
-
until (lines.first =~ /^\s*(?:Scenario:|(?:Scenario Outline:))/) or
|
123
|
+
until (lines.first =~ /^\s*(?:Scenario:|(?:Scenario Outline:))/) or
|
124
|
+
lines.empty?
|
125
|
+
|
119
126
|
if (lines.first =~ /^\s*"""/)
|
120
127
|
test_lines.concat(extract_doc_string!(lines))
|
121
128
|
else
|
122
|
-
|
123
|
-
test_lines << lines.first
|
124
|
-
end
|
129
|
+
test_lines << lines.first
|
125
130
|
lines.shift
|
126
131
|
end
|
127
132
|
end
|
128
133
|
|
129
134
|
# backtrack in order to not end up stealing the next test's tag lines
|
130
135
|
unless lines.empty?
|
131
|
-
while
|
136
|
+
while (test_lines.last =~ /^\s*@/) or World.ignored_line?(test_lines.last)
|
132
137
|
lines = [test_lines.pop].concat(lines)
|
133
138
|
end
|
134
139
|
end
|
@@ -145,6 +150,12 @@ module CucumberAnalytics
|
|
145
150
|
end
|
146
151
|
|
147
152
|
def extract_doc_string!(lines)
|
153
|
+
CucumberAnalytics::Logging.logger.info('ParsedFile#extract_doc_string!')
|
154
|
+
CucumberAnalytics::Logging.logger.debug('lines')
|
155
|
+
lines.each do |line|
|
156
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
157
|
+
end
|
158
|
+
|
148
159
|
doc_block = []
|
149
160
|
|
150
161
|
doc_block << lines.first
|
@@ -161,9 +172,5 @@ module CucumberAnalytics
|
|
161
172
|
doc_block
|
162
173
|
end
|
163
174
|
|
164
|
-
def ignored_line?(line)
|
165
|
-
line =~ /^\s*#/ or !(line =~ /\S/)
|
166
|
-
end
|
167
|
-
|
168
175
|
end
|
169
176
|
end
|
@@ -8,6 +8,12 @@ module CucumberAnalytics
|
|
8
8
|
# Creates a new ParsedScenario object and, if *source_lines* is provided,
|
9
9
|
# populates the object.
|
10
10
|
def initialize(source_lines = nil)
|
11
|
+
CucumberAnalytics::Logging.logger.info('ParsedScenario#initialize')
|
12
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
13
|
+
source_lines.each do |line|
|
14
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
15
|
+
end
|
16
|
+
|
11
17
|
super
|
12
18
|
|
13
19
|
@tags = []
|
@@ -20,16 +26,27 @@ module CucumberAnalytics
|
|
20
26
|
|
21
27
|
|
22
28
|
def parse_scenario(source_lines)
|
29
|
+
CucumberAnalytics::Logging.logger.info('ParsedScenario#parse_scenario')
|
30
|
+
|
23
31
|
parse_feature_element_tags(source_lines)
|
24
32
|
parse_feature_element(source_lines)
|
25
33
|
parse_test_element_steps(source_lines)
|
26
34
|
end
|
27
35
|
|
28
36
|
def parse_feature_element_description(source_lines)
|
37
|
+
CucumberAnalytics::Logging.logger.info('ParsedScenario#parse_feature_element_description')
|
38
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
39
|
+
source_lines.each do |line|
|
40
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
41
|
+
end
|
42
|
+
|
29
43
|
until source_lines.first =~ /^\s*(?:(?:Given )|(?:When )|(?:Then )|(?:And )|(?:\* ))/ or
|
30
44
|
source_lines.empty?
|
31
45
|
|
32
|
-
|
46
|
+
unless World.ignored_line?(source_lines.first)
|
47
|
+
@description << source_lines.first.strip
|
48
|
+
end
|
49
|
+
|
33
50
|
source_lines.shift
|
34
51
|
end
|
35
52
|
end
|
@@ -8,6 +8,12 @@ module CucumberAnalytics
|
|
8
8
|
# Creates a new ParsedScenarioOutline object and, if *source_lines* is
|
9
9
|
# provided, populates the object.
|
10
10
|
def initialize(source_lines = nil)
|
11
|
+
CucumberAnalytics::Logging.logger.info('ParsedScenarioOutline#initialize')
|
12
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
13
|
+
source_lines.each do |line|
|
14
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
15
|
+
end
|
16
|
+
|
11
17
|
super
|
12
18
|
|
13
19
|
@tags = []
|
@@ -25,6 +31,8 @@ module CucumberAnalytics
|
|
25
31
|
|
26
32
|
|
27
33
|
def parse_outline(source_lines)
|
34
|
+
CucumberAnalytics::Logging.logger.info('ParsedScenarioOutline#parse_outline')
|
35
|
+
|
28
36
|
parse_feature_element_tags(source_lines)
|
29
37
|
parse_feature_element(source_lines)
|
30
38
|
parse_test_element_steps(source_lines)
|
@@ -32,32 +40,63 @@ module CucumberAnalytics
|
|
32
40
|
end
|
33
41
|
|
34
42
|
def parse_feature_element_description(source_lines)
|
43
|
+
CucumberAnalytics::Logging.logger.info('ParsedScenarioOutline#parse_feature_element_description')
|
44
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
45
|
+
source_lines.each do |line|
|
46
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
47
|
+
end
|
48
|
+
|
35
49
|
until source_lines.first =~ /^\s*(?:(?:Given )|(?:When )|(?:Then )|(?:And )|(?:\* )| (?:Examples: ))/ or
|
36
50
|
source_lines.empty?
|
37
51
|
|
38
|
-
|
52
|
+
unless World.ignored_line?(source_lines.first)
|
53
|
+
@description << source_lines.first.strip
|
54
|
+
end
|
55
|
+
|
39
56
|
source_lines.shift
|
40
57
|
end
|
41
58
|
end
|
42
59
|
|
43
60
|
def parse_outline_examples(source_lines)
|
61
|
+
CucumberAnalytics::Logging.logger.info('ParsedScenarioOutline#parse_outline_examples')
|
62
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
63
|
+
source_lines.each do |line|
|
64
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
65
|
+
end
|
66
|
+
|
67
|
+
|
44
68
|
until source_lines.empty?
|
45
|
-
|
69
|
+
example_lines = []
|
46
70
|
|
47
|
-
|
71
|
+
# collect the tag lines
|
72
|
+
until source_lines.first =~ /^\s*Examples:/
|
73
|
+
example_lines << source_lines.first
|
74
|
+
source_lines.shift
|
75
|
+
end
|
48
76
|
|
49
|
-
|
77
|
+
example_lines << source_lines.first
|
78
|
+
source_lines.shift
|
50
79
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
80
|
+
# collect the description lines
|
81
|
+
until (source_lines.first =~ /^\s*\|/) or source_lines.empty?
|
82
|
+
example_lines << source_lines.first
|
83
|
+
source_lines.shift
|
84
|
+
end
|
85
|
+
|
86
|
+
# collect everything else up to the next example
|
87
|
+
until (source_lines.first =~ /^\s*Examples:/) or source_lines.empty?
|
88
|
+
example_lines << source_lines.first
|
89
|
+
source_lines.shift
|
90
|
+
end
|
57
91
|
|
58
|
-
|
92
|
+
# backtrack in order to not end up stealing the next test's tag lines
|
93
|
+
unless source_lines.empty?
|
94
|
+
while (example_lines.last =~ /^\s*@/) or World.ignored_line?(example_lines.last)
|
95
|
+
source_lines = [example_lines.pop].concat(source_lines)
|
96
|
+
end
|
59
97
|
end
|
60
98
|
|
99
|
+
# use the collected lines to create an example
|
61
100
|
@examples << OutlineExample.new(example_lines)
|
62
101
|
end
|
63
102
|
end
|
@@ -10,11 +10,23 @@ module CucumberAnalytics
|
|
10
10
|
# Creates a new Step object based on the passed string. If the optional
|
11
11
|
# string array is provided, it becomes the block for the step.
|
12
12
|
def initialize(step, block = nil)
|
13
|
+
CucumberAnalytics::Logging.logger.info('Step#initialize')
|
14
|
+
CucumberAnalytics::Logging.logger.debug("step: #{step}")
|
15
|
+
|
13
16
|
@base = step.sub(/#{World::STEP_KEYWORD_PATTERN}/, '')
|
14
17
|
@block = block
|
15
18
|
@keyword = step.slice(/#{World::STEP_KEYWORD_PATTERN}/).strip
|
16
19
|
end
|
17
20
|
|
21
|
+
# Returns true if the two steps have the same text, minus any keywords
|
22
|
+
# and arguments, and false otherwise.
|
23
|
+
def ==(other_step)
|
24
|
+
left_step = step_text(with_keywords: false, with_arguments: false)
|
25
|
+
right_step = other_step.step_text(with_keywords: false, with_arguments: false)
|
26
|
+
|
27
|
+
left_step == right_step
|
28
|
+
end
|
29
|
+
|
18
30
|
# Returns the text of the step. Options can be set to selectively exclude
|
19
31
|
# certain portions of the text. *left_delimiter* and *right_delimiter* are
|
20
32
|
# used to determine which parts of the step are arguments.
|
@@ -7,18 +7,17 @@ module CucumberAnalytics
|
|
7
7
|
|
8
8
|
# Creates a new TestElement object.
|
9
9
|
def initialize(source_lines = nil)
|
10
|
+
CucumberAnalytics::Logging.logger.info('TestElement#initialize')
|
11
|
+
|
10
12
|
super
|
11
13
|
|
12
14
|
@steps = []
|
13
15
|
end
|
14
16
|
|
15
|
-
#
|
17
|
+
# Returns true if the two elements have the same steps, minus any keywords
|
16
18
|
# and arguments, and false otherwise.
|
17
19
|
def ==(other_element)
|
18
|
-
|
19
|
-
right_steps = other_element.steps.collect { |step| step.step_text(with_keywords: false, with_arguments: false) }.flatten
|
20
|
-
|
21
|
-
left_steps == right_steps
|
20
|
+
steps == other_element.steps
|
22
21
|
end
|
23
22
|
|
24
23
|
|
@@ -26,6 +25,12 @@ module CucumberAnalytics
|
|
26
25
|
|
27
26
|
|
28
27
|
def parse_test_element_steps(source_lines)
|
28
|
+
CucumberAnalytics::Logging.logger.info('TestElement#parse_test_element_steps')
|
29
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
30
|
+
source_lines.each do |line|
|
31
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
32
|
+
end
|
33
|
+
|
29
34
|
until source_lines.empty? or source_lines.first =~ /^\s*(?:@|Examples:)/
|
30
35
|
line = source_lines.first
|
31
36
|
block = nil
|
@@ -38,13 +43,22 @@ module CucumberAnalytics
|
|
38
43
|
block = extract_table_block(source_lines)
|
39
44
|
@steps[@steps.size - 1] = Step.new(@steps.last.keyword + ' ' + @steps.last.base, block)
|
40
45
|
else
|
41
|
-
|
46
|
+
unless World.ignored_line?(line)
|
47
|
+
@steps << Step.new(line.strip)
|
48
|
+
end
|
49
|
+
|
42
50
|
source_lines.shift
|
43
51
|
end
|
44
52
|
end
|
45
53
|
end
|
46
54
|
|
47
55
|
def extract_doc_block(source_lines)
|
56
|
+
CucumberAnalytics::Logging.logger.info('TestElement#extract_doc_block')
|
57
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
58
|
+
source_lines.each do |line|
|
59
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
60
|
+
end
|
61
|
+
|
48
62
|
step_block = []
|
49
63
|
|
50
64
|
line = source_lines.first
|
@@ -72,6 +86,12 @@ module CucumberAnalytics
|
|
72
86
|
end
|
73
87
|
|
74
88
|
def extract_table_block(source_lines)
|
89
|
+
CucumberAnalytics::Logging.logger.info('TestElement#extract_table_block')
|
90
|
+
CucumberAnalytics::Logging.logger.debug('source lines')
|
91
|
+
source_lines.each do |line|
|
92
|
+
CucumberAnalytics::Logging.logger.debug(line.chomp)
|
93
|
+
end
|
94
|
+
|
75
95
|
step_block = []
|
76
96
|
|
77
97
|
line = source_lines.first
|
@@ -1,3 +1,3 @@
|
|
1
|
-
module CucumberAnalytics
|
2
|
-
VERSION = "0.0.
|
3
|
-
end
|
1
|
+
module CucumberAnalytics
|
2
|
+
VERSION = "0.0.3"
|
3
|
+
end
|
@@ -3,7 +3,7 @@ module CucumberAnalytics
|
|
3
3
|
|
4
4
|
|
5
5
|
SANITARY_STRING = '___!!!___'
|
6
|
-
STEP_KEYWORD_PATTERN = '\s*(?:Given|When|Then|And|\*)\s*'
|
6
|
+
STEP_KEYWORD_PATTERN = '\s*(?:Given|When|Then|And|But|\*)\s*'
|
7
7
|
|
8
8
|
|
9
9
|
# Returns the left delimiter, which is used to mark the beginning of a step
|
@@ -178,5 +178,11 @@ module CucumberAnalytics
|
|
178
178
|
end
|
179
179
|
end
|
180
180
|
|
181
|
+
# Returns true if the line is ignored when reading source code, false
|
182
|
+
# otherwise.
|
183
|
+
def self.ignored_line?(line)
|
184
|
+
line =~ /^\s*#/ or !(line =~ /\S/)
|
185
|
+
end
|
186
|
+
|
181
187
|
end
|
182
188
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber_analytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
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: 2012-11-
|
12
|
+
date: 2012-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: log4r
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: Static analysis of Cucumber tests made easy.
|
79
95
|
email:
|
80
96
|
- morrow748@gmail.com
|
@@ -84,6 +100,7 @@ extra_rdoc_files: []
|
|
84
100
|
files:
|
85
101
|
- .gitignore
|
86
102
|
- Gemfile
|
103
|
+
- History.rdoc
|
87
104
|
- LICENSE
|
88
105
|
- README.rdoc
|
89
106
|
- Rakefile
|
@@ -112,6 +129,7 @@ files:
|
|
112
129
|
- features/support/transforms.rb
|
113
130
|
- lib/cucumber_analytics.rb
|
114
131
|
- lib/cucumber_analytics/feature_element.rb
|
132
|
+
- lib/cucumber_analytics/logging.rb
|
115
133
|
- lib/cucumber_analytics/outline_example.rb
|
116
134
|
- lib/cucumber_analytics/parsed_background.rb
|
117
135
|
- lib/cucumber_analytics/parsed_directory.rb
|