razorrisk-razor-control 0.1

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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/RakeFile +46 -0
  3. data/lib/razor_risk/razor/control/cucumber_helpers/consolidate_reports.rb +80 -0
  4. data/lib/razor_risk/razor/control/cucumber_helpers/executor.rb +108 -0
  5. data/lib/razor_risk/razor/control/cucumber_helpers.rb +3 -0
  6. data/lib/razor_risk/razor/control/diagnostics/util_functions.rb +203 -0
  7. data/lib/razor_risk/razor/control/diagnostics/zeroth_include.rb +27 -0
  8. data/lib/razor_risk/razor/control/exceptions.rb +121 -0
  9. data/lib/razor_risk/razor/control/gem/gem_helpers.rb +397 -0
  10. data/lib/razor_risk/razor/control/rake_helpers/aborter.rb +90 -0
  11. data/lib/razor_risk/razor/control/rake_helpers/diagnostic_tasks.rb +74 -0
  12. data/lib/razor_risk/razor/control/rake_helpers/gem_tasks.rb +128 -0
  13. data/lib/razor_risk/razor/control/rake_helpers/razor_tasks.rb +195 -0
  14. data/lib/razor_risk/razor/control/rake_helpers/task_helpers.rb +86 -0
  15. data/lib/razor_risk/razor/control/rake_helpers.rb +3 -0
  16. data/lib/razor_risk/razor/control/razor/executor.rb +131 -0
  17. data/lib/razor_risk/razor/control/razor/razor_instance.rb +227 -0
  18. data/lib/razor_risk/razor/control/razor.rb +2 -0
  19. data/lib/razor_risk/razor/control/version.rb +41 -0
  20. data/test/unit/control/cucumber_helpers/reports/expected/groups.html +213 -0
  21. data/test/unit/control/cucumber_helpers/reports/expected/no_groups.html +170 -0
  22. data/test/unit/control/cucumber_helpers/reports/groups/LbbwConfig/LbbwConfig.json +69 -0
  23. data/test/unit/control/cucumber_helpers/reports/groups/StandardConfig/StandardConfig.json +69 -0
  24. data/test/unit/control/cucumber_helpers/reports/no_groups/LbbwConfig.json +69 -0
  25. data/test/unit/control/cucumber_helpers/reports/no_groups/StandardConfig/StandardConfig.json +69 -0
  26. data/test/unit/control/cucumber_helpers/tc_consolidate_reports.rb +73 -0
  27. data/test/unit/control/cucumber_helpers/tc_executor.rb +406 -0
  28. data/test/unit/control/gem/tc_gem_helpers.rb +405 -0
  29. data/test/unit/control/rake_helpers/tc_aborter.rb +131 -0
  30. data/test/unit/control/rake_helpers/tc_task_helpers.rb +228 -0
  31. data/test/unit/control/razor/tc_executor.rb +129 -0
  32. data/test/unit/control/razor/tc_razor_instance.rb +517 -0
  33. data/test/unit/control/razor/test_scripts/exit_failure.cmd +3 -0
  34. data/test/unit/control/razor/test_scripts/exit_strange.cmd +3 -0
  35. data/test/unit/control/razor/test_scripts/exit_success.cmd +3 -0
  36. data/test/unit/control/razor/test_scripts/pause.cmd +5 -0
  37. data/test/unit/control/razor/test_scripts/print.cmd +6 -0
  38. data/test/unit/control/tc_exceptions.rb +120 -0
  39. metadata +192 -0
@@ -0,0 +1,397 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Rake Task helpers.
6
+ #
7
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+ # ##########################################################
12
+ # requires
13
+
14
+
15
+ begin
16
+ require 'razor_risk/razor/control/exceptions'
17
+ rescue ::LoadError
18
+ abort "RazorRisk Diagnostics is required to use this rake file"
19
+ end
20
+
21
+ begin
22
+ require 'pantheios'
23
+ rescue ::LoadError
24
+ abort "Panthios is required to use this rake file"
25
+ end
26
+
27
+ begin
28
+ require 'xqsr3/quality/parameter_checking'
29
+ rescue ::LoadError
30
+ abort "RazorRisk Diagnostics is required to use this rake file"
31
+ end
32
+
33
+ require 'rubygems/package'
34
+ require 'rubygems/uninstaller'
35
+ require 'rubygems/commands/push_command'
36
+
37
+ require 'tmpdir'
38
+
39
+ # ##########################################################
40
+ # RazorInstance
41
+
42
+ module RazorRisk
43
+ module Razor
44
+ module Control
45
+ module Gem
46
+
47
+ # Helpers for intercting with Ruby Gems.
48
+ class GemHelpers
49
+
50
+ include ::RazorRisk::Razor::Control::Exceptions
51
+
52
+ include ::Pantheios
53
+ include ::Xqsr3::Quality::ParameterChecking
54
+
55
+ # Initialize class.
56
+ #
57
+ # @param gem_module [#install] The module for to use for executing
58
+ # gem commands.
59
+ #
60
+ def initialize gem_module = ::Gem
61
+
62
+ trace ParamNames[ :gem_module ], gem_module
63
+
64
+ @gem_module = check_parameter gem_module, 'gem_module', respond_to: :install
65
+ end
66
+
67
+ # Installs the gem in the specified directory. The specified directory
68
+ # must have both the gem and gemspec, and may not have multiple versions
69
+ # of the build gem.
70
+ #
71
+ # @raise (see get_gem_file_)
72
+ #
73
+ # @param directory [::String] The path to where the gem is located.
74
+ # @param options (see ::Gem::DependencyInstaller#initialize)
75
+ #
76
+ # @return (see ::Gem::DependencyInstaller#installed_gems)
77
+ def install_gem directory, **options
78
+
79
+ trace ParamNames[ :directory ], directory
80
+
81
+ check_parameter directory, 'directory', type: ::String
82
+
83
+ gem_file = get_gem_file_ directory
84
+ @gem_module.install gem_file, nil, **options
85
+ end
86
+
87
+ # Builds the gem in the specified directory. The specified directory must
88
+ # constain a gemspec and no previously built gem.
89
+ #
90
+ # @param directory [::String] The path to the gem directory.
91
+ # @param path [::String,nil] Path to a directory to copy the gem to.
92
+ #
93
+ # @raise [GemDeploymentException] if the gemspec fails to load.
94
+ # @raise (see get_file_)
95
+ #
96
+ def build_gem directory, path = nil
97
+
98
+ trace ParamNames[ :directory, :path ], directory, path
99
+
100
+ check_parameter directory, 'directory', type: ::String
101
+ check_parameter path, 'path', type: ::String, allow_nil: true
102
+
103
+ gemspec = get_gemspec_file_ directory
104
+
105
+ spec = @gem_module::Specification.load gemspec
106
+ raise GemDeploymentException.new "Failed to load gemspec" unless spec
107
+
108
+ begin
109
+ gem_file = @gem_module::Package.build spec
110
+ rescue ::ArgumentError, ::NameError, ::NoMethodError, ::TypeError => x
111
+ raise
112
+ rescue => x
113
+ raise GemDeploymentException.new "Failed to build gem; (#{x.class}): #{x.mesage}"
114
+ end
115
+
116
+ begin
117
+ FileUtils.cp(
118
+ gem_file,
119
+ path
120
+ ) if path
121
+ rescue ::ArgumentError, ::NameError, ::NoMethodError, ::TypeError => x
122
+ raise
123
+ rescue => x
124
+ raise GemDeploymentException.new "Failed to copy gem to #{path}; (#{x.class}): #{x.message}"
125
+ end
126
+ end
127
+
128
+ # Push gem to a gem server.
129
+ #
130
+ # @param directory [::String] The location of the gem.
131
+ # @param gem_server [::String] The URL to the gem server.
132
+ #
133
+ # @raise (see get_file_)
134
+ #
135
+ def push_gem directory, gem_server
136
+
137
+ trace ParamNames[ :directory, :gem_server ], directory, gem_server
138
+
139
+ check_parameter directory, 'directory', type: ::String
140
+ check_parameter gem_server, 'gem_server', type: ::String
141
+
142
+ gem_file = get_gem_file_ directory
143
+
144
+ original = {
145
+ host: @gem_module.host,
146
+ }
147
+
148
+ begin
149
+ @gem_module.host = gem_server
150
+ pc = @gem_module::Commands::PushCommand.new
151
+ pc.send_gem gem_file
152
+ ensure
153
+ @gem_module.host = original[:host]
154
+ end
155
+ end
156
+
157
+ # Sets gem varaibles to temp directories for the duration of the block.
158
+ # This is to aid in actions like temporarily installing a gem for
159
+ # testing.
160
+ #
161
+ # The following parameters are ensure to be reset after the block:
162
+ # * +Gem.dir+
163
+ # * +Gem.path+
164
+ # * +Gem.sources+
165
+ # * Environement vairable +'GEM_HOME'+
166
+ #
167
+ # The following parameters are set to a temp directory for the block:
168
+ # * +Gem.dir+
169
+ # * Environement vairable +'GEM_HOME'+
170
+ #
171
+ # @yield The block to execute with a local temporary environement setup.
172
+ #
173
+ def temporary_env &block
174
+
175
+ original = {
176
+ sources: @gem_module.sources,
177
+ dir: @gem_module.dir,
178
+ path: @gem_module.path,
179
+ home: ENV['GEM_HOME'],
180
+ }
181
+
182
+ begin
183
+ Dir.mktmpdir do |tmpdir|
184
+ @gem_module.use_paths tmpdir, @gem_module.path
185
+ ENV['GEM_HOME'] = tmpdir
186
+ yield
187
+ end
188
+ ensure
189
+ @gem_module.sources = original[:sources]
190
+ @gem_module.use_paths original[:dir], original[:path]
191
+ ENV['GEM_HOME'] = original[:home]
192
+ end
193
+ end
194
+
195
+ private
196
+ # Gets the path to the gem in the specified directory by first getting
197
+ # the gem name from the gemspec.
198
+ #
199
+ # @param directory [::String] The path to where the gem is located.
200
+ #
201
+ # @raise (see get_file_)
202
+ #
203
+ # @return [::String] The path to the gem file.
204
+ def get_gem_file_ directory = '.'
205
+
206
+ gemspec = get_gemspec_file_ directory
207
+ spec = @gem_module::Specification.load gemspec
208
+ raise GemDeploymentException.new "Failed to load gemspec #{spec}" unless spec
209
+ get_file_ "#{spec.name}*.gem", 'project gem', directory
210
+ end
211
+
212
+ # Finds the gemspec file.
213
+ #
214
+ # @param directory [::String] The directory to search in.
215
+ #
216
+ # @raise (see get_file_)
217
+ #
218
+ # @return [::String] The path to the gemspec file.
219
+ def get_gemspec_file_ directory = '.'
220
+
221
+ get_file_ '*.gemspec', 'gemspec', directory
222
+ end
223
+
224
+ # Finds a file based on a glob pattern. This method expects only one file
225
+ # to be found.
226
+ #
227
+ # @param pattern [::String] A pattern for use with a file glob.
228
+ # @param name [::String] The name of the type of files being searched
229
+ # for.
230
+ # @param directory [::String] The directory to search in.
231
+ #
232
+ # @raise [GemDeploymentException] if no files are found.
233
+ # @raise [GemDeploymentException] if more than one file is found.
234
+ #
235
+ # @return [::String] The path to the file.
236
+ def get_file_ pattern, name, directory = '.'
237
+
238
+ files = Dir.glob("#{directory}/#{pattern}")
239
+ case files.count
240
+ when 0
241
+ raise GemDeploymentException.new "No #{name} files found"
242
+ when 1
243
+ return files.first
244
+ else
245
+ raise GemDeploymentException.new "Multiple #{name} files found: #{files}"
246
+ end
247
+ end
248
+ end
249
+
250
+ # @!visibility private
251
+ module MockGem
252
+
253
+ def self.host= host
254
+ @host = host
255
+ end
256
+
257
+ def self.host
258
+ @host
259
+ end
260
+
261
+ def self.sources= sources
262
+ @sources = sources
263
+ end
264
+
265
+ def self.sources
266
+ @sources
267
+ end
268
+
269
+ def self.dir= dir
270
+ @dir = dir
271
+ end
272
+
273
+ def self.dir
274
+ @dir
275
+ end
276
+
277
+ def self.path= path
278
+ @path = path
279
+ end
280
+
281
+ def self.path
282
+ @path
283
+ end
284
+
285
+ def self.use_paths dir, path
286
+ @dir = dir
287
+ @path = path
288
+ end
289
+
290
+ def self.install_block &block
291
+ @install_block = block
292
+ end
293
+
294
+ def self.install name, version = nil, **options
295
+ @install_block.call(name, version, **options) if @install_block
296
+ end
297
+
298
+ def self.clear
299
+ @install_block = nil
300
+ @host = nil
301
+ @sources = nil
302
+ @dir = nil
303
+ @path = nil
304
+ Specification.clear
305
+ Package.clear
306
+ Commands::PushCommand.clear
307
+ end
308
+
309
+ private
310
+ @install_block = nil
311
+ @host = nil
312
+ @sources = nil
313
+ @dir = nil
314
+ @path = nil
315
+
316
+ public
317
+ module Specification
318
+
319
+ Spec = Struct.new(:name)
320
+
321
+ def self.load spec
322
+ @load_block.call(spec) if @load_block
323
+ @specs[spec]
324
+ end
325
+
326
+ def self.add_spec spec, name
327
+ @specs[spec] = Spec.new(name)
328
+ end
329
+
330
+ def self.load_block &block
331
+ @load_block = block
332
+ end
333
+
334
+ def self.clear
335
+ @specs = {}
336
+ @load_block = nil
337
+ end
338
+
339
+ private
340
+ @specs = {}
341
+ @load_block = nil
342
+ end
343
+
344
+ module Package
345
+
346
+ def self.build spec
347
+ @build_block.call(spec) if @build_block
348
+ @gems[spec.name]
349
+ end
350
+
351
+ def self.add_gem name
352
+ @gems[name] = "#{name}.gem"
353
+ end
354
+
355
+ def self.build_block &block
356
+ @build_block = block
357
+ end
358
+
359
+ def self.clear
360
+ @build_block = nil
361
+ @gems = {}
362
+ end
363
+
364
+ private
365
+ @gems = {}
366
+ @build_block = nil
367
+ end
368
+
369
+ module Commands
370
+ class PushCommand
371
+
372
+ def self.push_block &block
373
+ @@push_block = block
374
+ end
375
+
376
+ def self.clear
377
+ @@push_block = nil
378
+ end
379
+
380
+ def send_gem gem_file
381
+ @@push_block.call(gem_file) if @@push_block
382
+ end
383
+
384
+ private
385
+ @@push_block = nil
386
+ end
387
+ end
388
+ end
389
+
390
+ end # module RakeHelpers
391
+ end # module Control
392
+ end # module Razor
393
+ end # module RazorRisk
394
+
395
+ # ############################## end of file ############################# #
396
+
397
+
@@ -0,0 +1,90 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Rake Task helpers.
6
+ #
7
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+ # ##########################################################
12
+ # requires
13
+
14
+ require 'pantheios'
15
+ require 'xqsr3/quality/parameter_checking'
16
+
17
+ require 'rake'
18
+
19
+ require 'razor_risk/core/diagnostics/logger'
20
+
21
+ # ##########################################################
22
+ # RazorInstance
23
+
24
+ module RazorRisk
25
+ module Razor
26
+ module Control
27
+ module RakeHelpers
28
+
29
+ # Extends ruby abort for rake files that provides a hook and logging.
30
+ module RakeAborter
31
+
32
+ include ::Pantheios
33
+ include ::Xqsr3::Quality::ParameterChecking
34
+ include ::RazorRisk::Core::Diagnostics::Logger
35
+ private
36
+ @@abort_hook = []
37
+ @@called = false
38
+
39
+ public
40
+ # Executes defined abort hooks before terminating execution. If
41
+ # exceptions are raised during execution of the hooks, the exception will
42
+ # be logged and hook execution will end.
43
+ #
44
+ # @param msg [::String] Message to be written to +STRERR+ before
45
+ # termination.
46
+ #
47
+ # @see ::Kernel::abort
48
+ def abort msg = nil
49
+
50
+ begin
51
+
52
+ unless @@called
53
+
54
+ @@called = true
55
+
56
+ log :critical, 'Aborting' + (msg ? ": #{msg}" : '')
57
+ log :critical, 'Executing abort hook(s)' unless @@abort_hook.empty?
58
+
59
+ @@abort_hook.each do |h|
60
+ h.call
61
+ end
62
+ end
63
+ rescue => x
64
+
65
+ log :critical, "Exception during abort: (#{x.class}): #{x.message}\n#{x.backtrace * "\n"}"
66
+ ensure
67
+
68
+ msg ? Kernel.abort(msg) : Kernel.abort
69
+ end
70
+ end
71
+
72
+ # Sets the provided proc to execute if rake aborts.
73
+ #
74
+ # @param block [#call] The proc to execute if a task aborts.
75
+ def self.abort_hook &block
76
+
77
+ check_parameter block, 'block', respond_to: :call
78
+
79
+ @@abort_hook << block
80
+ end
81
+ end
82
+
83
+ end # module RakeHelpers
84
+ end # module Control
85
+ end # module Razor
86
+ end # module RazorRisk
87
+
88
+ # ############################## end of file ############################# #
89
+
90
+
@@ -0,0 +1,74 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Diagnostics Rake tasks for Razor Risk projects.
6
+ #
7
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+ # ######################################################################## #
12
+ # requires
13
+
14
+ require 'razor_risk/razor/control/diagnostics/zeroth_include'
15
+ require 'razor_risk/razor/control/diagnostics/util_functions'
16
+
17
+ require 'xqsr3/quality/parameter_checking'
18
+
19
+ require 'rake'
20
+ require 'rake/clean'
21
+
22
+
23
+ module RazorRisk
24
+ module Razor
25
+ module Control
26
+ module RakeHelpers
27
+
28
+ # Rake tasks for setting up logging.
29
+ module DiagnosticTasks
30
+
31
+ extend ::Rake::DSL
32
+
33
+ include ::RazorRisk::Razor::Control
34
+ include ::Xqsr3::Quality::ParameterChecking
35
+
36
+
37
+ # ##########################################################
38
+ # tasks
39
+
40
+ namespace :diagnostics do
41
+
42
+ # Task to initialize logging for rake files.
43
+ #
44
+ # @param name [::String] The program name.
45
+ # @param version [::String] The program version.
46
+ # @param directory [::String] The directory to write logs to.
47
+ # @param thrsholds [Array<::Symbol, ::Symbol>] The logging thresholds.
48
+ #
49
+ task :init, [ :name, :version, :directory, :thresholds ] do |task, args|
50
+
51
+ name = check_parameter args[:name], 'name', type: ::String
52
+ version = check_parameter args[:version], 'version', type: ::String
53
+ directory = check_parameter args[:directory], 'directory', type: ::String
54
+ threshold = check_parameter args[:thresholds], 'thresholds', type: [::String, ::Symbol]
55
+
56
+ Diagnostics.setup_diagnostic_logging(
57
+ "#{name}-#{version}",
58
+ log_directory: directory,
59
+ log_threshold: threshold,
60
+ )
61
+
62
+ CLEAN << directory
63
+ end
64
+ end
65
+ end # module DiagnosticsTasks
66
+
67
+ end # module RakeHelpers
68
+ end # module Control
69
+ end # module Razor
70
+ end # module RazorRisk
71
+
72
+ # ############################## end of file ############################# #
73
+
74
+
@@ -0,0 +1,128 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Rakefile for Razor Risk Razor Control library.
6
+ #
7
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+ # ######################################################################## #
12
+ # requires
13
+
14
+ require 'razor_risk/razor/control/exceptions'
15
+ require 'razor_risk/razor/control/gem/gem_helpers'
16
+
17
+ require 'rake'
18
+ require 'rake/clean'
19
+ require 'rake/testtask'
20
+
21
+ module RazorRisk
22
+ module Razor
23
+ module Control
24
+ module RakeHelpers
25
+
26
+ # Rake tasks for building/installing/testing/deploying gems.
27
+ module GemTasks
28
+
29
+ extend ::Rake::DSL
30
+
31
+ include ::RazorRisk::Razor::Control::Gem
32
+ include ::RazorRisk::Razor::Control::Exceptions
33
+
34
+ # ######################################################################## #
35
+ # constants
36
+
37
+ # Constants for use in gem related rake tasks.
38
+ module Constants
39
+
40
+ # Default gem server to use.
41
+ GemServer = ENV['RZ_GEM_SERVER'] || 'http://syd-pandora:9292'
42
+
43
+ # Unit test options
44
+ UnitTestOps = '--no-show-detail-immediately -v'
45
+ end
46
+
47
+ # ##########################################################
48
+ # JUnit Reporting
49
+
50
+ if ENV['RR_GENERATE_REPORTS'] == 'true'
51
+ require 'ci/reporter/rake/test_unit'
52
+ ENV['TESTOPTS'] = Constants::UnitTestOps
53
+ ::Rake::Task['ci:setup:testunit'].invoke
54
+ end
55
+
56
+
57
+ # ##########################################################
58
+ # clean and clobber
59
+
60
+ CLEAN << Dir[ 'test/reports' ]
61
+ CLOBBER << Dir[ '*.gem' ]
62
+
63
+
64
+ # ##########################################################
65
+ # tasks
66
+
67
+ namespace :gem do
68
+
69
+ # Test task runs all tests
70
+ Rake::TestTask.new do |t|
71
+ t.test_files = FileList[ 'test/unit/**/tc_*.rb']
72
+ t.verbose = false
73
+ # Disable warnings for code that Razor Risk does not control.
74
+ # See also https://github.com/hanami/utils/issues/123 for details.
75
+ t.warning = false
76
+ t.options = Constants::UnitTestOps
77
+ t.name = :unit_test
78
+ t.description = nil
79
+ end
80
+
81
+ task :build, [:path] do |task, options|
82
+
83
+ begin
84
+ GemHelpers.new.build_gem '.', options[:path]
85
+ rescue GemDeploymentException => x
86
+ abort x.message
87
+ end
88
+ end
89
+
90
+ task :install, [:options] do |task, args|
91
+
92
+ options = args[:options] || {}
93
+ begin
94
+ GemHelpers.new.install_gem '.', **options
95
+ rescue GemDeploymentException => x
96
+ abort x.message
97
+ end
98
+ end
99
+
100
+ task :push do
101
+
102
+ begin
103
+ GemHelpers.new.push_gem '.', Constants::GemServer
104
+ rescue GemDeploymentException => x
105
+ abort x.message
106
+ end
107
+ end
108
+
109
+ task :test_with_local_install do
110
+
111
+ GemHelpers.new.temporary_env do
112
+ ::Gem.sources = [ Constants::GemServer ]
113
+ ::Rake::Task[:'gem:install'].invoke
114
+ ::Rake::Task[:'gem:unit_test'].invoke
115
+ end
116
+ end
117
+ end
118
+
119
+ end # module GemTasks
120
+
121
+ end # module RakeHelpers
122
+ end # module Control
123
+ end # module Razor
124
+ end # module RazorRisk
125
+
126
+ # ############################## end of file ############################# #
127
+
128
+