simmer 2.1.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +3 -3
- data/CHANGELOG.md +19 -2
- data/README.md +9 -0
- data/lib/simmer.rb +9 -3
- data/lib/simmer/externals/mysql_database.rb +11 -3
- data/lib/simmer/externals/spoon_client.rb +5 -4
- data/lib/simmer/runner.rb +26 -58
- data/lib/simmer/runner/result.rb +0 -8
- data/lib/simmer/suite.rb +14 -7
- data/lib/simmer/suite/output_router.rb +73 -0
- data/lib/simmer/suite/pdi_output_writer.rb +56 -0
- data/lib/simmer/suite/results_writer.rb +44 -0
- data/lib/simmer/util.rb +1 -0
- data/lib/simmer/util/file_system.rb +25 -0
- data/lib/simmer/version.rb +1 -1
- data/simmer.gemspec +3 -2
- metadata +23 -5
- data/lib/simmer/suite/reporter.rb +0 -83
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c2be2ad790619cfd4a18f34df9c05b9a575a67b80a8d8be4a4e2a0fae4f1271
|
4
|
+
data.tar.gz: 5467d82cf7c7be7c1aab033b45302d6b97d74b56447194ddd3b8ac4760a7ff11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28076b241e673455e18ffc482829425f81754ffde566e58fd9b011cb5d0dd40cb1143b6a35f51f59789096406e5ace09e707e72fa7de640f786b55863a0d7242
|
7
|
+
data.tar.gz: eb7a544f07c273e659aa313877741ddb9628ec1e03f04002f63e26663000f47efa8161582a61146f5a5a059130202bafd469047d00fabfcb1371fa1b323d01f2
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.6.
|
1
|
+
2.6.6
|
data/.travis.yml
CHANGED
@@ -6,9 +6,9 @@ services:
|
|
6
6
|
- mysql
|
7
7
|
rvm:
|
8
8
|
# Build on the latest stable of all supported Rubies (https://www.ruby-lang.org/en/downloads/):
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
- 2.5.8
|
10
|
+
- 2.6.6
|
11
|
+
- 2.7.1
|
12
12
|
cache: bundler
|
13
13
|
before_script:
|
14
14
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
-
#
|
1
|
+
# Simmer Change Log
|
2
|
+
|
3
|
+
## 3.0.0 (June 8th, 2020)
|
4
|
+
|
5
|
+
Breaking Changes:
|
6
|
+
|
7
|
+
* `Simmer::Runner` now accepts a `Simmer::Suite::OutputRouter` instead of an `IO` instance as its 'out' parameter.
|
8
|
+
* The `execution_output` and `execution_result` methods have been removed from `Simmer::Runner::Result`.
|
9
|
+
|
10
|
+
Additions:
|
11
|
+
|
12
|
+
* pdi_out.txt is written to throughout test execution instead of at the end.
|
13
|
+
|
14
|
+
Fixes:
|
15
|
+
|
16
|
+
* Fixtures now handle identifiers which are MySQL reserved words.
|
17
|
+
|
18
|
+
## 2.1.0 (May 13th, 2020)
|
2
19
|
|
3
20
|
Additions:
|
4
21
|
|
@@ -6,7 +23,7 @@ Additions:
|
|
6
23
|
* Do not make PDI timeouts short-circuit the rest of the test suite.
|
7
24
|
* Report PDI's exit code and execution time to the console.
|
8
25
|
|
9
|
-
|
26
|
+
## 2.0.0 (May 11th, 2020)
|
10
27
|
|
11
28
|
Breaking Changes:
|
12
29
|
|
data/README.md
CHANGED
@@ -281,6 +281,15 @@ Basic steps to take to get this repository compiling:
|
|
281
281
|
3. Clone the repository (git clone git@github.com:bluemarblepayroll/simmer.git)
|
282
282
|
4. Navigate to the root folder (cd simmer)
|
283
283
|
5. Install dependencies (bundle)
|
284
|
+
6. Create the 'simmer_test' MySQL database as defined in `spec/db/tables.sql`.
|
285
|
+
7. Add the tables from `spec/db/tables.sql` to this database.
|
286
|
+
8. Configure your test simmer.yaml:
|
287
|
+
|
288
|
+
````bash
|
289
|
+
cp spec/config/simmer.yaml.ci spec/config/simmer.yaml
|
290
|
+
```
|
291
|
+
|
292
|
+
9. Edit `spec/config/simmer.yaml` so that it can connect to the database created in step seven.
|
284
293
|
|
285
294
|
### Running Tests
|
286
295
|
|
data/lib/simmer.rb
CHANGED
@@ -51,7 +51,8 @@ module Simmer
|
|
51
51
|
)
|
52
52
|
configuration = make_configuration(config_path: config_path, simmer_dir: simmer_dir)
|
53
53
|
specs = make_specifications(path, configuration.tests_dir)
|
54
|
-
|
54
|
+
out_router = make_output_router(configuration, out)
|
55
|
+
runner = make_runner(configuration, out_router)
|
55
56
|
suite = make_suite(configuration, out, runner)
|
56
57
|
|
57
58
|
suite.run(specs)
|
@@ -66,7 +67,7 @@ module Simmer
|
|
66
67
|
Configuration.new(raw_config, simmer_dir)
|
67
68
|
end
|
68
69
|
|
69
|
-
def make_runner(configuration,
|
70
|
+
def make_runner(configuration, out_router)
|
70
71
|
database = make_mysql_database(configuration)
|
71
72
|
file_system = make_file_system(configuration)
|
72
73
|
fixture_set = make_fixture_set(configuration)
|
@@ -76,7 +77,7 @@ module Simmer
|
|
76
77
|
database: database,
|
77
78
|
file_system: file_system,
|
78
79
|
fixture_set: fixture_set,
|
79
|
-
out:
|
80
|
+
out: out_router,
|
80
81
|
spoon_client: spoon_client
|
81
82
|
)
|
82
83
|
end
|
@@ -156,5 +157,10 @@ module Simmer
|
|
156
157
|
runner: runner
|
157
158
|
)
|
158
159
|
end
|
160
|
+
|
161
|
+
def make_output_router(configuration, console_out)
|
162
|
+
pdi_out = Suite::PdiOutputWriter.new(configuration.results_dir)
|
163
|
+
Simmer::Suite::OutputRouter.new(console_out, pdi_out)
|
164
|
+
end
|
159
165
|
end
|
160
166
|
end
|
@@ -27,7 +27,7 @@ module Simmer
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def records(table, columns = [])
|
30
|
-
query = "SELECT #{sql_select_params(columns)} FROM #{table}"
|
30
|
+
query = "SELECT #{sql_select_params(columns)} FROM #{qualify(table)}"
|
31
31
|
|
32
32
|
client.query(query).to_a
|
33
33
|
end
|
@@ -53,7 +53,11 @@ module Simmer
|
|
53
53
|
attr_reader :client, :fixture_set, :table_names
|
54
54
|
|
55
55
|
def sql_select_params(columns)
|
56
|
-
Array(columns).any?
|
56
|
+
if Array(columns).any?
|
57
|
+
Array(columns).map { |c| qualify(client.escape(c)).to_s }.join(',')
|
58
|
+
else
|
59
|
+
'*'
|
60
|
+
end
|
57
61
|
end
|
58
62
|
|
59
63
|
def seed_sql_statements(fixtures)
|
@@ -62,7 +66,7 @@ module Simmer
|
|
62
66
|
|
63
67
|
def clean_sql_statements
|
64
68
|
table_names.map do |table_name|
|
65
|
-
"TRUNCATE #{table_name}"
|
69
|
+
"TRUNCATE #{qualify(table_name)}"
|
66
70
|
end
|
67
71
|
end
|
68
72
|
|
@@ -110,6 +114,10 @@ module Simmer
|
|
110
114
|
|
111
115
|
raise ArgumentError, "database (#{name}) must end in #{DATABASE_SUFFIX}"
|
112
116
|
end
|
117
|
+
|
118
|
+
def qualify(identifier)
|
119
|
+
"`#{identifier}`"
|
120
|
+
end
|
113
121
|
end
|
114
122
|
end
|
115
123
|
end
|
@@ -24,13 +24,13 @@ module Simmer
|
|
24
24
|
freeze
|
25
25
|
end
|
26
26
|
|
27
|
-
def run(specification, config)
|
27
|
+
def run(specification, config, &output_capturer)
|
28
28
|
execution_result = nil
|
29
29
|
time_in_seconds = nil
|
30
30
|
|
31
31
|
begin
|
32
32
|
time_in_seconds = Benchmark.measure do
|
33
|
-
execution_result = execute!(specification, config)
|
33
|
+
execution_result = execute!(specification, config, &output_capturer)
|
34
34
|
end.real
|
35
35
|
rescue Pdi::Spoon::PanError, Pdi::Spoon::KitchenError => e
|
36
36
|
return Result.new(
|
@@ -50,14 +50,15 @@ module Simmer
|
|
50
50
|
|
51
51
|
attr_reader :files_dir
|
52
52
|
|
53
|
-
def execute!(specification, config)
|
53
|
+
def execute!(specification, config, &output_capturer)
|
54
54
|
act = specification.act
|
55
55
|
|
56
56
|
spoon.run(
|
57
57
|
repository: act.repository,
|
58
58
|
name: act.name,
|
59
59
|
params: act.compiled_params(files_dir, config),
|
60
|
-
type: act.type
|
60
|
+
type: act.type,
|
61
|
+
&output_capturer
|
61
62
|
)
|
62
63
|
end
|
63
64
|
end
|
data/lib/simmer/runner.rb
CHANGED
@@ -27,9 +27,7 @@ module Simmer
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def run(specification, config: {}, id: SecureRandom.uuid)
|
30
|
-
|
31
|
-
print("Path: #{specification.path}")
|
32
|
-
|
30
|
+
out.announce_start(id, specification)
|
33
31
|
clean_and_seed(specification)
|
34
32
|
|
35
33
|
spoon_client_result = execute_spoon(specification, config)
|
@@ -41,7 +39,7 @@ module Simmer
|
|
41
39
|
specification: specification,
|
42
40
|
spoon_client_result: spoon_client_result
|
43
41
|
).tap do |result|
|
44
|
-
|
42
|
+
out.final_verdict(result)
|
45
43
|
end
|
46
44
|
rescue Database::FixtureSet::FixtureMissingError, Timeout::Error => e
|
47
45
|
Result.new(
|
@@ -49,20 +47,18 @@ module Simmer
|
|
49
47
|
specification: specification,
|
50
48
|
errors: e.message
|
51
49
|
).tap do |result|
|
52
|
-
|
50
|
+
out.final_verdict(result)
|
53
51
|
end
|
54
52
|
end
|
55
53
|
|
54
|
+
def complete
|
55
|
+
out.close
|
56
|
+
end
|
57
|
+
|
56
58
|
private
|
57
59
|
|
58
60
|
attr_reader :database, :file_system, :fixture_set, :judge, :out
|
59
61
|
|
60
|
-
def print_result(result)
|
61
|
-
msg = pass_message(result)
|
62
|
-
print_waiting('Done', 'Final verdict')
|
63
|
-
print(msg)
|
64
|
-
end
|
65
|
-
|
66
62
|
def clean_and_seed(specification)
|
67
63
|
clean_db
|
68
64
|
seed_db(specification)
|
@@ -71,100 +67,72 @@ module Simmer
|
|
71
67
|
end
|
72
68
|
|
73
69
|
def clean_db
|
74
|
-
|
70
|
+
out.waiting('Stage', 'Cleaning database')
|
75
71
|
count = database.clean!
|
76
|
-
|
72
|
+
out.console_puts("#{count} table(s) emptied")
|
77
73
|
|
78
74
|
count
|
79
75
|
end
|
80
76
|
|
81
77
|
def seed_db(specification)
|
82
|
-
|
78
|
+
out.waiting('Stage', 'Seeding database')
|
83
79
|
|
84
80
|
fixtures = specification.stage.fixtures.map { |f| fixture_set.get!(f) }
|
85
81
|
count = database.seed!(fixtures)
|
86
82
|
|
87
|
-
|
83
|
+
out.console_puts("#{count} record(s) inserted")
|
88
84
|
|
89
85
|
count
|
90
86
|
rescue Database::FixtureSet::FixtureMissingError => e
|
91
|
-
|
87
|
+
out.console_puts('Missing Fixture(s)')
|
92
88
|
raise e
|
93
89
|
end
|
94
90
|
|
95
91
|
def clean_file_system
|
96
|
-
|
92
|
+
out.waiting('Stage', 'Cleaning File System')
|
97
93
|
count = file_system.clean!
|
98
|
-
|
94
|
+
out.console_puts("#{count} file(s) deleted")
|
99
95
|
|
100
96
|
count
|
101
97
|
end
|
102
98
|
|
103
99
|
def seed_file_system(specification)
|
104
|
-
|
100
|
+
out.waiting('Stage', 'Seeding File System')
|
105
101
|
count = file_system.write!(specification.stage.files)
|
106
|
-
|
102
|
+
out.console_puts("#{count} file(s) uploaded")
|
107
103
|
|
108
104
|
count
|
109
105
|
end
|
110
106
|
|
111
107
|
def execute_spoon(specification, config)
|
112
|
-
|
108
|
+
out.waiting('Act', 'Executing Spoon')
|
113
109
|
|
114
|
-
spoon_client_result = spoon_client.run(specification, config)
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
msg = [
|
119
|
-
pass_message(spoon_client_result),
|
120
|
-
"(Exited with code #{code} after #{time_in_seconds} seconds)"
|
121
|
-
].join(' ')
|
110
|
+
spoon_client_result = spoon_client.run(specification, config) do |output|
|
111
|
+
out.capture_spoon_output(output)
|
112
|
+
end
|
122
113
|
|
123
|
-
|
114
|
+
out.finish_spec
|
115
|
+
out.spoon_execution_detail_message(spoon_client_result)
|
124
116
|
|
125
117
|
spoon_client_result
|
126
118
|
rescue Timeout::Error => e
|
127
|
-
|
119
|
+
out.console_puts('Timed out')
|
128
120
|
raise e
|
129
121
|
end
|
130
122
|
|
131
123
|
def assert(specification, spoon_client_result)
|
132
|
-
|
124
|
+
out.waiting('Assert', 'Checking results')
|
133
125
|
|
134
126
|
if spoon_client_result.fail?
|
135
|
-
|
127
|
+
out.console_puts('Skipped')
|
136
128
|
return nil
|
137
129
|
end
|
138
130
|
|
139
131
|
output = spoon_client_result.execution_result.out
|
140
132
|
judge_result = judge.assert(specification, output)
|
141
|
-
|
142
|
-
|
143
|
-
print(msg)
|
133
|
+
out.result(judge_result)
|
144
134
|
|
145
135
|
judge_result
|
146
136
|
end
|
147
|
-
|
148
|
-
def print(msg)
|
149
|
-
out.puts(msg)
|
150
|
-
end
|
151
|
-
|
152
|
-
def print_waiting(stage, msg)
|
153
|
-
max = 25
|
154
|
-
char = '.'
|
155
|
-
msg = " > #{pad_right(stage, 6)} - #{pad_right(msg, max, char)}"
|
156
|
-
|
157
|
-
out.print(msg)
|
158
|
-
end
|
159
|
-
|
160
|
-
def pad_right(msg, len, char = ' ')
|
161
|
-
missing = len - msg.length
|
162
|
-
|
163
|
-
"#{msg}#{char * missing}"
|
164
|
-
end
|
165
|
-
|
166
|
-
def pass_message(obj)
|
167
|
-
obj.pass? ? 'Pass' : 'Fail'
|
168
|
-
end
|
169
137
|
end
|
170
138
|
end
|
data/lib/simmer/runner/result.rb
CHANGED
data/lib/simmer/suite.rb
CHANGED
@@ -7,7 +7,9 @@
|
|
7
7
|
# LICENSE file in the root directory of this source tree.
|
8
8
|
#
|
9
9
|
|
10
|
-
require_relative 'suite/
|
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
|
@@ -33,15 +35,12 @@ module Simmer
|
|
33
35
|
|
34
36
|
def run(specifications)
|
35
37
|
runner_results = run_all_specs(specifications)
|
38
|
+
runner.complete
|
36
39
|
|
37
40
|
Result.new(runner_results).tap do |result|
|
38
|
-
|
39
|
-
out.puts('Suite ended successfully')
|
40
|
-
else
|
41
|
-
out.puts('Suite ended but was not successful')
|
42
|
-
end
|
41
|
+
output_summary(result.pass?)
|
43
42
|
|
44
|
-
|
43
|
+
ResulstWriter.new(result, results_dir).write!
|
45
44
|
|
46
45
|
out.puts("Results can be viewed at #{results_dir}")
|
47
46
|
end
|
@@ -77,5 +76,13 @@ module Simmer
|
|
77
76
|
def print_line
|
78
77
|
out.puts('-' * LINE_LENGTH)
|
79
78
|
end
|
79
|
+
|
80
|
+
def output_summary(passed)
|
81
|
+
if passed
|
82
|
+
out.puts('Suite ended successfully')
|
83
|
+
else
|
84
|
+
out.puts('Suite ended but was not successful')
|
85
|
+
end
|
86
|
+
end
|
80
87
|
end
|
81
88
|
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
|
@@ -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
|
data/lib/simmer/util.rb
CHANGED
@@ -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
|
data/lib/simmer/version.rb
CHANGED
data/simmer.gemspec
CHANGED
@@ -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,11 +32,12 @@ 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')
|
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:
|
4
|
+
version: 3.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-
|
12
|
+
date: 2020-06-10 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
|
@@ -245,10 +260,13 @@ files:
|
|
245
260
|
- lib/simmer/specification/stage.rb
|
246
261
|
- lib/simmer/specification/stage/input_file.rb
|
247
262
|
- lib/simmer/suite.rb
|
248
|
-
- lib/simmer/suite/
|
263
|
+
- lib/simmer/suite/output_router.rb
|
264
|
+
- lib/simmer/suite/pdi_output_writer.rb
|
249
265
|
- lib/simmer/suite/result.rb
|
266
|
+
- lib/simmer/suite/results_writer.rb
|
250
267
|
- lib/simmer/util.rb
|
251
268
|
- lib/simmer/util/evaluator.rb
|
269
|
+
- lib/simmer/util/file_system.rb
|
252
270
|
- lib/simmer/util/record.rb
|
253
271
|
- lib/simmer/util/record_set.rb
|
254
272
|
- lib/simmer/util/resolver.rb
|
@@ -1,83 +0,0 @@
|
|
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 Reporter
|
14
|
-
DATA_FILE = 'data.yaml'
|
15
|
-
PDI_OUT_FILE = 'pdi_out.txt'
|
16
|
-
|
17
|
-
def initialize(session_result)
|
18
|
-
raise ArgumentError, 'session_result is required' unless session_result
|
19
|
-
|
20
|
-
@session_result = session_result
|
21
|
-
|
22
|
-
freeze
|
23
|
-
end
|
24
|
-
|
25
|
-
def write!(dir)
|
26
|
-
dir = setup_directory(dir)
|
27
|
-
|
28
|
-
IO.write(data_path(dir), session_result.to_h.to_yaml)
|
29
|
-
|
30
|
-
pdi_out_file = File.open(pdi_out_path(dir), 'w')
|
31
|
-
|
32
|
-
write_part(session_result.runner_results, pdi_out_file)
|
33
|
-
|
34
|
-
pdi_out_file.close
|
35
|
-
|
36
|
-
self
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
attr_reader :session_result
|
42
|
-
|
43
|
-
def data_path(dir)
|
44
|
-
File.join(dir, DATA_FILE)
|
45
|
-
end
|
46
|
-
|
47
|
-
def pdi_out_path(dir)
|
48
|
-
File.join(dir, PDI_OUT_FILE)
|
49
|
-
end
|
50
|
-
|
51
|
-
def setup_directory(dir)
|
52
|
-
File.expand_path(dir).tap do |expanded_dir|
|
53
|
-
FileUtils.mkdir_p(expanded_dir)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def write_part(runner_results, pdi_out_file)
|
58
|
-
runner_results.each do |runner_result|
|
59
|
-
name = runner_result.name
|
60
|
-
runner_id = runner_result.id
|
61
|
-
out_contents = runner_result.execution_output
|
62
|
-
|
63
|
-
write_block(pdi_out_file, name, runner_id, out_contents)
|
64
|
-
end
|
65
|
-
|
66
|
-
nil
|
67
|
-
end
|
68
|
-
|
69
|
-
def write_block(file, name, runner_id, contents)
|
70
|
-
hyphens = '-' * 80
|
71
|
-
|
72
|
-
file.write("#{hyphens}\n")
|
73
|
-
file.write("Name: #{name}\n")
|
74
|
-
file.write("Runner ID: #{runner_id}\n")
|
75
|
-
file.write("#{hyphens}\n")
|
76
|
-
file.write("#{contents}\n")
|
77
|
-
file.write("\n")
|
78
|
-
|
79
|
-
nil
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|