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.
Files changed (224) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +442 -241
  3. data/FEATURES.md +30 -9
  4. data/README.md +1 -3
  5. data/hanami.gemspec +21 -11
  6. data/lib/hanami/app.rb +141 -0
  7. data/lib/hanami/assets/application_configuration.rb +10 -4
  8. data/lib/hanami/configuration/actions/content_security_policy.rb +5 -5
  9. data/lib/hanami/configuration/actions/cookies.rb +2 -2
  10. data/lib/hanami/configuration/actions.rb +10 -4
  11. data/lib/hanami/configuration/logger.rb +4 -4
  12. data/lib/hanami/configuration/router.rb +2 -6
  13. data/lib/hanami/configuration/sessions.rb +1 -1
  14. data/lib/hanami/configuration/views.rb +9 -4
  15. data/lib/hanami/configuration.rb +118 -46
  16. data/lib/hanami/constants.rb +24 -2
  17. data/lib/hanami/errors.rb +1 -1
  18. data/lib/hanami/{application → extensions}/action/slice_configured_action.rb +9 -9
  19. data/lib/hanami/extensions/action.rb +79 -0
  20. data/lib/hanami/extensions/view/context.rb +106 -0
  21. data/lib/hanami/{application → extensions}/view/slice_configured_context.rb +10 -10
  22. data/lib/hanami/{application → extensions}/view/slice_configured_view.rb +12 -6
  23. data/lib/hanami/extensions/view.rb +33 -0
  24. data/lib/hanami/extensions.rb +10 -0
  25. data/lib/hanami/providers/inflector.rb +13 -0
  26. data/lib/hanami/providers/logger.rb +13 -0
  27. data/lib/hanami/providers/rack.rb +27 -0
  28. data/lib/hanami/providers/routes.rb +33 -0
  29. data/lib/hanami/providers/settings.rb +23 -0
  30. data/lib/hanami/rake_tasks.rb +61 -0
  31. data/lib/hanami/routes.rb +51 -0
  32. data/lib/hanami/server.rb +1 -1
  33. data/lib/hanami/settings/dotenv_store.rb +58 -0
  34. data/lib/hanami/settings.rb +90 -0
  35. data/lib/hanami/setup.rb +4 -2
  36. data/lib/hanami/{application → slice}/router.rb +18 -13
  37. data/lib/hanami/slice/routes_helper.rb +37 -0
  38. data/lib/hanami/{application → slice}/routing/middleware/stack.rb +43 -5
  39. data/lib/hanami/slice/routing/resolver.rb +97 -0
  40. data/lib/hanami/{application → slice}/view_name_inferrer.rb +3 -3
  41. data/lib/hanami/slice.rb +246 -73
  42. data/lib/hanami/slice_configurable.rb +4 -17
  43. data/lib/hanami/slice_name.rb +6 -6
  44. data/lib/hanami/slice_registrar.rb +119 -0
  45. data/lib/hanami/version.rb +1 -1
  46. data/lib/hanami/web/rack_logger.rb +1 -1
  47. data/lib/hanami.rb +34 -26
  48. data/spec/integration/application_middleware_stack_spec.rb +84 -0
  49. data/spec/integration/assets/cdn_spec.rb +48 -0
  50. data/spec/integration/assets/fingerprint_spec.rb +42 -0
  51. data/spec/integration/assets/helpers_spec.rb +50 -0
  52. data/spec/integration/assets/serve_spec.rb +70 -0
  53. data/spec/integration/assets/subresource_integrity_spec.rb +54 -0
  54. data/spec/integration/body_parsers_spec.rb +50 -0
  55. data/spec/integration/cli/assets/precompile_spec.rb +147 -0
  56. data/spec/integration/cli/assets_spec.rb +14 -0
  57. data/spec/integration/cli/console_spec.rb +105 -0
  58. data/spec/integration/cli/db/apply_spec.rb +74 -0
  59. data/spec/integration/cli/db/console_spec.rb +40 -0
  60. data/spec/integration/cli/db/create_spec.rb +50 -0
  61. data/spec/integration/cli/db/drop_spec.rb +54 -0
  62. data/spec/integration/cli/db/migrate_spec.rb +108 -0
  63. data/spec/integration/cli/db/prepare_spec.rb +36 -0
  64. data/spec/integration/cli/db/rollback_spec.rb +96 -0
  65. data/spec/integration/cli/db/version_spec.rb +38 -0
  66. data/spec/integration/cli/db_spec.rb +21 -0
  67. data/spec/integration/cli/destroy/action_spec.rb +143 -0
  68. data/spec/integration/cli/destroy/app_spec.rb +118 -0
  69. data/spec/integration/cli/destroy/mailer_spec.rb +74 -0
  70. data/spec/integration/cli/destroy/migration_spec.rb +70 -0
  71. data/spec/integration/cli/destroy/model_spec.rb +113 -0
  72. data/spec/integration/cli/destroy_spec.rb +18 -0
  73. data/spec/integration/cli/generate/action_spec.rb +469 -0
  74. data/spec/integration/cli/generate/app_spec.rb +215 -0
  75. data/spec/integration/cli/generate/mailer_spec.rb +189 -0
  76. data/spec/integration/cli/generate/migration_spec.rb +72 -0
  77. data/spec/integration/cli/generate/model_spec.rb +290 -0
  78. data/spec/integration/cli/generate/secret_spec.rb +56 -0
  79. data/spec/integration/cli/generate_spec.rb +19 -0
  80. data/spec/integration/cli/new/database_spec.rb +235 -0
  81. data/spec/integration/cli/new/hanami_head_spec.rb +27 -0
  82. data/spec/integration/cli/new/template_spec.rb +118 -0
  83. data/spec/integration/cli/new/test_spec.rb +274 -0
  84. data/spec/integration/cli/new_spec.rb +970 -0
  85. data/spec/integration/cli/plugins_spec.rb +39 -0
  86. data/spec/integration/cli/routes_spec.rb +49 -0
  87. data/spec/integration/cli/server_spec.rb +626 -0
  88. data/spec/integration/cli/version_spec.rb +85 -0
  89. data/spec/integration/early_hints_spec.rb +35 -0
  90. data/spec/integration/handle_exceptions_spec.rb +244 -0
  91. data/spec/integration/head_spec.rb +89 -0
  92. data/spec/integration/http_headers_spec.rb +29 -0
  93. data/spec/integration/mailer_spec.rb +32 -0
  94. data/spec/integration/middleware_spec.rb +81 -0
  95. data/spec/integration/mount_applications_spec.rb +88 -0
  96. data/spec/integration/project_initializers_spec.rb +40 -0
  97. data/spec/integration/rackup_spec.rb +35 -0
  98. data/spec/integration/rake/with_minitest_spec.rb +67 -0
  99. data/spec/integration/rake/with_rspec_spec.rb +69 -0
  100. data/spec/integration/routing_helpers_spec.rb +61 -0
  101. data/spec/integration/security/content_security_policy_spec.rb +46 -0
  102. data/spec/integration/security/csrf_protection_spec.rb +42 -0
  103. data/spec/integration/security/force_ssl_spec.rb +29 -0
  104. data/spec/integration/security/x_content_type_options_spec.rb +46 -0
  105. data/spec/integration/security/x_frame_options_spec.rb +46 -0
  106. data/spec/integration/security/x_xss_protection_spec.rb +46 -0
  107. data/spec/integration/send_file_spec.rb +51 -0
  108. data/spec/integration/sessions_spec.rb +247 -0
  109. data/spec/integration/static_middleware_spec.rb +21 -0
  110. data/spec/integration/streaming_spec.rb +41 -0
  111. data/spec/integration/unsafe_send_file_spec.rb +52 -0
  112. data/spec/isolation/hanami/application/already_configured_spec.rb +19 -0
  113. data/spec/isolation/hanami/application/inherit_anonymous_class_spec.rb +10 -0
  114. data/spec/isolation/hanami/application/inherit_concrete_class_spec.rb +14 -0
  115. data/spec/isolation/hanami/application/not_configured_spec.rb +9 -0
  116. data/spec/isolation/hanami/application/routes/configured_spec.rb +44 -0
  117. data/spec/isolation/hanami/application/routes/not_configured_spec.rb +16 -0
  118. data/spec/isolation/hanami/boot/success_spec.rb +50 -0
  119. data/spec/new_integration/action/configuration_spec.rb +26 -0
  120. data/spec/new_integration/action/cookies_spec.rb +58 -0
  121. data/spec/new_integration/action/csrf_protection_spec.rb +54 -0
  122. data/spec/new_integration/action/routes_spec.rb +73 -0
  123. data/spec/new_integration/action/sessions_spec.rb +50 -0
  124. data/spec/new_integration/action/view_integration_spec.rb +165 -0
  125. data/spec/new_integration/action/view_rendering/automatic_rendering_spec.rb +247 -0
  126. data/spec/new_integration/action/view_rendering/paired_view_inference_spec.rb +115 -0
  127. data/spec/new_integration/action/view_rendering_spec.rb +107 -0
  128. data/spec/new_integration/code_loading/loading_from_app_spec.rb +152 -0
  129. data/spec/new_integration/code_loading/loading_from_slice_spec.rb +165 -0
  130. data/spec/new_integration/container/application_routes_helper_spec.rb +48 -0
  131. data/spec/new_integration/container/auto_injection_spec.rb +53 -0
  132. data/spec/new_integration/container/auto_registration_spec.rb +86 -0
  133. data/spec/new_integration/container/autoloader_spec.rb +80 -0
  134. data/spec/new_integration/container/imports_spec.rb +253 -0
  135. data/spec/new_integration/container/prepare_container_spec.rb +123 -0
  136. data/spec/new_integration/container/shutdown_spec.rb +91 -0
  137. data/spec/new_integration/container/standard_bootable_components_spec.rb +124 -0
  138. data/spec/new_integration/rack_app/middleware_spec.rb +215 -0
  139. data/spec/new_integration/rack_app/non_booted_rack_app_spec.rb +105 -0
  140. data/spec/new_integration/rack_app/rack_app_spec.rb +524 -0
  141. data/spec/new_integration/settings_spec.rb +115 -0
  142. data/spec/new_integration/slices/external_slice_spec.rb +92 -0
  143. data/spec/new_integration/slices/slice_configuration_spec.rb +40 -0
  144. data/spec/new_integration/slices/slice_routing_spec.rb +226 -0
  145. data/spec/new_integration/slices/slice_settings_spec.rb +141 -0
  146. data/spec/new_integration/slices_spec.rb +101 -0
  147. data/spec/new_integration/view/configuration_spec.rb +49 -0
  148. data/spec/new_integration/view/context/assets_spec.rb +67 -0
  149. data/spec/new_integration/view/context/inflector_spec.rb +48 -0
  150. data/spec/new_integration/view/context/request_spec.rb +61 -0
  151. data/spec/new_integration/view/context/routes_spec.rb +86 -0
  152. data/spec/new_integration/view/context/settings_spec.rb +50 -0
  153. data/spec/new_integration/view/inflector_spec.rb +57 -0
  154. data/spec/new_integration/view/part_namespace_spec.rb +96 -0
  155. data/spec/new_integration/view/path_spec.rb +56 -0
  156. data/spec/new_integration/view/template_spec.rb +68 -0
  157. data/spec/new_integration/view/views_spec.rb +103 -0
  158. data/spec/spec_helper.rb +16 -0
  159. data/spec/support/app_integration.rb +91 -0
  160. data/spec/support/coverage.rb +1 -0
  161. data/spec/support/fixtures/hanami-plugin/Gemfile +8 -0
  162. data/spec/support/fixtures/hanami-plugin/README.md +35 -0
  163. data/spec/support/fixtures/hanami-plugin/Rakefile +4 -0
  164. data/spec/support/fixtures/hanami-plugin/bin/console +15 -0
  165. data/spec/support/fixtures/hanami-plugin/bin/setup +8 -0
  166. data/spec/support/fixtures/hanami-plugin/hanami-plugin.gemspec +28 -0
  167. data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/cli.rb +19 -0
  168. data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin/version.rb +7 -0
  169. data/spec/support/fixtures/hanami-plugin/lib/hanami/plugin.rb +8 -0
  170. data/spec/support/rspec.rb +27 -0
  171. data/spec/support/shared_examples/cli/generate/app.rb +494 -0
  172. data/spec/support/shared_examples/cli/generate/migration.rb +32 -0
  173. data/spec/support/shared_examples/cli/generate/model.rb +81 -0
  174. data/spec/support/shared_examples/cli/new.rb +97 -0
  175. data/spec/unit/hanami/configuration/actions/content_security_policy_spec.rb +102 -0
  176. data/spec/unit/hanami/configuration/actions/cookies_spec.rb +46 -0
  177. data/spec/unit/hanami/configuration/actions/csrf_protection_spec.rb +57 -0
  178. data/spec/unit/hanami/configuration/actions/default_values_spec.rb +52 -0
  179. data/spec/unit/hanami/configuration/actions/sessions_spec.rb +50 -0
  180. data/spec/unit/hanami/configuration/actions_spec.rb +78 -0
  181. data/spec/unit/hanami/configuration/base_url_spec.rb +25 -0
  182. data/spec/unit/hanami/configuration/inflector_spec.rb +35 -0
  183. data/spec/unit/hanami/configuration/logger_spec.rb +203 -0
  184. data/spec/unit/hanami/configuration/views_spec.rb +120 -0
  185. data/spec/unit/hanami/configuration_spec.rb +43 -0
  186. data/spec/unit/hanami/env_spec.rb +54 -0
  187. data/spec/unit/hanami/routes_spec.rb +25 -0
  188. data/spec/unit/hanami/settings/dotenv_store_spec.rb +119 -0
  189. data/spec/unit/hanami/settings_spec.rb +56 -0
  190. data/spec/unit/hanami/slice_configurable_spec.rb +104 -0
  191. data/spec/unit/hanami/slice_name_spec.rb +47 -0
  192. data/spec/unit/hanami/slice_spec.rb +17 -0
  193. data/spec/unit/hanami/version_spec.rb +7 -0
  194. data/spec/unit/hanami/web/rack_logger_spec.rb +78 -0
  195. metadata +353 -57
  196. data/lib/hanami/application/action.rb +0 -72
  197. data/lib/hanami/application/container/providers/inflector.rb +0 -7
  198. data/lib/hanami/application/container/providers/logger.rb +0 -7
  199. data/lib/hanami/application/container/providers/rack_logger.rb +0 -15
  200. data/lib/hanami/application/container/providers/rack_monitor.rb +0 -12
  201. data/lib/hanami/application/container/providers/routes_helper.rb +0 -9
  202. data/lib/hanami/application/container/providers/settings.rb +0 -7
  203. data/lib/hanami/application/routes.rb +0 -55
  204. data/lib/hanami/application/routes_helper.rb +0 -34
  205. data/lib/hanami/application/routing/resolver/node.rb +0 -50
  206. data/lib/hanami/application/routing/resolver/trie.rb +0 -59
  207. data/lib/hanami/application/routing/resolver.rb +0 -87
  208. data/lib/hanami/application/routing/router.rb +0 -36
  209. data/lib/hanami/application/settings/dotenv_store.rb +0 -60
  210. data/lib/hanami/application/settings.rb +0 -93
  211. data/lib/hanami/application/slice_registrar.rb +0 -106
  212. data/lib/hanami/application/view/context.rb +0 -95
  213. data/lib/hanami/application/view.rb +0 -24
  214. data/lib/hanami/application.rb +0 -273
  215. data/lib/hanami/cli/application/cli.rb +0 -40
  216. data/lib/hanami/cli/application/command.rb +0 -47
  217. data/lib/hanami/cli/application/commands/console.rb +0 -81
  218. data/lib/hanami/cli/application/commands.rb +0 -16
  219. data/lib/hanami/cli/base_command.rb +0 -48
  220. data/lib/hanami/cli/commands/command.rb +0 -171
  221. data/lib/hanami/cli/commands/server.rb +0 -88
  222. data/lib/hanami/cli/commands.rb +0 -65
  223. data/lib/hanami/configuration/middleware.rb +0 -20
  224. 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