hanami 2.0.0.alpha8 → 2.0.0.beta1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +442 -241
- data/FEATURES.md +30 -9
- data/README.md +1 -3
- data/hanami.gemspec +21 -11
- data/lib/hanami/app.rb +141 -0
- data/lib/hanami/assets/application_configuration.rb +10 -4
- data/lib/hanami/configuration/actions/content_security_policy.rb +5 -5
- data/lib/hanami/configuration/actions/cookies.rb +2 -2
- data/lib/hanami/configuration/actions.rb +10 -4
- data/lib/hanami/configuration/logger.rb +4 -4
- data/lib/hanami/configuration/router.rb +2 -6
- data/lib/hanami/configuration/sessions.rb +1 -1
- data/lib/hanami/configuration/views.rb +9 -4
- data/lib/hanami/configuration.rb +118 -46
- data/lib/hanami/constants.rb +24 -2
- data/lib/hanami/errors.rb +1 -1
- data/lib/hanami/{application → extensions}/action/slice_configured_action.rb +9 -9
- data/lib/hanami/extensions/action.rb +79 -0
- data/lib/hanami/extensions/view/context.rb +106 -0
- data/lib/hanami/{application → extensions}/view/slice_configured_context.rb +10 -10
- data/lib/hanami/{application → extensions}/view/slice_configured_view.rb +12 -6
- data/lib/hanami/extensions/view.rb +33 -0
- data/lib/hanami/extensions.rb +10 -0
- data/lib/hanami/providers/inflector.rb +13 -0
- data/lib/hanami/providers/logger.rb +13 -0
- data/lib/hanami/providers/rack.rb +27 -0
- data/lib/hanami/providers/routes.rb +33 -0
- data/lib/hanami/providers/settings.rb +23 -0
- data/lib/hanami/rake_tasks.rb +61 -0
- data/lib/hanami/routes.rb +51 -0
- data/lib/hanami/server.rb +1 -1
- data/lib/hanami/settings/dotenv_store.rb +58 -0
- data/lib/hanami/settings.rb +90 -0
- data/lib/hanami/setup.rb +4 -2
- data/lib/hanami/{application → slice}/router.rb +18 -13
- data/lib/hanami/slice/routes_helper.rb +37 -0
- data/lib/hanami/{application → slice}/routing/middleware/stack.rb +43 -5
- data/lib/hanami/slice/routing/resolver.rb +97 -0
- data/lib/hanami/{application → slice}/view_name_inferrer.rb +3 -3
- data/lib/hanami/slice.rb +246 -73
- data/lib/hanami/slice_configurable.rb +4 -17
- data/lib/hanami/slice_name.rb +6 -6
- data/lib/hanami/slice_registrar.rb +119 -0
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami/web/rack_logger.rb +1 -1
- data/lib/hanami.rb +34 -26
- data/spec/integration/application_middleware_stack_spec.rb +84 -0
- data/spec/integration/assets/cdn_spec.rb +48 -0
- data/spec/integration/assets/fingerprint_spec.rb +42 -0
- data/spec/integration/assets/helpers_spec.rb +50 -0
- data/spec/integration/assets/serve_spec.rb +70 -0
- data/spec/integration/assets/subresource_integrity_spec.rb +54 -0
- data/spec/integration/body_parsers_spec.rb +50 -0
- data/spec/integration/cli/assets/precompile_spec.rb +147 -0
- data/spec/integration/cli/assets_spec.rb +14 -0
- data/spec/integration/cli/console_spec.rb +105 -0
- data/spec/integration/cli/db/apply_spec.rb +74 -0
- data/spec/integration/cli/db/console_spec.rb +40 -0
- data/spec/integration/cli/db/create_spec.rb +50 -0
- data/spec/integration/cli/db/drop_spec.rb +54 -0
- data/spec/integration/cli/db/migrate_spec.rb +108 -0
- data/spec/integration/cli/db/prepare_spec.rb +36 -0
- data/spec/integration/cli/db/rollback_spec.rb +96 -0
- data/spec/integration/cli/db/version_spec.rb +38 -0
- data/spec/integration/cli/db_spec.rb +21 -0
- data/spec/integration/cli/destroy/action_spec.rb +143 -0
- data/spec/integration/cli/destroy/app_spec.rb +118 -0
- data/spec/integration/cli/destroy/mailer_spec.rb +74 -0
- data/spec/integration/cli/destroy/migration_spec.rb +70 -0
- data/spec/integration/cli/destroy/model_spec.rb +113 -0
- data/spec/integration/cli/destroy_spec.rb +18 -0
- data/spec/integration/cli/generate/action_spec.rb +469 -0
- data/spec/integration/cli/generate/app_spec.rb +215 -0
- data/spec/integration/cli/generate/mailer_spec.rb +189 -0
- data/spec/integration/cli/generate/migration_spec.rb +72 -0
- data/spec/integration/cli/generate/model_spec.rb +290 -0
- data/spec/integration/cli/generate/secret_spec.rb +56 -0
- data/spec/integration/cli/generate_spec.rb +19 -0
- data/spec/integration/cli/new/database_spec.rb +235 -0
- data/spec/integration/cli/new/hanami_head_spec.rb +27 -0
- data/spec/integration/cli/new/template_spec.rb +118 -0
- data/spec/integration/cli/new/test_spec.rb +274 -0
- data/spec/integration/cli/new_spec.rb +970 -0
- data/spec/integration/cli/plugins_spec.rb +39 -0
- data/spec/integration/cli/routes_spec.rb +49 -0
- data/spec/integration/cli/server_spec.rb +626 -0
- data/spec/integration/cli/version_spec.rb +85 -0
- data/spec/integration/early_hints_spec.rb +35 -0
- data/spec/integration/handle_exceptions_spec.rb +244 -0
- data/spec/integration/head_spec.rb +89 -0
- data/spec/integration/http_headers_spec.rb +29 -0
- data/spec/integration/mailer_spec.rb +32 -0
- data/spec/integration/middleware_spec.rb +81 -0
- data/spec/integration/mount_applications_spec.rb +88 -0
- data/spec/integration/project_initializers_spec.rb +40 -0
- data/spec/integration/rackup_spec.rb +35 -0
- data/spec/integration/rake/with_minitest_spec.rb +67 -0
- data/spec/integration/rake/with_rspec_spec.rb +69 -0
- data/spec/integration/routing_helpers_spec.rb +61 -0
- data/spec/integration/security/content_security_policy_spec.rb +46 -0
- data/spec/integration/security/csrf_protection_spec.rb +42 -0
- data/spec/integration/security/force_ssl_spec.rb +29 -0
- data/spec/integration/security/x_content_type_options_spec.rb +46 -0
- data/spec/integration/security/x_frame_options_spec.rb +46 -0
- data/spec/integration/security/x_xss_protection_spec.rb +46 -0
- data/spec/integration/send_file_spec.rb +51 -0
- data/spec/integration/sessions_spec.rb +247 -0
- data/spec/integration/static_middleware_spec.rb +21 -0
- data/spec/integration/streaming_spec.rb +41 -0
- data/spec/integration/unsafe_send_file_spec.rb +52 -0
- data/spec/isolation/hanami/application/already_configured_spec.rb +19 -0
- data/spec/isolation/hanami/application/inherit_anonymous_class_spec.rb +10 -0
- data/spec/isolation/hanami/application/inherit_concrete_class_spec.rb +14 -0
- data/spec/isolation/hanami/application/not_configured_spec.rb +9 -0
- data/spec/isolation/hanami/application/routes/configured_spec.rb +44 -0
- data/spec/isolation/hanami/application/routes/not_configured_spec.rb +16 -0
- data/spec/isolation/hanami/boot/success_spec.rb +50 -0
- data/spec/new_integration/action/configuration_spec.rb +26 -0
- data/spec/new_integration/action/cookies_spec.rb +58 -0
- data/spec/new_integration/action/csrf_protection_spec.rb +54 -0
- data/spec/new_integration/action/routes_spec.rb +73 -0
- data/spec/new_integration/action/sessions_spec.rb +50 -0
- data/spec/new_integration/action/view_integration_spec.rb +165 -0
- data/spec/new_integration/action/view_rendering/automatic_rendering_spec.rb +247 -0
- data/spec/new_integration/action/view_rendering/paired_view_inference_spec.rb +115 -0
- data/spec/new_integration/action/view_rendering_spec.rb +107 -0
- data/spec/new_integration/code_loading/loading_from_app_spec.rb +152 -0
- data/spec/new_integration/code_loading/loading_from_slice_spec.rb +165 -0
- data/spec/new_integration/container/application_routes_helper_spec.rb +48 -0
- data/spec/new_integration/container/auto_injection_spec.rb +53 -0
- data/spec/new_integration/container/auto_registration_spec.rb +86 -0
- data/spec/new_integration/container/autoloader_spec.rb +80 -0
- data/spec/new_integration/container/imports_spec.rb +253 -0
- data/spec/new_integration/container/prepare_container_spec.rb +123 -0
- data/spec/new_integration/container/shutdown_spec.rb +91 -0
- data/spec/new_integration/container/standard_bootable_components_spec.rb +124 -0
- data/spec/new_integration/rack_app/middleware_spec.rb +215 -0
- data/spec/new_integration/rack_app/non_booted_rack_app_spec.rb +105 -0
- data/spec/new_integration/rack_app/rack_app_spec.rb +524 -0
- data/spec/new_integration/settings_spec.rb +115 -0
- data/spec/new_integration/slices/external_slice_spec.rb +92 -0
- data/spec/new_integration/slices/slice_configuration_spec.rb +40 -0
- data/spec/new_integration/slices/slice_routing_spec.rb +226 -0
- data/spec/new_integration/slices/slice_settings_spec.rb +141 -0
- data/spec/new_integration/slices_spec.rb +101 -0
- data/spec/new_integration/view/configuration_spec.rb +49 -0
- data/spec/new_integration/view/context/assets_spec.rb +67 -0
- data/spec/new_integration/view/context/inflector_spec.rb +48 -0
- data/spec/new_integration/view/context/request_spec.rb +61 -0
- data/spec/new_integration/view/context/routes_spec.rb +86 -0
- data/spec/new_integration/view/context/settings_spec.rb +50 -0
- data/spec/new_integration/view/inflector_spec.rb +57 -0
- data/spec/new_integration/view/part_namespace_spec.rb +96 -0
- data/spec/new_integration/view/path_spec.rb +56 -0
- data/spec/new_integration/view/template_spec.rb +68 -0
- data/spec/new_integration/view/views_spec.rb +103 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/app_integration.rb +91 -0
- data/spec/support/coverage.rb +1 -0
- data/spec/support/fixtures/hanami-plugin/Gemfile +8 -0
- data/spec/support/fixtures/hanami-plugin/README.md +35 -0
- data/spec/support/fixtures/hanami-plugin/Rakefile +4 -0
- data/spec/support/fixtures/hanami-plugin/bin/console +15 -0
- data/spec/support/fixtures/hanami-plugin/bin/setup +8 -0
- data/spec/support/fixtures/hanami-plugin/hanami-plugin.gemspec +28 -0
- data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/cli.rb +19 -0
- data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/version.rb +7 -0
- data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin.rb +8 -0
- data/spec/support/rspec.rb +27 -0
- data/spec/support/shared_examples/cli/generate/app.rb +494 -0
- data/spec/support/shared_examples/cli/generate/migration.rb +32 -0
- data/spec/support/shared_examples/cli/generate/model.rb +81 -0
- data/spec/support/shared_examples/cli/new.rb +97 -0
- data/spec/unit/hanami/configuration/actions/content_security_policy_spec.rb +102 -0
- data/spec/unit/hanami/configuration/actions/cookies_spec.rb +46 -0
- data/spec/unit/hanami/configuration/actions/csrf_protection_spec.rb +57 -0
- data/spec/unit/hanami/configuration/actions/default_values_spec.rb +52 -0
- data/spec/unit/hanami/configuration/actions/sessions_spec.rb +50 -0
- data/spec/unit/hanami/configuration/actions_spec.rb +78 -0
- data/spec/unit/hanami/configuration/base_url_spec.rb +25 -0
- data/spec/unit/hanami/configuration/inflector_spec.rb +35 -0
- data/spec/unit/hanami/configuration/logger_spec.rb +203 -0
- data/spec/unit/hanami/configuration/views_spec.rb +120 -0
- data/spec/unit/hanami/configuration_spec.rb +43 -0
- data/spec/unit/hanami/env_spec.rb +54 -0
- data/spec/unit/hanami/routes_spec.rb +25 -0
- data/spec/unit/hanami/settings/dotenv_store_spec.rb +119 -0
- data/spec/unit/hanami/settings_spec.rb +56 -0
- data/spec/unit/hanami/slice_configurable_spec.rb +104 -0
- data/spec/unit/hanami/slice_name_spec.rb +47 -0
- data/spec/unit/hanami/slice_spec.rb +17 -0
- data/spec/unit/hanami/version_spec.rb +7 -0
- data/spec/unit/hanami/web/rack_logger_spec.rb +78 -0
- metadata +353 -57
- data/lib/hanami/application/action.rb +0 -72
- data/lib/hanami/application/container/providers/inflector.rb +0 -7
- data/lib/hanami/application/container/providers/logger.rb +0 -7
- data/lib/hanami/application/container/providers/rack_logger.rb +0 -15
- data/lib/hanami/application/container/providers/rack_monitor.rb +0 -12
- data/lib/hanami/application/container/providers/routes_helper.rb +0 -9
- data/lib/hanami/application/container/providers/settings.rb +0 -7
- data/lib/hanami/application/routes.rb +0 -55
- data/lib/hanami/application/routes_helper.rb +0 -34
- data/lib/hanami/application/routing/resolver/node.rb +0 -50
- data/lib/hanami/application/routing/resolver/trie.rb +0 -59
- data/lib/hanami/application/routing/resolver.rb +0 -87
- data/lib/hanami/application/routing/router.rb +0 -36
- data/lib/hanami/application/settings/dotenv_store.rb +0 -60
- data/lib/hanami/application/settings.rb +0 -93
- data/lib/hanami/application/slice_registrar.rb +0 -106
- data/lib/hanami/application/view/context.rb +0 -95
- data/lib/hanami/application/view.rb +0 -24
- data/lib/hanami/application.rb +0 -273
- data/lib/hanami/cli/application/cli.rb +0 -40
- data/lib/hanami/cli/application/command.rb +0 -47
- data/lib/hanami/cli/application/commands/console.rb +0 -81
- data/lib/hanami/cli/application/commands.rb +0 -16
- data/lib/hanami/cli/base_command.rb +0 -48
- data/lib/hanami/cli/commands/command.rb +0 -171
- data/lib/hanami/cli/commands/server.rb +0 -88
- data/lib/hanami/cli/commands.rb +0 -65
- data/lib/hanami/configuration/middleware.rb +0 -20
- data/lib/hanami/configuration/source_dirs.rb +0 -42
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "Container imports", :app_integration do
|
|
4
|
+
xspecify "App container is imported into slice containers by default" do
|
|
5
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
6
|
+
write "config/app.rb", <<~RUBY
|
|
7
|
+
require "hanami"
|
|
8
|
+
|
|
9
|
+
module TestApp
|
|
10
|
+
class App < Hanami::App
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
RUBY
|
|
14
|
+
|
|
15
|
+
write "config/slices/admin.rb", <<~RUBY
|
|
16
|
+
module Admin
|
|
17
|
+
class Slice < Hanami::Slice
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
RUBY
|
|
21
|
+
|
|
22
|
+
require "hanami/setup"
|
|
23
|
+
|
|
24
|
+
Hanami.prepare
|
|
25
|
+
|
|
26
|
+
shared_service = Object.new
|
|
27
|
+
TestApp::App.register("shared_service", shared_service)
|
|
28
|
+
|
|
29
|
+
Hanami.boot
|
|
30
|
+
|
|
31
|
+
expect(Admin::Slice["shared_service"]).to be shared_service
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
specify "Slices can import other slices" do
|
|
36
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
37
|
+
write "config/app.rb", <<~RUBY
|
|
38
|
+
require "hanami"
|
|
39
|
+
|
|
40
|
+
module TestApp
|
|
41
|
+
class App < Hanami::App
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
RUBY
|
|
45
|
+
|
|
46
|
+
write "config/slices/admin.rb", <<~RUBY
|
|
47
|
+
module Admin
|
|
48
|
+
class Slice < Hanami::Slice
|
|
49
|
+
import from: :search
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
RUBY
|
|
53
|
+
|
|
54
|
+
write "slices/search/lib/index_entity.rb", <<~RUBY
|
|
55
|
+
module Search
|
|
56
|
+
class IndexEntity
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
RUBY
|
|
60
|
+
|
|
61
|
+
require "hanami/boot"
|
|
62
|
+
|
|
63
|
+
expect(Admin::Slice["search.index_entity"]).to be_a Search::IndexEntity
|
|
64
|
+
|
|
65
|
+
# Ensure a slice's imported components (e.g. from "app") are not then
|
|
66
|
+
# exported again when that slice is imported, which would result in redundant
|
|
67
|
+
# components
|
|
68
|
+
expect(Search::Slice.key?("logger")).to be true
|
|
69
|
+
expect(Admin::Slice.key?("logger")).to be true
|
|
70
|
+
expect(Admin::Slice.key?("search.logger")).to be false
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
specify "Slices can import specific components from other slices" do
|
|
75
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
76
|
+
write "config/app.rb", <<~RUBY
|
|
77
|
+
require "hanami"
|
|
78
|
+
|
|
79
|
+
module TestApp
|
|
80
|
+
class App < Hanami::App
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
RUBY
|
|
84
|
+
|
|
85
|
+
write "config/slices/admin.rb", <<~RUBY
|
|
86
|
+
module Admin
|
|
87
|
+
class Slice < Hanami::Slice
|
|
88
|
+
import(
|
|
89
|
+
keys: ["query"],
|
|
90
|
+
from: :search
|
|
91
|
+
)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
RUBY
|
|
95
|
+
|
|
96
|
+
write "slices/search/lib/index_entity.rb", <<~RUBY
|
|
97
|
+
module Search
|
|
98
|
+
class IndexEntity; end
|
|
99
|
+
end
|
|
100
|
+
RUBY
|
|
101
|
+
|
|
102
|
+
write "slices/search/lib/query.rb", <<~RUBY
|
|
103
|
+
module Search
|
|
104
|
+
class Query; end
|
|
105
|
+
end
|
|
106
|
+
RUBY
|
|
107
|
+
|
|
108
|
+
require "hanami/setup"
|
|
109
|
+
Hanami.boot
|
|
110
|
+
|
|
111
|
+
expect(Admin::Slice["search.query"]).to be_a Search::Query
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
specify "Slices can import from other slices with a custom import key namespace" do
|
|
116
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
117
|
+
write "config/app.rb", <<~RUBY
|
|
118
|
+
require "hanami"
|
|
119
|
+
|
|
120
|
+
module TestApp
|
|
121
|
+
class App < Hanami::App
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
RUBY
|
|
125
|
+
|
|
126
|
+
write "config/slices/admin.rb", <<~RUBY
|
|
127
|
+
module Admin
|
|
128
|
+
class Slice < Hanami::Slice
|
|
129
|
+
import(
|
|
130
|
+
keys: ["query"],
|
|
131
|
+
from: :search,
|
|
132
|
+
as: :search_engine
|
|
133
|
+
)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
RUBY
|
|
137
|
+
|
|
138
|
+
write "slices/search/lib/index_entity.rb", <<~RUBY
|
|
139
|
+
module Search
|
|
140
|
+
class IndexEntity; end
|
|
141
|
+
end
|
|
142
|
+
RUBY
|
|
143
|
+
|
|
144
|
+
write "slices/search/lib/query.rb", <<~RUBY
|
|
145
|
+
module Search
|
|
146
|
+
class Query; end
|
|
147
|
+
end
|
|
148
|
+
RUBY
|
|
149
|
+
|
|
150
|
+
require "hanami/boot"
|
|
151
|
+
|
|
152
|
+
expect(Admin::Slice["search_engine.query"]).to be_a Search::Query
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
specify "Imported components from another slice are lazily resolved in unbooted apps" do
|
|
157
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
158
|
+
write "config/app.rb", <<~RUBY
|
|
159
|
+
require "hanami"
|
|
160
|
+
|
|
161
|
+
module TestApp
|
|
162
|
+
class App < Hanami::App
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
RUBY
|
|
166
|
+
|
|
167
|
+
write "config/slices/admin.rb", <<~RUBY
|
|
168
|
+
module Admin
|
|
169
|
+
class Slice < Hanami::Slice
|
|
170
|
+
import from: :search
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
RUBY
|
|
174
|
+
|
|
175
|
+
write "slices/admin/lib/admin/test_op.rb", <<~RUBY
|
|
176
|
+
module Admin
|
|
177
|
+
class TestOp
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
RUBY
|
|
181
|
+
|
|
182
|
+
write "slices/search/lib/index_entity.rb", <<~RUBY
|
|
183
|
+
module Search
|
|
184
|
+
class IndexEntity
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
RUBY
|
|
188
|
+
|
|
189
|
+
require "hanami/prepare"
|
|
190
|
+
|
|
191
|
+
expect(Hanami.app).not_to be_booted
|
|
192
|
+
|
|
193
|
+
expect(Admin::Slice.keys).not_to include "search.index_entity"
|
|
194
|
+
expect(Admin::Slice["search.index_entity"]).to be_a Search::IndexEntity
|
|
195
|
+
expect(Admin::Slice.keys).to include "search.index_entity"
|
|
196
|
+
|
|
197
|
+
expect(Admin::Slice).not_to be_booted
|
|
198
|
+
expect(Admin::Slice.container).not_to be_finalized
|
|
199
|
+
expect(Search::Slice).not_to be_booted
|
|
200
|
+
expect(Search::Slice.container).not_to be_finalized
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
specify "Slices can configure specific exports" do
|
|
205
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
206
|
+
write "config/app.rb", <<~RUBY
|
|
207
|
+
require "hanami"
|
|
208
|
+
|
|
209
|
+
module TestApp
|
|
210
|
+
class App < Hanami::App
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
RUBY
|
|
214
|
+
|
|
215
|
+
write "config/slices/admin.rb", <<~RUBY
|
|
216
|
+
module Admin
|
|
217
|
+
class Slice < Hanami::Slice
|
|
218
|
+
import(
|
|
219
|
+
keys: %w[index_entity query],
|
|
220
|
+
from: :search
|
|
221
|
+
)
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
RUBY
|
|
225
|
+
|
|
226
|
+
write "config/slices/search.rb", <<~RUBY
|
|
227
|
+
module Search
|
|
228
|
+
class Slice < Hanami::Slice
|
|
229
|
+
export(%w[query])
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
RUBY
|
|
233
|
+
|
|
234
|
+
write "slices/search/lib/index_entity.rb", <<~RUBY
|
|
235
|
+
module Search
|
|
236
|
+
class IndexEntity; end
|
|
237
|
+
end
|
|
238
|
+
RUBY
|
|
239
|
+
|
|
240
|
+
write "slices/search/lib/query.rb", <<~RUBY
|
|
241
|
+
module Search
|
|
242
|
+
class Query; end
|
|
243
|
+
end
|
|
244
|
+
RUBY
|
|
245
|
+
|
|
246
|
+
require "hanami/setup"
|
|
247
|
+
Hanami.boot
|
|
248
|
+
|
|
249
|
+
expect(Admin::Slice.key?("search.query")).to be true
|
|
250
|
+
expect(Admin::Slice.key?("search.index_entity")).to be false
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "Container / prepare_container", :app_integration do
|
|
4
|
+
# (Most of) the examples below make their expectations on a `container_to_prepare`,
|
|
5
|
+
# which is the container yielded to the `Slice.prepare_container` block _at the moment
|
|
6
|
+
# it is called_.
|
|
7
|
+
#
|
|
8
|
+
# This around hook ensures the examples are run at the right time and container is
|
|
9
|
+
# available to each.
|
|
10
|
+
around(in_prepare_container: true) do |example|
|
|
11
|
+
# Eagerly capture @loaded_features here (see spec/support/app_integration.rb) since
|
|
12
|
+
# around hooks are run before any before hooks (where we ordinarily capture
|
|
13
|
+
# @loaded_features), and by invoking `example_group_instance.subject` below, we're
|
|
14
|
+
# making requires that we want to ensure are properly cleaned between examples.
|
|
15
|
+
@loaded_features = $LOADED_FEATURES.dup
|
|
16
|
+
|
|
17
|
+
slice = example.example_group_instance.subject
|
|
18
|
+
|
|
19
|
+
slice.prepare_container do |container|
|
|
20
|
+
example.example.example_group.let(:container_to_prepare) { container }
|
|
21
|
+
example.run
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The prepare_container block is called when the slice is prepared
|
|
25
|
+
slice.prepare
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "in app", :in_prepare_container do
|
|
29
|
+
before :context do
|
|
30
|
+
with_directory(@dir = make_tmp_directory) do
|
|
31
|
+
write "config/app.rb", <<~'RUBY'
|
|
32
|
+
module TestApp
|
|
33
|
+
class App < Hanami::App
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
RUBY
|
|
37
|
+
|
|
38
|
+
write "app/.keep", ""
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
subject {
|
|
43
|
+
with_directory(@dir) { require "hanami/setup" }
|
|
44
|
+
Hanami.app
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
it "receives the container for the app" do
|
|
48
|
+
expect(container_to_prepare).to be TestApp::Container
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
specify "the container has been already configured by the app" do
|
|
52
|
+
expect(container_to_prepare.config.component_dirs.dir("app")).to be
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
specify "the container is not yet marked as configured" do
|
|
56
|
+
expect(container_to_prepare).not_to be_configured
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe "after app is prepared", in_prepare_container: false do
|
|
60
|
+
before do
|
|
61
|
+
subject.prepare_container do |container|
|
|
62
|
+
container.config.name = :custom_name
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "preserves any container configuration changes made via the block" do
|
|
67
|
+
expect { subject.prepare }
|
|
68
|
+
.to change { subject.container.config.name }
|
|
69
|
+
.to :custom_name
|
|
70
|
+
|
|
71
|
+
expect(subject.container).to be_configured
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "in slice", :in_prepare_container do
|
|
77
|
+
before :context do
|
|
78
|
+
with_directory(@dir = make_tmp_directory) do
|
|
79
|
+
write "config/app.rb", <<~'RUBY'
|
|
80
|
+
module TestApp
|
|
81
|
+
class App < Hanami::App
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
RUBY
|
|
85
|
+
|
|
86
|
+
write "slices/main/.keep", ""
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
subject {
|
|
91
|
+
with_directory(@dir) { require "hanami/setup" }
|
|
92
|
+
Hanami.app.register_slice(:main)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
it "receives the container for the slice" do
|
|
96
|
+
expect(container_to_prepare).to be Main::Container
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
specify "the container has been already configured by the slice" do
|
|
100
|
+
expect(container_to_prepare.config.component_dirs.dir("")).to be
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
specify "the container is not yet marked as configured" do
|
|
104
|
+
expect(container_to_prepare).not_to be_configured
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
describe "after slice is prepared", in_prepare_container: false do
|
|
108
|
+
before do
|
|
109
|
+
subject.prepare_container do |container|
|
|
110
|
+
container.config.name = :custom_name
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "preserves any container configuration changes made via the block" do
|
|
115
|
+
expect { subject.prepare }
|
|
116
|
+
.to change { subject.container.config.name }
|
|
117
|
+
.to :custom_name
|
|
118
|
+
|
|
119
|
+
expect(subject.container).to be_configured
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe "App shutdown", :app_integration do
|
|
4
|
+
specify "App shutdown stops providers in both the app and slices" do
|
|
5
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
6
|
+
write "config/app.rb", <<~RUBY
|
|
7
|
+
# frozen_string_literal: true
|
|
8
|
+
|
|
9
|
+
require "hanami"
|
|
10
|
+
|
|
11
|
+
module TestApp
|
|
12
|
+
class App < Hanami::App
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
RUBY
|
|
16
|
+
|
|
17
|
+
write "config/providers/connection.rb", <<~RUBY
|
|
18
|
+
# frozen_string_literal: true
|
|
19
|
+
|
|
20
|
+
Hanami.app.register_provider :connection do
|
|
21
|
+
prepare do
|
|
22
|
+
module TestApp
|
|
23
|
+
class Connection
|
|
24
|
+
attr_reader :connected
|
|
25
|
+
|
|
26
|
+
def initialize
|
|
27
|
+
@connected = true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def disconnect
|
|
31
|
+
@connected = false
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
start do
|
|
38
|
+
register("connection", TestApp::Connection.new)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
stop do
|
|
42
|
+
container["connection"].disconnect
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
RUBY
|
|
46
|
+
|
|
47
|
+
write "slices/main/config/providers/connection.rb", <<~RUBY
|
|
48
|
+
# frozen_string_literal: true
|
|
49
|
+
|
|
50
|
+
Main::Slice.register_provider :connection do
|
|
51
|
+
prepare do
|
|
52
|
+
module Main
|
|
53
|
+
class Connection
|
|
54
|
+
attr_reader :connected
|
|
55
|
+
|
|
56
|
+
def initialize
|
|
57
|
+
@connected = true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def disconnect
|
|
61
|
+
@connected = false
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
start do
|
|
68
|
+
register "connection", Main::Connection.new
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
stop do
|
|
72
|
+
container["connection"].disconnect
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
RUBY
|
|
76
|
+
|
|
77
|
+
require "hanami/boot"
|
|
78
|
+
|
|
79
|
+
app_connection = Hanami.app["connection"]
|
|
80
|
+
slice_connection = Main::Slice["connection"]
|
|
81
|
+
|
|
82
|
+
expect(app_connection.connected).to be true
|
|
83
|
+
expect(slice_connection.connected).to be true
|
|
84
|
+
|
|
85
|
+
Hanami.shutdown
|
|
86
|
+
|
|
87
|
+
expect(app_connection.connected).to be false
|
|
88
|
+
expect(slice_connection.connected).to be false
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
RSpec.describe "Container / Standard bootable components", :app_integration do
|
|
2
|
+
specify "Standard components are available on booted container" do
|
|
3
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
4
|
+
write "config/app.rb", <<~RUBY
|
|
5
|
+
require "hanami"
|
|
6
|
+
|
|
7
|
+
module TestApp
|
|
8
|
+
class App < Hanami::App
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
RUBY
|
|
12
|
+
|
|
13
|
+
require "hanami/setup"
|
|
14
|
+
Hanami.boot
|
|
15
|
+
|
|
16
|
+
expect(Hanami.app.key?(:settings)).to be false
|
|
17
|
+
expect(Hanami.app["inflector"]).to eql Hanami.app.inflector
|
|
18
|
+
expect(Hanami.app["logger"]).to be_a_kind_of(Hanami::Logger)
|
|
19
|
+
expect(Hanami.app["rack.monitor"]).to be_a_kind_of(Dry::Monitor::Rack::Middleware)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
specify "Standard components are resolved lazily on non-booted container" do
|
|
24
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
25
|
+
write "config/app.rb", <<~RUBY
|
|
26
|
+
require "hanami"
|
|
27
|
+
|
|
28
|
+
module TestApp
|
|
29
|
+
class App < Hanami::App
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
RUBY
|
|
33
|
+
|
|
34
|
+
require "hanami/setup"
|
|
35
|
+
Hanami.prepare
|
|
36
|
+
|
|
37
|
+
expect(Hanami.app.key?(:settings)).to be false
|
|
38
|
+
expect(Hanami.app["inflector"]).to eql Hanami.app.inflector
|
|
39
|
+
expect(Hanami.app["logger"]).to be_a_kind_of(Hanami::Logger)
|
|
40
|
+
expect(Hanami.app["rack.monitor"]).to be_a_kind_of(Dry::Monitor::Rack::Middleware)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
specify "Settings component is available when settings are defined" do
|
|
45
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
46
|
+
write "config/app.rb", <<~RUBY
|
|
47
|
+
require "hanami"
|
|
48
|
+
|
|
49
|
+
module TestApp
|
|
50
|
+
class App < Hanami::App
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
RUBY
|
|
54
|
+
|
|
55
|
+
write "config/settings.rb", <<~RUBY
|
|
56
|
+
require "hanami/settings"
|
|
57
|
+
|
|
58
|
+
module TestApp
|
|
59
|
+
class Settings < Hanami::Settings
|
|
60
|
+
setting :session_secret
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
RUBY
|
|
64
|
+
|
|
65
|
+
require "hanami/setup"
|
|
66
|
+
Hanami.boot
|
|
67
|
+
|
|
68
|
+
expect(Hanami.app.key?(:settings)).to be true
|
|
69
|
+
expect(Hanami.app[:settings]).to respond_to :session_secret
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
specify "Standard components can be replaced by custom bootable components (on booted container)" do
|
|
74
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
75
|
+
write "config/app.rb", <<~RUBY
|
|
76
|
+
require "hanami"
|
|
77
|
+
|
|
78
|
+
module TestApp
|
|
79
|
+
class App < Hanami::App
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
RUBY
|
|
83
|
+
|
|
84
|
+
write "config/providers/logger.rb", <<~RUBY
|
|
85
|
+
Hanami.app.register_provider :logger do
|
|
86
|
+
start do
|
|
87
|
+
register :logger, "custom logger"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
RUBY
|
|
91
|
+
|
|
92
|
+
require "hanami/setup"
|
|
93
|
+
Hanami.boot
|
|
94
|
+
|
|
95
|
+
expect(Hanami.app[:logger]).to eq "custom logger"
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
specify "Standard components can be replaced by custom bootable components resolved lazily (on non-booted container)" do
|
|
100
|
+
with_tmp_directory(Dir.mktmpdir) do
|
|
101
|
+
write "config/app.rb", <<~RUBY
|
|
102
|
+
require "hanami"
|
|
103
|
+
|
|
104
|
+
module TestApp
|
|
105
|
+
class App < Hanami::App
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
RUBY
|
|
109
|
+
|
|
110
|
+
write "config/providers/logger.rb", <<~RUBY
|
|
111
|
+
Hanami.app.register_provider :logger do
|
|
112
|
+
start do
|
|
113
|
+
register :logger, "custom logger"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
RUBY
|
|
117
|
+
|
|
118
|
+
require "hanami/setup"
|
|
119
|
+
Hanami.prepare
|
|
120
|
+
|
|
121
|
+
expect(Hanami.app[:logger]).to eq "custom logger"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|