hanami 1.1.1 → 1.2.0.beta1

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: 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