qonfig 0.24.0 → 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +62 -0
  3. data/.gitignore +0 -2
  4. data/.rubocop.yml +19 -1
  5. data/CHANGELOG.md +53 -0
  6. data/Gemfile +2 -0
  7. data/Gemfile.lock +129 -0
  8. data/LICENSE.txt +1 -1
  9. data/README.md +115 -5
  10. data/Rakefile +0 -1
  11. data/gemfiles/with_external_deps.gemfile +2 -0
  12. data/gemfiles/with_external_deps.gemfile.lock +123 -0
  13. data/gemfiles/without_external_deps.gemfile.lock +113 -0
  14. data/lib/qonfig/commands/definition/load_from_env/value_converter.rb +2 -0
  15. data/lib/qonfig/commands/definition/load_from_env.rb +2 -0
  16. data/lib/qonfig/data_set.rb +3 -0
  17. data/lib/qonfig/imports/direct_key.rb +8 -2
  18. data/lib/qonfig/imports/mappings.rb +8 -2
  19. data/lib/qonfig/loaders/basic.rb +2 -0
  20. data/lib/qonfig/loaders/json.rb +2 -1
  21. data/lib/qonfig/loaders/yaml.rb +3 -1
  22. data/lib/qonfig/plugins/pretty_print/requirements.rb +3 -0
  23. data/lib/qonfig/plugins/pretty_print.rb +1 -0
  24. data/lib/qonfig/plugins/toml/commands/definition/expose_toml.rb +3 -3
  25. data/lib/qonfig/plugins/vault/commands/definition/expose_vault.rb +142 -0
  26. data/lib/qonfig/plugins/vault/commands/definition/load_from_vault.rb +53 -0
  27. data/lib/qonfig/plugins/vault/dsl.rb +35 -0
  28. data/lib/qonfig/plugins/vault/errors.rb +9 -0
  29. data/lib/qonfig/plugins/vault/loaders/vault.rb +74 -0
  30. data/lib/qonfig/plugins/vault.rb +24 -0
  31. data/lib/qonfig/plugins.rb +1 -0
  32. data/lib/qonfig/settings/key_matcher.rb +3 -1
  33. data/lib/qonfig/settings.rb +83 -22
  34. data/lib/qonfig/uploaders/base.rb +2 -0
  35. data/lib/qonfig/uploaders/yaml.rb +2 -0
  36. data/lib/qonfig/version.rb +1 -1
  37. data/lib/qonfig.rb +4 -1
  38. data/qonfig.gemspec +9 -8
  39. data/sig/.keep +0 -0
  40. data/spec/artifacts/.keep +0 -0
  41. data/spec/features/clear_options_spec.rb +92 -0
  42. data/spec/features/compacted_config_spec.rb +308 -0
  43. data/spec/features/composition_spec.rb +207 -0
  44. data/spec/features/config_definition_and_representation_spec.rb +535 -0
  45. data/spec/features/definition_order_spec.rb +69 -0
  46. data/spec/features/dig_functionality_spec.rb +47 -0
  47. data/spec/features/dot_notation_spec.rb +159 -0
  48. data/spec/features/export_settings_spec.rb +138 -0
  49. data/spec/features/expose_json_spec.rb +281 -0
  50. data/spec/features/expose_self/format_option_dynamic_spec.rb +69 -0
  51. data/spec/features/expose_self/format_option_json_spec.rb +74 -0
  52. data/spec/features/expose_self/format_option_unsupported_spec.rb +27 -0
  53. data/spec/features/expose_self/format_option_yaml_spec.rb +77 -0
  54. data/spec/features/expose_self_spec.rb +97 -0
  55. data/spec/features/expose_yaml_spec.rb +263 -0
  56. data/spec/features/freeze_state_spec.rb +122 -0
  57. data/spec/features/get_config_keys_spec.rb +62 -0
  58. data/spec/features/get_config_values_spec.rb +41 -0
  59. data/spec/features/has_a_key_spec.rb +48 -0
  60. data/spec/features/import_settings_spec.rb +323 -0
  61. data/spec/features/indifferent_access_spec.rb +57 -0
  62. data/spec/features/inheritance_spec.rb +110 -0
  63. data/spec/features/instantiation_without_class_definition_spec.rb +59 -0
  64. data/spec/features/iteration_over_setting_keys_spec.rb +48 -0
  65. data/spec/features/load_from_env_spec.rb +240 -0
  66. data/spec/features/load_from_json_spec.rb +97 -0
  67. data/spec/features/load_from_self/format_option_json_spec.rb +31 -0
  68. data/spec/features/load_from_self/format_option_unsupported_spec.rb +27 -0
  69. data/spec/features/load_from_self/format_option_yaml_spec.rb +49 -0
  70. data/spec/features/load_from_self/with_erb_instructions_spec.rb +33 -0
  71. data/spec/features/load_from_self/with_hash_like_data_representation_spec.rb +66 -0
  72. data/spec/features/load_from_self/with_non_hash_like_data_representation_spec.rb +19 -0
  73. data/spec/features/load_from_self/without_end_data_spec.rb +11 -0
  74. data/spec/features/load_from_yaml_spec.rb +110 -0
  75. data/spec/features/load_setting_values_from_file/by_instance_method_examples.rb +171 -0
  76. data/spec/features/load_setting_values_from_file/by_macros_examples.rb +165 -0
  77. data/spec/features/load_setting_values_from_file/load_from_json_spec.rb +21 -0
  78. data/spec/features/load_setting_values_from_file/load_from_self/json_format/end_data_with_env_spec.rb +100 -0
  79. data/spec/features/load_setting_values_from_file/load_from_self/json_format/with_end_data_spec.rb +129 -0
  80. data/spec/features/load_setting_values_from_file/load_from_self/json_format/with_incorrect_end_data_spec.rb +34 -0
  81. data/spec/features/load_setting_values_from_file/load_from_self/json_format/without_end_data_spec.rb +65 -0
  82. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/end_data_with_env_spec.rb +94 -0
  83. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/with_end_data_spec.rb +126 -0
  84. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/with_incorrect_end_data_spec.rb +32 -0
  85. data/spec/features/load_setting_values_from_file/load_from_self/yaml_format/without_end_data_spec.rb +65 -0
  86. data/spec/features/load_setting_values_from_file/load_from_yaml_spec.rb +21 -0
  87. data/spec/features/load_setting_values_from_file/shared_behavior_spec.rb +33 -0
  88. data/spec/features/mixin_spec.rb +387 -0
  89. data/spec/features/non_redefineable_core_methods_spec.rb +29 -0
  90. data/spec/features/plugins/pretty_print_spec.rb +86 -0
  91. data/spec/features/plugins/toml/expose_self/format_option_toml_spec.rb +71 -0
  92. data/spec/features/plugins/toml/expose_toml_spec.rb +221 -0
  93. data/spec/features/plugins/toml/load_from_self/format_option_toml_spec.rb +27 -0
  94. data/spec/features/plugins/toml/load_from_toml_spec.rb +109 -0
  95. data/spec/features/plugins/toml/load_setting_values_from_file/load_from_toml_spec.rb +27 -0
  96. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/end_data_with_env_spec.rb +95 -0
  97. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/with_end_data_spec.rb +125 -0
  98. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/with_incorrect_end_data_spec.rb +34 -0
  99. data/spec/features/plugins/toml/load_setting_values_from_file/load_toml_from_self/without_end_data_spec.rb +65 -0
  100. data/spec/features/plugins/toml/load_setting_values_from_file/shared_behavior_spec.rb +34 -0
  101. data/spec/features/plugins/toml/save_to_toml_spec.rb +149 -0
  102. data/spec/features/plugins/vault/expose_vault_spec.rb +117 -0
  103. data/spec/features/plugins/vault/load_from_vault_spec.rb +80 -0
  104. data/spec/features/plugins_spec.rb +89 -0
  105. data/spec/features/reload_spec.rb +75 -0
  106. data/spec/features/run_code_with_temporary_settings_spec.rb +104 -0
  107. data/spec/features/save_to_file/save_to_json_spec.rb +157 -0
  108. data/spec/features/save_to_file/save_to_yaml_spec.rb +189 -0
  109. data/spec/features/settings_as_predicates_spec.rb +47 -0
  110. data/spec/features/settings_redefinition_spec.rb +30 -0
  111. data/spec/features/slice_functionality_spec.rb +69 -0
  112. data/spec/features/subset_functionality_spec.rb +49 -0
  113. data/spec/features/validation_spec.rb +919 -0
  114. data/spec/fixtures/array_settings.yml +3 -0
  115. data/spec/fixtures/expose_json/incompatible_root_structure.json +6 -0
  116. data/spec/fixtures/expose_json/incompatible_structure.json +4 -0
  117. data/spec/fixtures/expose_json/project.development.json +7 -0
  118. data/spec/fixtures/expose_json/project.json +30 -0
  119. data/spec/fixtures/expose_json/project.production.json +7 -0
  120. data/spec/fixtures/expose_json/project.staging.json +7 -0
  121. data/spec/fixtures/expose_json/project.test.json +7 -0
  122. data/spec/fixtures/expose_yaml/incompatible_structure.yml +2 -0
  123. data/spec/fixtures/expose_yaml/project.development.yml +4 -0
  124. data/spec/fixtures/expose_yaml/project.production.yml +4 -0
  125. data/spec/fixtures/expose_yaml/project.staging.yml +4 -0
  126. data/spec/fixtures/expose_yaml/project.test.yml +4 -0
  127. data/spec/fixtures/expose_yaml/project.yml +25 -0
  128. data/spec/fixtures/json_array_sample.json +14 -0
  129. data/spec/fixtures/json_object_sample.json +9 -0
  130. data/spec/fixtures/json_with_empty_object.json +6 -0
  131. data/spec/fixtures/json_with_erb.json +6 -0
  132. data/spec/fixtures/plugins/toml/expose_toml/project.development.toml +4 -0
  133. data/spec/fixtures/plugins/toml/expose_toml/project.production.toml +4 -0
  134. data/spec/fixtures/plugins/toml/expose_toml/project.staging.toml +4 -0
  135. data/spec/fixtures/plugins/toml/expose_toml/project.test.toml +4 -0
  136. data/spec/fixtures/plugins/toml/expose_toml/project.toml +27 -0
  137. data/spec/fixtures/plugins/toml/mini_file.toml +6 -0
  138. data/spec/fixtures/plugins/toml/toml_sample_with_all_types.toml +72 -0
  139. data/spec/fixtures/plugins/toml/values_file/with_env.toml +13 -0
  140. data/spec/fixtures/plugins/toml/values_file/without_env.toml +6 -0
  141. data/spec/fixtures/rubocop_settings.yml +12 -0
  142. data/spec/fixtures/shared_settings_with_aliases.yml +10 -0
  143. data/spec/fixtures/travis_settings.yml +6 -0
  144. data/spec/fixtures/values_file/with_env.json +19 -0
  145. data/spec/fixtures/values_file/with_env.yml +17 -0
  146. data/spec/fixtures/values_file/without_env.json +8 -0
  147. data/spec/fixtures/values_file/without_env.yml +5 -0
  148. data/spec/fixtures/with_empty_hash.yml +4 -0
  149. data/spec/fixtures/with_erb_instructions.yml +3 -0
  150. data/spec/spec_helper.rb +46 -0
  151. data/spec/support/meta_scopes.rb +20 -0
  152. data/spec/support/spec_support.rb +42 -0
  153. metadata +181 -15
  154. data/.travis.yml +0 -47
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Plugins(toml): expose TOML file', plugin: :toml do
4
+ specify 'defines config object by toml instructions and specific environment settings' do
5
+ class ExposeTOMLConfig < Qonfig::DataSet
6
+ toml_file_path = SpecSupport.fixture_path('plugins', 'toml', 'expose_toml', 'project.toml')
7
+
8
+ setting :file_name_based do
9
+ setting :test_env do
10
+ # spec/fixtures/plugins/toml/expose_toml/project.test.toml
11
+ expose_toml toml_file_path, via: :file_name, env: :test
12
+ end
13
+
14
+ setting :prod_env do
15
+ # spec/fixtures/plugins/toml/expose_toml/project.production.toml
16
+ expose_toml toml_file_path, via: :file_name, env: :production
17
+ end
18
+
19
+ setting :stage_env do
20
+ # spec/fixtures/plugins/toml/expose_toml/project.staging.toml
21
+ expose_toml toml_file_path, via: :file_name, env: :staging
22
+ end
23
+
24
+ setting :dev_env do
25
+ # spec/fixtures/plugins/toml/expose_toml/project.development.yml
26
+ expose_toml toml_file_path, via: :file_name, env: :development
27
+ end
28
+ end
29
+
30
+ setting :env_based do
31
+ setting :test_env do
32
+ # spec/fixtures/plugins/toml/expose_toml/project.toml
33
+ expose_toml toml_file_path, via: :env_key, env: :test
34
+ end
35
+
36
+ setting :prod_env do
37
+ # spec/fixtures/plugins/toml/expose_toml/project.toml
38
+ expose_toml toml_file_path, via: :env_key, env: :production
39
+ end
40
+
41
+ setting :stage_env do
42
+ # spec/fixtures/plugins/toml/expose_toml/project.toml
43
+ expose_toml toml_file_path, via: :env_key, env: :staging
44
+ end
45
+
46
+ setting :dev_env do
47
+ # spec/fixtures/plugins/toml/expose_toml/project.toml
48
+ expose_toml toml_file_path, via: :env_key, env: :development
49
+ end
50
+ end
51
+ end
52
+
53
+ settings = ExposeTOMLConfig.new.settings
54
+
55
+ # NOTE: file-name based expose
56
+ # spec/fixtures/plugins/toml/expose_toml/project.test.toml
57
+ expect(settings.file_name_based.test_env.api_mode_enabled).to eq(false)
58
+ expect(settings.file_name_based.test_env.db_driver).to eq('in_memory')
59
+ expect(settings.file_name_based.test_env.logging).to eq(false)
60
+ expect(settings.file_name_based.test_env.credentials).to eq({})
61
+ # spec/fixtures/plugins/toml/expose_toml/project.production.toml
62
+ expect(settings.file_name_based.prod_env.api_mode_enabled).to eq(true)
63
+ expect(settings.file_name_based.prod_env.db_driver).to eq('rom')
64
+ expect(settings.file_name_based.prod_env.logging).to eq(true)
65
+ expect(settings.file_name_based.prod_env.credentials).to eq({})
66
+ # spec/fixtures/plugins/toml/expose_toml/project.development.toml
67
+ expect(settings.file_name_based.dev_env.api_mode_enabled).to eq(true)
68
+ expect(settings.file_name_based.dev_env.db_driver).to eq('sequel')
69
+ expect(settings.file_name_based.dev_env.logging).to eq(false)
70
+ expect(settings.file_name_based.dev_env.credentials).to eq({})
71
+ # spec/fixtures/plugins/toml/expose_toml/project.staging.toml
72
+ expect(settings.file_name_based.stage_env.api_mode_enabled).to eq(true)
73
+ expect(settings.file_name_based.stage_env.db_driver).to eq('active_record')
74
+ expect(settings.file_name_based.stage_env.logging).to eq(true)
75
+ expect(settings.file_name_based.stage_env.credentials).to eq({})
76
+
77
+ # NOTE: environment based expose
78
+ # spec/fixtures/plugins/toml/expose_toml/projecttoml (table: 'test')
79
+ expect(settings.env_based.test_env.api_mode_enabled).to eq(true)
80
+ expect(settings.env_based.test_env.db_driver).to eq('in_memory')
81
+ expect(settings.env_based.test_env.logging).to eq(false)
82
+ expect(settings.env_based.test_env.throttle_requests).to eq(false)
83
+ expect(settings.env_based.test_env.credentials).to eq({})
84
+ # spec/fixtures/plugins/toml/expose_toml/project.toml (table: 'production')
85
+ expect(settings.env_based.prod_env.api_mode_enabled).to eq(true)
86
+ expect(settings.env_based.prod_env.db_driver).to eq('rom')
87
+ expect(settings.env_based.prod_env.logging).to eq(true)
88
+ expect(settings.env_based.prod_env.throttle_requests).to eq(true)
89
+ expect(settings.env_based.prod_env.credentials).to eq({})
90
+ # spec/fixtures/plugins/toml/expose_toml/projecttoml (table: 'development')
91
+ expect(settings.env_based.dev_env.api_mode_enabled).to eq(true)
92
+ expect(settings.env_based.dev_env.db_driver).to eq('sequel')
93
+ expect(settings.env_based.dev_env.logging).to eq(false)
94
+ expect(settings.env_based.dev_env.throttle_requests).to eq(false)
95
+ expect(settings.env_based.dev_env.credentials).to eq({})
96
+ # spec/fixtures/plugins/toml/expose_toml/projecttoml (table: 'staging')
97
+ expect(settings.env_based.stage_env.api_mode_enabled).to eq(true)
98
+ expect(settings.env_based.stage_env.db_driver).to eq('active_record')
99
+ expect(settings.env_based.stage_env.logging).to eq(true)
100
+ expect(settings.env_based.stage_env.throttle_requests).to eq(true)
101
+ expect(settings.env_based.stage_env.credentials).to eq({})
102
+ end
103
+
104
+ describe 'failures and inconsistent situations' do
105
+ describe 'definition level errors' do
106
+ specify 'fails when :env attribute has non-string / non-symbol / non-numeric value' do
107
+ expect do
108
+ Class.new(Qonfig::DataSet) do
109
+ expose_toml SpecSupport.fixture_path(
110
+ 'plugins', 'toml', 'expose_toml', 'project.toml'
111
+ ), via: :env_key, env: Object.new
112
+ end
113
+ end.to raise_error(Qonfig::ArgumentError)
114
+ end
115
+
116
+ specify 'fails when :env is empty' do
117
+ expect do
118
+ Class.new(Qonfig::DataSet) do
119
+ expose_toml SpecSupport.fixture_path(
120
+ 'plugins', 'toml', 'expose_toml', 'project.toml'
121
+ ), via: :env_key, env: ''
122
+ end
123
+ end.to raise_error(Qonfig::ArgumentError)
124
+ end
125
+
126
+ specify 'fails when provided :via is not supported' do
127
+ expect do
128
+ Class.new(Qonfig::DataSet) do
129
+ expose_toml SpecSupport.fixture_path(
130
+ 'plugins', 'toml', 'expose_toml', 'project.toml'
131
+ ), via: :auto, env: :production
132
+ end
133
+ end.to raise_error(Qonfig::ArgumentError)
134
+ end
135
+ end
136
+
137
+ describe 'initialization level errors' do
138
+ describe 'strict mode' do
139
+ specify(
140
+ 'disabled (non-strict): ' \
141
+ 'file existence requirement + yaml-env-key existence requirement'
142
+ ) do
143
+ # NOTE: file does not exist + env key does not exist in toml file
144
+ class NoFileNonStrictExposeTOMLConfig < Qonfig::DataSet
145
+ setting :non_strict_by_file do
146
+ expose_toml SpecSupport.fixture_path(
147
+ 'plugins', 'toml', 'expose_toml', 'nonexistent.toml'
148
+ ), strict: false, via: :file_name, env: :development
149
+ end
150
+
151
+ setting :non_strict_by_env do
152
+ expose_toml SpecSupport.fixture_path(
153
+ 'plugins', 'toml', 'expose_toml', 'nonexistent.toml'
154
+ ), strict: false, via: :env_key, env: :development
155
+ end
156
+ end
157
+
158
+ expect(NoFileNonStrictExposeTOMLConfig.new.to_h).to match(
159
+ 'non_strict_by_file' => {},
160
+ 'non_strict_by_env' => {}
161
+ )
162
+
163
+ # NOTE: file is exist + env key does not exist in toml file
164
+ class NoEnvKeyNonStrictExposeTOMLConfig < Qonfig::DataSet
165
+ setting :non_strict_by_file do
166
+ expose_toml SpecSupport.fixture_path(
167
+ 'plugins', 'toml', 'expose_toml', 'project.toml'
168
+ ), strict: false, via: :file_name, env: :nonexistent
169
+ end
170
+
171
+ setting :non_strict_by_env do
172
+ expose_toml SpecSupport.fixture_path(
173
+ 'plugins', 'toml', 'expose_toml', 'project.toml'
174
+ ), strict: false, via: :env_key, env: :nonexistent
175
+ end
176
+ end
177
+
178
+ expect(NoEnvKeyNonStrictExposeTOMLConfig.new.to_h).to match(
179
+ 'non_strict_by_file' => {},
180
+ 'non_strict_by_env' => {}
181
+ )
182
+ end
183
+
184
+ specify(
185
+ 'enabled (strict, by default): ' \
186
+ 'file existence requirement + yaml-env-key existence requirement'
187
+ ) do
188
+ # NOTE: file does not exist
189
+ class StrictFileViaFileNameConfig < Qonfig::DataSet
190
+ expose_toml SpecSupport.fixture_path(
191
+ 'plugins', 'toml', 'expose_toml', 'nonexistent.toml'
192
+ ), via: :file_name, env: :production
193
+ end
194
+
195
+ # NOTE: file does not exist
196
+ class StrictFileViaEnvKeyConfig < Qonfig::DataSet
197
+ expose_toml SpecSupport.fixture_path(
198
+ 'plugins', 'toml', 'expose_toml', 'nonexistent.toml'
199
+ ), via: :env_key, env: :production
200
+ end
201
+
202
+ # NOTE: file does not exist
203
+ expect { StrictFileViaFileNameConfig.new }.to raise_error(Qonfig::FileNotFoundError)
204
+ expect { StrictFileViaEnvKeyConfig.new }.to raise_error(Qonfig::FileNotFoundError)
205
+
206
+ # NOTE:
207
+ # - file exists but env key does not exist
208
+ # - file: spec/fixtures/plugins/toml/expose_toml/project.toml
209
+ class NonExistentEnvKeyConfig < Qonfig::DataSet
210
+ expose_toml SpecSupport.fixture_path(
211
+ 'plugins', 'toml', 'expose_toml', 'project.toml'
212
+ ), via: :env_key, env: :nonexistent
213
+ end
214
+
215
+ # NOTE: env key does not exist
216
+ expect { NonExistentEnvKeyConfig.new }.to raise_error(Qonfig::ExposeError)
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Plugins(toml): #load_from_self => format: :toml', plugin: :toml do
4
+ specify ':toml-format support' do
5
+ class TomlEndDataConfig < Qonfig::DataSet
6
+ load_from_self format: :toml
7
+ end
8
+
9
+ config = TomlEndDataConfig.new
10
+
11
+ expect(config.settings.amount).to eq(123.456)
12
+ expect(config.settings.methods).to eq([['test'], [true, false], [1, 2, 3]])
13
+ expect(config.settings.credentials.user).to eq('admin')
14
+ expect(config.settings.credentials.password).to eq('123')
15
+ expect(config.settings.credentials.enabled).to eq(true)
16
+ end
17
+ end
18
+
19
+ __END__
20
+
21
+ amount = 123.456
22
+ methods = [ [ "test" ], [ true, false ], [ 1, 2, 3 ] ]
23
+
24
+ [credentials]
25
+ user = "admin"
26
+ password = "123"
27
+ enabled = true
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Plugins(toml): Load from .toml (TOML)', plugin: :toml do
4
+ specify 'defines config object by toml instructions' do
5
+ class TomlConfig < Qonfig::DataSet
6
+ load_from_toml SpecSupport.fixture_path('plugins', 'toml', 'toml_sample_with_all_types.toml')
7
+ end
8
+
9
+ TomlConfig.new.settings.tap do |conf|
10
+ expect(conf.key_in_air).to eq('TOML Example')
11
+
12
+ expect(conf.inline_table_of_tables).to eq([
13
+ { 'x' => 1, 'y' => 2, 'z' => 3 },
14
+ { 'x' => 7, 'y' => 8, 'z' => 9 },
15
+ { 'x' => 2, 'y' => 4, 'z' => 8 }
16
+ ])
17
+
18
+ expect(conf.strings.simple_string).to eq('Simple String')
19
+ expect(conf.strings.first_multi_line_string).to eq("first multiline\nstring defined")
20
+ expect(conf.strings.second_multiline_string).to eq("second multiline\nstring defined\n")
21
+
22
+ expect(conf.times.first_format).to eq(Time.utc(1979, 0o5, 27, 0o7, 32, 0))
23
+ expect(conf.times.second_format).to eq(Time.new(1979, 0o5, 27, 0o0, 32, 0, '-07:00'))
24
+ expect(conf.times.third_format).to eq(Time.new(1979, 0o5, 27, 0o0, 32, 0.999999, '-07:00'))
25
+
26
+ expect(conf.arrays.array_of_integers).to eq([1, 2, 3])
27
+ expect(conf.arrays.array_of_strings).to eq(%w[a b c])
28
+ expect(conf.arrays.array_of_integer_arrays).to eq([[1, 2], [3, 4, 5]])
29
+ expect(conf.arrays.array_of_different_string_literals).to eq(%w[azaza trazaza kek pek])
30
+ expect(conf.arrays.array_of_multityped_arrays).to eq([[1, 2], %w[a b c]])
31
+ expect(conf.arrays.multyline_array).to eq(%w[super puper])
32
+
33
+ expect(conf.number_definitions.number_with_parts).to eq([8_001, 8_001, 8_002])
34
+ expect(conf.number_definitions.number_with_idiot_parts).to eq(5_000)
35
+ expect(conf.number_definitions.simple_float).to eq(3.12138)
36
+ expect(conf.number_definitions.epic_float).to eq(5e+22)
37
+ expect(conf.number_definitions.haha_float).to eq(1e6)
38
+ expect(conf.number_definitions.wow_float).to eq(-2E-2)
39
+
40
+ expect(conf.booleans.boolean_true).to eq(true)
41
+ expect(conf.booleans.boolean_false).to eq(false)
42
+
43
+ expect(conf.nesteds.first.ip).to eq('10.0.0.1')
44
+ expect(conf.nesteds.first.host).to eq('google.sru')
45
+ expect(conf.nesteds.second.ip).to eq('10.0.0.2')
46
+ expect(conf.nesteds.second.host).to eq('poogle.fru')
47
+
48
+ expect(conf.deep_nesteds).to eq([
49
+ {
50
+ 'name' => 'apple',
51
+ 'first' => { 'model' => 'iphone xs', 'color' => 'white' },
52
+ 'second' => [{ 'model' => 'iphone x' }],
53
+ 'third' => [{ 'model' => 'iphone se' }]
54
+ },
55
+ {
56
+ 'name'=>'xiaomi',
57
+ 'fourth'=>[{ 'model' => 'mi8 explorer edition' }]
58
+ }
59
+ ])
60
+ end
61
+ end
62
+
63
+ specify 'support for Pathanme in filepath' do
64
+ class PathanmeTomlLoadCheckConfig < Qonfig::DataSet
65
+ load_from_toml Pathname.new(SpecSupport.fixture_path('plugins', 'toml', 'mini_file.toml'))
66
+ end
67
+
68
+ config = PathanmeTomlLoadCheckConfig.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
+ describe ':strict mode option (when file does not exist)' do
77
+ context 'when :strict => true (by default)' do
78
+ specify 'fails with corresponding error' do
79
+ # check default behaviour (strict: true)
80
+ class FailingTomlConfig < Qonfig::DataSet
81
+ load_from_toml 'no_file.toml'
82
+ end
83
+
84
+ expect { FailingTomlConfig.new }.to raise_error(Qonfig::FileNotFoundError)
85
+
86
+ class ExplicitlyStrictedTomlConfig < Qonfig::DataSet
87
+ load_from_toml 'no_file.toml', strict: true
88
+ end
89
+
90
+ expect { ExplicitlyStrictedTomlConfig.new }.to raise_error(Qonfig::FileNotFoundError)
91
+ end
92
+ end
93
+
94
+ context 'when :strict => false' do
95
+ specify 'does not fail - empty config' do
96
+ class NonFailingTomlConfig < Qonfig::DataSet
97
+ load_from_toml 'no_file.toml', strict: false
98
+
99
+ setting :nested do
100
+ load_from_toml 'no_file.toml', strict: false
101
+ end
102
+ end
103
+
104
+ expect { NonFailingTomlConfig.new }.not_to raise_error
105
+ expect(NonFailingTomlConfig.new.to_h).to eq('nested' => {})
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../load_setting_values_from_file/by_macros_examples'
4
+ require_relative '../../../load_setting_values_from_file/by_instance_method_examples'
5
+
6
+ describe 'Plugins(toml): Load setting values from file', plugin: :toml do
7
+ describe 'DSL macros (Qonfig::DataSet.values_file)' do
8
+ it_behaves_like(
9
+ 'load setting values from file by macros',
10
+ file_format: :toml,
11
+ file_name: SpecSupport.fixture_path('plugins', 'toml', 'values_file', 'without_env.toml'),
12
+ file_with_env_name: SpecSupport.fixture_path('plugins', 'toml', 'values_file',
13
+ 'with_env.toml')
14
+ )
15
+ end
16
+
17
+ describe 'Instance methods (Qonfig::DataSet#load_from_file/.load_from_toml' do
18
+ it_behaves_like(
19
+ 'load setting values from file by instance methods',
20
+ file_format: :toml,
21
+ load_by: :load_from_toml,
22
+ file_name: SpecSupport.fixture_path('plugins', 'toml', 'values_file', 'without_env.toml'),
23
+ file_with_env_name: SpecSupport.fixture_path('plugins', 'toml', 'values_file',
24
+ 'with_env.toml')
25
+ )
26
+ end
27
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Plugins(toml): .values_file / #load_from_self (__END__ data with env)', plugin: :toml 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: :toml, 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: :toml, 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: :toml, 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: :toml, 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
+ [test]
86
+ user = '0exp'
87
+ [test.queue]
88
+ adapter = 'sidekiq'
89
+ concurrency = 25
90
+
91
+ [production]
92
+ user = 'iAmDaiveR'
93
+ [production.queue]
94
+ adapter = 'in_memory'
95
+ concurrency = 50
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Plugins(toml): .values_file / #load_from_self (with __END__ data)', plugin: :toml do
4
+ describe 'DSL macros' do
5
+ let(:config_klass) do
6
+ Class.new(Qonfig::DataSet) do
7
+ values_file :self, format: :toml
8
+
9
+ setting :user, 'D@iVeR'
10
+ setting :queue do
11
+ setting :adapter, 'que'
12
+ setting :concurrency, 2
13
+ end
14
+ end
15
+ end
16
+
17
+ specify 'loads setting values from __END__ defined as TOML instructions' do
18
+ config = config_klass.new
19
+
20
+ expect(config.settings.user).to eq('0exp')
21
+ expect(config.settings.queue.adapter).to eq('sidekiq')
22
+ expect(config.settings.queue.concurrency).to eq(25)
23
+ end
24
+
25
+ specify 'foramt of __END__ data can be inferred automatically' do
26
+ config = Qonfig::DataSet.build do
27
+ values_file :self
28
+
29
+ setting :user
30
+ setting :queue do
31
+ setting :adapter
32
+ setting :concurrency
33
+ end
34
+ end
35
+
36
+ expect(config.settings.user).to eq('0exp')
37
+ expect(config.settings.queue.adapter).to eq('sidekiq')
38
+ expect(config.settings.queue.concurrency).to eq(25)
39
+ end
40
+
41
+ specify 'fails when __END__ data has extra keys' do
42
+ expect do
43
+ Qonfig::DataSet.build { values_file :self }
44
+ end.to raise_error(Qonfig::UnknownSettingError)
45
+
46
+ expect do
47
+ Qonfig::DataSet.build do
48
+ values_file :self
49
+
50
+ setting :user
51
+ setting :queue do
52
+ setting :adapter
53
+ setting :concurrency
54
+ end
55
+ end
56
+ end.not_to raise_error
57
+ end
58
+ end
59
+
60
+ describe 'Instance method' do
61
+ let(:config_klass) do
62
+ Class.new(Qonfig::DataSet) do
63
+ setting :user, 'D@iVeR'
64
+ setting :queue do
65
+ setting :adapter, 'que'
66
+ setting :concurrency, 2
67
+ end
68
+ end
69
+ end
70
+
71
+ specify 'loads setting values from __END__ defined as TOML instructions' do
72
+ config = config_klass.new
73
+
74
+ expect(config.settings.user).to eq('D@iVeR')
75
+ expect(config.settings.queue.adapter).to eq('que')
76
+ expect(config.settings.queue.concurrency).to eq(2)
77
+
78
+ config.load_from_self(format: :toml)
79
+
80
+ expect(config.settings.user).to eq('0exp')
81
+ expect(config.settings.queue.adapter).to eq('sidekiq')
82
+ expect(config.settings.queue.concurrency).to eq(25)
83
+ end
84
+
85
+ specify 'format of __END__ data can be inferred automatically' do
86
+ config = config_klass.new
87
+ config.load_from_self
88
+
89
+ expect(config.settings.user).to eq('0exp')
90
+ expect(config.settings.queue.adapter).to eq('sidekiq')
91
+ expect(config.settings.queue.concurrency).to eq(25)
92
+ end
93
+
94
+ specify 'reloading process returns original values' do
95
+ config = config_klass.new
96
+ config.load_from_self
97
+ config.reload!
98
+
99
+ expect(config.settings.user).to eq('D@iVeR')
100
+ expect(config.settings.queue.adapter).to eq('que')
101
+ expect(config.settings.queue.concurrency).to eq(2)
102
+ end
103
+
104
+ specify 'fails when __END__ data has extra keys' do
105
+ config = Qonfig::DataSet.build {}
106
+ expect { config.load_from_self }.to raise_error(Qonfig::UnknownSettingError)
107
+
108
+ config = Qonfig::DataSet.build do
109
+ setting :user
110
+ setting :queue do
111
+ setting :adapter
112
+ setting :concurrency
113
+ end
114
+ end
115
+
116
+ expect { config.load_from_self }.not_to raise_error
117
+ end
118
+ end
119
+ end
120
+
121
+ __END__
122
+ user = '0exp'
123
+ [queue]
124
+ adapter = 'sidekiq'
125
+ concurrency = 25
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/LineLength
4
+ describe 'Plugins(toml): .values_file / #load_from_self (with incorrect __END__ data)', plugin: :toml do
5
+ describe 'DSL macros' do
6
+ let(:config_klass) do
7
+ Class.new(Qonfig::DataSet) do
8
+ values_file :self, format: :toml
9
+ setting :user, 'D@iVeR'
10
+ end
11
+ end
12
+
13
+ specify 'fails with corresponding error' do
14
+ expect { config_klass.new }.to raise_error(Qonfig::TOMLLoaderParseError)
15
+ end
16
+ end
17
+
18
+ describe 'Instance method' do
19
+ let(:config) do
20
+ Qonfig::DataSet.build { setting :user, 'D@iVeR' }
21
+ end
22
+
23
+ specify 'fails with corresponding error' do
24
+ expect { config.load_from_self(format: :toml) }.to raise_error(Qonfig::TOMLLoaderParseError)
25
+ expect(config.settings.user).to eq('D@iVeR')
26
+ end
27
+ end
28
+ end
29
+ # rubocop:enable Layout/LineLength
30
+
31
+ __END__
32
+
33
+ user = '0exp'
34
+ asdf|"ASD"