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,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Non-redefineable core methods' do
4
+ specify 'fails when setting key intersects with any internal Qonfig::Settings core method' do
5
+ core_methods = (
6
+ Qonfig::Settings.instance_methods(false) |
7
+ Qonfig::Settings.private_instance_methods(false) |
8
+ %i[define_singleton_method super self]
9
+ )
10
+
11
+ expect(core_methods).not_to include(:super_test_key)
12
+
13
+ core_methods.each do |core_method|
14
+ expect do
15
+ Class.new(Qonfig::DataSet) do
16
+ setting core_method
17
+ end
18
+ end.to raise_error(Qonfig::CoreMethodIntersectionError)
19
+
20
+ expect do
21
+ Class.new(Qonfig::DataSet) do
22
+ setting :super_test_key do
23
+ setting core_method
24
+ end
25
+ end
26
+ end.to raise_error(Qonfig::CoreMethodIntersectionError)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Plugins(:pretty_print): Pretty print :)', plugin: :pretty_print do
4
+ before do
5
+ stub_const('PrettyPrintableConfig', Class.new(Qonfig::DataSet) do
6
+ setting :api do
7
+ setting :domain, 'google'
8
+ setting :creds do
9
+ setting :token, 'a0sdj10k@'
10
+ setting :login, 'D2'
11
+ end
12
+ end
13
+
14
+ setting :database do
15
+ setting :adapter, 'pg'
16
+ setting 'logging.queries', nil
17
+ end
18
+
19
+ setting :logging, false
20
+ setting :author, nil
21
+ end)
22
+ end
23
+
24
+ shared_examples 'pretty printing :)' do
25
+ subject(:print_to_console!) { PP.pp(config, pretty_printer_output) }
26
+
27
+ let(:pretty_printer_output) { StringIO.new }
28
+
29
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0')
30
+ specify 'shows config settings in beatufied format' do
31
+ print_to_console!
32
+
33
+ expect(pretty_printer_output.string).to include(
34
+ "#<#{expected_config_klass_name}:0x"
35
+ )
36
+
37
+ expect(pretty_printer_output.string).to include(
38
+ " api.domain: \"google\",\n" \
39
+ " api.creds.token: \"a0sdj10k@\",\n" \
40
+ " api.creds.login: \"D2\",\n" \
41
+ " database.adapter: \"pg\",\n" \
42
+ " database.logging.queries: nil,\n" \
43
+ " logging: false,\n" \
44
+ " author: nil>\n"
45
+ )
46
+ end
47
+ else
48
+ specify 'shows config settings in beatufied format' do
49
+ print_to_console!
50
+ value_space = SpecSupport.from_object_id_space_to_value_space(config)
51
+
52
+ expect(pretty_printer_output.string).to eq(
53
+ "#<#{expected_config_klass_name}:0x#{value_space}\n" \
54
+ " api.domain: \"google\",\n" \
55
+ " api.creds.token: \"a0sdj10k@\",\n" \
56
+ " api.creds.login: \"D2\",\n" \
57
+ " database.adapter: \"pg\",\n" \
58
+ " database.logging.queries: nil,\n" \
59
+ " logging: false,\n" \
60
+ " author: nil>\n"
61
+ )
62
+ end
63
+ end
64
+ end
65
+
66
+ context 'pretty-printed Qonfig::DataSet' do
67
+ include_examples 'pretty printing :)' do
68
+ let(:config) { PrettyPrintableConfig.new }
69
+ let(:expected_config_klass_name) { 'PrettyPrintableConfig' }
70
+ end
71
+ end
72
+
73
+ context 'pretty-printed Qonfig::Settings' do
74
+ include_examples 'pretty printing :)' do
75
+ let(:config) { PrettyPrintableConfig.new.settings }
76
+ let(:expected_config_klass_name) { 'Qonfig::Settings' }
77
+ end
78
+ end
79
+
80
+ context 'pretty-printed Qonfig::Compacted' do
81
+ include_examples 'pretty printing :)' do
82
+ let(:config) { PrettyPrintableConfig.new.compacted }
83
+ let(:expected_config_klass_name) { 'Qonfig::Compacted' }
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'Plugins(toml): #expose_self => format: :toml', plugin: :toml do
4
+ specify ':toml-format support' do
5
+ class ExposeTomlEndDataConfig < Qonfig::DataSet
6
+ setting :staging_env do
7
+ expose_self format: :toml, env: :staging
8
+ end
9
+
10
+ setting :prod_env do
11
+ expose_self format: :toml, env: :production
12
+ end
13
+
14
+ setting :test_env do
15
+ expose_self format: :toml, env: :test
16
+ end
17
+ end
18
+
19
+ config = ExposeTomlEndDataConfig.new
20
+
21
+ # NOTE: production env
22
+ expect(config.settings.prod_env.credentials.user).to eq('admin')
23
+ expect(config.settings.prod_env.credentials.password).to eq('123')
24
+ expect(config.settings.prod_env.credentials.enabled).to eq(true)
25
+ expect(config.settings.prod_env.api).to eq('google.com')
26
+ expect(config.settings.prod_env.ports).to eq([10001, 10002, 10003])
27
+
28
+ # NOTE: test env
29
+ expect(config.settings.test_env.credentials.user).to eq('megaman')
30
+ expect(config.settings.test_env.credentials.password).to eq('atata123')
31
+ expect(config.settings.test_env.credentials.enabled).to eq(false)
32
+ expect(config.settings.test_env.api).to eq('yandex.ru')
33
+ expect(config.settings.test_env.ports).to eq([1, 2, 3])
34
+
35
+ # NOTE: staging env
36
+ expect(config.settings.staging_env.credentials.user).to eq('diablo')
37
+ expect(config.settings.staging_env.credentials.password).to eq('testornot')
38
+ expect(config.settings.staging_env.credentials.enabled).to eq(true)
39
+ expect(config.settings.staging_env.api).to eq('battle.net')
40
+ expect(config.settings.staging_env.ports).to eq([111, 222, 333])
41
+ end
42
+ end
43
+
44
+ __END__
45
+
46
+ [production]
47
+ api = "google.com"
48
+ ports = [ 10001, 10002, 10003 ]
49
+
50
+ [production.credentials]
51
+ user = "admin"
52
+ password = "123"
53
+ enabled = true
54
+
55
+ [test]
56
+ api = "yandex.ru"
57
+ ports = [ 1, 2, 3 ]
58
+
59
+ [test.credentials]
60
+ user = "megaman"
61
+ password = "atata123"
62
+ enabled = false
63
+
64
+ [staging]
65
+ api = "battle.net"
66
+ ports = [ 111, 222, 333 ]
67
+
68
+ [staging.credentials]
69
+ user = "diablo"
70
+ password = "testornot"
71
+ enabled = true
@@ -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