qonfig 0.25.0 → 0.26.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.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/.rubocop.yml +19 -1
  4. data/.travis.yml +7 -2
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile.lock +102 -0
  7. data/README.md +2 -0
  8. data/gemfiles/with_external_deps.gemfile.lock +112 -0
  9. data/gemfiles/without_external_deps.gemfile.lock +102 -0
  10. data/lib/qonfig.rb +1 -1
  11. data/lib/qonfig/commands/definition/load_from_env.rb +2 -0
  12. data/lib/qonfig/commands/definition/load_from_env/value_converter.rb +2 -0
  13. data/lib/qonfig/imports/direct_key.rb +8 -2
  14. data/lib/qonfig/imports/mappings.rb +8 -2
  15. data/lib/qonfig/loaders/basic.rb +2 -0
  16. data/lib/qonfig/loaders/json.rb +2 -1
  17. data/lib/qonfig/settings.rb +5 -1
  18. data/lib/qonfig/settings/key_matcher.rb +1 -1
  19. data/lib/qonfig/uploaders/base.rb +2 -0
  20. data/lib/qonfig/uploaders/yaml.rb +2 -0
  21. data/lib/qonfig/version.rb +1 -1
  22. data/qonfig.gemspec +4 -6
  23. data/sig/.keep +0 -0
  24. data/spec/features/clear_options_spec.rb +92 -0
  25. data/spec/features/compacted_config_spec.rb +308 -0
  26. data/spec/features/composition_spec.rb +207 -0
  27. data/spec/features/config_definition_and_representation_spec.rb +535 -0
  28. data/spec/features/definition_order_spec.rb +69 -0
  29. data/spec/features/dig_functionality_spec.rb +47 -0
  30. data/spec/features/dot_notation_spec.rb +159 -0
  31. data/spec/features/export_settings_spec.rb +138 -0
  32. data/spec/features/expose_json_spec.rb +281 -0
  33. data/spec/features/expose_self/format_option_dynamic_spec.rb +69 -0
  34. data/spec/features/expose_self/format_option_json_spec.rb +74 -0
  35. data/spec/features/expose_self/format_option_unsupported_spec.rb +27 -0
  36. data/spec/features/expose_self/format_option_yaml_spec.rb +77 -0
  37. data/spec/features/expose_self_spec.rb +97 -0
  38. data/spec/features/expose_yaml_spec.rb +263 -0
  39. data/spec/features/freeze_state_spec.rb +122 -0
  40. data/spec/features/get_config_keys_spec.rb +62 -0
  41. data/spec/features/get_config_values_spec.rb +41 -0
  42. data/spec/features/has_a_key_spec.rb +48 -0
  43. data/spec/features/import_settings_spec.rb +323 -0
  44. data/spec/features/indifferent_access_spec.rb +57 -0
  45. data/spec/features/inheritance_spec.rb +110 -0
  46. data/spec/features/instantiation_without_class_definition_spec.rb +59 -0
  47. data/spec/features/iteration_over_setting_keys_spec.rb +48 -0
  48. data/spec/features/load_from_env_spec.rb +240 -0
  49. data/spec/features/load_from_json_spec.rb +97 -0
  50. data/spec/features/load_from_self/format_option_json_spec.rb +31 -0
  51. data/spec/features/load_from_self/format_option_unsupported_spec.rb +27 -0
  52. data/spec/features/load_from_self/format_option_yaml_spec.rb +49 -0
  53. data/spec/features/load_from_self/with_erb_instructions_spec.rb +33 -0
  54. data/spec/features/load_from_self/with_hash_like_data_representation_spec.rb +66 -0
  55. data/spec/features/load_from_self/with_non_hash_like_data_representation_spec.rb +19 -0
  56. data/spec/features/load_from_self/without_end_data_spec.rb +11 -0
  57. data/spec/features/load_from_yaml_spec.rb +110 -0
  58. data/spec/features/load_setting_values_from_file/by_instance_method_examples.rb +171 -0
  59. data/spec/features/load_setting_values_from_file/by_macros_examples.rb +165 -0
  60. data/spec/features/load_setting_values_from_file/load_from_json_spec.rb +21 -0
  61. data/spec/features/load_setting_values_from_file/load_from_self/json_format/end_data_with_env_spec.rb +100 -0
  62. data/spec/features/load_setting_values_from_file/load_from_self/json_format/with_end_data_spec.rb +129 -0
  63. data/spec/features/load_setting_values_from_file/load_from_self/json_format/with_incorrect_end_data_spec.rb +34 -0
  64. data/spec/features/load_setting_values_from_file/load_from_self/json_format/without_end_data_spec.rb +65 -0
  65. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/end_data_with_env_spec.rb +94 -0
  66. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/with_end_data_spec.rb +126 -0
  67. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/with_incorrect_end_data_spec.rb +32 -0
  68. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/without_end_data_spec.rb +65 -0
  69. data/spec/features/load_setting_values_from_file/load_from_yaml_spec.rb +21 -0
  70. data/spec/features/load_setting_values_from_file/shared_behavior_spec.rb +33 -0
  71. data/spec/features/mixin_spec.rb +387 -0
  72. data/spec/features/non_redefineable_core_methods_spec.rb +29 -0
  73. data/spec/features/plugins/pretty_print_spec.rb +86 -0
  74. data/spec/features/plugins/toml/expose_self/format_option_toml_spec.rb +71 -0
  75. data/spec/features/plugins/toml/expose_toml_spec.rb +221 -0
  76. data/spec/features/plugins/toml/load_from_self/format_option_toml_spec.rb +27 -0
  77. data/spec/features/plugins/toml/load_from_toml_spec.rb +109 -0
  78. data/spec/features/plugins/toml/load_setting_values_from_file/load_from_toml_spec.rb +27 -0
  79. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/end_data_with_env_spec.rb +95 -0
  80. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/with_end_data_spec.rb +125 -0
  81. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/with_incorrect_end_data_spec.rb +34 -0
  82. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/without_end_data_spec.rb +65 -0
  83. data/spec/features/plugins/toml/load_setting_values_from_file/shared_behavior_spec.rb +34 -0
  84. data/spec/features/plugins/toml/save_to_toml_spec.rb +149 -0
  85. data/spec/features/plugins/vault/expose_vault_spec.rb +117 -0
  86. data/spec/features/plugins/vault/load_from_vault_spec.rb +80 -0
  87. data/spec/features/plugins_spec.rb +89 -0
  88. data/spec/features/reload_spec.rb +75 -0
  89. data/spec/features/run_code_with_temporary_settings_spec.rb +104 -0
  90. data/spec/features/save_to_file/save_to_json_spec.rb +157 -0
  91. data/spec/features/save_to_file/save_to_yaml_spec.rb +189 -0
  92. data/spec/features/settings_as_predicates_spec.rb +47 -0
  93. data/spec/features/settings_redefinition_spec.rb +30 -0
  94. data/spec/features/slice_functionality_spec.rb +69 -0
  95. data/spec/features/subset_functionality_spec.rb +49 -0
  96. data/spec/features/validation_spec.rb +916 -0
  97. data/spec/fixtures/array_settings.yml +3 -0
  98. data/spec/fixtures/expose_json/incompatible_root_structure.json +6 -0
  99. data/spec/fixtures/expose_json/incompatible_structure.json +4 -0
  100. data/spec/fixtures/expose_json/project.development.json +7 -0
  101. data/spec/fixtures/expose_json/project.json +30 -0
  102. data/spec/fixtures/expose_json/project.production.json +7 -0
  103. data/spec/fixtures/expose_json/project.staging.json +7 -0
  104. data/spec/fixtures/expose_json/project.test.json +7 -0
  105. data/spec/fixtures/expose_yaml/incompatible_structure.yml +2 -0
  106. data/spec/fixtures/expose_yaml/project.development.yml +4 -0
  107. data/spec/fixtures/expose_yaml/project.production.yml +4 -0
  108. data/spec/fixtures/expose_yaml/project.staging.yml +4 -0
  109. data/spec/fixtures/expose_yaml/project.test.yml +4 -0
  110. data/spec/fixtures/expose_yaml/project.yml +25 -0
  111. data/spec/fixtures/json_array_sample.json +14 -0
  112. data/spec/fixtures/json_object_sample.json +9 -0
  113. data/spec/fixtures/json_with_empty_object.json +6 -0
  114. data/spec/fixtures/json_with_erb.json +6 -0
  115. data/spec/fixtures/plugins/toml/expose_toml/project.development.toml +4 -0
  116. data/spec/fixtures/plugins/toml/expose_toml/project.production.toml +4 -0
  117. data/spec/fixtures/plugins/toml/expose_toml/project.staging.toml +4 -0
  118. data/spec/fixtures/plugins/toml/expose_toml/project.test.toml +4 -0
  119. data/spec/fixtures/plugins/toml/expose_toml/project.toml +27 -0
  120. data/spec/fixtures/plugins/toml/mini_file.toml +6 -0
  121. data/spec/fixtures/plugins/toml/toml_sample_with_all_types.toml +72 -0
  122. data/spec/fixtures/plugins/toml/values_file/with_env.toml +13 -0
  123. data/spec/fixtures/plugins/toml/values_file/without_env.toml +6 -0
  124. data/spec/fixtures/rubocop_settings.yml +12 -0
  125. data/spec/fixtures/shared_settings_with_aliases.yml +10 -0
  126. data/spec/fixtures/travis_settings.yml +6 -0
  127. data/spec/fixtures/values_file/with_env.json +19 -0
  128. data/spec/fixtures/values_file/with_env.yml +17 -0
  129. data/spec/fixtures/values_file/without_env.json +8 -0
  130. data/spec/fixtures/values_file/without_env.yml +5 -0
  131. data/spec/fixtures/with_empty_hash.yml +4 -0
  132. data/spec/fixtures/with_erb_instructions.yml +3 -0
  133. data/spec/spec_helper.rb +27 -0
  134. data/spec/support/meta_scopes.rb +20 -0
  135. data/spec/support/spec_support.rb +42 -0
  136. metadata +128 -11
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/LineLength, Style/Semicolon
4
+ shared_examples 'load setting values from file by instance methods' do |file_name:, file_with_env_name:, file_format:, load_by:|
5
+ specify "load values from #{file_format} file over existing (strict, explicit format, no env)" do
6
+ config = Class.new(Qonfig::DataSet) do
7
+ setting :enabled, true
8
+ setting :adapter, 'undefined'
9
+ setting(:credentials) { setting :user; setting :timeout }
10
+ end.new
11
+
12
+ config.public_send(load_by, file_name)
13
+
14
+ expect(config.settings.enabled).to eq(false)
15
+ expect(config.settings.adapter).to eq('sidekiq')
16
+ expect(config.settings.credentials.user).to eq('0exp')
17
+ expect(config.settings.credentials.timeout).to eq(123)
18
+ end
19
+
20
+ specify "load values from #{file_format} file (strict, dynamic format, no env)" do
21
+ config = Class.new(Qonfig::DataSet) do
22
+ setting :enabled, nil
23
+ setting :adapter, 'no-adapter'
24
+ setting(:credentials) { setting :user; setting :timeout }
25
+ end.new
26
+
27
+ config.load_from_file(file_name)
28
+
29
+ expect(config.settings.enabled).to eq(false)
30
+ expect(config.settings.adapter).to eq('sidekiq')
31
+ expect(config.settings.credentials.user).to eq('0exp')
32
+ expect(config.settings.credentials.timeout).to eq(123)
33
+ end
34
+
35
+ specify 'support for Pathname in file path' do
36
+ config = Class.new(Qonfig::DataSet) do
37
+ setting :enabled, true
38
+ setting :adapter, 'undefined'
39
+ setting(:credentials) { setting :user; setting :timeout }
40
+ end.new
41
+
42
+ config.public_send(load_by, Pathname.new(file_name))
43
+
44
+ expect(config.settings.enabled).to eq(false)
45
+ expect(config.settings.adapter).to eq('sidekiq')
46
+ expect(config.settings.credentials.user).to eq('0exp')
47
+ expect(config.settings.credentials.timeout).to eq(123)
48
+ end
49
+
50
+ specify 'provides "do |config|" ability' do
51
+ config = Class.new(Qonfig::DataSet) do
52
+ setting :enabled, nil
53
+ setting :adapter, 'no-adapter'
54
+ setting(:credentials) { setting :user; setting :timeout }
55
+ end.new
56
+
57
+ config.public_send(load_by, file_name) do |conf|
58
+ conf.enabled = true
59
+ conf.credentials.user = 'do_config'
60
+ conf.credentials.timeout = 0
61
+ end
62
+
63
+ expect(config.settings.enabled).to eq(true) # from do-config
64
+ expect(config.settings.adapter).to eq('sidekiq')
65
+ expect(config.settings.credentials.user).to eq('do_config') # from do-config
66
+ expect(config.settings.credentials.timeout).to eq(0) # from do-config
67
+
68
+ config.public_send(load_by, file_with_env_name, expose: :test) do |conf|
69
+ conf.credentials.user = 'super_expose_test'
70
+ end
71
+
72
+ expect(config.settings.enabled).to eq(false)
73
+ expect(config.settings.adapter).to eq('sidekiq')
74
+ expect(config.settings.credentials.user).to eq('super_expose_test') # from do-config
75
+ expect(config.settings.credentials.timeout).to eq(321)
76
+
77
+ config.public_send(load_by, file_with_env_name, expose: :production) do |conf|
78
+ conf.adapter = 'overwatch'
79
+ end
80
+
81
+ expect(config.settings.enabled).to eq(true)
82
+ expect(config.settings.adapter).to eq('overwatch') # from do-config
83
+ expect(config.settings.credentials.user).to eq('0exp')
84
+ expect(config.settings.credentials.timeout).to eq(123)
85
+ end
86
+
87
+ specify 'can expose environment-based settings defined by key' do
88
+ config = Class.new(Qonfig::DataSet) do
89
+ setting :enabled, true
90
+ setting :adapter, 'resque'
91
+ setting(:credentials) { setting :user; setting :timeout }
92
+ end.new
93
+
94
+ config.public_send(load_by, file_with_env_name, expose: :test)
95
+
96
+ expect(config.settings.enabled).to eq(false)
97
+ expect(config.settings.adapter).to eq('sidekiq')
98
+ expect(config.settings.credentials.user).to eq('D@iVeR')
99
+ expect(config.settings.credentials.timeout).to eq(321)
100
+
101
+ config.public_send(load_by, file_with_env_name, expose: :production)
102
+
103
+ expect(config.settings.enabled).to eq(true)
104
+ expect(config.settings.adapter).to eq('que')
105
+ expect(config.settings.credentials.user).to eq('0exp')
106
+ expect(config.settings.credentials.timeout).to eq(123)
107
+ end
108
+
109
+ specify 'fails when file does not exist (default strict behavior (strict: true))' do
110
+ config = nil
111
+ nonexistent_file = SpecSupport.fixture_path('values_file', "atata.#{file_format}")
112
+
113
+ expect do
114
+ config = Class.new(Qonfig::DataSet) do
115
+ setting :enabled, true
116
+ setting :adapter, 'undefined'
117
+ setting(:credentials) { setting :user; setting :timeout }
118
+ end.new
119
+
120
+ config.public_send(load_by, nonexistent_file)
121
+ end.to raise_error(Qonfig::FileNotFoundError)
122
+
123
+ # NOTE: check that original settings has original values
124
+ expect(config.settings.enabled).to eq(true)
125
+ expect(config.settings.adapter).to eq('undefined')
126
+ expect(config.settings.credentials.user).to eq(nil)
127
+ expect(config.settings.credentials.timeout).to eq(nil)
128
+ end
129
+
130
+ specify 'does not fail when file does not exist and strict behaviour is disabled (strict: false)' do
131
+ nonexistent_file = SpecSupport.fixture_path('values_file', "atata.#{file_format}")
132
+
133
+ config = Class.new(Qonfig::DataSet) do
134
+ setting :enabled, true
135
+ setting :adapter, 'undefined'
136
+ setting(:credentials) { setting :user; setting :timeout }
137
+ end.new
138
+
139
+ expect { config.public_send(load_by, nonexistent_file, strict: false) }.not_to raise_error
140
+
141
+ # NOTE: check that original settings has original values
142
+ expect(config.settings.enabled).to eq(true)
143
+ expect(config.settings.adapter).to eq('undefined')
144
+ expect(config.settings.credentials.user).to eq(nil)
145
+ expect(config.settings.credentials.timeout).to eq(nil)
146
+ end
147
+
148
+ specify 'fails when method attributes are incorrect' do
149
+ config = Class.new(Qonfig::DataSet) do
150
+ setting :enabled, true
151
+ setting :adapter, 'undefined'
152
+ setting(:credentials) { setting :user; setting :timeout }
153
+ end.new
154
+
155
+ # incorrect file path
156
+ expect do
157
+ config.public_send(load_by, 123)
158
+ end.to raise_error(Qonfig::ArgumentError)
159
+
160
+ # incorrect :expose
161
+ expect do
162
+ config.public_send(load_by, file_name, expose: 123)
163
+ end.to raise_error(Qonfig::ArgumentError)
164
+
165
+ # incorrect :strict
166
+ expect do
167
+ config.public_send(load_by, file_name, strict: 123)
168
+ end.to raise_error(Qonfig::ArgumentError)
169
+ end
170
+ end
171
+ # rubocop:enable Layout/LineLength, Style/Semicolon
@@ -0,0 +1,165 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/LineLength, Style/Semicolon
4
+ shared_examples 'load setting values from file by macros' do |file_name:, file_with_env_name:, file_format:|
5
+ specify "load values from #{file_format} file over existing (non-strict, explicit format, no env)" do
6
+ config = Class.new(Qonfig::DataSet) do
7
+ values_file file_name, format: file_format
8
+
9
+ setting :enabled, true
10
+ setting :adapter, 'undefined'
11
+ setting(:credentials) { setting :user; setting :timeout }
12
+ end.new
13
+
14
+ expect(config.settings.enabled).to eq(false)
15
+ expect(config.settings.adapter).to eq('sidekiq')
16
+ expect(config.settings.credentials.user).to eq('0exp')
17
+ expect(config.settings.credentials.timeout).to eq(123)
18
+ end
19
+
20
+ specify 'support for Pathname in file path' do
21
+ config = Class.new(Qonfig::DataSet) do
22
+ values_file Pathname.new(file_name), format: file_format
23
+
24
+ setting :enabled, true
25
+ setting :adapter, 'undefined'
26
+ setting(:credentials) { setting :user; setting :timeout }
27
+ end.new
28
+
29
+ expect(config.settings.enabled).to eq(false)
30
+ expect(config.settings.adapter).to eq('sidekiq')
31
+ expect(config.settings.credentials.user).to eq('0exp')
32
+ expect(config.settings.credentials.timeout).to eq(123)
33
+ end
34
+
35
+ specify 'works with inheritance and composition' do
36
+ base_config_klass = Class.new(Qonfig::DataSet) do
37
+ values_file file_name, format: file_format
38
+
39
+ setting :enabled, true
40
+ setting :adapter, 'undefined'
41
+ setting(:credentials) { setting :user; setting :timeout }
42
+ end
43
+
44
+ child_config_klass = Class.new(base_config_klass) do
45
+ compose base_config_klass
46
+ setting(:nested) { compose base_config_klass }
47
+ end
48
+
49
+ config = child_config_klass.new
50
+
51
+ expect(config.settings.enabled).to eq(false)
52
+ expect(config.settings.adapter).to eq('sidekiq')
53
+ expect(config.settings.credentials.user).to eq('0exp')
54
+ expect(config.settings.credentials.timeout).to eq(123)
55
+ expect(config.settings.nested.enabled).to eq(false)
56
+ expect(config.settings.nested.adapter).to eq('sidekiq')
57
+ expect(config.settings.nested.credentials.user).to eq('0exp')
58
+ expect(config.settings.nested.credentials.timeout).to eq(123)
59
+ end
60
+
61
+ specify "load values from #{file_format} file (non-strict, dynamic format, no env)" do
62
+ config = Class.new(Qonfig::DataSet) do
63
+ values_file file_name
64
+
65
+ setting :enabled, nil
66
+ setting :adapter, 'no-adapter'
67
+ setting(:credentials) { setting :user; setting :timeout }
68
+ end.new
69
+
70
+ expect(config.settings.enabled).to eq(false)
71
+ expect(config.settings.adapter).to eq('sidekiq')
72
+ expect(config.settings.credentials.user).to eq('0exp')
73
+ expect(config.settings.credentials.timeout).to eq(123)
74
+ end
75
+
76
+ specify 'can expose environment-based settings defined by key' do
77
+ test_config = Class.new(Qonfig::DataSet) do
78
+ values_file file_with_env_name, expose: :test
79
+
80
+ setting :enabled, true
81
+ setting :adapter, 'resque'
82
+ setting(:credentials) { setting :user; setting :timeout }
83
+ end.new
84
+
85
+ expect(test_config.settings.enabled).to eq(false)
86
+ expect(test_config.settings.adapter).to eq('sidekiq')
87
+ expect(test_config.settings.credentials.user).to eq('D@iVeR')
88
+ expect(test_config.settings.credentials.timeout).to eq(321)
89
+
90
+ production_config = Class.new(Qonfig::DataSet) do
91
+ values_file file_with_env_name, expose: :production
92
+
93
+ setting :enabled, true
94
+ setting :adapter, 'resque'
95
+ setting(:credentials) { setting :user; setting :timeout }
96
+ end.new
97
+
98
+ expect(production_config.settings.enabled).to eq(true)
99
+ expect(production_config.settings.adapter).to eq('que')
100
+ expect(production_config.settings.credentials.user).to eq('0exp')
101
+ expect(production_config.settings.credentials.timeout).to eq(123)
102
+ end
103
+
104
+ specify 'does not fails when file does not exist (default non-strict behavior)' do
105
+ config = nil
106
+
107
+ expect do
108
+ config = Class.new(Qonfig::DataSet) do
109
+ values_file SpecSupport.fixture_path('values_file', "atata.#{file_format}")
110
+
111
+ setting :enabled, true
112
+ setting :adapter, 'undefined'
113
+ setting(:credentials) { setting :user; setting :timeout }
114
+ end.new
115
+ end.not_to raise_error
116
+
117
+ expect do
118
+ # NOTE: (quietly :)) check that we can use expose param too :)
119
+ Class.new(Qonfig::DataSet) do
120
+ values_file SpecSupport.fixture_path('values_file', "atata.#{file_format}"), expose: :test
121
+ end.new
122
+ end.not_to raise_error
123
+
124
+ # NOTE: check that original settings has original values
125
+ expect(config.settings.enabled).to eq(true)
126
+ expect(config.settings.adapter).to eq('undefined')
127
+ expect(config.settings.credentials.user).to eq(nil)
128
+ expect(config.settings.credentials.timeout).to eq(nil)
129
+ end
130
+
131
+ specify 'fails when file does not exist (with configured strict behavior)' do
132
+ config_klass = Class.new(Qonfig::DataSet) do
133
+ values_file SpecSupport.fixture_path('values_file', "atata.#{file_format}"), strict: true
134
+
135
+ setting :enabled, true
136
+ setting :adapter, 'undefined'
137
+ setting(:credentials) { setting :user; setting :timeout }
138
+ end
139
+
140
+ expect { config_klass.new }.to raise_error(Qonfig::FileNotFoundError)
141
+ end
142
+
143
+ specify 'fails when method attributes are incorrect' do
144
+ # incorrect file path
145
+ expect do
146
+ Class.new(Qonfig::DataSet) { values_file 123 }
147
+ end.to raise_error(Qonfig::ArgumentError)
148
+
149
+ # incorrect :format
150
+ expect do
151
+ Class.new(Qonfig::DataSet) { values_file file_name, format: 123 }
152
+ end.to raise_error(Qonfig::ArgumentError)
153
+
154
+ # incorrect :expose
155
+ expect do
156
+ Class.new(Qonfig::DataSet) { values_file file_name, expose: 123 }
157
+ end.to raise_error(Qonfig::ArgumentError)
158
+
159
+ # incorrect :strict
160
+ expect do
161
+ Class.new(Qonfig::DataSet) { values_file file_name, strict: 123 }
162
+ end.to raise_error(Qonfig::ArgumentError)
163
+ end
164
+ end
165
+ # rubocop:enable Layout/LineLength, Style/Semicolon
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'by_macros_examples'
4
+ require_relative 'by_instance_method_examples'
5
+
6
+ describe 'Load setting values from JSON file' do
7
+ describe 'DSL macros (Qonfig::DataSet.values_file)' do
8
+ it_behaves_like 'load setting values from file by macros',
9
+ file_name: SpecSupport.fixture_path('values_file', 'without_env.json'),
10
+ file_with_env_name: SpecSupport.fixture_path('values_file', 'with_env.json'),
11
+ file_format: :json
12
+ end
13
+
14
+ describe 'Instance methods (Qonfig::DataSet#load_from_file/.load_from_json' do
15
+ it_behaves_like 'load setting values from file by instance methods',
16
+ file_name: SpecSupport.fixture_path('values_file', 'without_env.json'),
17
+ file_with_env_name: SpecSupport.fixture_path('values_file', 'with_env.json'),
18
+ load_by: :load_from_json,
19
+ file_format: :json
20
+ end
21
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe '.values_file / #load_from_self (__END__ data with env) (JSON format)' do
4
+ describe 'DSL macros' do
5
+ context '__END__ data has corresponding env key' do
6
+ let(:config_klass) do
7
+ Class.new(Qonfig::DataSet) do
8
+ values_file :self, format: :json, expose: :production
9
+
10
+ setting :user, 'D@iVeR'
11
+ setting :queue do
12
+ setting :adapter, 'que'
13
+ setting :concurrency, 2
14
+ end
15
+ end
16
+ end
17
+
18
+ specify 'loads setting values of corresponding environment' do
19
+ config = config_klass.new
20
+
21
+ expect(config.settings.user).to eq('iAmDaiveR')
22
+ expect(config.settings.queue.adapter).to eq('in_memory')
23
+ expect(config.settings.queue.concurrency).to eq(50)
24
+ end
25
+ end
26
+
27
+ context '__END__ data does not have correspodning env key' do
28
+ let(:config_klass) do
29
+ Class.new(Qonfig::DataSet) do
30
+ values_file :self, format: :json, expose: :staging
31
+
32
+ setting :user, 'D@iVeR'
33
+ setting :queue do
34
+ setting :adapter, 'que'
35
+ setting :concurrency, 2
36
+ end
37
+ end
38
+ end
39
+
40
+ specify 'ignrores values from __END__ data' do
41
+ config = config_klass.new
42
+
43
+ expect(config.settings.user).to eq('D@iVeR')
44
+ expect(config.settings.queue.adapter).to eq('que')
45
+ expect(config.settings.queue.concurrency).to eq(2)
46
+ end
47
+ end
48
+ end
49
+
50
+ describe 'Instance method' do
51
+ let(:config) do
52
+ Qonfig::DataSet.build do
53
+ setting :user, 'D@iVeR'
54
+ setting :queue do
55
+ setting :adapter, 'que'
56
+ setting :concurrency, 2
57
+ end
58
+ end
59
+ end
60
+
61
+ context '__END__ data has corresponding env key' do
62
+ specify 'loads setting values of corresponding environment' do
63
+ config.load_from_self(format: :json, expose: :production)
64
+
65
+ expect(config.settings.user).to eq('iAmDaiveR')
66
+ expect(config.settings.queue.adapter).to eq('in_memory')
67
+ expect(config.settings.queue.concurrency).to eq(50)
68
+ end
69
+ end
70
+
71
+ context '__END__ data does not have correspodning env key' do
72
+ specify 'ignrores values from __END__ data' do
73
+ config.load_from_self(format: :json, expose: :staging)
74
+
75
+ expect(config.settings.user).to eq('D@iVeR')
76
+ expect(config.settings.queue.adapter).to eq('que')
77
+ expect(config.settings.queue.concurrency).to eq(2)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ __END__
84
+
85
+ {
86
+ "test": {
87
+ "user": "0exp",
88
+ "queue": {
89
+ "adapter": "sidekiq",
90
+ "concurrency": 25
91
+ }
92
+ },
93
+ "production": {
94
+ "user": "iAmDaiveR",
95
+ "queue": {
96
+ "adapter": "in_memory",
97
+ "concurrency": 50
98
+ }
99
+ }
100
+ }