hanami 2.0.0.beta4 → 2.0.0.rc1

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/hanami.gemspec +8 -7
  4. data/lib/hanami/app.rb +47 -36
  5. data/lib/hanami/assets/app_config.rb +7 -15
  6. data/lib/hanami/assets/config.rb +5 -6
  7. data/lib/hanami/config/actions/content_security_policy.rb +1 -1
  8. data/lib/hanami/config/actions/cookies.rb +27 -0
  9. data/lib/hanami/config/actions/sessions.rb +42 -5
  10. data/lib/hanami/config/actions.rb +81 -17
  11. data/lib/hanami/config/logger.rb +112 -23
  12. data/lib/hanami/config/router.rb +0 -1
  13. data/lib/hanami/config/views.rb +6 -10
  14. data/lib/hanami/config.rb +235 -73
  15. data/lib/hanami/constants.rb +4 -0
  16. data/lib/hanami/errors.rb +17 -0
  17. data/lib/hanami/extensions/action/slice_configured_action.rb +9 -5
  18. data/lib/hanami/extensions/action.rb +59 -7
  19. data/lib/hanami/extensions/view/context.rb +3 -4
  20. data/lib/hanami/extensions/view/slice_configured_view.rb +4 -4
  21. data/lib/hanami/extensions/view.rb +7 -5
  22. data/lib/hanami/providers/inflector.rb +6 -0
  23. data/lib/hanami/providers/logger.rb +8 -0
  24. data/lib/hanami/providers/rack.rb +12 -0
  25. data/lib/hanami/providers/routes.rb +14 -4
  26. data/lib/hanami/routes.rb +36 -1
  27. data/lib/hanami/settings/env_store.rb +1 -1
  28. data/lib/hanami/settings.rb +102 -36
  29. data/lib/hanami/slice/router.rb +38 -16
  30. data/lib/hanami/slice/routing/middleware/stack.rb +66 -42
  31. data/lib/hanami/slice/routing/resolver.rb +10 -17
  32. data/lib/hanami/slice/view_name_inferrer.rb +1 -1
  33. data/lib/hanami/slice.rb +553 -14
  34. data/lib/hanami/slice_registrar.rb +20 -15
  35. data/lib/hanami/version.rb +2 -3
  36. data/lib/hanami/web/rack_logger.rb +14 -4
  37. data/lib/hanami.rb +122 -23
  38. data/spec/integration/action/csrf_protection_spec.rb +1 -1
  39. data/spec/integration/container/application_routes_helper_spec.rb +3 -1
  40. data/spec/integration/container/provider_lifecycle_spec.rb +61 -0
  41. data/spec/integration/container/standard_providers/rack_provider_spec.rb +44 -0
  42. data/spec/integration/container/{standard_bootable_components_spec.rb → standard_providers_spec.rb} +3 -3
  43. data/spec/integration/rack_app/body_parser_spec.rb +3 -0
  44. data/spec/integration/rack_app/middleware_spec.rb +427 -3
  45. data/spec/integration/rack_app/non_booted_rack_app_spec.rb +2 -1
  46. data/spec/integration/rack_app/rack_app_spec.rb +39 -11
  47. data/spec/integration/setup_spec.rb +4 -4
  48. data/spec/integration/slices/external_slice_spec.rb +2 -1
  49. data/spec/integration/slices/slice_configuration_spec.rb +3 -1
  50. data/spec/integration/slices/slice_loading_spec.rb +4 -4
  51. data/spec/integration/slices/slice_routing_spec.rb +4 -3
  52. data/spec/integration/slices_spec.rb +100 -0
  53. data/spec/isolation/hanami/boot/success_spec.rb +1 -1
  54. data/spec/support/app_integration.rb +2 -10
  55. data/spec/unit/hanami/config/actions/content_security_policy_spec.rb +7 -7
  56. data/spec/unit/hanami/config/actions/default_values_spec.rb +1 -1
  57. data/spec/unit/hanami/config/actions/sessions_spec.rb +1 -3
  58. data/spec/unit/hanami/config/actions_spec.rb +1 -12
  59. data/spec/unit/hanami/config/logger_spec.rb +38 -55
  60. data/spec/unit/hanami/config/router_spec.rb +1 -1
  61. data/spec/unit/hanami/config/views_spec.rb +3 -13
  62. data/spec/unit/hanami/settings_spec.rb +1 -1
  63. data/spec/unit/hanami/slice_configurable_spec.rb +5 -5
  64. data/spec/unit/hanami/slice_spec.rb +32 -0
  65. data/spec/unit/hanami/version_spec.rb +1 -1
  66. data/spec/unit/hanami/web/rack_logger_spec.rb +13 -2
  67. metadata +54 -45
  68. data/lib/hanami/config/sessions.rb +0 -50
  69. data/spec/unit/hanami/config_spec.rb +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afcc32f5e8f7ba0a0acb001c4c36ea5a654f73e705b22e73cfc2a2835858af3e
4
- data.tar.gz: d183f4cdec177426f339eeae371320880927d15463982d82daeffacd632fe09f
3
+ metadata.gz: 6a1a430f511f0bda44248e88d4fb2c87d10dc3d8fbabf092b895ff2a3bbb78db
4
+ data.tar.gz: 75c6e767584d34103505eb3637fc0fb72dde6118b35fa5f4a76a186681031e7a
5
5
  SHA512:
6
- metadata.gz: a1cca2e0e675ba87e678c14d4733bc172af135ea8fbf751fb1d1749faef2cf9a96629eae77fac339c5d435f6d3744dc6da1f1c32bf63881563ceb435337725bb
7
- data.tar.gz: 5a466e081c89ded4a30f4ba8655c2981ba26f9cbb16a5f5e8deb6034f806f4ec203a62556c4ad372b8fd4619e959eb8beb3781a6e8e0451e04aaa0dc2099129f
6
+ metadata.gz: 306e3261fb72d114ddcb9128de3a3c9a499bff57f1b2c51fd3cee54e644248c3bd981f54b626d7e5549e1fa9c467d86156a7c2c3e4c14c869501e698d07f6423
7
+ data.tar.gz: a59bf43bf07700e282abe6e83919fd53a5e277b7efa5706b743a25537006eef76b49409bedf0af49cae8122bd39d5c396f705f1e148a01367565e1accb46d9a6
data/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  The web, with simplicity.
4
4
 
5
+ ## v2.0.0.rc1 - 2022-11-08
6
+
7
+ ### Added
8
+
9
+ - [Piotr Solnica] Use Zeitwerk to auto-load Hanami
10
+ - [Tim Riley] Introduce `Hanami::Slice.stop` to properly shutdown all the application slices
11
+
12
+ ### Fixed
13
+
14
+ - [Luca Guidi] Ensure to properly mount Rack middleware in routing scope and slice
15
+ - [Tim Riley] Simplify and clarify usage of `Hanami::Config#enviroment`
16
+ - [Tim Riley] Improve error message for missing action class
17
+ - [Tim Riley] Expect nested slices to use parent’s namespace
18
+
19
+ ### Changed
20
+
21
+ - [Piotr Solnica] Replace `Hanami::Logger` with `Dry::Logger`
22
+ - [Tim Riley] Remove duplicated configuration `config.session` and keep `config.actions.sessions`
23
+
5
24
  ## v2.0.0.beta4 - 2022-10-24
6
25
 
7
26
  ### Added
data/hanami.gemspec CHANGED
@@ -32,13 +32,14 @@ Gem::Specification.new do |spec|
32
32
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
33
33
 
34
34
  spec.add_dependency "bundler", ">= 1.16", "< 3"
35
- spec.add_dependency "dry-configurable", "~> 0.16", ">= 0.16.1"
36
- spec.add_dependency "dry-core", "~> 0.9", ">= 0.9.1"
37
- spec.add_dependency "dry-inflector", "~> 0.2", ">= 0.2.1"
38
- spec.add_dependency "dry-system", "~> 0.27", ">= 0.27.2"
39
- spec.add_dependency "dry-monitor", "~> 0.7", ">= 0.7"
40
- spec.add_dependency "hanami-cli", "~> 2.0.beta"
41
- spec.add_dependency "hanami-utils", "~> 2.0.beta"
35
+ spec.add_dependency "dry-configurable", "~> 1.0", "< 2"
36
+ spec.add_dependency "dry-core", "~> 1.0", "< 2"
37
+ spec.add_dependency "dry-inflector", "~> 1.0", "< 2"
38
+ spec.add_dependency "dry-monitor", "~> 1.0", "< 2"
39
+ spec.add_dependency "dry-system", "~> 1.0.rc"
40
+ spec.add_dependency "dry-logger", "~> 1.0.rc"
41
+ spec.add_dependency "hanami-cli", "~> 2.0.rc"
42
+ spec.add_dependency "hanami-utils", "~> 2.0.rc"
42
43
  spec.add_dependency "zeitwerk", "~> 2.6"
43
44
 
44
45
  spec.add_development_dependency "rspec", "~> 3.8"
data/lib/hanami/app.rb CHANGED
@@ -1,17 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "config"
4
3
  require_relative "constants"
5
- require_relative "slice"
6
- require_relative "slice_name"
7
4
 
8
5
  module Hanami
9
- # The Hanami app is a singular slice tasked with managing the core components of
10
- # the app and coordinating overall app boot.
6
+ # The Hanami app is a singular slice tasked with managing the core components of the app and
7
+ # coordinating overall app boot.
11
8
  #
12
- # For smaller apps, the app may be the only slice present, whereas larger apps
13
- # may consist of many slices, with the app reserved for holding a small number
14
- # of shared components only.
9
+ # For smaller apps, the app may be the only slice present, whereas larger apps may consist of many
10
+ # slices, with the app reserved for holding a small number of shared components only.
15
11
  #
16
12
  # @see Slice
17
13
  #
@@ -20,6 +16,8 @@ module Hanami
20
16
  class App < Slice
21
17
  @_mutex = Mutex.new
22
18
 
19
+ # @api private
20
+ # @since 2.0.0
23
21
  def self.inherited(subclass)
24
22
  super
25
23
 
@@ -31,9 +29,9 @@ module Hanami
31
29
  subclass.class_eval do
32
30
  @config = Hanami::Config.new(app_name: slice_name, env: Hanami.env)
33
31
 
34
- # Prepare the load path (based on the default root of `Dir.pwd`) as early as
35
- # possible, so you can make a `require` inside the body of an `App` subclass,
36
- # which may be useful for certain kinds of app configuration.
32
+ # Prepare the load path (based on the default root of `Dir.pwd`) as early as possible, so
33
+ # you can make a `require` inside the body of an `App` subclass, which may be useful for
34
+ # certain kinds of app configuration.
37
35
  prepare_load_path
38
36
 
39
37
  load_dotenv
@@ -43,29 +41,41 @@ module Hanami
43
41
 
44
42
  # App class interface
45
43
  module ClassMethods
44
+ # Returns the app's config.
45
+ #
46
+ # @return [Hanami::Config]
47
+ #
48
+ # @api public
49
+ # @since 2.0.0
46
50
  attr_reader :config
47
51
 
52
+ # Returns the app's {SliceName}.
53
+ #
54
+ # @return [Hanami::SliceName]
55
+ #
56
+ # @see Slice::ClassMethods#slice_name
57
+ #
58
+ # @api public
59
+ # @since 2.0.0
48
60
  def app_name
49
61
  slice_name
50
62
  end
51
63
 
52
- # Prepares the $LOAD_PATH based on the app's configured root, prepending the `lib/`
53
- # directory if it exists. If the lib directory is already added, this will do
54
- # nothing.
64
+ # Prepares the $LOAD_PATH based on the app's configured root, prepending the `lib/` directory
65
+ # if it exists. If the lib directory is already added, this will do nothing.
55
66
  #
56
- # In ordinary circumstances, you should never have to call this method: this method
57
- # is called immediately upon subclassing {Hanami::App}, as a convenicence to put
58
- # lib/ (under the default root of `Dir.pwd`) on the load path automatically. This is
59
- # helpful if you need to require files inside the subclass body for performing
60
- # certain app configuration steps.
67
+ # In ordinary circumstances, you should never have to call this method: this method is called
68
+ # immediately upon subclassing {Hanami::App}, as a convenicence to put lib/ (under the default
69
+ # root of `Dir.pwd`) on the load path automatically. This is helpful if you need to require
70
+ # files inside the subclass body for performing certain app configuration steps.
61
71
  #
62
- # If you change your app's `config.root` and you need to require files from its
63
- # `lib/` directory within your {App} subclass body, you should call
64
- # {.prepare_load_path} explicitly after setting the new root.
72
+ # If you change your app's `config.root` and you need to require files from its `lib/`
73
+ # directory within your {App} subclass body, you should call {.prepare_load_path} explicitly
74
+ # after setting the new root.
65
75
  #
66
- # Otherwise, this method is called again as part of the app {.prepare} step, so if
67
- # you've changed your app's root and do _not_ need to require files within your {App}
68
- # subclass body, then you don't need to call this method.
76
+ # Otherwise, this method is called again as part of the app {.prepare} step, so if you've
77
+ # changed your app's root and do _not_ need to require files within your {App} subclass body,
78
+ # then you don't need to call this method.
69
79
  #
70
80
  # @example
71
81
  # module MyApp
@@ -124,12 +134,12 @@ module Hanami
124
134
  # Make app-wide notifications available as early as possible
125
135
  container.use(:notifications)
126
136
 
127
- # Ensure all basic slice preparation is complete before we make adjustments below
128
- # (which rely on the basic prepare steps having already run)
137
+ # Ensure all basic slice preparation is complete before we make adjustments below (which
138
+ # rely on the basic prepare steps having already run)
129
139
  super
130
140
 
131
- # Run specific prepare steps for the app slice. Note also that some
132
- # standard steps have been skipped via the empty method overrides below.
141
+ # Run specific prepare steps for the app slice. Note also that some standard steps have been
142
+ # skipped via the empty method overrides below.
133
143
  prepare_app_component_dirs
134
144
  prepare_app_providers
135
145
  end
@@ -150,8 +160,8 @@ module Hanami
150
160
  end
151
161
  end
152
162
 
153
- # When auto-registering components in app/, ignore files in `app/lib/` (these will
154
- # be auto-registered as above), as well as the configured no_auto_register_paths
163
+ # When auto-registering components in app/, ignore files in `app/lib/` (these will be
164
+ # auto-registered as above), as well as the configured no_auto_register_paths
155
165
  no_auto_register_paths = ([LIB_DIR] + config.no_auto_register_paths)
156
166
  .map { |path|
157
167
  path.end_with?(File::SEPARATOR) ? path : "#{path}#{File::SEPARATOR}"
@@ -178,14 +188,15 @@ module Hanami
178
188
  register_provider(:logger, source: Hanami::Providers::Logger)
179
189
  end
180
190
 
181
- require_relative "providers/rack"
182
- register_provider(:rack, source: Hanami::Providers::Rack, namespace: true)
191
+ if Hanami.bundled?("rack")
192
+ require_relative "providers/rack"
193
+ register_provider(:rack, source: Hanami::Providers::Rack, namespace: true)
194
+ end
183
195
  end
184
196
 
185
197
  def prepare_autoloader
186
- # Component dirs are automatically pushed to the autoloader by dry-system's
187
- # zeitwerk plugin. This method adds other dirs that are not otherwise configured
188
- # as component dirs.
198
+ # Component dirs are automatically pushed to the autoloader by dry-system's zeitwerk plugin.
199
+ # This method adds other dirs that are not otherwise configured as component dirs.
189
200
 
190
201
  # Autoload classes from `lib/[app_namespace]/`
191
202
  if root.join(LIB_DIR, app_name.name).directory?
@@ -1,28 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/configurable"
4
- require_relative "config"
5
4
 
6
5
  module Hanami
6
+ # @api private
7
7
  module Assets
8
- # @since 2.0.0
9
- # @api public
8
+ # App config for assets.
9
+ #
10
+ # This is NOT RELEASED as of 2.0.0.
11
+ #
12
+ # @api private
10
13
  class AppConfig
11
14
  include Dry::Configurable
12
15
 
13
- # @since 2.0.0
14
- # @api private
15
16
  attr_reader :base_config
16
17
  protected :base_config
17
18
 
18
19
  setting :server_url, default: "http://localhost:8080"
19
20
 
20
- # @since 2.0.0
21
- # @api private
22
21
  def initialize(*)
23
22
  super
24
23
 
25
- @base_config = Config.new
24
+ @base_config = Assets::Config.new
26
25
  end
27
26
 
28
27
  def initialize_copy(source)
@@ -30,8 +29,6 @@ module Hanami
30
29
  @base_config = source.base_config.dup
31
30
  end
32
31
 
33
- # @since 2.0.0
34
- # @api private
35
32
  def finalize!
36
33
  end
37
34
 
@@ -39,7 +36,6 @@ module Hanami
39
36
  #
40
37
  # @return [Set]
41
38
  #
42
- # @since 2.0.0
43
39
  # @api private
44
40
  def settings
45
41
  base_config.settings + self.class.settings
@@ -47,8 +43,6 @@ module Hanami
47
43
 
48
44
  private
49
45
 
50
- # @since 2.0.0
51
- # @api private
52
46
  def method_missing(name, *args, &block)
53
47
  if config.respond_to?(name)
54
48
  config.public_send(name, *args, &block)
@@ -59,8 +53,6 @@ module Hanami
59
53
  end
60
54
  end
61
55
 
62
- # @since 2.0.0
63
- # @api private
64
56
  def respond_to_missing?(name, _incude_all = false)
65
57
  config.respond_to?(name) || base_config.respond_to?(name) || super
66
58
  end
@@ -4,8 +4,11 @@ require "dry/configurable"
4
4
 
5
5
  module Hanami
6
6
  module Assets
7
- # @since 2.0.0
8
- # @api public
7
+ # App config for assets.
8
+ #
9
+ # This is NOT RELEASED as of 2.0.0.
10
+ #
11
+ # @api private
9
12
  class Config
10
13
  include Dry::Configurable
11
14
 
@@ -34,8 +37,6 @@ module Hanami
34
37
 
35
38
  private
36
39
 
37
- # @since 2.0.0
38
- # @api private
39
40
  def method_missing(name, *args, &block)
40
41
  if config.respond_to?(name)
41
42
  config.public_send(name, *args, &block)
@@ -44,8 +45,6 @@ module Hanami
44
45
  end
45
46
  end
46
47
 
47
- # @since 2.0.0
48
- # @api private
49
48
  def respond_to_missing?(name, _incude_all = false)
50
49
  config.respond_to?(name) || super
51
50
  end
@@ -99,7 +99,7 @@ module Hanami
99
99
 
100
100
  # @since 2.0.0
101
101
  # @api private
102
- def to_str
102
+ def to_s
103
103
  @policy.map do |key, value|
104
104
  "#{dasherize(key)} #{value}"
105
105
  end.join(";\n")
@@ -9,18 +9,45 @@ module Hanami
9
9
  # actions, and adds the `enabled?` method to allow app base action to determine whether to
10
10
  # include the `Action::Cookies` module.
11
11
  #
12
+ # @api public
12
13
  # @since 2.0.0
13
14
  class Cookies
15
+ # Returns the cookie options.
16
+ #
17
+ # @return [Hash]
18
+ #
19
+ # @api public
20
+ # @since 2.0.0
14
21
  attr_reader :options
15
22
 
23
+ # Returns a new `Cookies`.
24
+ #
25
+ # You should not need to initialize this class directly. Instead use
26
+ # {Hanami::Config::Actions#cookies}.
27
+ #
28
+ # @api private
29
+ # @since 2.0.0
16
30
  def initialize(options)
17
31
  @options = options
18
32
  end
19
33
 
34
+ # Returns true if any cookie options have been provided.
35
+ #
36
+ # @return [Boolean]
37
+ #
38
+ # @api public
39
+ # @since 2.0.0
20
40
  def enabled?
21
41
  !options.nil?
22
42
  end
23
43
 
44
+ # Returns the cookie options.
45
+ #
46
+ # If no options have been provided, returns an empty hash.
47
+ #
48
+ # @return [Hash]
49
+ #
50
+ # @api public
24
51
  def to_h
25
52
  options.to_h
26
53
  end
@@ -1,31 +1,68 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/constants"
4
3
  require "hanami/utils/string"
5
4
  require "hanami/utils/class"
6
5
 
7
6
  module Hanami
8
7
  class Config
9
8
  class Actions
10
- # Config for HTTP sessions in Hanami actions
9
+ # Config for HTTP session middleware in Hanami actions.
11
10
  #
11
+ # @api public
12
12
  # @since 2.0.0
13
13
  class Sessions
14
- attr_reader :storage, :options
14
+ # Returns the configured session storage
15
+ #
16
+ # @return [Symbol]
17
+ #
18
+ # @api public
19
+ # @since 2.0.0
20
+ attr_reader :storage
15
21
 
22
+ # Returns the configured session storage options
23
+ #
24
+ # @return [Array]
25
+ #
26
+ # @api public
27
+ # @since 2.0.0
28
+ attr_reader :options
29
+
30
+ # Returns a new `Sessions`.
31
+ #
32
+ # You should not need to initialize this class directly. Instead use
33
+ # {Hanami::Config::Actions#sessions=}.
34
+ #
35
+ # @example
36
+ # config.actions.sessions = :cookie, {secret: "xyz"}
37
+ #
38
+ # @api private
39
+ # @since 2.0.0
16
40
  def initialize(storage = nil, *options)
17
41
  @storage = storage
18
42
  @options = options
19
43
  end
20
44
 
45
+ # Returns true if sessions have been enabled.
46
+ #
47
+ # @return [Boolean]
48
+ #
49
+ # @api public
50
+ # @since 2.0.0
21
51
  def enabled?
22
52
  !storage.nil?
23
53
  end
24
54
 
55
+ # Returns an array of the session storage middleware name and its options, or an empty array
56
+ # if sessions have not been enabled.
57
+ #
58
+ # @return [Array<(Symbol, Array)>]
59
+ #
60
+ # @api public
61
+ # @since 2.0.0
25
62
  def middleware
26
- return [] if !enabled?
63
+ return [] unless enabled?
27
64
 
28
- [[storage_middleware, options]]
65
+ [storage_middleware, options].flatten(1)
29
66
  end
30
67
 
31
68
  private
@@ -1,33 +1,104 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/configurable"
4
- require_relative "actions/cookies"
5
- require_relative "actions/sessions"
6
- require_relative "actions/content_security_policy"
7
- require_relative "../slice/view_name_inferrer"
8
4
 
9
5
  module Hanami
10
6
  class Config
11
7
  # Hanami actions config
12
8
  #
9
+ # This exposes all the settings from the standalone `Hanami::Action` class, pre-configured with
10
+ # sensible defaults for actions within a full Hanami app. It also provides additional settings
11
+ # for further integration of actions with other full stack app components.
12
+ #
13
13
  # @since 2.0.0
14
+ # @api public
14
15
  class Actions
15
16
  include Dry::Configurable
16
17
 
18
+ # @!attribute [rw] cookies
19
+ # Sets or returns a hash of cookie options for actions.
20
+ #
21
+ # The hash is wrapped by {Hanami::Config::Actions::Cookies}, which also provides an
22
+ # `enabled?` method, returning true in the case of any options provided.
23
+ #
24
+ # @example
25
+ # config.actions.cookies = {max_age: 300}
26
+ #
27
+ # @return [Hanami::Config::Actions::Cookies]
28
+ #
29
+ # @api public
30
+ # @since 2.0.0
17
31
  setting :cookies, default: {}, constructor: -> options { Cookies.new(options) }
32
+
33
+ # @!attribute [rw] sessions
34
+ # Sets or returns the session store (and its options) for actions.
35
+ #
36
+ # The given values are taken as an argument list to be passed to {Config::Sessions#initialize}.
37
+ #
38
+ # The configured session store is used when setting up the app or slice
39
+ # {Slice::ClassMethods#router router}.
40
+ #
41
+ # @example
42
+ # config.actions.sessions = :cookie, {secret: "xyz"}
43
+ #
44
+ # @return [Config::Sessions]
45
+ #
46
+ # @see Config::Sessions
47
+ # @see Slice::ClassMethods#router
48
+ #
49
+ # @api public
50
+ # @since 2.0.0
18
51
  setting :sessions, constructor: proc { |storage, *options| Sessions.new(storage, *options) }
52
+
53
+ # @!attribute [rw] csrf_protection
54
+ # Sets or returns whether CSRF protection should be enabled for action classes.
55
+ #
56
+ # Defaults to true if {#sessions} is enabled. You can override this by explicitly setting a
57
+ # true or false value.
58
+ #
59
+ # When true, this will include `Hanami::Action::CSRFProtection` in all action classes.
60
+ #
61
+ # @return [Boolean]
62
+ #
63
+ # @api public
64
+ # @since 2.0.0
19
65
  setting :csrf_protection
20
66
 
67
+ # Returns the Content Security Policy config for actions.
68
+ #
69
+ # The resulting policy is set as a default `"Content-Security-Policy"` response header.
70
+ #
71
+ # @return [Hanami::Config::Actions::ContentSecurityPolicy]
72
+ #
73
+ # @api public
74
+ # @since 2.0.0
75
+ attr_accessor :content_security_policy
76
+
77
+ # The following settings are for view and assets integration with actions, and are NOT
78
+ # publicly released as of 2.0.0. We'll make full documentation available when these become
79
+ # public in a subsequent release.
80
+
81
+ # @!attribute [rw] name_inference_base
82
+ # @api private
21
83
  setting :name_inference_base, default: "actions"
84
+
85
+ # @!attribute [rw] view_context_identifier
86
+ # @api private
22
87
  setting :view_context_identifier, default: "views.context"
88
+
89
+ # @!attribute [rw] view_name_inferrer
90
+ # @api private
23
91
  setting :view_name_inferrer, default: Slice::ViewNameInferrer
24
- setting :view_name_inference_base, default: "views"
25
92
 
26
- attr_accessor :content_security_policy
93
+ # @!attribute [rw] view_name_inference_base
94
+ # @api private
95
+ setting :view_name_inference_base, default: "views"
27
96
 
97
+ # @api private
28
98
  attr_reader :base_config
29
99
  protected :base_config
30
100
 
101
+ # @api private
31
102
  def initialize(*, **options)
32
103
  super()
33
104
 
@@ -42,32 +113,25 @@ module Hanami
42
113
  configure_defaults
43
114
  end
44
115
 
116
+ # @api private
45
117
  def initialize_copy(source)
46
118
  super
47
119
  @base_config = source.base_config.dup
48
120
  @content_security_policy = source.content_security_policy.dup
49
121
  end
122
+ private :initialize_copy
50
123
 
124
+ # @api private
51
125
  def finalize!
52
126
  # A nil value for `csrf_protection` means it has not been explicitly configured
53
127
  # (neither true nor false), so we can default it to whether sessions are enabled
54
128
  self.csrf_protection = sessions.enabled? if csrf_protection.nil?
55
129
 
56
130
  if content_security_policy
57
- default_headers["Content-Security-Policy"] = content_security_policy.to_str
131
+ default_headers["Content-Security-Policy"] = content_security_policy.to_s
58
132
  end
59
133
  end
60
134
 
61
- # Returns the list of available settings
62
- #
63
- # @return [Set]
64
- #
65
- # @since 2.0.0
66
- # @api private
67
- def settings
68
- Hanami::Action.settings + self.class.settings
69
- end
70
-
71
135
  private
72
136
 
73
137
  # Apply defaults for base config