hanami-controller 2.0.0.alpha2 → 2.0.0.alpha6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d159c89cbe6b24762a475776ae1585e76925c8f26501c6334c908893624587e5
4
- data.tar.gz: b5f4b394c5337ae9b46f2482f86f69aaf151dbaee9cd2ac95be15f69a12ce65a
3
+ metadata.gz: 4f14c59426ea7017dc546100e0443d17d5f63362cd4b6f1546adfb18ae6bd4e3
4
+ data.tar.gz: 62fafda341ad801430ab2575df6a28b6a9848a71739c977e481fe8fa00dbadfc
5
5
  SHA512:
6
- metadata.gz: aac599272b21e8ca56b2c519b93a47593dc126d442be727d87b4e8884e1c2da3d349d480399e1ed781560acb9e450e24b1985fbcd7083d65d79fb8573c3db606
7
- data.tar.gz: 75beecc46dce543367e7869887cda80937c2d838a65996f9bd831e56dfade6fa1ccccc03c7c0a0ace5aad833e26db10638e6c51e869b70cb6dc95abd351b7000
6
+ metadata.gz: a51c5a37c6961bff7d1c3c30906cc2e072029e6d0b4ec5782ef92d592ed4f8b247807b9aabd803004afb31fd2f23900bb8a34c9d29bc1515e30e0caba4b3318a
7
+ data.tar.gz: b69d515d608fbaf545e7d2d4e6d19fbd6d305bc10bcc0a2208dc6e740389eb7188514112028d02dd3d8e6729192eed95305b7ec3a09cdd77039b55ac5d054083
data/CHANGELOG.md CHANGED
@@ -1,6 +1,32 @@
1
1
  # Hanami::Controller
2
2
  Complete, fast and testable actions for Rack
3
3
 
4
+ ## v2.0.0.alpha6 - 2022-02-10
5
+ ### Added
6
+ - [Luca Guidi] Official support for Ruby: MRI 3.1
7
+
8
+ ### Changed
9
+ - [Luca Guidi] Drop support for Ruby: MRI 2.6, and 2.7.
10
+ - [Sean Collins] Align with Rack list of HTTP supported status. Added: `103`, `306`, `421`, `425`, `451`, and `509`. Removed: `418`, `420`, `444`, `449`, `450`, `451`, `499`, `598`, `599`.
11
+
12
+ ## v2.0.0.alpha5 - 2022-01-12
13
+ ### Added
14
+ - [Philip Arndt] Added "rss" ("application/rss+xml") to list of supported MIME types
15
+
16
+ ## v2.0.0.alpha4 - 2021-12-07
17
+ ### Added
18
+ - [Luca Guidi] Manage Content Security Policy (CSP) defaults and new API via `Hanami::Action::ApplicationConfiguration#content_security_policy`
19
+ - [Tim Riley & Marc Busqué] Provide access to routes inside all application actions via `Hanami::Action::ApplicationAction#routes`
20
+
21
+ ## v2.0.0.alpha3 - 2021-11-09
22
+ ### Added
23
+ - [Luca Guidi] Automatically include session behavior in `Hanami::Action` when sessions are enabled via Hanami application config
24
+ - [Sean Collins] Pass exposures from action to view
25
+
26
+ ### Changed
27
+ - [Tim Riley] (Internal) Updated settings to use updated `setting` API in dry-configurable 0.13.0
28
+ - [Sean Collins] Move automatic view rendering from `handle` to `finish`
29
+
4
30
  ## v2.0.0.alpha2 - 2021-05-04
5
31
  ### Added
6
32
  - [Luca Guidi] Official support for Ruby: MRI 3.0
data/README.md CHANGED
@@ -2,11 +2,15 @@
2
2
 
3
3
  Complete, fast and testable actions for Rack and [Hanami](http://hanamirb.org)
4
4
 
5
+ ## Version
6
+
7
+ **This branch contains the code for `hanami-controller` 2.x.**
8
+
5
9
  ## Status
6
10
 
7
11
  [![Gem Version](https://badge.fury.io/rb/hanami-controller.svg)](https://badge.fury.io/rb/hanami-controller)
8
- [![CI](https://github.com/hanami/controller/workflows/ci/badge.svg?branch=unstable)](https://github.com/hanami/controller/actions?query=workflow%3Aci+branch%3Aunstable)
9
- [![Test Coverage](https://codecov.io/gh/hanami/controller/branch/unstable/graph/badge.svg)](https://codecov.io/gh/hanami/controller)
12
+ [![CI](https://github.com/hanami/controller/workflows/ci/badge.svg?branch=main)](https://github.com/hanami/controller/actions?query=workflow%3Aci+branch%3Amain)
13
+ [![Test Coverage](https://codecov.io/gh/hanami/controller/branch/main/graph/badge.svg)](https://codecov.io/gh/hanami/controller)
10
14
  [![Depfu](https://badges.depfu.com/badges/7cd17419fba78b726be1353118fb01de/overview.svg)](https://depfu.com/github/hanami/controller?project=Bundler)
11
15
  [![Inline Docs](http://inch-ci.org/github/hanami/controller.svg)](http://inch-ci.org/github/hanami/controller)
12
16
 
@@ -22,7 +26,7 @@ Complete, fast and testable actions for Rack and [Hanami](http://hanamirb.org)
22
26
 
23
27
  ## Rubies
24
28
 
25
- __Hanami::Controller__ supports Ruby (MRI) 2.5+
29
+ __Hanami::Controller__ supports Ruby (MRI) 3.0+
26
30
 
27
31
  ## Installation
28
32
 
@@ -963,6 +967,4 @@ __Hanami::Controller__ uses [Semantic Versioning 2.0.0](http://semver.org)
963
967
 
964
968
  ## Copyright
965
969
 
966
- Copyright © 2014-2021 Luca Guidi – Released under MIT License
967
-
968
- This project was formerly known as Lotus (`lotus-controller`).
970
+ Copyright © 2014-2022 Hanami Team – Released under MIT License
@@ -17,11 +17,12 @@ Gem::Specification.new do |spec|
17
17
  spec.executables = []
18
18
  spec.test_files = spec.files.grep(%r{^(spec)/})
19
19
  spec.require_paths = ['lib']
20
- spec.required_ruby_version = '>= 2.6.0'
20
+ spec.metadata["rubygems_mfa_required"] = "true"
21
+ spec.required_ruby_version = '>= 3.0'
21
22
 
22
23
  spec.add_dependency 'rack', '~> 2.0'
23
24
  spec.add_dependency 'hanami-utils', '~> 2.0.alpha'
24
- spec.add_dependency 'dry-configurable', '~> 0.12'
25
+ spec.add_dependency 'dry-configurable', '~> 0.13', '>= 0.13.0'
25
26
 
26
27
  spec.add_development_dependency 'bundler', '>= 1.6', '< 3'
27
28
  spec.add_development_dependency 'rack-test', '~> 1.0'
@@ -14,7 +14,7 @@ module Hanami
14
14
  def included(action_class)
15
15
  action_class.include InstanceMethods
16
16
 
17
- define_initialize action_class
17
+ define_initialize
18
18
  configure_action action_class
19
19
  extend_behavior action_class
20
20
  end
@@ -25,20 +25,33 @@ module Hanami
25
25
 
26
26
  private
27
27
 
28
- def define_initialize(action_class)
28
+ def define_initialize
29
29
  resolve_view = method(:resolve_paired_view)
30
30
  resolve_context = method(:resolve_view_context)
31
+ resolve_routes = method(:resolve_routes)
31
32
 
32
33
  define_method :initialize do |**deps|
33
34
  # Conditionally assign these to repsect any explictly auto-injected
34
35
  # dependencies provided by the class
35
36
  @view ||= deps[:view] || resolve_view.(self.class)
36
37
  @view_context ||= deps[:view_context] || resolve_context.()
38
+ @routes ||= deps[:routes] || resolve_routes.()
37
39
 
38
40
  super(**deps)
39
41
  end
40
42
  end
41
43
 
44
+ def resolve_paired_view(action_class)
45
+ view_identifiers = application.config.actions.view_name_inferrer.(
46
+ action_name: action_class.name,
47
+ provider: provider
48
+ )
49
+
50
+ view_identifiers.detect { |identifier|
51
+ break provider[identifier] if provider.key?(identifier)
52
+ }
53
+ end
54
+
42
55
  def resolve_view_context
43
56
  identifier = application.config.actions.view_context_identifier
44
57
 
@@ -49,15 +62,8 @@ module Hanami
49
62
  end
50
63
  end
51
64
 
52
- def resolve_paired_view(action_class)
53
- view_identifiers = application.config.actions.view_name_inferrer.(
54
- action_name: action_class.name,
55
- provider: provider
56
- )
57
-
58
- view_identifiers.detect { |identifier|
59
- break provider[identifier] if provider.key?(identifier)
60
- }
65
+ def resolve_routes
66
+ application[:routes_helper] if application.key?(:routes_helper)
61
67
  end
62
68
 
63
69
  def configure_action(action_class)
@@ -68,6 +74,11 @@ module Hanami
68
74
  end
69
75
 
70
76
  def extend_behavior(action_class)
77
+ if application.config.actions.sessions.enabled?
78
+ require "hanami/action/session"
79
+ action_class.include Hanami::Action::Session
80
+ end
81
+
71
82
  if application.config.actions.csrf_protection
72
83
  require "hanami/action/csrf_protection"
73
84
  action_class.include Hanami::Action::CSRFProtection
@@ -82,16 +93,7 @@ module Hanami
82
93
  module InstanceMethods
83
94
  attr_reader :view
84
95
  attr_reader :view_context
85
-
86
- protected
87
-
88
- def handle(request, response)
89
- if view
90
- response.render view, **request.params
91
- end
92
- end
93
-
94
- private
96
+ attr_reader :routes
95
97
 
96
98
  def build_response(**options)
97
99
  options = options.merge(view_options: method(:view_options))
@@ -105,6 +107,24 @@ module Hanami
105
107
  def view_context_options(req, res)
106
108
  {request: req, response: res}
107
109
  end
110
+
111
+ def finish(req, res, halted)
112
+ res.render(view, **req.params) if render?(res)
113
+ super
114
+ end
115
+
116
+ # Decide whether to render the current response with the associated view.
117
+ # This can be overridden to enable/disable automatic rendering.
118
+ #
119
+ # @param res [Hanami::Action::Response]
120
+ #
121
+ # @return [TrueClass,FalseClass]
122
+ #
123
+ # @since 2.0.0
124
+ # @api public
125
+ def render?(res)
126
+ view && res.body.empty?
127
+ end
108
128
  end
109
129
  end
110
130
  end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ class Action
5
+ class ApplicationConfiguration
6
+ # Configuration for Content Security Policy in Hanami applications
7
+ #
8
+ # @since 2.0.0
9
+ class ContentSecurityPolicy
10
+ # @since 2.0.0
11
+ # @api private
12
+ def initialize(&blk)
13
+ @policy = {
14
+ base_uri: "'self'",
15
+ child_src: "'self'",
16
+ connect_src: "'self'",
17
+ default_src: "'none'",
18
+ font_src: "'self'",
19
+ form_action: "'self'",
20
+ frame_ancestors: "'self'",
21
+ frame_src: "'self'",
22
+ img_src: "'self' https: data:",
23
+ media_src: "'self'",
24
+ object_src: "'none'",
25
+ plugin_types: "application/pdf",
26
+ script_src: "'self'",
27
+ style_src: "'self' 'unsafe-inline' https:"
28
+ }
29
+
30
+ blk&.(self)
31
+ end
32
+
33
+ # @since 2.0.0
34
+ # @api private
35
+ def initialize_copy(original_object)
36
+ @policy = original_object.instance_variable_get(:@policy).dup
37
+ super
38
+ end
39
+
40
+ # Get a CSP setting
41
+ #
42
+ # @param key [Symbol] the underscored name of the CPS setting
43
+ # @return [String,NilClass] the CSP setting, if any
44
+ #
45
+ # @since 2.0.0
46
+ # @api public
47
+ #
48
+ # @example
49
+ # module MyApp
50
+ # class Application < Hanami::Application
51
+ # config.actions.content_security_policy[:base_uri] # => "'self'"
52
+ # end
53
+ # end
54
+ def [](key)
55
+ @policy[key]
56
+ end
57
+
58
+ # Set a CSP setting
59
+ #
60
+ # @param key [Symbol] the underscored name of the CPS setting
61
+ # @param value [String] the CSP setting value
62
+ #
63
+ # @since 2.0.0
64
+ # @api public
65
+ #
66
+ # @example Replace a default value
67
+ # module MyApp
68
+ # class Application < Hanami::Application
69
+ # config.actions.content_security_policy[:plugin_types] = nil
70
+ # end
71
+ # end
72
+ #
73
+ # @example Append to a default value
74
+ # module MyApp
75
+ # class Application < Hanami::Application
76
+ # config.actions.content_security_policy[:script_src] += " https://my.cdn.test"
77
+ # end
78
+ # end
79
+ def []=(key, value)
80
+ @policy[key] = value
81
+ end
82
+
83
+ # Deletes a CSP key
84
+ #
85
+ # @param key [Symbol] the underscored name of the CPS setting
86
+ #
87
+ # @since 2.0.0
88
+ # @api public
89
+ #
90
+ # @example
91
+ # module MyApp
92
+ # class Application < Hanami::Application
93
+ # config.actions.content_security_policy.delete(:object_src)
94
+ # end
95
+ # end
96
+ def delete(key)
97
+ @policy.delete(key)
98
+ end
99
+
100
+ # @since 2.0.0
101
+ # @api private
102
+ def to_str
103
+ @policy.map do |key, value|
104
+ "#{dasherize(key)} #{value}"
105
+ end.join(";\n")
106
+ end
107
+
108
+ private
109
+
110
+ # @since 2.0.0
111
+ # @api private
112
+ def dasherize(key)
113
+ key.to_s.gsub("_", "-")
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative "application_configuration/cookies"
4
4
  require_relative "application_configuration/sessions"
5
+ require_relative "application_configuration/content_security_policy"
5
6
  require_relative "configuration"
6
7
  require_relative "view_name_inferrer"
7
8
 
@@ -10,19 +11,27 @@ module Hanami
10
11
  class ApplicationConfiguration
11
12
  include Dry::Configurable
12
13
 
13
- setting(:cookies, {}) { |options| Cookies.new(options) }
14
- setting(:sessions) { |storage, *options| Sessions.new(storage, *options) }
14
+ setting :cookies, default: {}, constructor: -> options { Cookies.new(options) }
15
+ setting :sessions, constructor: proc { |storage, *options| Sessions.new(storage, *options) }
15
16
  setting :csrf_protection
16
17
 
17
- setting :name_inference_base, "actions"
18
- setting :view_context_identifier, "view.context"
19
- setting :view_name_inferrer, ViewNameInferrer
20
- setting :view_name_inference_base, "views"
18
+ setting :name_inference_base, default: "actions"
19
+ setting :view_context_identifier, default: "view.context"
20
+ setting :view_name_inferrer, default: ViewNameInferrer
21
+ setting :view_name_inference_base, default: "views"
21
22
 
22
- def initialize(*)
23
- super
23
+ attr_accessor :content_security_policy
24
+
25
+ def initialize(*, **options)
26
+ super()
24
27
 
25
28
  @base_configuration = Configuration.new
29
+ @content_security_policy = ContentSecurityPolicy.new do |csp|
30
+ if assets_server_url = options[:assets_server_url]
31
+ csp[:script_src] += " #{assets_server_url}"
32
+ csp[:style_src] += " #{assets_server_url}"
33
+ end
34
+ end
26
35
 
27
36
  configure_defaults
28
37
  end
@@ -31,6 +40,10 @@ module Hanami
31
40
  # A nil value for `csrf_protection` means it has not been explicitly configured
32
41
  # (neither true nor false), so we can default it to whether sessions are enabled
33
42
  self.csrf_protection = sessions.enabled? if csrf_protection.nil?
43
+
44
+ if self.content_security_policy
45
+ self.default_headers["Content-Security-Policy"] = self.content_security_policy.to_str
46
+ end
34
47
  end
35
48
 
36
49
  # Returns the list of available settings
@@ -55,22 +68,7 @@ module Hanami
55
68
  self.default_headers = {
56
69
  "X-Frame-Options" => "DENY",
57
70
  "X-Content-Type-Options" => "nosniff",
58
- "X-XSS-Protection" => "1; mode=block",
59
- "Content-Security-Policy" => \
60
- "base-uri 'self'; " \
61
- "child-src 'self'; " \
62
- "connect-src 'self'; " \
63
- "default-src 'none'; " \
64
- "font-src 'self'; " \
65
- "form-action 'self'; " \
66
- "frame-ancestors 'self'; " \
67
- "frame-src 'self'; " \
68
- "img-src 'self' https: data:; " \
69
- "media-src 'self'; " \
70
- "object-src 'none'; " \
71
- "plugin-types application/pdf; " \
72
- "script-src 'self'; " \
73
- "style-src 'self' 'unsafe-inline' https:"
71
+ "X-XSS-Protection" => "1; mode=block"
74
72
  }
75
73
  end
76
74
 
@@ -58,7 +58,7 @@ module Hanami
58
58
  # @see handled_exceptions=
59
59
  #
60
60
  # @since 0.2.0
61
- setting :handled_exceptions, {}
61
+ setting :handled_exceptions, default: {}
62
62
 
63
63
  # Specifies how to handle exceptions with an HTTP status
64
64
  #
@@ -122,7 +122,7 @@ module Hanami
122
122
  # @see formats=
123
123
  #
124
124
  # @since 0.2.0
125
- setting :formats, DEFAULT_FORMATS.dup
125
+ setting :formats, default: DEFAULT_FORMATS.dup
126
126
 
127
127
  # Registers a MIME type to format mapping
128
128
  #
@@ -211,9 +211,9 @@ module Hanami
211
211
  # @see default_request_format=
212
212
  #
213
213
  # @since 0.5.0
214
- setting :default_request_format do |format|
214
+ setting :default_request_format, constructor: -> format {
215
215
  Utils::Kernel.Symbol(format) unless format.nil?
216
- end
216
+ }
217
217
 
218
218
  # @!method default_response_format=(format)
219
219
  #
@@ -243,9 +243,9 @@ module Hanami
243
243
  # @see default_request_format=
244
244
  #
245
245
  # @since 0.5.0
246
- setting :default_response_format do |format|
246
+ setting :default_response_format, constructor: -> format {
247
247
  Utils::Kernel.Symbol(format) unless format.nil?
248
- end
248
+ }
249
249
 
250
250
  # @!method default_charset=(charset)
251
251
  #
@@ -299,9 +299,7 @@ module Hanami
299
299
  # @since 0.4.0
300
300
  #
301
301
  # @see default_headers=
302
- setting :default_headers, {} do |headers|
303
- headers.compact
304
- end
302
+ setting :default_headers, default: {}, constructor: -> headers { headers.compact }
305
303
 
306
304
  # @!method cookies=(cookie_options)
307
305
  #
@@ -332,11 +330,11 @@ module Hanami
332
330
  # @since 0.4.0
333
331
  #
334
332
  # @see cookies=
335
- setting :cookies, {} do |cookie_options|
333
+ setting :cookies, default: {}, constructor: -> cookie_options {
336
334
  # Call `to_h` here to permit `ApplicationConfiguration::Cookies` object to be
337
335
  # provided when application actions are configured
338
336
  cookie_options.to_h.compact
339
- end
337
+ }
340
338
 
341
339
  # @!method root_directory=(dir)
342
340
  #
@@ -364,11 +362,11 @@ module Hanami
364
362
  # @since 1.0.0
365
363
  #
366
364
  # @api private
367
- setting :root_directory do |dir|
365
+ setting :root_directory, constructor: -> dir {
368
366
  dir ||= Dir.pwd
369
367
 
370
368
  Pathname(dir).realpath
371
- end
369
+ }
372
370
 
373
371
  # Default public directory
374
372
  #
@@ -393,7 +391,7 @@ module Hanami
393
391
  #
394
392
  # @see root_directory
395
393
  # @see public_directory
396
- setting :public_directory, DEFAULT_PUBLIC_DIRECTORY
394
+ setting :public_directory, default: DEFAULT_PUBLIC_DIRECTORY
397
395
 
398
396
  # Returns the configured public directory, appended onto the root directory.
399
397
  #
@@ -57,6 +57,7 @@ module Hanami
57
57
  pgp: 'application/pgp-encrypted',
58
58
  png: 'image/png',
59
59
  psd: 'image/vnd.adobe.photoshop',
60
+ rss: 'application/rss+xml',
60
61
  rtf: 'application/rtf',
61
62
  sh: 'application/x-sh',
62
63
  svg: 'image/svg+xml',
@@ -76,7 +76,7 @@ module Hanami
76
76
  end
77
77
 
78
78
  def render(view, **options)
79
- self.body = view.(**view_options.(request, self), **options).to_str
79
+ self.body = view.(**view_options.(request, self), **exposures.merge(options)).to_str
80
80
  end
81
81
 
82
82
  def format=(args)
@@ -553,15 +553,12 @@ module Hanami
553
553
 
554
554
  # Finalize the response
555
555
  #
556
- # This method is abstract and COULD be implemented by included modules in
557
- # order to prepare their data before the response will be returned to the
558
- # webserver.
556
+ # Prepare the data before the response will be returned to the webserver
559
557
  #
560
558
  # @since 0.1.0
561
559
  # @api private
562
560
  # @abstract
563
561
  #
564
- # @see Hanami::Action::Callable#finish
565
562
  # @see Hanami::Action::Session#finish
566
563
  # @see Hanami::Action::Cookies#finish
567
564
  # @see Hanami::Action::Cache#finish
@@ -3,6 +3,6 @@ module Hanami
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '2.0.0.alpha2'.freeze
6
+ VERSION = '2.0.0.alpha6'.freeze
7
7
  end
8
8
  end
@@ -11,23 +11,7 @@ module Hanami
11
11
  #
12
12
  # @since 0.1.0
13
13
  # @api private
14
- ALL = ::Rack::Utils::HTTP_STATUS_CODES.dup.merge({
15
- 103 => 'Checkpoint',
16
- 122 => 'Request-URI too long',
17
- 413 => 'Payload Too Large', # Rack 1.5 compat
18
- 414 => 'URI Too Long', # Rack 1.5 compat
19
- 416 => 'Range Not Satisfiable', # Rack 1.5 compat
20
- 418 => 'I\'m a teapot',
21
- 420 => 'Enhance Your Calm',
22
- 444 => 'No Response',
23
- 449 => 'Retry With',
24
- 450 => 'Blocked by Windows Parental Controls',
25
- 451 => 'Wrong Exchange server',
26
- 499 => 'Client Closed Request',
27
- 506 => 'Variant Also Negotiates', # Rack 1.5 compat
28
- 598 => 'Network read timeout error',
29
- 599 => 'Network connect timeout error'
30
- }).freeze
14
+ ALL = ::Rack::Utils::HTTP_STATUS_CODES
31
15
 
32
16
  # Return a status for the given code
33
17
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.alpha2
4
+ version: 2.0.0.alpha6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-04 00:00:00.000000000 Z
11
+ date: 2022-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -44,14 +44,20 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.12'
47
+ version: '0.13'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 0.13.0
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
55
  - - "~>"
53
56
  - !ruby/object:Gem::Version
54
- version: '0.12'
57
+ version: '0.13'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.13.0
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: bundler
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -128,6 +134,7 @@ files:
128
134
  - lib/hanami/action.rb
129
135
  - lib/hanami/action/application_action.rb
130
136
  - lib/hanami/action/application_configuration.rb
137
+ - lib/hanami/action/application_configuration/content_security_policy.rb
131
138
  - lib/hanami/action/application_configuration/cookies.rb
132
139
  - lib/hanami/action/application_configuration/sessions.rb
133
140
  - lib/hanami/action/base_params.rb
@@ -159,7 +166,8 @@ files:
159
166
  homepage: http://hanamirb.org
160
167
  licenses:
161
168
  - MIT
162
- metadata: {}
169
+ metadata:
170
+ rubygems_mfa_required: 'true'
163
171
  post_install_message:
164
172
  rdoc_options: []
165
173
  require_paths:
@@ -168,14 +176,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
168
176
  requirements:
169
177
  - - ">="
170
178
  - !ruby/object:Gem::Version
171
- version: 2.6.0
179
+ version: '3.0'
172
180
  required_rubygems_version: !ruby/object:Gem::Requirement
173
181
  requirements:
174
182
  - - ">"
175
183
  - !ruby/object:Gem::Version
176
184
  version: 1.3.1
177
185
  requirements: []
178
- rubygems_version: 3.2.4
186
+ rubygems_version: 3.3.3
179
187
  signing_key:
180
188
  specification_version: 4
181
189
  summary: Complete, fast and testable actions for Rack and Hanami