cuke_parser 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/cuke_model/feature.rb +33 -0
- data/lib/cuke_model/scenario.rb +33 -0
- data/lib/cuke_model/step.rb +34 -0
- data/lib/cuke_model/suite.rb +38 -0
- data/lib/cuke_parser.rb +25 -0
- data/lib/parse_engine/json_parser.rb +238 -0
- data/lib/parse_engine/parser_utils.rb +75 -0
- metadata +116 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
module CukeParser
|
2
|
+
module CukeModel
|
3
|
+
class CukeFeature
|
4
|
+
#this will store all of our features
|
5
|
+
attr_reader :keyword, :name, :duration, :converted_duration, :scenarios, :status
|
6
|
+
attr_writer :duration, :converted_duration, :scenarios, :status
|
7
|
+
def initialize(keyword, name)
|
8
|
+
@keyword = keyword
|
9
|
+
@name = name
|
10
|
+
@duration = 0
|
11
|
+
@converted_duration = 0
|
12
|
+
@scenarios = []
|
13
|
+
@status = ""
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_csv
|
17
|
+
#prints csv format
|
18
|
+
"#@keyword,#@name,#@duration,#@converted_duration"
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_csv_pretty
|
22
|
+
#prints pretty csv format
|
23
|
+
"\t #@keyword,#@name,#@duration,#@converted_duration"
|
24
|
+
end
|
25
|
+
|
26
|
+
def getFullName
|
27
|
+
#returns keyword + name
|
28
|
+
fullName = @keyword + " " + @name
|
29
|
+
return fullName
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CukeParser
|
2
|
+
module CukeModel
|
3
|
+
class CukeScenario
|
4
|
+
#this will store all the info for a scenario
|
5
|
+
attr_reader :keyword, :name, :duration, :converted_duration, :steps, :status
|
6
|
+
attr_writer :duration, :converted_duration, :steps, :status
|
7
|
+
def initialize(keyword, name)
|
8
|
+
@keyword = keyword
|
9
|
+
@name = name
|
10
|
+
@duration = 0
|
11
|
+
@converted_duration = 0
|
12
|
+
@steps = []
|
13
|
+
@status = ""
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_csv
|
17
|
+
#prints csv format
|
18
|
+
"#@keyword,#@name,#@duration,#@converted_duration"
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_csv_pretty
|
22
|
+
#prints pretty csv format
|
23
|
+
"\t\t #@keyword,#@name,#@duration,#@converted_duration"
|
24
|
+
end
|
25
|
+
|
26
|
+
def getFullName
|
27
|
+
#returns keyword + name
|
28
|
+
fullName = @keyword + " " + @name
|
29
|
+
return fullName
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module CukeParser
|
2
|
+
module CukeModel
|
3
|
+
class CukeStep
|
4
|
+
#this will be where we track step information
|
5
|
+
attr_reader :keyword, :name, :duration, :converted_duration, :status, :reason_for_failure, :failure_image
|
6
|
+
attr_writer :duration, :converted_duration, :status, :reason_for_failure, :failure_image
|
7
|
+
def initialize(keyword, name, duration, converted_duration, status, reason_for_failure, failure_image)
|
8
|
+
@keyword = keyword
|
9
|
+
@name = name
|
10
|
+
@duration = duration
|
11
|
+
@converted_duration = converted_duration
|
12
|
+
@status = status
|
13
|
+
@reason_for_failure = reason_for_failure
|
14
|
+
@failure_image = failure_image
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_csv
|
18
|
+
#prints csv format
|
19
|
+
"#@keyword,#@name,#@duration,#@converted_duration,#@status"
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_csv_pretty
|
23
|
+
#prints pretty csv format
|
24
|
+
"\t\t\t #@keyword,#@name,#@duration,#@converted_duration,#@status"
|
25
|
+
end
|
26
|
+
|
27
|
+
def getFullName
|
28
|
+
#returns keyword + name
|
29
|
+
fullName = @keyword + " " + @name
|
30
|
+
return fullName
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module CukeParser
|
2
|
+
module CukeModel
|
3
|
+
class CukeSuite
|
4
|
+
#this will store all the elements for a specific feature
|
5
|
+
attr_reader :date, :time, :runstamp, :duration, :converted_duration, :features, :browser, :os, :branch_number, :branch_build_tag, :url, :status
|
6
|
+
attr_writer :duration, :converted_duration, :features, :status, :date, :time
|
7
|
+
def initialize(date, time, runstamp, branch_build_tag, branch_number, os, url, browser)
|
8
|
+
@date = date
|
9
|
+
@time = time
|
10
|
+
@runstamp = runstamp
|
11
|
+
@duration = 0
|
12
|
+
@converted_duration = 0
|
13
|
+
@features = []
|
14
|
+
@browser = browser
|
15
|
+
@os = os
|
16
|
+
@branch_number = branch_number
|
17
|
+
@branch_build_tag = branch_build_tag
|
18
|
+
@url = url
|
19
|
+
@status = ""
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_csv
|
23
|
+
#prints pretty csv format
|
24
|
+
"#@date #@time,#@duration,#@converted_duration,#@browser,#@os,#@branch_number,#@branch_build_tag,#@url,#@status"
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_csv_pretty
|
28
|
+
return self.to_csv
|
29
|
+
end
|
30
|
+
|
31
|
+
def getFullName
|
32
|
+
#returns keyword + name
|
33
|
+
fullName = @date + "_" + @time
|
34
|
+
return fullName
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/cuke_parser.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'parse_engine/json_parser.rb'
|
2
|
+
require 'parse_engine/parser_utils.rb'
|
3
|
+
|
4
|
+
module CukeParser
|
5
|
+
|
6
|
+
@json_parser = ParseEngine::JsonParser.new
|
7
|
+
@parser_utils = ParseEngine::ParserUtils.new
|
8
|
+
|
9
|
+
def CukeParser.write_pretty(build,file)
|
10
|
+
@parser_utils.pretty(build,file)
|
11
|
+
end
|
12
|
+
|
13
|
+
def CukeParser.write_build(build,file)
|
14
|
+
@parser_utils.ugly(build,file)
|
15
|
+
end
|
16
|
+
|
17
|
+
def CukeParser.json(file_path)
|
18
|
+
@json_parser.get_build(file_path)
|
19
|
+
end
|
20
|
+
|
21
|
+
def CukeParser.json_jenkins_list(file_path,timestamp)
|
22
|
+
@json_parser.get_jenkins_build_list(file_path,timestamp)
|
23
|
+
end
|
24
|
+
|
25
|
+
end #end CukeParser module
|
@@ -0,0 +1,238 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'cuke_model/feature.rb'
|
3
|
+
require 'cuke_model/scenario.rb'
|
4
|
+
require 'cuke_model/step.rb'
|
5
|
+
require 'cuke_model/suite.rb'
|
6
|
+
|
7
|
+
module CukeParser
|
8
|
+
module ParseEngine
|
9
|
+
class JsonParser
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@utils = ParserUtils.new
|
13
|
+
@system_data_path = "/archive/systemData.json"
|
14
|
+
@cuke_data = "/archive/cucumber.json"
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_build(file_path)
|
18
|
+
file_path = file_path + "/cucumber.json"
|
19
|
+
if File.exists?(file_path)
|
20
|
+
today = Time.now
|
21
|
+
date = today.to_s.split(" ")[0]
|
22
|
+
time = today.to_s.split(" ")[1]
|
23
|
+
@cur_build = CukeModel::CukeSuite.new(date,time,today,nil,nil,nil,nil,nil)
|
24
|
+
return parse_build(file_path)
|
25
|
+
else
|
26
|
+
#nothing was found
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse_build(file_path)
|
32
|
+
document = JSON.parse(File.read(file_path))
|
33
|
+
features = parse_features(document)
|
34
|
+
if @cur_build.status.empty?
|
35
|
+
#all the steps passed
|
36
|
+
@cur_build.status = "passed"
|
37
|
+
end
|
38
|
+
@cur_build.duration = features['duration']
|
39
|
+
@cur_build.converted_duration = @utils.format_time(features['duration'])
|
40
|
+
@cur_build.features = features['list']
|
41
|
+
return @cur_build
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_features(features)
|
45
|
+
feature_data = Hash['duration', 0, 'list', Array.new]
|
46
|
+
features.each do |feature|
|
47
|
+
@cur_feature = CukeModel::CukeFeature.new(feature['keyword'],feature['name'])
|
48
|
+
scenarios = parse_scenarios(feature['elements'])
|
49
|
+
if @cur_feature.status.empty?
|
50
|
+
#all the steps passed
|
51
|
+
@cur_feature.status = "passed"
|
52
|
+
end
|
53
|
+
@cur_feature.duration = scenarios['duration']
|
54
|
+
@cur_feature.converted_duration = @utils.format_time(scenarios['duration'])
|
55
|
+
@cur_feature.scenarios = scenarios['list']
|
56
|
+
feature_data['list'].push(@cur_feature)
|
57
|
+
feature_data['duration'] = feature_data['duration'] + @cur_feature.duration
|
58
|
+
end
|
59
|
+
return feature_data
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_scenarios(scenarios)
|
63
|
+
scenario_data = Hash['duration', 0, 'list', Array.new]
|
64
|
+
scenarios.each do |scenario|
|
65
|
+
@cur_scenario = CukeModel::CukeScenario.new(scenario['keyword'],scenario['name'])
|
66
|
+
steps = parse_steps(scenario['steps'])
|
67
|
+
if @cur_scenario.status.empty?
|
68
|
+
#all the steps passed
|
69
|
+
@cur_scenario.status = "passed"
|
70
|
+
end
|
71
|
+
@cur_scenario.duration = steps['duration']
|
72
|
+
@cur_scenario.converted_duration = @utils.format_time(steps['duration'])
|
73
|
+
@cur_scenario.steps = steps['list']
|
74
|
+
scenario_data['list'].push(@cur_scenario)
|
75
|
+
scenario_data['duration'] = scenario_data['duration'] + @cur_scenario.duration
|
76
|
+
end
|
77
|
+
return scenario_data
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse_steps(steps)
|
81
|
+
step_data = Hash['duration', 0, 'list', Array.new]
|
82
|
+
steps.each do |step|
|
83
|
+
stepErrorMessage = ''
|
84
|
+
stepFailureImage = ''
|
85
|
+
step_data['duration'] = step_data['duration'] + step['result']['duration']
|
86
|
+
dur = step['result']['duration']
|
87
|
+
convDur = @utils.format_time(dur)
|
88
|
+
if step['result']['status'] == "failed"
|
89
|
+
@cur_scenario.status = "failed"
|
90
|
+
@cur_feature.status = "failed"
|
91
|
+
@cur_build.status = "failed"
|
92
|
+
stepErrorMessage = step['result']['error_message']
|
93
|
+
#failed steps should have an image available:
|
94
|
+
unless step['embeddings'].nil?
|
95
|
+
stepFailureImage = step['embeddings'][0]['data']
|
96
|
+
end
|
97
|
+
end
|
98
|
+
step_data['list'].push(CukeModel::CukeStep.new(step['keyword'],step['name'],dur,convDur,step['result']['status'],stepErrorMessage,stepFailureImage))
|
99
|
+
end
|
100
|
+
return step_data
|
101
|
+
end
|
102
|
+
|
103
|
+
def get_jenkins_build_list(file_path,build_stamp)
|
104
|
+
build_list = []
|
105
|
+
dir_path = file_path + "/builds"
|
106
|
+
dir = @utils.dir_purge(dir_path,build_stamp)
|
107
|
+
if dir.kind_of?(Array)
|
108
|
+
dir.each do |build_folder|
|
109
|
+
cur_path = dir_path + "/" + build_folder
|
110
|
+
system_data_file_path = cur_path + @system_data_path
|
111
|
+
cuke_file_path = cur_path + @cuke_data
|
112
|
+
if Dir.exists?(cur_path) and File.exists?(system_data_file_path) and File.exists?(cuke_file_path)
|
113
|
+
timestamp = @utils.parse_time(build_folder.split("_"))
|
114
|
+
system_data_file = File.read(system_data_file_path)
|
115
|
+
system_data = JSON.parse(system_data_file)
|
116
|
+
#mobilizer_build_tag, mobilizer, os, url, browser
|
117
|
+
@cur_build = CukeModel::CukeSuite.new(timestamp['date'],timestamp['time'],timestamp['runstamp'],system_data['mobilizer_build_tag'],system_data['mobilizer'],system_data['os'],system_data['url'],system_data['browser'])
|
118
|
+
#now we have the cucumber.json file location, lets process it
|
119
|
+
build_list.push(parse_build(cuke_file_path))
|
120
|
+
end
|
121
|
+
end
|
122
|
+
return build_list
|
123
|
+
else
|
124
|
+
return false
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
#goes through jobs and pulls out performance information from json dumps
|
129
|
+
#requires Pickle Job name, last entry for date_time on that model (so we only pull new data)
|
130
|
+
#Example BuildVerificationTest = BVT (so use BVT when calling from the controller)
|
131
|
+
def get_deprecated(file_path,build_stamp)
|
132
|
+
build_list = []
|
133
|
+
#step through file directory and find cucumber.json
|
134
|
+
dirPath = file_path + "/builds"
|
135
|
+
#dirPath = "C:/Users/cbrachmann/workspace/CukePerformance/app/Performance/builds"
|
136
|
+
dir = @utils.dir_purge(dirPath,build_stamp)
|
137
|
+
if dir.kind_of?(Array)
|
138
|
+
dir.each do |buildFolder|
|
139
|
+
curPath = dirPath + "/" + buildFolder
|
140
|
+
systemDatafilePath = dirPath + "/" + buildFolder + "/archive/systemData.json"
|
141
|
+
filePath = dirPath + "/" + buildFolder + "/archive/cucumber.json"
|
142
|
+
if Dir.exists?(curPath) and File.exists?(systemDatafilePath) and File.exists?(filePath)#get the date time stamp from the name of this directory
|
143
|
+
build = buildFolder.split("_")
|
144
|
+
date = build[0]
|
145
|
+
time = build[1]
|
146
|
+
dateArray = date.split("-")
|
147
|
+
timeArray = time.split("-")
|
148
|
+
dt = []
|
149
|
+
dateArray.each do |d|
|
150
|
+
dt.push(d.to_i)
|
151
|
+
end
|
152
|
+
timeArray.each do |t|
|
153
|
+
dt.push(t.to_i)
|
154
|
+
end
|
155
|
+
runstamp = Time.new(dt[0],dt[1],dt[2],dt[3],dt[4],dt[5])
|
156
|
+
systemDataFile = File.read(systemDatafilePath)
|
157
|
+
systemData = JSON.parse(systemDataFile)
|
158
|
+
#mobilizer_build_tag, mobilizer, os, url, browser
|
159
|
+
current_build = CukeModel::CukeSuite.new(date,time,runstamp,systemData['mobilizer_build_tag'],systemData['mobilizer'],systemData['os'],systemData['url'],systemData['browser'])
|
160
|
+
|
161
|
+
#now we have the cucumber.json file location, lets process it
|
162
|
+
file = File.read(filePath)
|
163
|
+
document = JSON.parse(file)
|
164
|
+
|
165
|
+
feature_list = []
|
166
|
+
featureTotal = 0
|
167
|
+
|
168
|
+
document.each do |feature|
|
169
|
+
current_feature = CukeModel::CukeFeature.new(feature['keyword'],feature['name'])
|
170
|
+
scenarioTotal = 0
|
171
|
+
scenario_list = []
|
172
|
+
feature['elements'].each do |scenario|
|
173
|
+
current_scenario = CukeModel::CukeScenario.new(scenario['keyword'],scenario['name'])
|
174
|
+
stepTotal = 0
|
175
|
+
step_list = []
|
176
|
+
scenario['steps'].each do |step|
|
177
|
+
stepErrorMessage = ''
|
178
|
+
stepFailureImage = ''
|
179
|
+
stepTotal = stepTotal + step['result']['duration']
|
180
|
+
dur = step['result']['duration']
|
181
|
+
convDur = Time.at((dur / 1000000000.00)).gmtime.strftime('%R:%S:%L')
|
182
|
+
if step['result']['status'] == "failed"
|
183
|
+
current_scenario.status = "failed"
|
184
|
+
current_feature.status = "failed"
|
185
|
+
current_build.status = "failed"
|
186
|
+
stepErrorMessage = step['result']['error_message']
|
187
|
+
#failed steps should have an image available:
|
188
|
+
unless step['embeddings'].nil?
|
189
|
+
stepFailureImage = step['embeddings'][0]['data']
|
190
|
+
end
|
191
|
+
end
|
192
|
+
step_list.push(CukeModel::CukeStep.new(step['keyword'],step['name'],dur,convDur,step['result']['status'],stepErrorMessage,stepFailureImage))
|
193
|
+
end
|
194
|
+
if current_scenario.status.empty?
|
195
|
+
#all the steps passed
|
196
|
+
current_scenario.status = "passed"
|
197
|
+
end
|
198
|
+
current_scenario.duration = stepTotal
|
199
|
+
current_scenario.converted_duration = Time.at((stepTotal / 1000000000.00)).gmtime.strftime('%R:%S:%L')
|
200
|
+
current_scenario.steps = step_list
|
201
|
+
scenario_list.push(current_scenario)
|
202
|
+
scenarioTotal = scenarioTotal + stepTotal
|
203
|
+
end
|
204
|
+
if current_feature.status.empty?
|
205
|
+
#all the steps passed
|
206
|
+
current_feature.status = "passed"
|
207
|
+
end
|
208
|
+
current_feature.duration = scenarioTotal
|
209
|
+
current_feature.converted_duration = Time.at((scenarioTotal / 1000000000.00)).gmtime.strftime('%R:%S:%L')
|
210
|
+
current_feature.scenarios = scenario_list
|
211
|
+
feature_list.push(current_feature)
|
212
|
+
featureTotal = featureTotal + scenarioTotal
|
213
|
+
end
|
214
|
+
|
215
|
+
totalTime = 0
|
216
|
+
feature_list.each do |feature|
|
217
|
+
totalTime = totalTime + feature.duration
|
218
|
+
end
|
219
|
+
|
220
|
+
if current_build.status.empty?
|
221
|
+
#all the steps passed
|
222
|
+
current_build.status = "passed"
|
223
|
+
end
|
224
|
+
current_build.duration = totalTime
|
225
|
+
current_build.converted_duration = Time.at(totalTime / 1000000000.00).gmtime.strftime('%R:%S:%L')
|
226
|
+
current_build.features = feature_list
|
227
|
+
build_list.push(current_build)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
return build_list
|
231
|
+
else
|
232
|
+
return false
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
end #end of JsonParser class
|
237
|
+
end #end of ParseEnginer module
|
238
|
+
end #end CukeParser module
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module CukeParser
|
2
|
+
module ParseEngine
|
3
|
+
class ParserUtils
|
4
|
+
|
5
|
+
def intialize
|
6
|
+
#nothing yet
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse_time(datetime)
|
10
|
+
timestamp = Hash['date', datetime[0], 'time', datetime[1], 'runstamp', 0]
|
11
|
+
dt = []
|
12
|
+
timestamp['date'].split("-").each do |d|
|
13
|
+
dt.push(d.to_i)
|
14
|
+
end
|
15
|
+
timestamp['time'].split("-").each do |t|
|
16
|
+
dt.push(t.to_i)
|
17
|
+
end
|
18
|
+
timestamp['runstamp'] = Time.new(dt[0],dt[1],dt[2],dt[3],dt[4],dt[5])
|
19
|
+
return timestamp
|
20
|
+
end
|
21
|
+
|
22
|
+
def dir_purge(dir_path, build_stamp)
|
23
|
+
#get rid of directories we already have data for
|
24
|
+
drop_num = 2
|
25
|
+
if Dir.exists?(dir_path)
|
26
|
+
dir = Dir.entries(dir_path)
|
27
|
+
if build_stamp != "empty"
|
28
|
+
dir.each do |build_folder|
|
29
|
+
if build_folder <= build_stamp
|
30
|
+
drop_num = dir.index(build_folder) + 1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
dir = dir.drop(drop_num)
|
35
|
+
return dir
|
36
|
+
else
|
37
|
+
#not a valid directory (does not exist must let App know so User can be notified)
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def pretty(build,file)
|
43
|
+
#build is always first line, no indentation needed to make it "pretty"
|
44
|
+
file.puts build.to_csv
|
45
|
+
build.features.each do |feature|
|
46
|
+
file.puts feature.to_csv_pretty
|
47
|
+
feature.scenarios.each do |scenario|
|
48
|
+
file.puts scenario.to_csv_pretty
|
49
|
+
scenario.steps.each do |step|
|
50
|
+
file.puts step.to_csv_pretty
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def ugly(build,file)
|
57
|
+
file.puts build.to_csv
|
58
|
+
build.features.each do |feature|
|
59
|
+
file.puts feature.to_csv
|
60
|
+
feature.scenarios.each do |scenario|
|
61
|
+
file.puts scenario.to_csv
|
62
|
+
scenario.steps.each do |step|
|
63
|
+
file.puts step.to_csv
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def format_time(time)
|
70
|
+
Time.at(time / 1000000000.00).gmtime.strftime('%R:%S:%L')
|
71
|
+
end
|
72
|
+
|
73
|
+
end #end of ParserUtils class
|
74
|
+
end #end of ParseEnginer module
|
75
|
+
end#end of CukeParser Module
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cuke_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rick Beyer
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: builder
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.1.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.1.2
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.4.6
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.4.6
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.9.2
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.11.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.11.0
|
78
|
+
description: Library to easily pull out information for tracking your Cukes
|
79
|
+
email: rick.beyer@gmail.com
|
80
|
+
executables: []
|
81
|
+
extensions: []
|
82
|
+
extra_rdoc_files: []
|
83
|
+
files:
|
84
|
+
- lib/cuke_model/feature.rb
|
85
|
+
- lib/cuke_model/scenario.rb
|
86
|
+
- lib/cuke_model/step.rb
|
87
|
+
- lib/cuke_model/suite.rb
|
88
|
+
- lib/cuke_parser.rb
|
89
|
+
- lib/parse_engine/json_parser.rb
|
90
|
+
- lib/parse_engine/parser_utils.rb
|
91
|
+
homepage:
|
92
|
+
licenses: []
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 1.8.24
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: cuke_parser-0.0.4
|
115
|
+
test_files: []
|
116
|
+
has_rdoc:
|