simmer 2.0.0.pre.alpha.1 → 4.0.0

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,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Simmer
11
+ class Runner
12
+ # This error used when a specification times out. It is stored in
13
+ # <tt>Simmer::Runner::Results#errors</tt> when a specification times out.
14
+ class TimeoutError < RuntimeError
15
+ def message
16
+ cause ? cause.message : DEFAULT_MESSAGE
17
+ end
18
+
19
+ DEFAULT_MESSAGE = 'a timeout occurred'
20
+ private_constant :DEFAULT_MESSAGE
21
+ end
22
+ end
23
+ end
@@ -7,7 +7,9 @@
7
7
  # LICENSE file in the root directory of this source tree.
8
8
  #
9
9
 
10
- require_relative 'suite/reporter'
10
+ require_relative 'suite/output_router'
11
+ require_relative 'suite/pdi_output_writer'
12
+ require_relative 'suite/results_writer'
11
13
  require_relative 'suite/result'
12
14
 
13
15
  module Simmer
@@ -22,7 +24,7 @@ module Simmer
22
24
  results_dir:,
23
25
  runner:
24
26
  )
25
- @config = config || {}
27
+ @config = config
26
28
  @out = out
27
29
  @resolver = resolver
28
30
  @results_dir = results_dir
@@ -32,18 +34,17 @@ module Simmer
32
34
  end
33
35
 
34
36
  def run(specifications)
35
- runner_results = run_all_specs(specifications)
37
+ config.run_suite_with_callbacks do
38
+ runner_results = run_all_specs(specifications)
39
+ runner.complete
36
40
 
37
- Result.new(runner_results).tap do |result|
38
- if result.pass?
39
- out.puts('Suite ended successfully')
40
- else
41
- out.puts('Suite ended but was not successful')
42
- end
41
+ Result.new(runner_results).tap do |result|
42
+ output_summary(result.pass?)
43
43
 
44
- Reporter.new(result).write!(results_dir)
44
+ ResulstWriter.new(result, results_dir).write!
45
45
 
46
- out.puts("Results can be viewed at #{results_dir}")
46
+ out.puts("Results can be viewed at #{results_dir}")
47
+ end
47
48
  end
48
49
  end
49
50
 
@@ -77,5 +78,13 @@ module Simmer
77
78
  def print_line
78
79
  out.puts('-' * LINE_LENGTH)
79
80
  end
81
+
82
+ def output_summary(passed)
83
+ if passed
84
+ out.puts('Suite ended successfully')
85
+ else
86
+ out.puts('Suite ended but was not successful')
87
+ end
88
+ end
80
89
  end
81
90
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Simmer
4
+ class Suite
5
+ # Routes output either to the console or the <tt>PdiOutputWriter</tt>. It
6
+ # also provides some methods to help format output.
7
+ class OutputRouter
8
+ extend Forwardable
9
+
10
+ attr_reader :console, :pdi_out
11
+
12
+ def_delegator :console, :puts, :console_puts
13
+ def_delegators :pdi_out, :close, :finish_spec
14
+ def_delegator :pdi_out, :write, :capture_spoon_output
15
+
16
+ def initialize(console, pdi_out)
17
+ @console = console || raise(ArgumentError, 'console is required')
18
+ @pdi_out = pdi_out || raise(ArgumentError, 'pdi_out is required')
19
+
20
+ freeze
21
+ end
22
+
23
+ def announce_start(id, specification)
24
+ console_puts("Name: #{specification.name}")
25
+ console_puts("Path: #{specification.path}")
26
+ pdi_out.demarcate_spec(id, specification.name)
27
+ end
28
+
29
+ def result(result)
30
+ console_puts(pass_message(result))
31
+ end
32
+
33
+ def final_verdict(result)
34
+ msg = pass_message(result)
35
+ waiting('Done', 'Final verdict')
36
+ console_puts(msg)
37
+ end
38
+
39
+ def waiting(stage, msg)
40
+ # This is not for debugging.
41
+ # rubocop:disable Lint/Debugger
42
+ console.print(
43
+ " > #{pad_right(stage, 6)} - #{pad_right(msg, WAITING_MAX_WIDTH, WAITING_PADDING_CHAR)}"
44
+ )
45
+ # rubocop:enable Lint/Debugger
46
+ end
47
+
48
+ def spoon_execution_detail_message(spoon_client_result)
49
+ code = spoon_client_result.execution_result.status.code
50
+ detail = "(Exited with code #{code} after #{spoon_client_result.time_in_seconds} seconds)"
51
+
52
+ console_puts("#{pass_message(spoon_client_result)} #{detail}")
53
+ end
54
+
55
+ private
56
+
57
+ WAITING_MAX_WIDTH = 25
58
+ WAITING_PADDING_CHAR = '.'
59
+
60
+ private_constant :WAITING_MAX_WIDTH, :WAITING_PADDING_CHAR
61
+
62
+ def pad_right(msg, len, char = ' ')
63
+ missing = len - msg.length
64
+
65
+ "#{msg}#{char * missing}"
66
+ end
67
+
68
+ def pass_message(obj)
69
+ obj.pass? ? 'Pass' : 'Fail'
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Simmer
11
+ class Suite
12
+ # Captures PDI output from multiple specifications to a single file.
13
+ class PdiOutputWriter # :nodoc:
14
+ PDI_OUT_FILE = 'pdi_out.txt'
15
+
16
+ attr_reader :results_dir
17
+
18
+ def initialize(results_dir)
19
+ raise ArgumentError, 'results_dir is required' unless results_dir
20
+
21
+ results_dir = Util::FileSystem.setup_directory(results_dir)
22
+ @out = File.new(File.join(results_dir, PDI_OUT_FILE), 'w')
23
+
24
+ freeze
25
+ end
26
+
27
+ def demarcate_spec(runner_id, spec_name)
28
+ out.puts(LINE_OF_HYPHENS)
29
+ out.puts("Name: #{spec_name}")
30
+ out.puts("Runner ID: #{runner_id}")
31
+ out.puts(LINE_OF_HYPHENS)
32
+ end
33
+
34
+ def write(contents)
35
+ bytes_written = out.write(contents)
36
+ out.flush
37
+ bytes_written
38
+ end
39
+
40
+ def finish_spec
41
+ out.puts
42
+ end
43
+
44
+ def close
45
+ out.close
46
+ end
47
+
48
+ private
49
+
50
+ attr_reader :out
51
+
52
+ LINE_OF_HYPHENS = ('-' * 80).freeze
53
+ private_constant :LINE_OF_HYPHENS
54
+ end
55
+ end
56
+ end
@@ -22,6 +22,7 @@ module Simmer
22
22
  def pass?
23
23
  !fail?
24
24
  end
25
+ alias passing? pass?
25
26
 
26
27
  def fail?
27
28
  runner_results.any?(&:fail?)
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ module Simmer
11
+ class Suite
12
+ # Understands how to write a SessionResult instance to disk.
13
+ class ResulstWriter
14
+ DATA_FILE = 'data.yaml'
15
+
16
+ # Pass in dir here:
17
+ def initialize(session_result, results_dir)
18
+ raise ArgumentError, 'session_result is required' unless session_result
19
+ raise ArgumentError, 'results_directory is required' unless results_dir
20
+
21
+ @session_result = session_result
22
+ @results_directory = Util::FileSystem.setup_directory(results_dir)
23
+
24
+ freeze
25
+ end
26
+
27
+ def write!
28
+ dir = Util::FileSystem.setup_directory(results_directory)
29
+
30
+ IO.write(data_path(dir), session_result.to_h.to_yaml)
31
+
32
+ self
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :results_directory, :session_result
38
+
39
+ def data_path(dir)
40
+ File.join(dir, DATA_FILE)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -8,5 +8,6 @@
8
8
  #
9
9
 
10
10
  require_relative 'util/evaluator'
11
+ require_relative 'util/file_system'
11
12
  require_relative 'util/record_set'
12
13
  require_relative 'util/yaml_reader'
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2020-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ require_relative 'resolver'
11
+
12
+ module Simmer
13
+ module Util
14
+ # Provides convenience methods for working with the file system.
15
+ class FileSystem # :nodoc:
16
+ class << self
17
+ def setup_directory(dir_path)
18
+ File.expand_path(dir_path).tap do |expanded_dir|
19
+ FileUtils.mkdir_p(expanded_dir)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -8,5 +8,5 @@
8
8
  #
9
9
 
10
10
  module Simmer
11
- VERSION = '2.0.0-alpha.1'
11
+ VERSION = '4.0.0'
12
12
  end
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  Provides a harness for testing Pentaho Data Integration jobs and transformations.
12
12
  DESCRIPTION
13
13
 
14
- s.authors = ['Matthew Ruggio']
14
+ s.authors = ['Matthew Ruggio', 'Ryan Gerry']
15
15
  s.email = ['mruggio@bluemarblepayroll.com']
16
16
  s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  s.bindir = 'exe'
@@ -32,14 +32,16 @@ Gem::Specification.new do |s|
32
32
  s.add_dependency('aws-sdk-s3', '~>1.6')
33
33
  s.add_dependency('mysql2', '~>0.5')
34
34
  s.add_dependency('objectable', '~>1')
35
- s.add_dependency('pdi', '~>2')
35
+ s.add_dependency('pdi', '~>2.1')
36
36
  s.add_dependency('stringento', '~>2')
37
37
 
38
38
  s.add_development_dependency('guard-rspec', '~>4.7')
39
39
  s.add_development_dependency('pry', '~>0')
40
+ s.add_development_dependency 'pry-byebug'
40
41
  s.add_development_dependency('rake', '~> 13')
41
42
  s.add_development_dependency('rspec')
42
43
  s.add_development_dependency('rubocop', '~>0.79.0')
43
44
  s.add_development_dependency('simplecov', '~>0.17.0')
44
45
  s.add_development_dependency('simplecov-console', '~>0.6.0')
46
+ s.add_development_dependency('terminal-notifier-guard')
45
47
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre.alpha.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Ruggio
8
+ - Ryan Gerry
8
9
  autorequire:
9
10
  bindir: exe
10
11
  cert_chain: []
11
- date: 2020-05-11 00:00:00.000000000 Z
12
+ date: 2020-06-24 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: acts_as_hashable
@@ -72,14 +73,14 @@ dependencies:
72
73
  requirements:
73
74
  - - "~>"
74
75
  - !ruby/object:Gem::Version
75
- version: '2'
76
+ version: '2.1'
76
77
  type: :runtime
77
78
  prerelease: false
78
79
  version_requirements: !ruby/object:Gem::Requirement
79
80
  requirements:
80
81
  - - "~>"
81
82
  - !ruby/object:Gem::Version
82
- version: '2'
83
+ version: '2.1'
83
84
  - !ruby/object:Gem::Dependency
84
85
  name: stringento
85
86
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +123,20 @@ dependencies:
122
123
  - - "~>"
123
124
  - !ruby/object:Gem::Version
124
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: pry-byebug
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
125
140
  - !ruby/object:Gem::Dependency
126
141
  name: rake
127
142
  requirement: !ruby/object:Gem::Requirement
@@ -192,6 +207,20 @@ dependencies:
192
207
  - - "~>"
193
208
  - !ruby/object:Gem::Version
194
209
  version: 0.6.0
210
+ - !ruby/object:Gem::Dependency
211
+ name: terminal-notifier-guard
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
195
224
  description: " Provides a harness for testing Pentaho Data Integration jobs and
196
225
  transformations.\n"
197
226
  email:
@@ -216,7 +245,9 @@ files:
216
245
  - bin/console
217
246
  - exe/simmer
218
247
  - lib/simmer.rb
248
+ - lib/simmer/bootstrap.rb
219
249
  - lib/simmer/configuration.rb
250
+ - lib/simmer/configuration/callback_dsl.rb
220
251
  - lib/simmer/core_ext/hash.rb
221
252
  - lib/simmer/database.rb
222
253
  - lib/simmer/database/fixture.rb
@@ -231,8 +262,10 @@ files:
231
262
  - lib/simmer/externals/sql_writers/sql_fixture.rb
232
263
  - lib/simmer/judge.rb
233
264
  - lib/simmer/judge/result.rb
265
+ - lib/simmer/re_runner.rb
234
266
  - lib/simmer/runner.rb
235
267
  - lib/simmer/runner/result.rb
268
+ - lib/simmer/runner/timeout_error.rb
236
269
  - lib/simmer/specification.rb
237
270
  - lib/simmer/specification/act.rb
238
271
  - lib/simmer/specification/act/params.rb
@@ -245,10 +278,13 @@ files:
245
278
  - lib/simmer/specification/stage.rb
246
279
  - lib/simmer/specification/stage/input_file.rb
247
280
  - lib/simmer/suite.rb
248
- - lib/simmer/suite/reporter.rb
281
+ - lib/simmer/suite/output_router.rb
282
+ - lib/simmer/suite/pdi_output_writer.rb
249
283
  - lib/simmer/suite/result.rb
284
+ - lib/simmer/suite/results_writer.rb
250
285
  - lib/simmer/util.rb
251
286
  - lib/simmer/util/evaluator.rb
287
+ - lib/simmer/util/file_system.rb
252
288
  - lib/simmer/util/record.rb
253
289
  - lib/simmer/util/record_set.rb
254
290
  - lib/simmer/util/resolver.rb
@@ -275,9 +311,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
275
311
  version: '2.5'
276
312
  required_rubygems_version: !ruby/object:Gem::Requirement
277
313
  requirements:
278
- - - ">"
314
+ - - ">="
279
315
  - !ruby/object:Gem::Version
280
- version: 1.3.1
316
+ version: '0'
281
317
  requirements: []
282
318
  rubygems_version: 3.0.3
283
319
  signing_key: