simmer 1.0.0.pre.alpha.3 → 1.0.0.pre.alpha.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -0
- data/lib/simmer.rb +103 -9
- data/lib/simmer/configuration.rb +7 -17
- data/lib/simmer/database.rb +10 -0
- data/lib/simmer/{util → database}/fixture.rb +7 -3
- data/lib/simmer/{util → database}/fixture_set.rb +10 -4
- data/lib/simmer/externals/aws_file_system.rb +30 -23
- data/lib/simmer/externals/mysql_database.rb +17 -10
- data/lib/simmer/externals/spoon_client.rb +5 -19
- data/lib/simmer/runner.rb +2 -2
- data/lib/simmer/specification/act.rb +1 -6
- data/lib/simmer/specification/assert/assertions/table.rb +1 -6
- data/lib/simmer/spoon_mock.rb +35 -0
- data/lib/simmer/suite.rb +49 -43
- data/lib/simmer/{session → suite}/reporter.rb +1 -1
- data/lib/simmer/{session → suite}/result.rb +1 -1
- data/lib/simmer/util.rb +0 -1
- data/lib/simmer/util/evaluator.rb +4 -5
- data/lib/simmer/util/record.rb +2 -0
- data/lib/simmer/util/record_set.rb +5 -1
- data/lib/simmer/util/resolver.rb +2 -2
- data/lib/simmer/util/yaml_reader.rb +9 -12
- data/lib/simmer/version.rb +1 -1
- data/spec/config/simmer.yaml.ci +7 -0
- data/spec/db/database.sql +1 -0
- data/spec/db/tables.sql +20 -0
- data/spec/db_helper.rb +26 -0
- data/spec/fixtures/agent_fixtures.yaml +14 -0
- data/spec/fixtures/configuration.yaml +11 -0
- data/spec/fixtures/noc_list.csv +3 -0
- data/spec/fixtures/specifications/load_noc_list.yaml +30 -0
- data/spec/fixtures/yaml_reader/bar.yaml +2 -0
- data/spec/fixtures/yaml_reader/baz/baz.yaml +2 -0
- data/spec/fixtures/yaml_reader/foo.yaml +2 -0
- data/spec/simmer/configuration_spec.rb +46 -0
- data/spec/simmer/database/fixture_set_spec.rb +75 -0
- data/spec/simmer/database/fixture_spec.rb +57 -0
- data/spec/simmer/externals/aws_file_system_spec.rb +75 -0
- data/spec/simmer/externals/mysql_database_spec.rb +79 -0
- data/spec/simmer/externals/spoon_client_spec.rb +67 -0
- data/spec/simmer/specification/act/params_spec.rb +38 -0
- data/spec/simmer/specification/act_spec.rb +37 -0
- data/spec/simmer/specification/assert_spec.rb +27 -0
- data/spec/simmer/specification/stage_spec.rb +32 -0
- data/spec/simmer/specification_spec.rb +28 -0
- data/spec/simmer/util/evaluator_spec.rb +82 -0
- data/spec/simmer/util/record_set_spec.rb +41 -0
- data/spec/simmer/util/record_spec.rb +218 -0
- data/spec/simmer/util/yaml_reader_spec.rb +49 -0
- data/spec/spec_helper.rb +21 -0
- metadata +60 -8
- data/lib/simmer/externals/spoon_client/mock.rb +0 -39
- data/lib/simmer/session.rb +0 -79
@@ -0,0 +1,38 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Specification::Act::Params do
|
13
|
+
let(:spec_path) { File.join('specifications', 'load_noc_list.yaml') }
|
14
|
+
let(:params_config) { yaml_fixture(spec_path).dig('act', 'params') }
|
15
|
+
|
16
|
+
let(:config) do
|
17
|
+
{
|
18
|
+
codes: {
|
19
|
+
the_secret_one: '123ABC'
|
20
|
+
}
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:files_path) { 'files_are_here' }
|
25
|
+
|
26
|
+
subject { described_class.make(params_config) }
|
27
|
+
|
28
|
+
it '#compile combines files and keys' do
|
29
|
+
actual = subject.compile(files_path, config)
|
30
|
+
expected_path = File.expand_path(File.join(files_path, subject.files.values.first))
|
31
|
+
expected = {
|
32
|
+
'input_file' => expected_path,
|
33
|
+
'code' => 'The secret code is: 123ABC'
|
34
|
+
}
|
35
|
+
|
36
|
+
expect(actual).to eq(expected)
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Specification::Act do
|
13
|
+
let(:path) { File.join('specifications', 'load_noc_list.yaml') }
|
14
|
+
|
15
|
+
let(:config) { yaml_fixture(path)['act'] }
|
16
|
+
|
17
|
+
describe 'initialization using acts_as_hashable' do
|
18
|
+
subject { described_class.make(config) }
|
19
|
+
|
20
|
+
it 'sets repository' do
|
21
|
+
expect(subject.repository).to eq('top_secret')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sets name' do
|
25
|
+
expect(subject.name).to eq('load_noc_list')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'sets type' do
|
29
|
+
expect(subject.type).to eq('transformation')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'sets params' do
|
33
|
+
expect(subject.params.files).to eq('input_file' => 'noc_list.csv')
|
34
|
+
expect(subject.params.keys).to eq('code' => 'The secret code is: {codes.the_secret_one}')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,27 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Specification::Assert do
|
13
|
+
let(:path) { File.join('specifications', 'load_noc_list.yaml') }
|
14
|
+
|
15
|
+
let(:config) { yaml_fixture(path)['assert'] }
|
16
|
+
|
17
|
+
describe 'initialization using acts_as_hashable' do
|
18
|
+
subject { described_class.make(config) }
|
19
|
+
|
20
|
+
it 'sets assertions' do
|
21
|
+
expect(subject.assertions.length).to eq(2)
|
22
|
+
expect(subject.assertions.first.name).to eq('agents')
|
23
|
+
expect(subject.assertions.first.record_set.length).to eq(2)
|
24
|
+
expect(subject.assertions.last.value).to eq('Decoding Agents')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Specification::Stage do
|
13
|
+
let(:path) { File.join('specifications', 'load_noc_list.yaml') }
|
14
|
+
|
15
|
+
let(:config) { yaml_fixture(path)['stage'] }
|
16
|
+
|
17
|
+
describe 'initialization using acts_as_hashable' do
|
18
|
+
subject { described_class.make(config) }
|
19
|
+
|
20
|
+
it 'sets files' do
|
21
|
+
expect(subject.files.length).to eq(1)
|
22
|
+
expect(subject.files.first.src).to eq('noc_list.csv')
|
23
|
+
expect(subject.files.first.dest).to eq('input/noc_list.csv')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'sets fixtures' do
|
27
|
+
expect(subject.fixtures.length).to eq(2)
|
28
|
+
expect(subject.fixtures.first).to eq('iron_man')
|
29
|
+
expect(subject.fixtures.last).to eq('hulk')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,28 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Specification do
|
13
|
+
let(:path) { File.join('specifications', 'load_noc_list.yaml') }
|
14
|
+
|
15
|
+
let(:config) { yaml_fixture(path).merge(path: path) }
|
16
|
+
|
17
|
+
describe 'initialization using acts_as_hashable' do
|
18
|
+
subject { described_class.make(config) }
|
19
|
+
|
20
|
+
it 'sets name' do
|
21
|
+
expect(subject.name).to eq('Declassify Users')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'sets path' do
|
25
|
+
expect(subject.path).to eq(path)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,82 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Util::Evaluator do
|
13
|
+
let(:template) do
|
14
|
+
'The {traits.speed} {animal} jumps over the {thing}.'
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#evaluate' do
|
18
|
+
context 'when input is hash with string keys' do
|
19
|
+
let(:input) do
|
20
|
+
{
|
21
|
+
'animal' => :fox,
|
22
|
+
'traits' => {
|
23
|
+
'speed' => :quick
|
24
|
+
},
|
25
|
+
'thing' => :wall
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'renders template' do
|
30
|
+
expected = 'The quick fox jumps over the wall.'
|
31
|
+
|
32
|
+
expect(subject.evaluate(template, input)).to eq(expected)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when input is hash with symbol keys' do
|
37
|
+
let(:input) do
|
38
|
+
{
|
39
|
+
animal: :fox,
|
40
|
+
traits: {
|
41
|
+
speed: :quick
|
42
|
+
},
|
43
|
+
thing: :wall
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'renders template' do
|
48
|
+
expected = 'The quick fox jumps over the wall.'
|
49
|
+
|
50
|
+
expect(subject.evaluate(template, input)).to eq(expected)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when input is OpenStruct' do
|
55
|
+
let(:input) do
|
56
|
+
OpenStruct.new(
|
57
|
+
animal: :fox,
|
58
|
+
traits: OpenStruct.new(
|
59
|
+
speed: :quick
|
60
|
+
),
|
61
|
+
thing: :wall
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'renders template' do
|
66
|
+
expected = 'The quick fox jumps over the wall.'
|
67
|
+
|
68
|
+
expect(subject.evaluate(template, input)).to eq(expected)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when input is nil' do
|
73
|
+
let(:input) { nil }
|
74
|
+
|
75
|
+
it 'renders against nil' do
|
76
|
+
expected = 'The jumps over the .'
|
77
|
+
|
78
|
+
expect(subject.evaluate(template, input)).to eq(expected)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,41 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Util::RecordSet do
|
13
|
+
let(:hash1) do
|
14
|
+
{
|
15
|
+
a: 'a',
|
16
|
+
b: 'b'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:hash2) do
|
21
|
+
{
|
22
|
+
c: 'c',
|
23
|
+
d: 'd'
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
subject { described_class.new([hash1, hash2]) }
|
28
|
+
|
29
|
+
describe 'equality' do
|
30
|
+
specify 'hash order does not matter' do
|
31
|
+
subject2 = described_class.new([hash2, hash1])
|
32
|
+
|
33
|
+
expect(subject).to eq(subject2)
|
34
|
+
expect(subject).to eql(subject2)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
specify '#keys includes all record keys' do
|
39
|
+
expect(subject.keys).to eq(%w[a b c d])
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,218 @@
|
|
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 'spec_helper'
|
11
|
+
|
12
|
+
describe Simmer::Util::Record do
|
13
|
+
describe 'initialization' do
|
14
|
+
let(:data) do
|
15
|
+
{
|
16
|
+
'a' => 'a'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'accepts hash' do
|
21
|
+
subject = described_class.new(data)
|
22
|
+
|
23
|
+
expect(subject.to_h).to eq(data)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'accepts Record' do
|
27
|
+
record = Simmer::Util::Record.new(data)
|
28
|
+
subject = described_class.new(record)
|
29
|
+
|
30
|
+
expect(subject.to_h).to eq(data)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'accepts OpenStruct' do
|
34
|
+
record = OpenStruct.new(data)
|
35
|
+
subject = described_class.new(record)
|
36
|
+
|
37
|
+
expect(subject.to_h).to eq(data)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'equality' do
|
42
|
+
context 'when key types do not equal' do
|
43
|
+
let(:symbol_hash) do
|
44
|
+
{
|
45
|
+
'1': 1
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
let(:string_hash) do
|
50
|
+
{
|
51
|
+
'1' => 1
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:numeric_hash) do
|
56
|
+
{}.tap do |hash|
|
57
|
+
hash[1] = 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'compares symbol to string keys' do
|
62
|
+
record1 = described_class.new(symbol_hash)
|
63
|
+
record2 = described_class.new(string_hash)
|
64
|
+
|
65
|
+
expect(record1).to eq(record2)
|
66
|
+
expect(record1).to eql(record2)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'compares symbol to number keys' do
|
70
|
+
record1 = described_class.new(symbol_hash)
|
71
|
+
record2 = described_class.new(numeric_hash)
|
72
|
+
|
73
|
+
expect(record1).to eq(record2)
|
74
|
+
expect(record1).to eql(record2)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'compares string to number keys' do
|
78
|
+
record1 = described_class.new(string_hash)
|
79
|
+
record2 = described_class.new(numeric_hash)
|
80
|
+
|
81
|
+
expect(record1).to eq(record2)
|
82
|
+
expect(record1).to eql(record2)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when value types do not equal' do
|
87
|
+
let(:symbol_hash) do
|
88
|
+
{
|
89
|
+
a: :'1'
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
let(:string_hash) do
|
94
|
+
{
|
95
|
+
a: '1'
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
let(:numeric_hash) do
|
100
|
+
{
|
101
|
+
a: 1
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'compares symbol to string keys' do
|
106
|
+
record1 = described_class.new(symbol_hash)
|
107
|
+
record2 = described_class.new(string_hash)
|
108
|
+
|
109
|
+
expect(record1).to eq(record2)
|
110
|
+
expect(record1).to eql(record2)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'compares symbol to number keys' do
|
114
|
+
record1 = described_class.new(symbol_hash)
|
115
|
+
record2 = described_class.new(numeric_hash)
|
116
|
+
|
117
|
+
expect(record1).to eq(record2)
|
118
|
+
expect(record1).to eql(record2)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'compares string to number keys' do
|
122
|
+
record1 = described_class.new(string_hash)
|
123
|
+
record2 = described_class.new(numeric_hash)
|
124
|
+
|
125
|
+
expect(record1).to eq(record2)
|
126
|
+
expect(record1).to eql(record2)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context 'when keys and values are not in same order and mixed type' do
|
131
|
+
let(:alphabetical_hash) do
|
132
|
+
{
|
133
|
+
a: 'a',
|
134
|
+
b: :b,
|
135
|
+
'c': 'c'
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
let(:reverse_alphabetical_hash) do
|
140
|
+
{
|
141
|
+
b: 'b',
|
142
|
+
c: 'c',
|
143
|
+
'a': :a
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should ignore key ordering' do
|
148
|
+
record1 = described_class.new(alphabetical_hash)
|
149
|
+
record2 = described_class.new(reverse_alphabetical_hash)
|
150
|
+
|
151
|
+
expect(record1).to eq(record2)
|
152
|
+
expect(record1).to eql(record2)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'when value(s) are of type BigDecimal' do
|
157
|
+
let(:string_value) { '12.005' }
|
158
|
+
|
159
|
+
let(:float_hash) do
|
160
|
+
{
|
161
|
+
a: string_value.to_f
|
162
|
+
}
|
163
|
+
end
|
164
|
+
|
165
|
+
let(:big_decimal_hash) do
|
166
|
+
{
|
167
|
+
a: BigDecimal(string_value)
|
168
|
+
}
|
169
|
+
end
|
170
|
+
|
171
|
+
let(:string_hash) do
|
172
|
+
{
|
173
|
+
a: string_value
|
174
|
+
}
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'compares floats with big decimals' do
|
178
|
+
record1 = described_class.new(float_hash)
|
179
|
+
record2 = described_class.new(big_decimal_hash)
|
180
|
+
|
181
|
+
expect(record1).to eq(record2)
|
182
|
+
expect(record1).to eql(record2)
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'compares floats with strings' do
|
186
|
+
record1 = described_class.new(float_hash)
|
187
|
+
record2 = described_class.new(string_hash)
|
188
|
+
|
189
|
+
expect(record1).to eq(record2)
|
190
|
+
expect(record1).to eql(record2)
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'compares big decimals with strings' do
|
194
|
+
record1 = described_class.new(big_decimal_hash)
|
195
|
+
record2 = described_class.new(string_hash)
|
196
|
+
|
197
|
+
expect(record1).to eq(record2)
|
198
|
+
expect(record1).to eql(record2)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'should not equal if values are not equal' do
|
203
|
+
record1 = described_class.new(a: 'a')
|
204
|
+
record2 = described_class.new(a: 'b')
|
205
|
+
|
206
|
+
expect(record1).not_to eq(record2)
|
207
|
+
expect(record1).not_to eql(record2)
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'should not equal if keys are not equal' do
|
211
|
+
record1 = described_class.new(a: 'a')
|
212
|
+
record2 = described_class.new(b: 'a')
|
213
|
+
|
214
|
+
expect(record1).not_to eq(record2)
|
215
|
+
expect(record1).not_to eql(record2)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|