hanami 2.0.0.beta1.1 → 2.0.0.beta2

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +73 -0
  3. data/hanami.gemspec +1 -2
  4. data/lib/hanami/app.rb +76 -16
  5. data/lib/hanami/assets/{application_configuration.rb → app_configuration.rb} +1 -1
  6. data/lib/hanami/configuration.rb +20 -20
  7. data/lib/hanami/extensions/action/slice_configured_action.rb +44 -1
  8. data/lib/hanami/extensions/view/slice_configured_view.rb +47 -7
  9. data/lib/hanami/providers/rack.rb +2 -0
  10. data/lib/hanami/providers/settings.rb +81 -6
  11. data/lib/hanami/settings/env_store.rb +32 -0
  12. data/lib/hanami/settings.rb +8 -12
  13. data/lib/hanami/setup.rb +1 -6
  14. data/lib/hanami/slice/routing/middleware/stack.rb +26 -5
  15. data/lib/hanami/slice.rb +38 -45
  16. data/lib/hanami/slice_configurable.rb +14 -1
  17. data/lib/hanami/slice_registrar.rb +65 -5
  18. data/lib/hanami/version.rb +1 -1
  19. data/lib/hanami.rb +53 -2
  20. data/spec/new_integration/action/slice_configuration_spec.rb +287 -0
  21. data/spec/new_integration/code_loading/loading_from_lib_spec.rb +208 -0
  22. data/spec/new_integration/dotenv_loading_spec.rb +137 -0
  23. data/spec/new_integration/settings/access_to_constants_spec.rb +169 -0
  24. data/spec/new_integration/settings/loading_from_env_spec.rb +187 -0
  25. data/spec/new_integration/settings/settings_component_loading_spec.rb +113 -0
  26. data/spec/new_integration/settings/using_types_spec.rb +87 -0
  27. data/spec/new_integration/setup_spec.rb +145 -0
  28. data/spec/new_integration/slices/slice_loading_spec.rb +171 -0
  29. data/spec/new_integration/view/context/settings_spec.rb +5 -1
  30. data/spec/new_integration/view/slice_configuration_spec.rb +289 -0
  31. data/spec/support/app_integration.rb +4 -5
  32. data/spec/unit/hanami/configuration/slices_spec.rb +34 -0
  33. data/spec/unit/hanami/settings/env_store_spec.rb +52 -0
  34. data/spec/unit/hanami/slice_configurable_spec.rb +2 -2
  35. data/spec/unit/hanami/version_spec.rb +1 -1
  36. metadata +30 -28
  37. data/lib/hanami/settings/dotenv_store.rb +0 -58
  38. data/spec/new_integration/action/configuration_spec.rb +0 -26
  39. data/spec/new_integration/settings_spec.rb +0 -115
  40. data/spec/new_integration/view/configuration_spec.rb +0 -49
  41. data/spec/unit/hanami/settings/dotenv_store_spec.rb +0 -119
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta1.1
4
+ version: 2.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-22 00:00:00.000000000 Z
11
+ date: 2022-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,20 +58,6 @@ dependencies:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.7'
61
- - !ruby/object:Gem::Dependency
62
- name: dry-types
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '1.5'
68
- type: :runtime
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '1.5'
75
61
  - !ruby/object:Gem::Dependency
76
62
  name: dry-inflector
77
63
  requirement: !ruby/object:Gem::Requirement
@@ -121,7 +107,7 @@ dependencies:
121
107
  version: '0.6'
122
108
  - - ">="
123
109
  - !ruby/object:Gem::Version
124
- version: 0.6.0
110
+ version: 0.6.3
125
111
  type: :runtime
126
112
  prerelease: false
127
113
  version_requirements: !ruby/object:Gem::Requirement
@@ -131,7 +117,7 @@ dependencies:
131
117
  version: '0.6'
132
118
  - - ">="
133
119
  - !ruby/object:Gem::Version
134
- version: 0.6.0
120
+ version: 0.6.3
135
121
  - !ruby/object:Gem::Dependency
136
122
  name: hanami-cli
137
123
  requirement: !ruby/object:Gem::Requirement
@@ -231,7 +217,7 @@ files:
231
217
  - hanami.gemspec
232
218
  - lib/hanami.rb
233
219
  - lib/hanami/app.rb
234
- - lib/hanami/assets/application_configuration.rb
220
+ - lib/hanami/assets/app_configuration.rb
235
221
  - lib/hanami/assets/configuration.rb
236
222
  - lib/hanami/boot.rb
237
223
  - lib/hanami/configuration.rb
@@ -263,7 +249,7 @@ files:
263
249
  - lib/hanami/routes.rb
264
250
  - lib/hanami/server.rb
265
251
  - lib/hanami/settings.rb
266
- - lib/hanami/settings/dotenv_store.rb
252
+ - lib/hanami/settings/env_store.rb
267
253
  - lib/hanami/setup.rb
268
254
  - lib/hanami/slice.rb
269
255
  - lib/hanami/slice/router.rb
@@ -347,16 +333,17 @@ files:
347
333
  - spec/isolation/hanami/application/routes/configured_spec.rb
348
334
  - spec/isolation/hanami/application/routes/not_configured_spec.rb
349
335
  - spec/isolation/hanami/boot/success_spec.rb
350
- - spec/new_integration/action/configuration_spec.rb
351
336
  - spec/new_integration/action/cookies_spec.rb
352
337
  - spec/new_integration/action/csrf_protection_spec.rb
353
338
  - spec/new_integration/action/routes_spec.rb
354
339
  - spec/new_integration/action/sessions_spec.rb
340
+ - spec/new_integration/action/slice_configuration_spec.rb
355
341
  - spec/new_integration/action/view_integration_spec.rb
356
342
  - spec/new_integration/action/view_rendering/automatic_rendering_spec.rb
357
343
  - spec/new_integration/action/view_rendering/paired_view_inference_spec.rb
358
344
  - spec/new_integration/action/view_rendering_spec.rb
359
345
  - spec/new_integration/code_loading/loading_from_app_spec.rb
346
+ - spec/new_integration/code_loading/loading_from_lib_spec.rb
360
347
  - spec/new_integration/code_loading/loading_from_slice_spec.rb
361
348
  - spec/new_integration/container/application_routes_helper_spec.rb
362
349
  - spec/new_integration/container/auto_injection_spec.rb
@@ -366,16 +353,21 @@ files:
366
353
  - spec/new_integration/container/prepare_container_spec.rb
367
354
  - spec/new_integration/container/shutdown_spec.rb
368
355
  - spec/new_integration/container/standard_bootable_components_spec.rb
356
+ - spec/new_integration/dotenv_loading_spec.rb
369
357
  - spec/new_integration/rack_app/middleware_spec.rb
370
358
  - spec/new_integration/rack_app/non_booted_rack_app_spec.rb
371
359
  - spec/new_integration/rack_app/rack_app_spec.rb
372
- - spec/new_integration/settings_spec.rb
360
+ - spec/new_integration/settings/access_to_constants_spec.rb
361
+ - spec/new_integration/settings/loading_from_env_spec.rb
362
+ - spec/new_integration/settings/settings_component_loading_spec.rb
363
+ - spec/new_integration/settings/using_types_spec.rb
364
+ - spec/new_integration/setup_spec.rb
373
365
  - spec/new_integration/slices/external_slice_spec.rb
374
366
  - spec/new_integration/slices/slice_configuration_spec.rb
367
+ - spec/new_integration/slices/slice_loading_spec.rb
375
368
  - spec/new_integration/slices/slice_routing_spec.rb
376
369
  - spec/new_integration/slices/slice_settings_spec.rb
377
370
  - spec/new_integration/slices_spec.rb
378
- - spec/new_integration/view/configuration_spec.rb
379
371
  - spec/new_integration/view/context/assets_spec.rb
380
372
  - spec/new_integration/view/context/inflector_spec.rb
381
373
  - spec/new_integration/view/context/request_spec.rb
@@ -384,6 +376,7 @@ files:
384
376
  - spec/new_integration/view/inflector_spec.rb
385
377
  - spec/new_integration/view/part_namespace_spec.rb
386
378
  - spec/new_integration/view/path_spec.rb
379
+ - spec/new_integration/view/slice_configuration_spec.rb
387
380
  - spec/new_integration/view/template_spec.rb
388
381
  - spec/new_integration/view/views_spec.rb
389
382
  - spec/spec_helper.rb
@@ -412,11 +405,12 @@ files:
412
405
  - spec/unit/hanami/configuration/base_url_spec.rb
413
406
  - spec/unit/hanami/configuration/inflector_spec.rb
414
407
  - spec/unit/hanami/configuration/logger_spec.rb
408
+ - spec/unit/hanami/configuration/slices_spec.rb
415
409
  - spec/unit/hanami/configuration/views_spec.rb
416
410
  - spec/unit/hanami/configuration_spec.rb
417
411
  - spec/unit/hanami/env_spec.rb
418
412
  - spec/unit/hanami/routes_spec.rb
419
- - spec/unit/hanami/settings/dotenv_store_spec.rb
413
+ - spec/unit/hanami/settings/env_store_spec.rb
420
414
  - spec/unit/hanami/settings_spec.rb
421
415
  - spec/unit/hanami/slice_configurable_spec.rb
422
416
  - spec/unit/hanami/slice_name_spec.rb
@@ -520,16 +514,17 @@ test_files:
520
514
  - spec/isolation/hanami/application/routes/configured_spec.rb
521
515
  - spec/isolation/hanami/application/routes/not_configured_spec.rb
522
516
  - spec/isolation/hanami/boot/success_spec.rb
523
- - spec/new_integration/action/configuration_spec.rb
524
517
  - spec/new_integration/action/cookies_spec.rb
525
518
  - spec/new_integration/action/csrf_protection_spec.rb
526
519
  - spec/new_integration/action/routes_spec.rb
527
520
  - spec/new_integration/action/sessions_spec.rb
521
+ - spec/new_integration/action/slice_configuration_spec.rb
528
522
  - spec/new_integration/action/view_integration_spec.rb
529
523
  - spec/new_integration/action/view_rendering/automatic_rendering_spec.rb
530
524
  - spec/new_integration/action/view_rendering/paired_view_inference_spec.rb
531
525
  - spec/new_integration/action/view_rendering_spec.rb
532
526
  - spec/new_integration/code_loading/loading_from_app_spec.rb
527
+ - spec/new_integration/code_loading/loading_from_lib_spec.rb
533
528
  - spec/new_integration/code_loading/loading_from_slice_spec.rb
534
529
  - spec/new_integration/container/application_routes_helper_spec.rb
535
530
  - spec/new_integration/container/auto_injection_spec.rb
@@ -539,16 +534,21 @@ test_files:
539
534
  - spec/new_integration/container/prepare_container_spec.rb
540
535
  - spec/new_integration/container/shutdown_spec.rb
541
536
  - spec/new_integration/container/standard_bootable_components_spec.rb
537
+ - spec/new_integration/dotenv_loading_spec.rb
542
538
  - spec/new_integration/rack_app/middleware_spec.rb
543
539
  - spec/new_integration/rack_app/non_booted_rack_app_spec.rb
544
540
  - spec/new_integration/rack_app/rack_app_spec.rb
545
- - spec/new_integration/settings_spec.rb
541
+ - spec/new_integration/settings/access_to_constants_spec.rb
542
+ - spec/new_integration/settings/loading_from_env_spec.rb
543
+ - spec/new_integration/settings/settings_component_loading_spec.rb
544
+ - spec/new_integration/settings/using_types_spec.rb
545
+ - spec/new_integration/setup_spec.rb
546
546
  - spec/new_integration/slices/external_slice_spec.rb
547
547
  - spec/new_integration/slices/slice_configuration_spec.rb
548
+ - spec/new_integration/slices/slice_loading_spec.rb
548
549
  - spec/new_integration/slices/slice_routing_spec.rb
549
550
  - spec/new_integration/slices/slice_settings_spec.rb
550
551
  - spec/new_integration/slices_spec.rb
551
- - spec/new_integration/view/configuration_spec.rb
552
552
  - spec/new_integration/view/context/assets_spec.rb
553
553
  - spec/new_integration/view/context/inflector_spec.rb
554
554
  - spec/new_integration/view/context/request_spec.rb
@@ -557,6 +557,7 @@ test_files:
557
557
  - spec/new_integration/view/inflector_spec.rb
558
558
  - spec/new_integration/view/part_namespace_spec.rb
559
559
  - spec/new_integration/view/path_spec.rb
560
+ - spec/new_integration/view/slice_configuration_spec.rb
560
561
  - spec/new_integration/view/template_spec.rb
561
562
  - spec/new_integration/view/views_spec.rb
562
563
  - spec/spec_helper.rb
@@ -585,11 +586,12 @@ test_files:
585
586
  - spec/unit/hanami/configuration/base_url_spec.rb
586
587
  - spec/unit/hanami/configuration/inflector_spec.rb
587
588
  - spec/unit/hanami/configuration/logger_spec.rb
589
+ - spec/unit/hanami/configuration/slices_spec.rb
588
590
  - spec/unit/hanami/configuration/views_spec.rb
589
591
  - spec/unit/hanami/configuration_spec.rb
590
592
  - spec/unit/hanami/env_spec.rb
591
593
  - spec/unit/hanami/routes_spec.rb
592
- - spec/unit/hanami/settings/dotenv_store_spec.rb
594
+ - spec/unit/hanami/settings/env_store_spec.rb
593
595
  - spec/unit/hanami/settings_spec.rb
594
596
  - spec/unit/hanami/slice_configurable_spec.rb
595
597
  - spec/unit/hanami/slice_name_spec.rb
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dry/core/constants"
4
-
5
- module Hanami
6
- class Settings
7
- # Default app settings store.
8
- #
9
- # Uses [dotenv](https://github.com/bkeepers/dotenv) (if available) to load
10
- # .env files and then loads settings from ENV. For a given `HANAMI_ENV`
11
- # environment, the following `.env` files are looked up in the following order:
12
- #
13
- # - .env.{environment}.local
14
- # - .env.local (except if the environment is `test`)
15
- # - .env.{environment}
16
- # - .env
17
- #
18
- # @since 2.0.0
19
- # @api private
20
- class DotenvStore
21
- Undefined = Dry::Core::Constants::Undefined
22
-
23
- attr_reader :store,
24
- :hanami_env
25
-
26
- def initialize(store: ENV, hanami_env: Hanami.env)
27
- @store = store
28
- @hanami_env = hanami_env
29
- end
30
-
31
- def fetch(name, default_value = Undefined, &block)
32
- name = name.to_s.upcase
33
- args = (default_value == Undefined) ? [name] : [name, default_value]
34
-
35
- store.fetch(*args, &block)
36
- end
37
-
38
- def with_dotenv_loaded
39
- require "dotenv"
40
- Dotenv.load(*dotenv_files) if defined?(Dotenv)
41
- self
42
- rescue LoadError
43
- self
44
- end
45
-
46
- private
47
-
48
- def dotenv_files
49
- [
50
- ".env.#{hanami_env}.local",
51
- (".env.local" unless hanami_env == :test),
52
- ".env.#{hanami_env}",
53
- ".env"
54
- ].compact
55
- end
56
- end
57
- end
58
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe "App action / Configuration", :app_integration do
4
- before do
5
- module TestApp
6
- class App < Hanami::App
7
- config.actions.default_response_format = :json
8
- register_slice :main
9
- end
10
- end
11
-
12
- Hanami.app.prepare
13
-
14
- module TestApp
15
- class Action < Hanami::Action
16
- end
17
- end
18
- end
19
-
20
- let(:action_class) { TestApp::Action }
21
- subject(:configuration) { action_class.config }
22
-
23
- it "applies 'config.actions' configuration from the app" do
24
- expect(configuration.default_response_format).to eq :json
25
- end
26
- end
@@ -1,115 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami/settings"
4
-
5
- RSpec.describe "App settings", :app_integration do
6
- before do
7
- @env = ENV.to_h
8
- end
9
-
10
- after do
11
- ENV.replace(@env)
12
- end
13
-
14
- specify "Settings defined in config/settings.rb are loaded from .env" do
15
- with_tmp_directory(Dir.mktmpdir) do
16
- write "config/app.rb", <<~RUBY
17
- require "hanami"
18
-
19
- module TestApp
20
- class App < Hanami::App
21
- end
22
- end
23
- RUBY
24
-
25
- write "config/settings.rb", <<~RUBY
26
- require "hanami/settings"
27
- require "test_app/types"
28
-
29
- module TestApp
30
- class Settings < Hanami::Settings
31
- setting :database_url
32
- setting :redis_url
33
- setting :feature_flag, constructor: TestApp::Types::Params::Bool
34
- setting :feature_flag_with_default, default: false, constructor: TestApp::Types::Params::Bool
35
- end
36
- end
37
- RUBY
38
-
39
- write ".env", <<~RUBY
40
- DATABASE_URL=postgres://localhost/test_app_development
41
- REDIS_URL=redis://localhost:6379
42
- FEATURE_FLAG=true
43
- RUBY
44
-
45
- write "lib/test_app/types.rb", <<~RUBY
46
- require "dry/types"
47
-
48
- module TestApp
49
- module Types
50
- include Dry.Types()
51
- end
52
- end
53
- RUBY
54
-
55
- require "hanami/prepare"
56
-
57
- expect(Hanami.app.settings.database_url).to eq "postgres://localhost/test_app_development"
58
- expect(Hanami.app.settings.redis_url).to eq "redis://localhost:6379"
59
- expect(Hanami.app.settings.feature_flag).to be true
60
- expect(Hanami.app.settings.feature_flag_with_default).to be false
61
-
62
- expect(Hanami.app[:settings]).to eql Hanami.app.settings
63
- end
64
- end
65
-
66
- specify "Errors raised from setting constructors are collected" do
67
- with_tmp_directory(Dir.mktmpdir) do
68
- write "config/app.rb", <<~RUBY
69
- require "hanami"
70
-
71
- module TestApp
72
- class App < Hanami::App
73
- end
74
- end
75
- RUBY
76
-
77
- write "config/settings.rb", <<~RUBY
78
- require "hanami/settings"
79
- require "test_app/types"
80
-
81
- module TestApp
82
- class Settings < Hanami::Settings
83
- setting :numeric_setting, constructor: TestApp::Types::Params::Integer
84
- setting :feature_flag, constructor: TestApp::Types::Params::Bool
85
- end
86
- end
87
- RUBY
88
-
89
- write ".env", <<~RUBY
90
- NUMERIC_SETTING=hello
91
- FEATURE_FLAG=maybe
92
- RUBY
93
-
94
- write "lib/test_app/types.rb", <<~RUBY
95
- require "dry/types"
96
-
97
- module TestApp
98
- module Types
99
- include Dry.Types()
100
- end
101
- end
102
- RUBY
103
-
104
- numeric_setting_error = "numeric_setting: invalid value for Integer"
105
- feature_flag_error = "feature_flag: maybe cannot be coerced"
106
-
107
- expect {
108
- require "hanami/prepare"
109
- }.to raise_error(
110
- Hanami::Settings::InvalidSettingsError,
111
- /#{numeric_setting_error}.+#{feature_flag_error}|#{feature_flag_error}.+#{numeric_setting_error}/m
112
- )
113
- end
114
- end
115
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami"
4
-
5
- RSpec.describe "App view / Configuration", :app_integration do
6
- before do
7
- module TestApp
8
- class App < Hanami::App
9
- config.root = "/test_app"
10
- end
11
- end
12
-
13
- Hanami.app.instance_eval(&app_hook) if respond_to?(:app_hook)
14
- Hanami.app.register_slice :main
15
- Hanami.app.prepare
16
-
17
- module TestApp
18
- class View < Hanami::View
19
- end
20
- end
21
- end
22
-
23
- let(:view_class) { TestApp::View }
24
-
25
- subject(:config) { view_class.config }
26
-
27
- it "applies default view configuration from the app" do
28
- aggregate_failures do
29
- expect(config.layouts_dir).to eq "layouts"
30
- expect(config.layout).to eq "app"
31
- end
32
- end
33
-
34
- context "custom views configuration on app" do
35
- let(:app_hook) {
36
- proc do
37
- config.views.layouts_dir = "custom_layouts"
38
- config.views.layout = "my_layout"
39
- end
40
- }
41
-
42
- it "applies the custom configuration" do
43
- aggregate_failures do
44
- expect(config.layouts_dir).to eq "custom_layouts"
45
- expect(config.layout).to eq "my_layout"
46
- end
47
- end
48
- end
49
- end
@@ -1,119 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "hanami/settings/dotenv_store"
4
- require "dotenv"
5
-
6
- RSpec.describe Hanami::Settings::DotenvStore do
7
- def mock_dotenv(store)
8
- dotenv = spy(:dotenv)
9
- allow(store).to receive(:require).and_call_original
10
- stub_const "Dotenv", dotenv
11
- end
12
-
13
- describe "#with_dotenv_loaded" do
14
- context "dotenv available and environment other than test" do
15
- it "requires and loads a range of dotenv files, specific to the current environment" do
16
- store = described_class.new(store: {}, hanami_env: :development)
17
- dotenv = mock_dotenv(store)
18
-
19
- store.with_dotenv_loaded
20
-
21
- expect(store).to have_received(:require).with("dotenv").ordered
22
- expect(dotenv).to have_received(:load).ordered.with(
23
- ".env.development.local",
24
- ".env.local",
25
- ".env.development",
26
- ".env"
27
- )
28
- end
29
-
30
- it "returns self" do
31
- store = described_class.new(store: {}, hanami_env: :development)
32
-
33
- expect(store.with_dotenv_loaded).to be(store)
34
- end
35
- end
36
-
37
- context "dotenv available and test environment" do
38
- it "does not load .env.local (which is intended for non-test settings only)" do
39
- store = described_class.new(store: {}, hanami_env: :test)
40
- dotenv = mock_dotenv(store)
41
-
42
- store.with_dotenv_loaded
43
-
44
- expect(store).to have_received(:require).with("dotenv").ordered
45
- expect(dotenv).to have_received(:load).ordered.with(
46
- ".env.test.local",
47
- ".env.test",
48
- ".env"
49
- )
50
- end
51
-
52
- it "returns self" do
53
- store = described_class.new(store: {}, hanami_env: :test)
54
-
55
- expect(store.with_dotenv_loaded).to be(store)
56
- end
57
- end
58
-
59
- context "dotenv unavailable" do
60
- let(:store) { described_class.new(store: {}) }
61
-
62
- before do
63
- allow(store).to receive(:require).with("dotenv").and_raise LoadError
64
- end
65
-
66
- it "attempts to require dotenv" do
67
- store.with_dotenv_loaded
68
-
69
- expect(store).to have_received(:require).with("dotenv")
70
- end
71
-
72
- it "gracefully ignores load errors" do
73
- expect { store.with_dotenv_loaded }.not_to raise_error
74
- end
75
-
76
- it "returns self" do
77
- expect(store.with_dotenv_loaded).to be(store)
78
- end
79
- end
80
- end
81
-
82
- describe "#fetch" do
83
- it "fetches from ENV" do
84
- store = described_class.new(store: { "FOO" => "bar" })
85
-
86
- expect(store.fetch("FOO")).to eq("bar")
87
- end
88
-
89
- it "capitalizes name" do
90
- store = described_class.new(store: { "FOO" => "bar" })
91
-
92
- expect(store.fetch("foo")).to eq("bar")
93
- end
94
-
95
- it "coerces name to string" do
96
- store = described_class.new(store: { "FOO" => "bar" })
97
-
98
- expect(store.fetch(:foo)).to eq("bar")
99
- end
100
-
101
- it "returns default when value is not found" do
102
- store = described_class.new(store: { "FOO" => "bar" })
103
-
104
- expect(store.fetch("BAZ", "qux")).to eq("qux")
105
- end
106
-
107
- it "returns the block execution when value is not found" do
108
- store = described_class.new(store: { "FOO" => "bar" })
109
-
110
- expect(store.fetch("BAZ") { "qux" }).to eq("qux")
111
- end
112
-
113
- it "raises KeyError when value is not found and no default is given" do
114
- store = described_class.new(store: { "FOO" => "bar" })
115
-
116
- expect{ store.fetch("BAZ") }.to raise_error(KeyError)
117
- end
118
- end
119
- end