cuke_parser 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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: