cuke_parser 0.0.4

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.
@@ -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: