levels 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rbenv-version +1 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +12 -0
- data/Guardfile +14 -0
- data/LICENSE +22 -0
- data/README.md +315 -0
- data/Rakefile +28 -0
- data/bin/levels +130 -0
- data/examples/01_base.rb +6 -0
- data/examples/01_merge_to_json.sh +27 -0
- data/examples/01_prod.json +8 -0
- data/examples/02_base.rb +4 -0
- data/examples/02_merge_with_file.sh +20 -0
- data/examples/02_value +1 -0
- data/levels.gemspec +20 -0
- data/lib/levels.rb +77 -0
- data/lib/levels/audit.rb +24 -0
- data/lib/levels/audit/group_observer.rb +26 -0
- data/lib/levels/audit/nested_group_observer.rb +37 -0
- data/lib/levels/audit/root_observer.rb +63 -0
- data/lib/levels/audit/value.rb +64 -0
- data/lib/levels/audit/value_observer.rb +46 -0
- data/lib/levels/audit/values.rb +66 -0
- data/lib/levels/configuration.rb +98 -0
- data/lib/levels/configured_group.rb +62 -0
- data/lib/levels/event_handler.rb +127 -0
- data/lib/levels/group.rb +61 -0
- data/lib/levels/input/json.rb +17 -0
- data/lib/levels/input/ruby.rb +120 -0
- data/lib/levels/input/system.rb +63 -0
- data/lib/levels/input/yaml.rb +17 -0
- data/lib/levels/key.rb +28 -0
- data/lib/levels/key_values.rb +54 -0
- data/lib/levels/lazy_evaluator.rb +54 -0
- data/lib/levels/level.rb +80 -0
- data/lib/levels/method_missing.rb +14 -0
- data/lib/levels/output/json.rb +33 -0
- data/lib/levels/output/system.rb +29 -0
- data/lib/levels/output/yaml.rb +19 -0
- data/lib/levels/runtime.rb +30 -0
- data/lib/levels/setup.rb +132 -0
- data/lib/levels/system/constants.rb +8 -0
- data/lib/levels/system/key_formatter.rb +15 -0
- data/lib/levels/system/key_generator.rb +50 -0
- data/lib/levels/system/key_parser.rb +67 -0
- data/lib/levels/version.rb +3 -0
- data/test/acceptance/audit_test.rb +105 -0
- data/test/acceptance/event_handler_test.rb +43 -0
- data/test/acceptance/read_json_test.rb +35 -0
- data/test/acceptance/read_ruby_test.rb +117 -0
- data/test/acceptance/read_system_test.rb +121 -0
- data/test/acceptance/read_yaml_test.rb +38 -0
- data/test/acceptance/setup_test.rb +115 -0
- data/test/acceptance/write_json_test.rb +39 -0
- data/test/acceptance/write_system_test.rb +68 -0
- data/test/acceptance/write_yaml_test.rb +33 -0
- data/test/bin/merge_test.rb +194 -0
- data/test/bin/options_test.rb +41 -0
- data/test/helper.rb +12 -0
- data/test/support/acceptance_spec.rb +58 -0
- data/test/support/base_spec.rb +14 -0
- data/test/support/bin_spec.rb +65 -0
- data/test/support/tempfile_helper.rb +35 -0
- data/test/unit/audit/group_observer_test.rb +24 -0
- data/test/unit/audit/nested_group_observer_test.rb +28 -0
- data/test/unit/audit/root_observer_test.rb +54 -0
- data/test/unit/audit/value_observer_test.rb +63 -0
- data/test/unit/audit/value_test.rb +41 -0
- data/test/unit/audit/values_test.rb +86 -0
- data/test/unit/configuration_test.rb +72 -0
- data/test/unit/configured_group_test.rb +75 -0
- data/test/unit/group_test.rb +105 -0
- data/test/unit/input/json_test.rb +32 -0
- data/test/unit/input/ruby_test.rb +140 -0
- data/test/unit/input/system_test.rb +59 -0
- data/test/unit/input/yaml_test.rb +33 -0
- data/test/unit/key_test.rb +45 -0
- data/test/unit/key_values_test.rb +106 -0
- data/test/unit/lazy_evaluator_test.rb +38 -0
- data/test/unit/level_test.rb +89 -0
- data/test/unit/levels_test.rb +23 -0
- data/test/unit/output/json_test.rb +55 -0
- data/test/unit/output/system_test.rb +32 -0
- data/test/unit/output/yaml_test.rb +38 -0
- data/test/unit/runtime_test.rb +40 -0
- data/test/unit/system/key_formatter_test.rb +43 -0
- data/test/unit/system/key_generator_test.rb +21 -0
- data/test/unit/system/key_parser_test.rb +207 -0
- metadata +215 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "acceptance: read system" do
|
4
|
+
|
5
|
+
def read_system(level_name, template, prefix, env)
|
6
|
+
key_formatter = Levels::System::KeyFormatter.new(prefix)
|
7
|
+
level = Levels::Level.new(level_name)
|
8
|
+
input = Levels::Input::System.new(template, key_formatter, env)
|
9
|
+
input.read(level)
|
10
|
+
level
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "using typecast information" do
|
14
|
+
|
15
|
+
let(:template) {
|
16
|
+
level = Levels::Level.new("template level")
|
17
|
+
level.set_group(:types,
|
18
|
+
string: nil,
|
19
|
+
integer: nil,
|
20
|
+
float: nil,
|
21
|
+
boolean_true: nil,
|
22
|
+
boolean_false: nil,
|
23
|
+
array_of_string: nil,
|
24
|
+
array_of_integer: nil,
|
25
|
+
null: nil
|
26
|
+
)
|
27
|
+
level.set_group(:group2,
|
28
|
+
message: nil
|
29
|
+
)
|
30
|
+
level
|
31
|
+
}
|
32
|
+
|
33
|
+
let(:env) {
|
34
|
+
{
|
35
|
+
"TYPES_STRING" => "hello",
|
36
|
+
"TYPES_INTEGER" => "123",
|
37
|
+
"TYPES_INTEGER_TYPE" => "integer",
|
38
|
+
"TYPES_FLOAT" => "1.5",
|
39
|
+
"TYPES_FLOAT_TYPE" => "float",
|
40
|
+
"TYPES_BOOLEAN_TRUE" => "true",
|
41
|
+
"TYPES_BOOLEAN_TRUE_TYPE" => "boolean",
|
42
|
+
"TYPES_BOOLEAN_FALSE" => "false",
|
43
|
+
"TYPES_BOOLEAN_FALSE_TYPE" => "boolean",
|
44
|
+
"TYPES_ARRAY_OF_STRING" => "a:b:c",
|
45
|
+
"TYPES_ARRAY_OF_STRING_TYPE" => "array",
|
46
|
+
"TYPES_ARRAY_OF_INTEGER" => "1:2:3",
|
47
|
+
"TYPES_ARRAY_OF_INTEGER_TYPE" => "array",
|
48
|
+
"TYPES_ARRAY_OF_INTEGER_TYPE_TYPE" => "integer",
|
49
|
+
"TYPES_NULL" => "",
|
50
|
+
"GROUP2_MESSAGE" => "hello world"
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
subject { read_system("the system", template.to_enum, nil, env) }
|
55
|
+
|
56
|
+
assert_sample_data_set
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "using the template's types" do
|
60
|
+
|
61
|
+
let(:template) {
|
62
|
+
level = Levels::Level.new("template level")
|
63
|
+
level.set_group(:types,
|
64
|
+
string: "!hello",
|
65
|
+
integer: 0123,
|
66
|
+
float: 1.55,
|
67
|
+
boolean_true: false,
|
68
|
+
boolean_false: true,
|
69
|
+
array_of_string: ["a", "a", "a"],
|
70
|
+
array_of_integer: [1, 1, 1],
|
71
|
+
null: 999
|
72
|
+
)
|
73
|
+
level.set_group(:group2,
|
74
|
+
message: "hello there"
|
75
|
+
)
|
76
|
+
level
|
77
|
+
}
|
78
|
+
|
79
|
+
let(:env) {
|
80
|
+
{
|
81
|
+
"TYPES_STRING" => "hello",
|
82
|
+
"TYPES_INTEGER" => "123",
|
83
|
+
"TYPES_FLOAT" => "1.5",
|
84
|
+
"TYPES_BOOLEAN_TRUE" => "true",
|
85
|
+
"TYPES_BOOLEAN_FALSE" => "false",
|
86
|
+
"TYPES_ARRAY_OF_STRING" => "a:b:c",
|
87
|
+
"TYPES_ARRAY_OF_INTEGER" => "1:2:3",
|
88
|
+
"TYPES_NULL" => "",
|
89
|
+
"GROUP2_MESSAGE" => "hello world"
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
subject { read_system("the system", template.to_enum, nil, env) }
|
94
|
+
|
95
|
+
assert_sample_data_set
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "using a prefix" do
|
99
|
+
|
100
|
+
let(:template) {
|
101
|
+
level = Levels::Level.new("template level")
|
102
|
+
level.set_group(:group,
|
103
|
+
message: "hello there"
|
104
|
+
)
|
105
|
+
level
|
106
|
+
}
|
107
|
+
|
108
|
+
let(:env) {
|
109
|
+
{
|
110
|
+
"PREFIX_GROUP_MESSAGE" => "hello world"
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
subject { read_system("the system", template.to_enum, "PREFIX_", env) }
|
115
|
+
|
116
|
+
it "finds values" do
|
117
|
+
subject.group.message.must_equal "hello world"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "acceptance: read yaml" do
|
4
|
+
|
5
|
+
def read_yaml(level_name, yaml_string)
|
6
|
+
level = Levels::Level.new(level_name)
|
7
|
+
input = Levels::Input::YAML.new(yaml_string)
|
8
|
+
input.read(level)
|
9
|
+
level
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:yaml) {
|
13
|
+
<<-YAML
|
14
|
+
types:
|
15
|
+
string: hello
|
16
|
+
integer: 123
|
17
|
+
float: 1.5
|
18
|
+
boolean_true: true
|
19
|
+
boolean_false: false
|
20
|
+
array_of_string:
|
21
|
+
- a
|
22
|
+
- b
|
23
|
+
- c
|
24
|
+
array_of_integer:
|
25
|
+
- 1
|
26
|
+
- 2
|
27
|
+
- 3
|
28
|
+
"null": null
|
29
|
+
group2:
|
30
|
+
message: hello world
|
31
|
+
YAML
|
32
|
+
}
|
33
|
+
|
34
|
+
subject { read_yaml("test", yaml) }
|
35
|
+
|
36
|
+
assert_sample_data_set
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "acceptance: the Setup" do
|
4
|
+
|
5
|
+
subject { Levels::Setup.new }
|
6
|
+
|
7
|
+
describe "reading various inputs" do
|
8
|
+
|
9
|
+
let(:ruby_code) do
|
10
|
+
<<-RUBY
|
11
|
+
group :group
|
12
|
+
set a: 1
|
13
|
+
RUBY
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:json_code) do
|
17
|
+
<<-JSON
|
18
|
+
{
|
19
|
+
"group": {
|
20
|
+
"a": 1
|
21
|
+
}
|
22
|
+
}
|
23
|
+
JSON
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:yaml_code) do
|
27
|
+
<<-YAML
|
28
|
+
---
|
29
|
+
group:
|
30
|
+
a: 1
|
31
|
+
YAML
|
32
|
+
end
|
33
|
+
|
34
|
+
it "adds a custom source" do
|
35
|
+
custom_input = Class.new do
|
36
|
+
def read(level)
|
37
|
+
level.set_group(:group, a: 1)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
custom = custom_input.new
|
41
|
+
|
42
|
+
subject.add("custom", custom)
|
43
|
+
subject.merge.group.a.must_equal 1
|
44
|
+
end
|
45
|
+
|
46
|
+
it "adds ruby code" do
|
47
|
+
subject.add("code", ruby_code)
|
48
|
+
subject.merge.group.a.must_equal 1
|
49
|
+
end
|
50
|
+
|
51
|
+
it "adds JSON code" do
|
52
|
+
subject.add("code", json_code)
|
53
|
+
subject.merge.group.a.must_equal 1
|
54
|
+
end
|
55
|
+
|
56
|
+
it "adds YAML code" do
|
57
|
+
subject.add("code", yaml_code)
|
58
|
+
subject.merge.group.a.must_equal 1
|
59
|
+
end
|
60
|
+
|
61
|
+
it "adds a ruby file" do
|
62
|
+
file = w("input.rb", ruby_code)
|
63
|
+
subject.add("file", file.to_s)
|
64
|
+
subject.merge.group.a.must_equal 1
|
65
|
+
end
|
66
|
+
|
67
|
+
it "adds a JSON file" do
|
68
|
+
file = w("input.json", json_code)
|
69
|
+
subject.add("file", file.to_s)
|
70
|
+
subject.merge.group.a.must_equal 1
|
71
|
+
end
|
72
|
+
|
73
|
+
it "adds a YAML file (.yml)" do
|
74
|
+
file = w("input.yml", yaml_code)
|
75
|
+
subject.add("file", file.to_s)
|
76
|
+
subject.merge.group.a.must_equal 1
|
77
|
+
end
|
78
|
+
|
79
|
+
it "adds a YAML file (.yaml)" do
|
80
|
+
file = w("input.yaml", yaml_code)
|
81
|
+
subject.add("file", file.to_s)
|
82
|
+
subject.merge.group.a.must_equal 1
|
83
|
+
end
|
84
|
+
|
85
|
+
it "adds system variables" do
|
86
|
+
begin
|
87
|
+
subject.add "code", '{ "group": { "a": 0 } }'
|
88
|
+
subject.add_system
|
89
|
+
ENV['GROUP_A'] = '1'
|
90
|
+
subject.merge.group.a.must_equal 1
|
91
|
+
ensure
|
92
|
+
ENV.delete('GROUP_A')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it "adds system variables with a prefix" do
|
97
|
+
begin
|
98
|
+
subject.add "code", '{ "group": { "a": 0 } }'
|
99
|
+
subject.add_system 'PFX_'
|
100
|
+
ENV['PFX_GROUP_A'] = '1'
|
101
|
+
subject.merge.group.a.must_equal 1
|
102
|
+
ensure
|
103
|
+
ENV.delete('PFX_GROUP_A')
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it "adds a Level" do
|
108
|
+
level = Levels::Level.new("test")
|
109
|
+
level.set_group(:group, a: 1)
|
110
|
+
|
111
|
+
subject.add_level(level)
|
112
|
+
subject.merge.group.a.must_equal 1
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "acceptance: write json" do
|
4
|
+
|
5
|
+
def write_json(level)
|
6
|
+
output = Levels::Output::JSON.new
|
7
|
+
output.generate(level.to_enum)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "converts to JSON" do
|
11
|
+
output = write_json(standard_data_types_level)
|
12
|
+
output.must_equal <<-JSON.chomp
|
13
|
+
{
|
14
|
+
"types": {
|
15
|
+
"string": "hello",
|
16
|
+
"integer": 123,
|
17
|
+
"float": 1.5,
|
18
|
+
"boolean_true": true,
|
19
|
+
"boolean_false": false,
|
20
|
+
"array_of_string": [
|
21
|
+
"a",
|
22
|
+
"b",
|
23
|
+
"c"
|
24
|
+
],
|
25
|
+
"array_of_integer": [
|
26
|
+
1,
|
27
|
+
2,
|
28
|
+
3
|
29
|
+
],
|
30
|
+
"null": null
|
31
|
+
},
|
32
|
+
"group2": {
|
33
|
+
"message": "hello world"
|
34
|
+
}
|
35
|
+
}
|
36
|
+
JSON
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "acceptance: write system" do
|
4
|
+
|
5
|
+
def write_system(level, prefix = nil)
|
6
|
+
key_formatter = Levels::System::KeyFormatter.new(prefix)
|
7
|
+
output = Levels::Output::System.new(key_formatter)
|
8
|
+
output.generate(level.to_enum)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "converts to ENV variables" do
|
12
|
+
output = write_system(standard_data_types_level)
|
13
|
+
output.must_equal <<-ENV.chomp
|
14
|
+
export TYPES_STRING="hello"
|
15
|
+
export TYPES_STRING_TYPE="string"
|
16
|
+
export TYPES_INTEGER="123"
|
17
|
+
export TYPES_INTEGER_TYPE="integer"
|
18
|
+
export TYPES_FLOAT="1.5"
|
19
|
+
export TYPES_FLOAT_TYPE="float"
|
20
|
+
export TYPES_BOOLEAN_TRUE="true"
|
21
|
+
export TYPES_BOOLEAN_TRUE_TYPE="boolean"
|
22
|
+
export TYPES_BOOLEAN_FALSE="false"
|
23
|
+
export TYPES_BOOLEAN_FALSE_TYPE="boolean"
|
24
|
+
export TYPES_ARRAY_OF_STRING="a:b:c"
|
25
|
+
export TYPES_ARRAY_OF_STRING_TYPE="array"
|
26
|
+
export TYPES_ARRAY_OF_STRING_DELIMITER=":"
|
27
|
+
export TYPES_ARRAY_OF_STRING_TYPE_TYPE="string"
|
28
|
+
export TYPES_ARRAY_OF_INTEGER="1:2:3"
|
29
|
+
export TYPES_ARRAY_OF_INTEGER_TYPE="array"
|
30
|
+
export TYPES_ARRAY_OF_INTEGER_DELIMITER=":"
|
31
|
+
export TYPES_ARRAY_OF_INTEGER_TYPE_TYPE="integer"
|
32
|
+
export TYPES_NULL=""
|
33
|
+
export TYPES_NULL_TYPE="string"
|
34
|
+
export GROUP2_MESSAGE="hello world"
|
35
|
+
export GROUP2_MESSAGE_TYPE="string"
|
36
|
+
ENV
|
37
|
+
end
|
38
|
+
|
39
|
+
it "converts to ENV variables with a prefix" do
|
40
|
+
output = write_system(standard_data_types_level, "FOO_")
|
41
|
+
output.must_equal <<-ENV.chomp
|
42
|
+
export FOO_TYPES_STRING="hello"
|
43
|
+
export FOO_TYPES_STRING_TYPE="string"
|
44
|
+
export FOO_TYPES_INTEGER="123"
|
45
|
+
export FOO_TYPES_INTEGER_TYPE="integer"
|
46
|
+
export FOO_TYPES_FLOAT="1.5"
|
47
|
+
export FOO_TYPES_FLOAT_TYPE="float"
|
48
|
+
export FOO_TYPES_BOOLEAN_TRUE="true"
|
49
|
+
export FOO_TYPES_BOOLEAN_TRUE_TYPE="boolean"
|
50
|
+
export FOO_TYPES_BOOLEAN_FALSE="false"
|
51
|
+
export FOO_TYPES_BOOLEAN_FALSE_TYPE="boolean"
|
52
|
+
export FOO_TYPES_ARRAY_OF_STRING="a:b:c"
|
53
|
+
export FOO_TYPES_ARRAY_OF_STRING_TYPE="array"
|
54
|
+
export FOO_TYPES_ARRAY_OF_STRING_DELIMITER=":"
|
55
|
+
export FOO_TYPES_ARRAY_OF_STRING_TYPE_TYPE="string"
|
56
|
+
export FOO_TYPES_ARRAY_OF_INTEGER="1:2:3"
|
57
|
+
export FOO_TYPES_ARRAY_OF_INTEGER_TYPE="array"
|
58
|
+
export FOO_TYPES_ARRAY_OF_INTEGER_DELIMITER=":"
|
59
|
+
export FOO_TYPES_ARRAY_OF_INTEGER_TYPE_TYPE="integer"
|
60
|
+
export FOO_TYPES_NULL=""
|
61
|
+
export FOO_TYPES_NULL_TYPE="string"
|
62
|
+
export FOO_GROUP2_MESSAGE="hello world"
|
63
|
+
export FOO_GROUP2_MESSAGE_TYPE="string"
|
64
|
+
ENV
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "acceptance: write yaml" do
|
4
|
+
|
5
|
+
def write_yaml(level)
|
6
|
+
output = Levels::Output::YAML.new
|
7
|
+
output.generate(level.to_enum)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "converts to YAML" do
|
11
|
+
output = write_yaml(standard_data_types_level)
|
12
|
+
output.must_equal <<-JSON.sub(/'null':$/, '\0 ') # Handle trailing space for null.
|
13
|
+
---
|
14
|
+
types:
|
15
|
+
string: hello
|
16
|
+
integer: 123
|
17
|
+
float: 1.5
|
18
|
+
boolean_true: true
|
19
|
+
boolean_false: false
|
20
|
+
array_of_string:
|
21
|
+
- a
|
22
|
+
- b
|
23
|
+
- c
|
24
|
+
array_of_integer:
|
25
|
+
- 1
|
26
|
+
- 2
|
27
|
+
- 3
|
28
|
+
'null':
|
29
|
+
group2:
|
30
|
+
message: hello world
|
31
|
+
JSON
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe "bin: merge" do
|
4
|
+
|
5
|
+
let(:ruby_syntax) do
|
6
|
+
<<-STR
|
7
|
+
group :sample
|
8
|
+
set message: "hello"
|
9
|
+
STR
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:json_syntax) do
|
13
|
+
<<-STR
|
14
|
+
{
|
15
|
+
"sample": {
|
16
|
+
"message": "hello"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
STR
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:yaml_syntax) do
|
23
|
+
<<-STR
|
24
|
+
---
|
25
|
+
sample:
|
26
|
+
message: hello
|
27
|
+
STR
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:system_syntax) do
|
31
|
+
<<-STR
|
32
|
+
export SAMPLE_MESSAGE="hello"
|
33
|
+
export SAMPLE_MESSAGE_TYPE="string"
|
34
|
+
STR
|
35
|
+
end
|
36
|
+
|
37
|
+
let(:system_syntax_with_prefix) do
|
38
|
+
<<-STR
|
39
|
+
export FOO_SAMPLE_MESSAGE="hello"
|
40
|
+
export FOO_SAMPLE_MESSAGE_TYPE="string"
|
41
|
+
STR
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:merged_json_syntax) do
|
45
|
+
<<-STR
|
46
|
+
{
|
47
|
+
"sample": {
|
48
|
+
"message": "goodbye"
|
49
|
+
}
|
50
|
+
}
|
51
|
+
STR
|
52
|
+
end
|
53
|
+
|
54
|
+
let(:merged_system_keys) do
|
55
|
+
{
|
56
|
+
"SAMPLE_MESSAGE" => "goodbye",
|
57
|
+
"SAMPLE_MESSAGE_TYPE" => "string"
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
let(:merged_system_keys_with_prefix) do
|
62
|
+
{
|
63
|
+
"FOO_SAMPLE_MESSAGE" => "goodbye",
|
64
|
+
"FOO_SAMPLE_MESSAGE_TYPE" => "string"
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "reading files" do
|
69
|
+
|
70
|
+
it "reads a ruby file" do
|
71
|
+
w("one.rb", ruby_syntax)
|
72
|
+
assert_success "levels #{f 'one.rb'}"
|
73
|
+
stdout.must_equal json_syntax
|
74
|
+
end
|
75
|
+
|
76
|
+
it "reads a json file" do
|
77
|
+
w("one.json", json_syntax)
|
78
|
+
assert_success "levels #{f 'one.json'}"
|
79
|
+
stdout.must_equal json_syntax
|
80
|
+
end
|
81
|
+
|
82
|
+
it "reads a yaml file" do
|
83
|
+
w("one.yaml", yaml_syntax)
|
84
|
+
assert_success "levels #{f 'one.yaml'}"
|
85
|
+
stdout.must_equal json_syntax
|
86
|
+
end
|
87
|
+
|
88
|
+
it "reads a yml file" do
|
89
|
+
w("one.yml", yaml_syntax)
|
90
|
+
assert_success "levels #{f 'one.yml'}"
|
91
|
+
stdout.must_equal json_syntax
|
92
|
+
end
|
93
|
+
|
94
|
+
it "merges files" do
|
95
|
+
w("one.rb", ruby_syntax)
|
96
|
+
w("one.json", merged_json_syntax)
|
97
|
+
assert_success "levels #{f 'one.rb'} #{f 'one.json'}"
|
98
|
+
stdout.must_equal merged_json_syntax
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "reading the system" do
|
103
|
+
|
104
|
+
it "merges with the base" do
|
105
|
+
w("one.rb", ruby_syntax)
|
106
|
+
set_env merged_system_keys
|
107
|
+
assert_success "levels --system #{f 'one.rb'}"
|
108
|
+
stdout.must_equal merged_json_syntax
|
109
|
+
end
|
110
|
+
|
111
|
+
it "merges with the base with a prefix" do
|
112
|
+
w("one.rb", ruby_syntax)
|
113
|
+
set_env merged_system_keys_with_prefix
|
114
|
+
assert_success "levels --system FOO_ #{f 'one.rb'}"
|
115
|
+
stdout.must_equal merged_json_syntax
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "writing output" do
|
120
|
+
|
121
|
+
it "writes json" do
|
122
|
+
w("one.rb", ruby_syntax)
|
123
|
+
assert_success "levels --output json #{f 'one.rb'}"
|
124
|
+
stdout.must_equal json_syntax
|
125
|
+
end
|
126
|
+
|
127
|
+
it "writes yaml" do
|
128
|
+
w("one.rb", ruby_syntax)
|
129
|
+
assert_success "levels --output yaml #{f 'one.rb'}"
|
130
|
+
stdout.must_equal yaml_syntax
|
131
|
+
end
|
132
|
+
|
133
|
+
it "writes system" do
|
134
|
+
w("one.rb", ruby_syntax)
|
135
|
+
assert_success "levels --output system #{f 'one.rb'}"
|
136
|
+
stdout.must_equal system_syntax
|
137
|
+
end
|
138
|
+
|
139
|
+
it "writes system with a prefix" do
|
140
|
+
w("one.rb", ruby_syntax)
|
141
|
+
assert_success "levels --output system --prefix FOO_ #{f 'one.rb'}"
|
142
|
+
stdout.must_equal system_syntax_with_prefix
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "logging" do
|
147
|
+
|
148
|
+
it "logs each file read" do
|
149
|
+
w("one.rb", ruby_syntax)
|
150
|
+
w("one.json", json_syntax)
|
151
|
+
assert_success "levels --no-output #{f 'one.rb'} #{f 'one.json'}"
|
152
|
+
stderr.must_equal <<-STR
|
153
|
+
Add level "one.rb" from one.rb
|
154
|
+
Add level "one.json" from one.json
|
155
|
+
STR
|
156
|
+
stdout.must_equal ""
|
157
|
+
end
|
158
|
+
|
159
|
+
it "logs when the files are given level names" do
|
160
|
+
w("one.rb", ruby_syntax)
|
161
|
+
w("two.rb", ruby_syntax)
|
162
|
+
w("one.json", json_syntax)
|
163
|
+
w("three.rb", ruby_syntax)
|
164
|
+
assert_success "levels --no-output --level 'RB one' --level --level 'JSON one' #{f 'one.rb'} #{f 'two.rb'} #{f 'one.json'} #{f 'three.rb'}"
|
165
|
+
stderr.must_equal <<-STR
|
166
|
+
Add level "RB one" from one.rb
|
167
|
+
Add level "two.rb" from two.rb
|
168
|
+
Add level "JSON one" from one.json
|
169
|
+
Add level "three.rb" from three.rb
|
170
|
+
STR
|
171
|
+
stdout.must_equal ""
|
172
|
+
end
|
173
|
+
|
174
|
+
it "logs when the system is used" do
|
175
|
+
w("one.rb", ruby_syntax)
|
176
|
+
assert_success "levels --no-output --system --level 'First Level' #{f 'one.rb'}"
|
177
|
+
stderr.must_equal <<-STR
|
178
|
+
Add level "First Level" from one.rb
|
179
|
+
Add level "System Environment"
|
180
|
+
STR
|
181
|
+
stdout.must_equal ""
|
182
|
+
end
|
183
|
+
|
184
|
+
it "logs when the system is used with a prefix" do
|
185
|
+
w("one.rb", ruby_syntax)
|
186
|
+
assert_success "levels --no-output --system FOO_ --level 'First Level' #{f 'one.rb'}"
|
187
|
+
stderr.must_equal <<-STR
|
188
|
+
Add level "First Level" from one.rb
|
189
|
+
Add level "System Environment" with prefix FOO_
|
190
|
+
STR
|
191
|
+
stdout.must_equal ""
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|