hanami 1.1.1 → 1.2.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d87fe440f006e096c96ad18f1c20428ba4a279df2ee1dbce4ee122cf9ff59b12
4
- data.tar.gz: 8f40361860a2eef0fdbf9eea31cc88588cc3caa2bcc509b1fa40d6817060b951
3
+ metadata.gz: 8a9410374b4c5778d39a7929a839012e22563268752d4937c4afe6343a74cd0c
4
+ data.tar.gz: 9fb8af94de128436c1e1cde83c79dc52c2321baa3ddf3605da7b97cb5a5e6195
5
5
  SHA512:
6
- metadata.gz: 3228003ed57778a29753c440948cc82b2b4a93f9f201ec5836372bf33a3ca8af1535acd36d4ca94eb55c227df3c2503409e2ac9c8972809184e7eafa1e3f855e
7
- data.tar.gz: b57b87929454289abc9ce08d8ddcb35ab57ece912b12fd66791e486785187a222fa36a425d89853589c63e0e40950b6afca3a73f93a80f0cf5f6d540d6690c43
6
+ metadata.gz: 021c99d12215c9932a830cfd1b00efa6f4049eebd98513b0469f6a38a811557a7da1c6e040cf9cdbae15ace92a3fc9d4fe349c5f492817868647c65f51b61b2e
7
+ data.tar.gz: 04a48aedeb9a843f63b4ed5cee9523f1d94fcc088034b8335bc94c6e8774af737a3b44601979d3609312ccba403a1283d8e0e92fac3539ade749a22675735277
@@ -21,15 +21,15 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
23
23
 
24
- spec.add_dependency 'hanami-utils', '~> 1.1'
25
- spec.add_dependency 'hanami-validations', '~> 1.1'
26
- spec.add_dependency 'hanami-router', '~> 1.1'
27
- spec.add_dependency 'hanami-controller', '~> 1.1'
28
- spec.add_dependency 'hanami-view', '~> 1.1'
29
- spec.add_dependency 'hanami-helpers', '~> 1.1'
30
- spec.add_dependency 'hanami-mailer', '~> 1.1'
31
- spec.add_dependency 'hanami-assets', '~> 1.1'
32
- spec.add_dependency 'hanami-cli', '~> 0.1'
24
+ spec.add_dependency 'hanami-utils', '1.2.0.beta1'
25
+ spec.add_dependency 'hanami-validations', '1.2.0.beta1'
26
+ spec.add_dependency 'hanami-router', '1.2.0.beta1'
27
+ spec.add_dependency 'hanami-controller', '1.2.0.beta1'
28
+ spec.add_dependency 'hanami-view', '1.2.0.beta1'
29
+ spec.add_dependency 'hanami-helpers', '1.2.0.beta1'
30
+ spec.add_dependency 'hanami-mailer', '1.2.0.beta1'
31
+ spec.add_dependency 'hanami-assets', '1.2.0.beta1'
32
+ spec.add_dependency 'hanami-cli', '0.2.0.beta1'
33
33
  spec.add_dependency 'concurrent-ruby', '~> 1.0'
34
34
  spec.add_dependency 'bundler'
35
35
 
@@ -21,6 +21,7 @@ module Hanami
21
21
  # @api private
22
22
  # @since 0.9.0
23
23
  @_mutex = Mutex.new
24
+ @_plugins = Concurrent::Array.new
24
25
 
25
26
  # Configure Hanami project
26
27
  #
@@ -77,6 +78,39 @@ module Hanami
77
78
  end
78
79
  end
79
80
 
81
+ # Configure a plugin
82
+ #
83
+ # @see Hanami.configure
84
+ #
85
+ # @since x.x.x
86
+ def self.plugin(&blk)
87
+ @_plugins << blk
88
+ end
89
+
90
+ # Plugins registry
91
+ #
92
+ # NOTE: We can't use `Components` registry.
93
+ #
94
+ # Plugins are loaded when Bundler requires `Gemfile` gems.
95
+ # During this phase the `Components` that we can resolve are erased by the
96
+ # first incoming request in development.
97
+ # They are erased by a workaround that we had to put in place in `Hanami.boot`.
98
+ # This workaround is `Components.release` and it was introduced because
99
+ # `shotgun` failed to reload components, so we have to release for each
100
+ # incoming request.
101
+ # After the `Components` registry is cleared up, Hanami is able to resolve all
102
+ # the components from scratch.
103
+ #
104
+ # When we'll switch to `hanami-reloader` for development, we can remove
105
+ # `Components.release` and we'll be able to store plugins in `Components` and
106
+ # remove `Hanami.plugins` as well.
107
+ #
108
+ # @since x.x.x
109
+ # @api private
110
+ def self.plugins
111
+ @_plugins
112
+ end
113
+
80
114
  # Boot your Hanami project
81
115
  #
82
116
  # NOTE: In case this is invoked many times, it guarantees that the boot
@@ -26,8 +26,10 @@ module Hanami
26
26
  @routes = Hanami::Router.new
27
27
 
28
28
  mount(configuration)
29
- middleware(environment)
29
+ middleware(configuration, environment)
30
30
  builder.run(routes)
31
+
32
+ @app = builder.to_app
31
33
  end
32
34
 
33
35
  # Implements Rack SPEC
@@ -39,11 +41,15 @@ module Hanami
39
41
  # @since 0.9.0
40
42
  # @api private
41
43
  def call(env)
42
- builder.call(env)
44
+ app.call(env)
43
45
  end
44
46
 
45
47
  private
46
48
 
49
+ # @since x.x.x
50
+ # @api private
51
+ attr_reader :app
52
+
47
53
  # @since 0.9.0
48
54
  # @api private
49
55
  attr_reader :builder
@@ -62,15 +68,29 @@ module Hanami
62
68
 
63
69
  # @since 0.9.0
64
70
  # @api private
65
- def middleware(environment)
71
+ #
72
+ # rubocop:disable Metrics/AbcSize
73
+ # rubocop:disable Metrics/MethodLength
74
+ def middleware(configuration, environment)
66
75
  builder.use Hanami::CommonLogger, Hanami.logger unless Hanami.logger.nil?
67
76
  builder.use Rack::ContentLength
68
77
 
78
+ configuration.middleware.each do |m, args, blk|
79
+ builder.use(m, *args, &blk)
80
+ end
81
+
82
+ if configuration.early_hints
83
+ require 'hanami/early_hints'
84
+ builder.use Hanami::EarlyHints
85
+ end
86
+
69
87
  if middleware = environment.static_assets_middleware # rubocop:disable Lint/AssignmentInCondition
70
88
  builder.use middleware
71
89
  end
72
90
 
73
91
  builder.use Rack::MethodOverride
74
92
  end
93
+ # rubocop:enable Metrics/MethodLength
94
+ # rubocop:enable Metrics/AbcSize
75
95
  end
76
96
  end
@@ -299,7 +299,7 @@ module Hanami
299
299
  application_name: options.fetch(:application_name),
300
300
  application_base_url: options.fetch(:application_base_url),
301
301
  hanami_head: options.fetch(:hanami_head),
302
- hanami_model_version: '~> 1.1',
302
+ hanami_model_version: '1.2.0.beta1',
303
303
  code_reloading: code_reloading?,
304
304
  hanami_version: hanami_version,
305
305
  project_module: Utils::String.classify(project),
@@ -36,6 +36,8 @@ group :development do
36
36
  # Code reloading
37
37
  # See: http://hanamirb.org/guides/projects/code-reloading
38
38
  gem 'shotgun'
39
+
40
+ gem 'hanami-webconsole'
39
41
  end
40
42
 
41
43
  <%- end -%>
@@ -16,7 +16,7 @@ Hanami.configure do
16
16
  # adapter :sql, 'postgresql://localhost/<%= project %>_development'
17
17
  # adapter :sql, 'mysql://localhost/<%= project %>_development'
18
18
  #
19
- adapter :<%= database_config_hash[:type] %>, ENV['DATABASE_URL']
19
+ adapter :<%= database_config_hash[:type] %>, ENV.fetch('DATABASE_URL')
20
20
 
21
21
  <%- if database_config.sql? -%>
22
22
  ##
@@ -43,7 +43,7 @@ Hanami.configure do
43
43
  logger level: :info, formatter: :json, filter: []
44
44
 
45
45
  mailer do
46
- delivery :smtp, address: ENV['SMTP_HOST'], port: ENV['SMTP_PORT']
46
+ delivery :smtp, address: ENV.fetch('SMTP_HOST'), port: ENV.fetch('SMTP_PORT')
47
47
  end
48
48
  end
49
49
  end
@@ -323,7 +323,7 @@ module Hanami
323
323
  # @since 0.9.0
324
324
  # @api private
325
325
  register 'finalizers' do
326
- requires 'finalizers.initializers'
326
+ requires 'plugins', 'finalizers.initializers'
327
327
 
328
328
  resolve { true }
329
329
  end
@@ -340,6 +340,18 @@ module Hanami
340
340
  end
341
341
  end
342
342
 
343
+ # Load plugins
344
+ #
345
+ # @since x.x.x
346
+ # @api private
347
+ register 'plugins' do
348
+ resolve do |configuration|
349
+ Hanami.plugins.each do |plugin_configuration|
350
+ configuration.instance_eval(&plugin_configuration)
351
+ end
352
+ end
353
+ end
354
+
343
355
  # Configure, load and finalize a Hanami application in the project
344
356
  #
345
357
  # @since 0.9.0
@@ -1,5 +1,4 @@
1
1
  require 'concurrent'
2
- require 'delegate'
3
2
  require 'hanami/application'
4
3
  require 'hanami/utils/class'
5
4
  require 'hanami/utils/string'
@@ -7,17 +6,8 @@ require 'hanami/utils/string'
7
6
  module Hanami
8
7
  # @api private
9
8
  class Configuration
10
- # @api private
11
- class App < SimpleDelegator
12
- # @api private
13
- attr_reader :path_prefix
14
-
15
- # @api private
16
- def initialize(app, path_prefix)
17
- super(app)
18
- @path_prefix = path_prefix
19
- end
20
- end
9
+ require "hanami/configuration/app"
10
+ require "hanami/configuration/middleware"
21
11
 
22
12
  # @api private
23
13
  def initialize(&blk)
@@ -107,6 +97,36 @@ module Hanami
107
97
  settings.fetch_or_store(:mounted, {})
108
98
  end
109
99
 
100
+ # @since x.x.x
101
+ def middleware
102
+ settings.fetch_or_store(:middleware, Configuration::Middleware.new)
103
+ end
104
+
105
+ # Setup Early Hints feature
106
+ #
107
+ # @since x.x.x
108
+ #
109
+ # @example Enable for all the environments
110
+ # # config/environment.rb
111
+ # Hanami.configure do
112
+ # early_hints true
113
+ # end
114
+ #
115
+ # @example Enable only for production
116
+ # # config/environment.rb
117
+ # Hanami.configure do
118
+ # environment :production do
119
+ # early_hints true
120
+ # end
121
+ # end
122
+ def early_hints(value = nil)
123
+ if value.nil?
124
+ settings.fetch(:early_hints, false)
125
+ else
126
+ settings[:early_hints] = value
127
+ end
128
+ end
129
+
110
130
  # @since 0.9.0
111
131
  # @api private
112
132
  def apps
@@ -0,0 +1,18 @@
1
+ require "delegate"
2
+
3
+ module Hanami
4
+ # @api private
5
+ class Configuration
6
+ # @api private
7
+ class App < SimpleDelegator
8
+ # @api private
9
+ attr_reader :path_prefix
10
+
11
+ # @api private
12
+ def initialize(app, path_prefix)
13
+ super(app)
14
+ @path_prefix = path_prefix
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,37 @@
1
+ require "concurrent"
2
+
3
+ module Hanami
4
+ # @api private
5
+ class Configuration
6
+ # Middleware configuration
7
+ class Middleware
8
+ # @api private
9
+ def initialize
10
+ @middleware = Concurrent::Array.new
11
+ end
12
+
13
+ # Use a Rack middleware
14
+ #
15
+ # @param middleware [#call] a Rack middleware
16
+ # @param args [Array<Object>] an optional set of options
17
+ # @param blk [Proc] an optional block to pass to the middleware
18
+ #
19
+ # @since x.x.x
20
+ #
21
+ # @example
22
+ # # config/environment.rb
23
+ # # ...
24
+ # Hanami.configure do
25
+ # middleware.use MyRackMiddleware
26
+ # end
27
+ def use(middleware, *args, &blk)
28
+ @middleware.push([middleware, args, blk])
29
+ end
30
+
31
+ # @api private
32
+ def each(&blk)
33
+ @middleware.each(&blk)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ # HTTP/2 Early Hints Rack middleware
5
+ #
6
+ # It sends extra responses **before** the main reponse is sent.
7
+ # These extra responses are HTTP/2 Early Hints (103).
8
+ # They specify the web assets (javascripts, stylesheets, etc..) to be "pushed",
9
+ # so modern browsers pre-fetch them in parallel with the main HTTP response.
10
+ #
11
+ # @see https://tools.ietf.org/html/draft-ietf-httpbis-early-hints-05
12
+ #
13
+ # @since x.x.x
14
+ # @api private
15
+ class EarlyHints
16
+ # @since x.x.x
17
+ # @api private
18
+ class NotSupportedByServerError < ::StandardError
19
+ # @since x.x.x
20
+ # @api private
21
+ def initialize
22
+ super("Current Ruby server doesn't support Early Hints.\nPlease make sure to use a web server with Early Hints enabled (only Puma for now).")
23
+ end
24
+ end
25
+
26
+ # @since x.x.x
27
+ # @api private
28
+ def initialize(app)
29
+ @app = app
30
+ end
31
+
32
+ # @param env [Hash] Rack env
33
+ #
34
+ # @return [Array,Rack::Response] a Rack response
35
+ #
36
+ # @raise [Hanami::EarlyHints::NotSupportedByServerError] if the current Ruby
37
+ # server doesn't support Early Hints
38
+ #
39
+ # @since x.x.x
40
+ # @api private
41
+ def call(env)
42
+ @app.call(env).tap do
43
+ send_early_hints(env)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ # Pushing a lot of assets may exceed the limit of HTTP headers of a single
50
+ # Early Hints (103) response.
51
+ #
52
+ # For this reason we send multiple Early Hints (103) responses for each `n`
53
+ # assets. We call this `n` number `BATCH_SIZE`.
54
+ #
55
+ # If the current page needs to push 23 assets, it will send 3 Early Hints
56
+ # (103) responses:
57
+ #
58
+ # 1. Response #1: 10 assets
59
+ # 2. Response #2: 10 assets
60
+ # 3. Response #3: 3 assets
61
+ #
62
+ # @since x.x.x
63
+ # @api private
64
+ BATCH_SIZE = 10
65
+
66
+ # Rack servers that support Early Hints (only Puma for now),
67
+ # inject an object into the Rack env to send multiple Early Hints (103)
68
+ # responses.
69
+ #
70
+ # @since x.x.x
71
+ # @api private
72
+ #
73
+ # @see https://github.com/puma/puma/pull/1403
74
+ RACK_EARLY_HINTS_ENV_KEY = "rack.early_hints"
75
+
76
+ # This cache key is used by `hanami-assets` to collect the assets that are
77
+ # eligible to be pushed.
78
+ #
79
+ # It stores these values in a thread-local variable.
80
+ #
81
+ # NOTE: if changing this key here, it MUST be changed into `hanami-assets` as well
82
+ #
83
+ # @since x.x.x
84
+ # @api private
85
+ CACHE_KEY = :__hanami_assets
86
+
87
+ # Tries to send multiple Early Hints (103) HTTP responses, if there are
88
+ # assets eligible.
89
+ #
90
+ # @param env [Hash] Rack env
91
+ #
92
+ # @raise [Hanami::EarlyHints::NotSupportedByServerError] if the current Ruby
93
+ # server doesn't support Early Hints
94
+ #
95
+ # @since x.x.x
96
+ # @api private
97
+ def send_early_hints(env)
98
+ return if Thread.current[CACHE_KEY].nil?
99
+
100
+ Thread.current[CACHE_KEY].each_slice(BATCH_SIZE) do |slice|
101
+ link = slice.map do |asset, options|
102
+ ret = %(<#{asset}>; rel=preload)
103
+ ret += "; as=#{options[:as]}" unless options[:as].nil?
104
+ ret += "; crossorigin" if options[:crossorigin]
105
+ ret
106
+ end.join("\n")
107
+
108
+ send_early_hints_response(env, link)
109
+ end
110
+ end
111
+
112
+ # Tries to send an Early Hints (103) HTTP response for a batch of assets
113
+ #
114
+ # @param env [Hash] Rack env
115
+ # @param link [String] the serialized HTTP `Link` headers
116
+ #
117
+ # @raise [Hanami::EarlyHints::NotSupportedByServerError] if the current Ruby
118
+ # server doesn't support Early Hints
119
+ #
120
+ # @since x.x.x
121
+ # @api private
122
+ def send_early_hints_response(env, link)
123
+ env[RACK_EARLY_HINTS_ENV_KEY].call("Link" => link)
124
+ rescue NoMethodError => exception
125
+ raise exception if env.key?(RACK_EARLY_HINTS_ENV_KEY)
126
+ raise NotSupportedByServerError
127
+ end
128
+ end
129
+ end
@@ -6,7 +6,7 @@ module Hanami
6
6
  module Version
7
7
  # @since 0.9.0
8
8
  # @api private
9
- VERSION = '1.1.1'.freeze
9
+ VERSION = '1.2.0.beta1'.freeze
10
10
 
11
11
  # @since 0.9.0
12
12
  # @api private
metadata CHANGED
@@ -1,141 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-27 00:00:00.000000000 Z
11
+ date: 2018-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hanami-utils
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: 1.2.0.beta1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: '1.1'
26
+ version: 1.2.0.beta1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: hanami-validations
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: '1.1'
33
+ version: 1.2.0.beta1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: '1.1'
40
+ version: 1.2.0.beta1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hanami-router
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: '1.1'
47
+ version: 1.2.0.beta1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: '1.1'
54
+ version: 1.2.0.beta1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: hanami-controller
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: '1.1'
61
+ version: 1.2.0.beta1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: '1.1'
68
+ version: 1.2.0.beta1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: hanami-view
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: '1.1'
75
+ version: 1.2.0.beta1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: '1.1'
82
+ version: 1.2.0.beta1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: hanami-helpers
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: '1.1'
89
+ version: 1.2.0.beta1
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: '1.1'
96
+ version: 1.2.0.beta1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: hanami-mailer
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: '1.1'
103
+ version: 1.2.0.beta1
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: '1.1'
110
+ version: 1.2.0.beta1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: hanami-assets
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - '='
116
116
  - !ruby/object:Gem::Version
117
- version: '1.1'
117
+ version: 1.2.0.beta1
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - '='
123
123
  - !ruby/object:Gem::Version
124
- version: '1.1'
124
+ version: 1.2.0.beta1
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: hanami-cli
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: '0.1'
131
+ version: 0.2.0.beta1
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: '0.1'
138
+ version: 0.2.0.beta1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: concurrent-ruby
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -344,6 +344,9 @@ files:
344
344
  - lib/hanami/config/security.rb
345
345
  - lib/hanami/config/sessions.rb
346
346
  - lib/hanami/configuration.rb
347
+ - lib/hanami/configuration/app.rb
348
+ - lib/hanami/configuration/middleware.rb
349
+ - lib/hanami/early_hints.rb
347
350
  - lib/hanami/env.rb
348
351
  - lib/hanami/environment.rb
349
352
  - lib/hanami/environment_application_configurations.rb
@@ -382,9 +385,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
382
385
  version: 2.3.0
383
386
  required_rubygems_version: !ruby/object:Gem::Requirement
384
387
  requirements:
385
- - - ">="
388
+ - - ">"
386
389
  - !ruby/object:Gem::Version
387
- version: '0'
390
+ version: 1.3.1
388
391
  requirements: []
389
392
  rubyforge_project:
390
393
  rubygems_version: 2.7.5