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
data/FEATURES.md CHANGED
@@ -1,8 +1,29 @@
1
1
  # Hanami
2
+
2
3
  ### The web, with simplicity.
3
4
 
4
5
  ## Features
5
6
 
7
+ ## v2.0.0.beta1 - 2021-07-20
8
+
9
+ - Generate new apps using `app/` directory
10
+
11
+ ## v2.0.0.alpha8 - 2021-05-19
12
+
13
+ ## v2.0.0.alpha7.1 - 2021-03-09
14
+
15
+ ## v2.0.0.alpha7 - 2021-03-08
16
+
17
+ ## v2.0.0.alpha6 - 2021-02-10
18
+
19
+ ## v2.0.0.alpha5 - 2021-01-12
20
+
21
+ ## v2.0.0.alpha4 - 2021-12-07
22
+
23
+ ## v2.0.0.alpha3 - 2021-11-09
24
+
25
+ ## v2.0.0.alpha2 - 2021-05-04
26
+
6
27
  ## v2.0.0.alpha1 - 2019-01-30
7
28
 
8
29
  ## v1.3.3 - 2019-09-20
@@ -110,14 +131,14 @@
110
131
  - Assets preprocessors support (eg. Sass, ES6, Opal, Less, CoffeScript..)
111
132
  - Assets compressors (eg. YUI, UglifyJS2, Google Closure Compiler, Sass..)
112
133
  - Assets helpers:
113
- * `javascript`
114
- * `stylesheet`
115
- * `favicon`
116
- * `image`
117
- * `video`
118
- * `audio`
119
- * `asset_path`
120
- * `asset_url`
134
+ - `javascript`
135
+ - `stylesheet`
136
+ - `favicon`
137
+ - `image`
138
+ - `video`
139
+ - `audio`
140
+ - `asset_path`
141
+ - `asset_url`
121
142
  - Content Delivery Network (CDN) support for static assets (CDN mode)
122
143
  - Checksum suffix for static assets in production mode (Digest mode)
123
144
  - Support for third party gems as assets distribution channel (eg. `lotus-jquery`)
@@ -159,7 +180,7 @@
159
180
  - `Lotus.env` and `Lotus.env?` for current environment introspection (eg. `Lotus.env?(:test)` or `Lotus.env?(:staging, :production)`)
160
181
  - Allow repositories to execute raw query/commands against database
161
182
  - Automatic timestamps update for entities
162
- – Dirty Tracking for entities (via `Lotus::Entity::DirtyTracking`)
183
+ – Dirty Tracking for entities (via `Lotus::Entity::DirtyTracking`)
163
184
  - Nested RESTful resource(s)
164
185
  - String pluralization and singularization
165
186
 
data/README.md CHANGED
@@ -14,10 +14,8 @@ It's made up of smaller, single-purpose libraries.
14
14
  This repository is for the full-stack framework,
15
15
  which provides the glue that ties all the parts together:
16
16
 
17
- * [**Hanami::Model**](https://github.com/hanami/model) - Persistence with entities, repositories and data mapper
18
17
  * [**Hanami::View**](https://github.com/hanami/view) - Presentation with a separation between views and templates
19
18
  * [**Hanami::Controller**](https://github.com/hanami/controller) - Full featured, fast and testable actions for Rack
20
- * [**Hanami::Validations**](https://github.com/hanami/validations) - Validations mixin for Ruby objects
21
19
  * [**Hanami::Router**](https://github.com/hanami/router) - Rack compatible HTTP router for Ruby
22
20
  * [**Hanami::Helpers**](https://github.com/hanami/helpers) - View helpers for Ruby applications
23
21
  * [**Hanami::Mailer**](https://github.com/hanami/mailer) - Mail for Ruby applications
@@ -54,7 +52,7 @@ Please follow along with the [Getting Started guide](https://guides.hanamirb.org
54
52
 
55
53
  ## Donations
56
54
 
57
- You can give back to Open Source, by supporting Hanami development via a [donation](https://salt.bountysource.com/teams/hanami). :green_heart:
55
+ You can give back to Open Source, by supporting Hanami development via [GitHub Sponsors](https://github.com/sponsors/hanami).
58
56
 
59
57
  ### Supporters
60
58
 
data/hanami.gemspec CHANGED
@@ -14,23 +14,33 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "http://hanamirb.org"
15
15
  spec.license = "MIT"
16
16
 
17
- spec.files = `git ls-files -c -o --exclude-standard -z -- lib/* bin/* LICENSE.md README.md CODE_OF_CONDUCT.md CHANGELOG.md FEATURES.md hanami.gemspec`.split("\x0") # rubocop:disable Layout/LineLength
18
- spec.test_files = spec.files.grep(%r{^(test)/})
17
+ spec.files = Dir[
18
+ "CODE_OF_CONDUCT.md",
19
+ "CHANGELOG.md",
20
+ "FEATURES.md",
21
+ "LICENSE.md",
22
+ "README.md",
23
+ "hanami.gemspec",
24
+ "lib/**/*"
25
+ ]
26
+
27
+ spec.test_files = Dir["spec/**/*"]
19
28
  spec.require_paths = ["lib"]
20
29
  spec.metadata["rubygems_mfa_required"] = "true"
21
30
  spec.required_ruby_version = ">= 3.0"
22
31
 
23
32
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
24
33
 
25
- spec.add_dependency "bundler", ">= 1.16", "< 3"
26
- spec.add_dependency "dry-configurable", "~> 0.12", ">= 0.12.1"
27
- spec.add_dependency "dry-core", "~> 0.4"
28
- spec.add_dependency "dry-inflector", "~> 0.2", ">= 0.2.1"
29
- spec.add_dependency "dry-monitor"
30
- spec.add_dependency "dry-system", "~> 0.23", ">= 0.23.0"
31
- spec.add_dependency "hanami-cli", "~> 2.0.alpha"
32
- spec.add_dependency "hanami-utils", "~> 2.0.alpha"
33
- spec.add_dependency "zeitwerk", "~> 2.4"
34
+ spec.add_dependency "bundler", ">= 1.16", "< 3"
35
+ spec.add_dependency "dry-configurable", "~> 0.15"
36
+ spec.add_dependency "dry-core", "~> 0.7"
37
+ spec.add_dependency "dry-types", "~> 1.5"
38
+ spec.add_dependency "dry-inflector", "~> 0.2", ">= 0.2.1"
39
+ spec.add_dependency "dry-system", "~> 0.25", ">= 0.25.0"
40
+ spec.add_dependency "dry-monitor", "~> 0.6", ">= 0.6.0"
41
+ spec.add_dependency "hanami-cli", "~> 2.0.alpha"
42
+ spec.add_dependency "hanami-utils", "~> 2.0.alpha"
43
+ spec.add_dependency "zeitwerk", "~> 2.4"
34
44
 
35
45
  spec.add_development_dependency "rspec", "~> 3.8"
36
46
  spec.add_development_dependency "rack-test", "~> 1.1"
data/lib/hanami/app.rb ADDED
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ require_relative "configuration"
5
+ require_relative "constants"
6
+ require_relative "slice"
7
+ require_relative "slice_name"
8
+
9
+ module Hanami
10
+ # The Hanami app is a singular slice tasked with managing the core components of
11
+ # the app and coordinating overall app boot.
12
+ #
13
+ # For smaller apps, the app may be the only slice present, whereas larger apps
14
+ # may consist of many slices, with the app reserved for holding a small number
15
+ # of shared components only.
16
+ #
17
+ # @see Slice
18
+ #
19
+ # @api public
20
+ # @since 2.0.0
21
+ class App < Slice
22
+ @_mutex = Mutex.new
23
+
24
+ def self.inherited(subclass)
25
+ super
26
+
27
+ Hanami.app = subclass
28
+
29
+ subclass.extend(ClassMethods)
30
+
31
+ @_mutex.synchronize do
32
+ subclass.class_eval do
33
+ @configuration = Hanami::Configuration.new(app_name: slice_name, env: Hanami.env)
34
+ @autoloader = Zeitwerk::Loader.new
35
+
36
+ prepare_base_load_path
37
+ end
38
+ end
39
+ end
40
+
41
+ # App class interface
42
+ module ClassMethods
43
+ attr_reader :autoloader, :configuration
44
+
45
+ def app_name
46
+ slice_name
47
+ end
48
+
49
+ private
50
+
51
+ def prepare_base_load_path
52
+ base_path = root.join(LIB_DIR)
53
+ $LOAD_PATH.unshift(base_path) unless $LOAD_PATH.include?(base_path)
54
+ end
55
+
56
+ def prepare_all
57
+ # Make app-wide notifications available as early as possible
58
+ container.use(:notifications)
59
+
60
+ # Ensure all basic slice preparation is complete before we make adjustments below
61
+ # (which rely on the basic prepare steps having already run)
62
+ super
63
+
64
+ # Run specific prepare steps for the app slice. Note also that some
65
+ # standard steps have been skipped via the empty method overrides below.
66
+ prepare_app_component_dirs
67
+ prepare_app_providers
68
+
69
+ # The autoloader must be setup after the container is configured, which is the
70
+ # point at which any component dirs from other slices are added to the autoloader
71
+ app = self
72
+ container.after(:configure) do
73
+ app.send(:prepare_app_autoloader)
74
+ end
75
+ end
76
+
77
+ # Skip standard slice prepare steps that do not apply to the app slice
78
+ def prepare_container_component_dirs; end
79
+ def prepare_container_imports; end
80
+
81
+ # rubocop:disable Metrics/AbcSize
82
+
83
+ def prepare_app_component_dirs
84
+ # Component files in both `app/` and `app/lib/` define classes in the
85
+ # app's namespace
86
+
87
+ if root.join(APP_DIR, LIB_DIR).directory?
88
+ container.config.component_dirs.add(File.join(APP_DIR, LIB_DIR)) do |dir|
89
+ dir.namespaces.add_root(key: nil, const: app_name.name)
90
+ end
91
+ end
92
+
93
+ # When auto-registering components in app/, ignore files in `app/lib/` (these will
94
+ # be auto-registered as above), as well as the configured no_auto_register_paths
95
+ no_auto_register_paths = ([LIB_DIR] + configuration.no_auto_register_paths)
96
+ .map { |path|
97
+ path.end_with?(File::SEPARATOR) ? path : "#{path}#{File::SEPARATOR}"
98
+ }
99
+
100
+ if root.join(APP_DIR).directory?
101
+ container.config.component_dirs.add(APP_DIR) do |dir|
102
+ dir.namespaces.add_root(key: nil, const: app_name.name)
103
+ dir.auto_register = -> component {
104
+ relative_path = component.file_path.relative_path_from(root.join(APP_DIR)).to_s
105
+ !relative_path.start_with?(*no_auto_register_paths)
106
+ }
107
+ end
108
+ end
109
+ end
110
+
111
+ def prepare_app_providers
112
+ require_relative "providers/inflector"
113
+ register_provider(:inflector, source: Hanami::Providers::Inflector)
114
+
115
+ # Allow logger to be replaced by users with a manual provider, for advanced cases
116
+ unless container.providers.find_and_load_provider(:logger)
117
+ require_relative "providers/logger"
118
+ register_provider(:logger, source: Hanami::Providers::Logger)
119
+ end
120
+
121
+ require_relative "providers/rack"
122
+ register_provider(:rack, source: Hanami::Providers::Rack, namespace: true)
123
+ end
124
+
125
+ def prepare_app_autoloader
126
+ # Component dirs are automatically pushed to the autoloader by dry-system's
127
+ # zeitwerk plugin. This method adds other dirs that are not otherwise configured
128
+ # as component dirs.
129
+
130
+ # Autoload classes from `lib/[app_namespace]/`
131
+ if root.join(LIB_DIR, app_name.name).directory?
132
+ autoloader.push_dir(root.join(LIB_DIR, app_name.name), namespace: namespace)
133
+ end
134
+
135
+ autoloader.setup
136
+ end
137
+
138
+ # rubocop:enable Metrics/AbcSize
139
+ end
140
+ end
141
+ end
@@ -10,6 +10,11 @@ module Hanami
10
10
  class ApplicationConfiguration
11
11
  include Dry::Configurable
12
12
 
13
+ # @since 2.0.0
14
+ # @api private
15
+ attr_reader :base_configuration
16
+ protected :base_configuration
17
+
13
18
  setting :server_url, default: "http://localhost:8080"
14
19
 
15
20
  # @since 2.0.0
@@ -20,6 +25,11 @@ module Hanami
20
25
  @base_configuration = Assets::Configuration.new
21
26
  end
22
27
 
28
+ def initialize_copy(source)
29
+ super
30
+ @base_configuration = source.base_configuration.dup
31
+ end
32
+
23
33
  # @since 2.0.0
24
34
  # @api private
25
35
  def finalize!
@@ -37,10 +47,6 @@ module Hanami
37
47
 
38
48
  private
39
49
 
40
- # @since 2.0.0
41
- # @api private
42
- attr_reader :base_configuration
43
-
44
50
  # @since 2.0.0
45
51
  # @api private
46
52
  def method_missing(name, *args, &block)
@@ -3,7 +3,7 @@
3
3
  module Hanami
4
4
  class Configuration
5
5
  class Actions
6
- # Configuration for Content Security Policy in Hanami applications
6
+ # Configuration for Content Security Policy in Hanami apps
7
7
  #
8
8
  # @since 2.0.0
9
9
  class ContentSecurityPolicy
@@ -47,7 +47,7 @@ module Hanami
47
47
  #
48
48
  # @example
49
49
  # module MyApp
50
- # class Application < Hanami::Application
50
+ # class App < Hanami::App
51
51
  # config.actions.content_security_policy[:base_uri] # => "'self'"
52
52
  # end
53
53
  # end
@@ -65,14 +65,14 @@ module Hanami
65
65
  #
66
66
  # @example Replace a default value
67
67
  # module MyApp
68
- # class Application < Hanami::Application
68
+ # class App < Hanami::App
69
69
  # config.actions.content_security_policy[:plugin_types] = nil
70
70
  # end
71
71
  # end
72
72
  #
73
73
  # @example Append to a default value
74
74
  # module MyApp
75
- # class Application < Hanami::Application
75
+ # class App < Hanami::App
76
76
  # config.actions.content_security_policy[:script_src] += " https://my.cdn.test"
77
77
  # end
78
78
  # end
@@ -89,7 +89,7 @@ module Hanami
89
89
  #
90
90
  # @example
91
91
  # module MyApp
92
- # class Application < Hanami::Application
92
+ # class App < Hanami::App
93
93
  # config.actions.content_security_policy.delete(:object_src)
94
94
  # end
95
95
  # end
@@ -3,9 +3,9 @@
3
3
  module Hanami
4
4
  class Configuration
5
5
  class Actions
6
- # Wrapper for application-level configuration of HTTP cookies for Hanami actions.
6
+ # Wrapper for app-level configuration of HTTP cookies for Hanami actions.
7
7
  # This decorates the hash of cookie options that is otherwise directly configurable
8
- # on actions, and adds the `enabled?` method to allow `ApplicationAction` to
8
+ # on actions, and adds the `enabled?` method to allow app base action to
9
9
  # determine whether to include the `Action::Cookies` module.
10
10
  #
11
11
  # @since 2.0.0
@@ -5,7 +5,7 @@ require "hanami/action/configuration"
5
5
  require_relative "actions/cookies"
6
6
  require_relative "actions/sessions"
7
7
  require_relative "actions/content_security_policy"
8
- require_relative "../application/view_name_inferrer"
8
+ require_relative "../slice/view_name_inferrer"
9
9
 
10
10
  module Hanami
11
11
  class Configuration
@@ -20,14 +20,14 @@ module Hanami
20
20
  setting :csrf_protection
21
21
 
22
22
  setting :name_inference_base, default: "actions"
23
- setting :view_context_identifier, default: "view.context"
24
- setting :view_name_inferrer, default: Application::ViewNameInferrer
23
+ setting :view_context_identifier, default: "views.context"
24
+ setting :view_name_inferrer, default: Slice::ViewNameInferrer
25
25
  setting :view_name_inference_base, default: "views"
26
26
 
27
27
  attr_accessor :content_security_policy
28
28
 
29
29
  attr_reader :base_configuration
30
- private :base_configuration
30
+ protected :base_configuration
31
31
 
32
32
  def initialize(*, **options)
33
33
  super()
@@ -43,6 +43,12 @@ module Hanami
43
43
  configure_defaults
44
44
  end
45
45
 
46
+ def initialize_copy(source)
47
+ super
48
+ @base_configuration = source.base_configuration.dup
49
+ @content_security_policy = source.content_security_policy.dup
50
+ end
51
+
46
52
  def finalize!
47
53
  # A nil value for `csrf_protection` means it has not been explicitly configured
48
54
  # (neither true nor false), so we can default it to whether sessions are enabled
@@ -11,7 +11,7 @@ module Hanami
11
11
  class Logger
12
12
  include Dry::Configurable
13
13
 
14
- attr_reader :application_name
14
+ attr_reader :app_name
15
15
 
16
16
  protected :config
17
17
 
@@ -29,8 +29,8 @@ module Hanami
29
29
 
30
30
  setting :logger_class, default: Hanami::Logger
31
31
 
32
- def initialize(env:, application_name:)
33
- @application_name = application_name
32
+ def initialize(env:, app_name:)
33
+ @app_name = app_name
34
34
 
35
35
  config.level = case env
36
36
  when :production
@@ -59,7 +59,7 @@ module Hanami
59
59
 
60
60
  def instance
61
61
  logger_class.new(
62
- application_name.name,
62
+ app_name.name,
63
63
  *options,
64
64
  stream: stream,
65
65
  level: level,
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/configurable"
4
- require_relative "../application/routing/resolver"
4
+ require_relative "../slice/routing/resolver"
5
5
 
6
6
  module Hanami
7
7
  class Configuration
@@ -22,11 +22,7 @@ module Hanami
22
22
  @base_configuration = base_configuration
23
23
  end
24
24
 
25
- setting :routes_path, default: File.join("config", "routes")
26
-
27
- setting :routes_class_name, default: "Routes"
28
-
29
- setting :resolver, default: Application::Routing::Resolver
25
+ setting :resolver, default: Slice::Routing::Resolver
30
26
 
31
27
  # @api private
32
28
  # @since 2.0.0
@@ -30,7 +30,7 @@ module Hanami
30
30
  end
31
31
 
32
32
  def middleware
33
- [[storage_middleware, options]]
33
+ [storage_middleware, options]
34
34
  end
35
35
 
36
36
  private
@@ -11,10 +11,10 @@ module Hanami
11
11
  class Views
12
12
  include Dry::Configurable
13
13
 
14
- setting :parts_path, default: "view/parts"
14
+ setting :parts_path, default: "views/parts"
15
15
 
16
16
  attr_reader :base_configuration
17
- private :base_configuration
17
+ protected :base_configuration
18
18
 
19
19
  def initialize(*)
20
20
  super
@@ -24,6 +24,11 @@ module Hanami
24
24
  configure_defaults
25
25
  end
26
26
 
27
+ def initialize_copy(source)
28
+ super
29
+ @base_configuration = source.base_configuration.dup
30
+ end
31
+
27
32
  # Returns the list of available settings
28
33
  #
29
34
  # @return [Set]
@@ -47,11 +52,11 @@ module Hanami
47
52
  def configure_defaults
48
53
  self.paths = ["templates"]
49
54
  self.template_inference_base = "views"
50
- self.layout = "application"
55
+ self.layout = "app"
51
56
  end
52
57
 
53
58
  # An inflector for views is not configurable via `config.views.inflector` on an
54
- # `Hanami::Application`. The application-wide inflector is already configurable
59
+ # `Hanami::App`. The app-wide inflector is already configurable
55
60
  # there as `config.inflector` and will be used as the default inflector for views.
56
61
  #
57
62
  # A custom inflector may still be provided in an `Hanami::View` subclass, via