hanami 1.3.5 → 2.0.0.alpha1
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 +4 -4
- data/CHANGELOG.md +51 -41
- data/FEATURES.md +2 -12
- data/LICENSE.md +1 -1
- data/README.md +5 -8
- data/bin/hanami +6 -4
- data/hanami.gemspec +24 -28
- data/lib/hanami/application.rb +44 -176
- data/lib/hanami/boot.rb +6 -0
- data/lib/hanami/cli/commands/command.rb +21 -29
- data/lib/hanami/cli/commands/server.rb +63 -14
- data/lib/hanami/cli/commands.rb +5 -42
- data/lib/hanami/configuration/cookies.rb +24 -0
- data/lib/hanami/configuration/middleware.rb +8 -28
- data/lib/hanami/configuration/security.rb +141 -0
- data/lib/hanami/configuration/sessions.rb +50 -0
- data/lib/hanami/configuration.rb +181 -191
- data/lib/hanami/container.rb +107 -0
- data/lib/hanami/frameworks.rb +24 -18
- data/lib/hanami/routes.rb +17 -205
- data/lib/hanami/server.rb +5 -69
- data/lib/hanami/version.rb +3 -1
- data/lib/hanami.rb +39 -243
- metadata +36 -233
- data/lib/hanami/action/csrf_protection.rb +0 -211
- data/lib/hanami/action/routing_helpers.rb +0 -40
- data/lib/hanami/app.rb +0 -96
- data/lib/hanami/application_configuration.rb +0 -1495
- data/lib/hanami/application_name.rb +0 -108
- data/lib/hanami/application_namespace.rb +0 -14
- data/lib/hanami/assets/asset.rb +0 -72
- data/lib/hanami/assets/static.rb +0 -102
- data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
- data/lib/hanami/cli/commands/assets.rb +0 -16
- data/lib/hanami/cli/commands/console.rb +0 -95
- data/lib/hanami/cli/commands/db/apply.rb +0 -32
- data/lib/hanami/cli/commands/db/console.rb +0 -44
- data/lib/hanami/cli/commands/db/create.rb +0 -32
- data/lib/hanami/cli/commands/db/drop.rb +0 -32
- data/lib/hanami/cli/commands/db/migrate.rb +0 -39
- data/lib/hanami/cli/commands/db/prepare.rb +0 -32
- data/lib/hanami/cli/commands/db/rollback.rb +0 -59
- data/lib/hanami/cli/commands/db/version.rb +0 -32
- data/lib/hanami/cli/commands/db.rb +0 -32
- data/lib/hanami/cli/commands/destroy/action.rb +0 -137
- data/lib/hanami/cli/commands/destroy/app.rb +0 -159
- data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
- data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
- data/lib/hanami/cli/commands/destroy/model.rb +0 -84
- data/lib/hanami/cli/commands/destroy.rb +0 -26
- data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
- data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
- data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
- data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
- data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/action.rb +0 -321
- data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
- data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
- data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
- data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
- data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
- data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
- data/lib/hanami/cli/commands/generate/app.rb +0 -243
- data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
- data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
- data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
- data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
- data/lib/hanami/cli/commands/generate/migration.rb +0 -41
- data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
- data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
- data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
- data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
- data/lib/hanami/cli/commands/generate/model.rb +0 -125
- data/lib/hanami/cli/commands/generate/secret.rb +0 -48
- data/lib/hanami/cli/commands/generate.rb +0 -28
- data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
- data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
- data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
- data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
- data/lib/hanami/cli/commands/new/README.md.erb +0 -33
- data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
- data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
- data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
- data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
- data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
- data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
- data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
- data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
- data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
- data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
- data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
- data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
- data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
- data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
- data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
- data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
- data/lib/hanami/cli/commands/new.rb +0 -578
- data/lib/hanami/cli/commands/project.rb +0 -421
- data/lib/hanami/cli/commands/routes.rb +0 -21
- data/lib/hanami/cli/commands/templates.rb +0 -31
- data/lib/hanami/cli/commands/version.rb +0 -19
- data/lib/hanami/common_logger.rb +0 -109
- data/lib/hanami/components/app/assets.rb +0 -59
- data/lib/hanami/components/app/controller.rb +0 -74
- data/lib/hanami/components/app/routes.rb +0 -59
- data/lib/hanami/components/app/view.rb +0 -44
- data/lib/hanami/components/component.rb +0 -182
- data/lib/hanami/components/components.rb +0 -479
- data/lib/hanami/components/routes_inspector.rb +0 -72
- data/lib/hanami/components.rb +0 -156
- data/lib/hanami/config/cookies.rb +0 -69
- data/lib/hanami/config/framework_configuration.rb +0 -43
- data/lib/hanami/config/load_paths.rb +0 -46
- data/lib/hanami/config/mapper.rb +0 -47
- data/lib/hanami/config/routes.rb +0 -20
- data/lib/hanami/config/security.rb +0 -110
- data/lib/hanami/config/sessions.rb +0 -119
- data/lib/hanami/configuration/app.rb +0 -21
- data/lib/hanami/early_hints.rb +0 -129
- data/lib/hanami/env.rb +0 -69
- data/lib/hanami/environment.rb +0 -541
- data/lib/hanami/environment_application_configurations.rb +0 -37
- data/lib/hanami/hanamirc.rb +0 -169
- data/lib/hanami/mailer/glue.rb +0 -27
- data/lib/hanami/middleware_stack.rb +0 -172
- data/lib/hanami/rake_helper.rb +0 -78
- data/lib/hanami/rake_tasks.rb +0 -3
- data/lib/hanami/rendering_policy.rb +0 -94
- data/lib/hanami/routing/default.rb +0 -32
- data/lib/hanami/setup.rb +0 -3
- data/lib/hanami/static.rb +0 -63
- data/lib/hanami/templates/default.html.erb +0 -30
- data/lib/hanami/templates/welcome.html.erb +0 -52
- data/lib/hanami/views/default.rb +0 -37
- data/lib/hanami/views/default_template_finder.rb +0 -22
- data/lib/hanami/views/null_view.rb +0 -15
- data/lib/hanami/welcome.rb +0 -41
data/lib/hanami/routes.rb
CHANGED
|
@@ -1,219 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Hanami
|
|
4
|
-
#
|
|
4
|
+
# Hanami application routes
|
|
5
5
|
#
|
|
6
|
-
#
|
|
7
|
-
# to the `Routes` constant, under the application namespace.
|
|
8
|
-
#
|
|
9
|
-
# @since 0.1.0
|
|
10
|
-
# @api private
|
|
6
|
+
# @since 2.0.0
|
|
11
7
|
class Routes
|
|
12
|
-
|
|
13
|
-
#
|
|
14
|
-
# @param routes [Hanami::Router] a routes set
|
|
15
|
-
#
|
|
16
|
-
# @return [Hanami::Routes] the factory
|
|
17
|
-
#
|
|
18
|
-
# @since 0.1.0
|
|
19
|
-
# @api private
|
|
20
|
-
def initialize(routes)
|
|
21
|
-
@routes = routes
|
|
22
|
-
end
|
|
8
|
+
attr_reader :apps
|
|
23
9
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
# to the wrapped route set.
|
|
29
|
-
#
|
|
30
|
-
# @return [Hanami::Utils::Escape::SafeString] the corresponding relative URL
|
|
31
|
-
#
|
|
32
|
-
# @raise Hanami::Routing::InvalidRouteException
|
|
33
|
-
#
|
|
34
|
-
# @since 0.1.0
|
|
35
|
-
#
|
|
36
|
-
# @see http://rdoc.info/gems/hanami-router/Hanami/Router#path-instance_method
|
|
37
|
-
#
|
|
38
|
-
# @example Basic example
|
|
39
|
-
# require 'hanami'
|
|
40
|
-
#
|
|
41
|
-
# module Web
|
|
42
|
-
# class Application < Hanami::Application
|
|
43
|
-
# configure do
|
|
44
|
-
# routes do
|
|
45
|
-
# get '/login', to: 'sessions#new', as: :login
|
|
46
|
-
# end
|
|
47
|
-
# end
|
|
48
|
-
# end
|
|
49
|
-
# end
|
|
50
|
-
#
|
|
51
|
-
# Web.routes.path(:login)
|
|
52
|
-
# # => '/login'
|
|
53
|
-
#
|
|
54
|
-
# Web.routes.path(:login, return_to: '/dashboard')
|
|
55
|
-
# # => '/login?return_to=%2Fdashboard'
|
|
56
|
-
#
|
|
57
|
-
# @example Dynamic finders
|
|
58
|
-
# require 'hanami'
|
|
59
|
-
#
|
|
60
|
-
# module Web
|
|
61
|
-
# class Application < Hanami::Application
|
|
62
|
-
# configure do
|
|
63
|
-
# routes do
|
|
64
|
-
# get '/login', to: 'sessions#new', as: :login
|
|
65
|
-
# end
|
|
66
|
-
# end
|
|
67
|
-
# end
|
|
68
|
-
# end
|
|
69
|
-
#
|
|
70
|
-
# Web.routes.login_path
|
|
71
|
-
# # => '/login'
|
|
72
|
-
#
|
|
73
|
-
# Web.routes.login_path(return_to: '/dashboard')
|
|
74
|
-
# # => '/login?return_to=%2Fdashboard'
|
|
75
|
-
def path(name, *args)
|
|
76
|
-
Utils::Escape::SafeString.new(@routes.path(name, *args))
|
|
10
|
+
def initialize(&blk)
|
|
11
|
+
@blk = blk
|
|
12
|
+
@apps = []
|
|
13
|
+
instance_eval(&blk)
|
|
77
14
|
end
|
|
78
15
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
# @param name [Symbol] the route name
|
|
82
|
-
# @param args [Array,nil] an optional set of arguments that is passed down
|
|
83
|
-
# to the wrapped route set.
|
|
84
|
-
#
|
|
85
|
-
# @return [Hanami::Utils::Escape::SafeString] the corresponding absolute URL
|
|
86
|
-
#
|
|
87
|
-
# @raise Hanami::Routing::InvalidRouteException
|
|
88
|
-
#
|
|
89
|
-
# @since 0.1.0
|
|
90
|
-
#
|
|
91
|
-
# @see http://rdoc.info/gems/hanami-router/Hanami/Router#url-instance_method
|
|
92
|
-
#
|
|
93
|
-
# @example Basic example
|
|
94
|
-
# require 'hanami'
|
|
95
|
-
#
|
|
96
|
-
# module Web
|
|
97
|
-
# class Application < Hanami::Application
|
|
98
|
-
# configure do
|
|
99
|
-
# routes do
|
|
100
|
-
# scheme 'https'
|
|
101
|
-
# host 'bookshelf.org'
|
|
102
|
-
#
|
|
103
|
-
# get '/login', to: 'sessions#new', as: :login
|
|
104
|
-
# end
|
|
105
|
-
# end
|
|
106
|
-
# end
|
|
107
|
-
# end
|
|
108
|
-
#
|
|
109
|
-
# Web.routes.url(:login)
|
|
110
|
-
# # => 'https://bookshelf.org/login'
|
|
111
|
-
#
|
|
112
|
-
# Web.routes.url(:login, return_to: '/dashboard')
|
|
113
|
-
# # => 'https://bookshelf.org/login?return_to=%2Fdashboard'
|
|
114
|
-
#
|
|
115
|
-
# @example Dynamic finders
|
|
116
|
-
# require 'hanami'
|
|
117
|
-
#
|
|
118
|
-
# module Web
|
|
119
|
-
# class Application < Hanami::Application
|
|
120
|
-
# configure do
|
|
121
|
-
# routes do
|
|
122
|
-
# scheme 'https'
|
|
123
|
-
# host 'bookshelf.org'
|
|
124
|
-
#
|
|
125
|
-
# get '/login', to: 'sessions#new', as: :login
|
|
126
|
-
# end
|
|
127
|
-
# end
|
|
128
|
-
# end
|
|
129
|
-
# end
|
|
130
|
-
#
|
|
131
|
-
# Web.routes.login_url
|
|
132
|
-
# # => 'https://bookshelf.org/login'
|
|
133
|
-
#
|
|
134
|
-
# Web.routes.login_url(return_to: '/dashboard')
|
|
135
|
-
# # => 'https://bookshelf.org/login?return_to=%2Fdashboard'
|
|
136
|
-
def url(name, *args)
|
|
137
|
-
Utils::Escape::SafeString.new(@routes.url(name, *args))
|
|
16
|
+
def to_proc
|
|
17
|
+
@blk
|
|
138
18
|
end
|
|
139
19
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
# This method is designed for testing purposes
|
|
143
|
-
#
|
|
144
|
-
# @param env [Hash] a Rack env
|
|
145
|
-
#
|
|
146
|
-
# @return [Hanami::Routing::RecognizedRoute] the recognized route
|
|
147
|
-
#
|
|
148
|
-
# @since 0.8.0
|
|
149
|
-
#
|
|
150
|
-
# @see https://guides.hanamirb.org/routing/testing
|
|
151
|
-
#
|
|
152
|
-
# @example Path Generation
|
|
153
|
-
# # spec/web/routes_spec.rb
|
|
154
|
-
# RSpec.describe Web::Routes do
|
|
155
|
-
# it 'generates "/"' do
|
|
156
|
-
# actual = described_class.path(:root)
|
|
157
|
-
# expect(actual).to eq '/'
|
|
158
|
-
# end
|
|
159
|
-
#
|
|
160
|
-
# it 'generates "/books/23"' do
|
|
161
|
-
# actual = described_class.path(:book, id: 23)
|
|
162
|
-
# expect(actual).to eq '/books/23'
|
|
163
|
-
# end
|
|
164
|
-
# end
|
|
165
|
-
#
|
|
166
|
-
# @example Route Recognition
|
|
167
|
-
# # spec/web/routes_spec.rb
|
|
168
|
-
# RSpec.describe Web::Routes do
|
|
169
|
-
#
|
|
170
|
-
# # ...
|
|
171
|
-
#
|
|
172
|
-
# it 'recognizes "GET /"' do
|
|
173
|
-
# env = Rack::MockRequest.env_for('/')
|
|
174
|
-
# route = described_class.recognize(env)
|
|
175
|
-
#
|
|
176
|
-
# expect(route).to be_routable
|
|
177
|
-
#
|
|
178
|
-
# expect(route.path).to eq '/'
|
|
179
|
-
# expect(route.verb).to eq 'GET'
|
|
180
|
-
# expect(route.params).to eq({})
|
|
181
|
-
# end
|
|
182
|
-
#
|
|
183
|
-
# it 'recognizes "PATCH /books/23"' do
|
|
184
|
-
# env = Rack::MockRequest.env_for('/books/23', method: 'PATCH')
|
|
185
|
-
# route = described_class.recognize(env)
|
|
186
|
-
#
|
|
187
|
-
# expect(route).to be_routable
|
|
188
|
-
#
|
|
189
|
-
# expect(route.path).to eq '/books/23'
|
|
190
|
-
# expect(route.verb).to eq 'PATCH'
|
|
191
|
-
# expect(route.params).to eq(id: '23')
|
|
192
|
-
# end
|
|
193
|
-
#
|
|
194
|
-
# it 'does not recognize unknown route' do
|
|
195
|
-
# env = Rack::MockRequest.env_for('/foo')
|
|
196
|
-
# route = described_class.recognize(env)
|
|
197
|
-
#
|
|
198
|
-
# expect(route).to_not be_routable
|
|
199
|
-
# end
|
|
200
|
-
# end
|
|
201
|
-
def recognize(env)
|
|
202
|
-
@routes.recognize(env)
|
|
20
|
+
def mount(app, **)
|
|
21
|
+
@apps << app if app.is_a?(Symbol)
|
|
203
22
|
end
|
|
204
23
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
# @api private
|
|
209
|
-
def method_missing(m, *args)
|
|
210
|
-
named_route, type = m.to_s.split(/\_(path|url)\z/)
|
|
211
|
-
|
|
212
|
-
if type
|
|
213
|
-
public_send(type, named_route.to_sym, *args)
|
|
214
|
-
else
|
|
215
|
-
super
|
|
216
|
-
end
|
|
24
|
+
# rubocop:disable Style/MethodMissingSuper
|
|
25
|
+
# rubocop:disable Style/MissingRespondToMissing
|
|
26
|
+
def method_missing(*)
|
|
217
27
|
end
|
|
28
|
+
# rubocop:enable Style/MissingRespondToMissing
|
|
29
|
+
# rubocop:enable Style/MethodMissingSuper
|
|
218
30
|
end
|
|
219
31
|
end
|
data/lib/hanami/server.rb
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "hanami"
|
|
4
|
+
require "rack"
|
|
2
5
|
|
|
3
6
|
module Hanami
|
|
4
7
|
# Rack compatible server.
|
|
@@ -13,81 +16,14 @@ module Hanami
|
|
|
13
16
|
# @since 0.8.0
|
|
14
17
|
# @api private
|
|
15
18
|
class Server < ::Rack::Server
|
|
16
|
-
# @api private
|
|
17
|
-
attr_reader :options
|
|
18
|
-
|
|
19
|
-
# @since 0.8.0
|
|
20
|
-
# @api private
|
|
21
|
-
#
|
|
22
|
-
# @see Hanami::Environment#initialize
|
|
23
|
-
def initialize
|
|
24
|
-
@options = _extract_options
|
|
25
|
-
setup
|
|
26
|
-
end
|
|
27
|
-
|
|
28
19
|
# Primarily this removes the ::Rack::Chunked middleware
|
|
29
20
|
# which is the cause of Safari content-length bugs.
|
|
30
21
|
#
|
|
31
22
|
# @since 0.8.0
|
|
32
23
|
def middleware
|
|
33
|
-
mw = Hash.new { |e, m| e[m] = [] }
|
|
24
|
+
mw = ::Hash.new { |e, m| e[m] = [] }
|
|
34
25
|
mw["development"].concat([::Rack::ShowExceptions, ::Rack::Lint])
|
|
35
|
-
require 'hanami/assets/static'
|
|
36
|
-
mw["development"].push(::Hanami::Assets::Static)
|
|
37
26
|
mw
|
|
38
27
|
end
|
|
39
|
-
|
|
40
|
-
# @api private
|
|
41
|
-
def start
|
|
42
|
-
preload
|
|
43
|
-
super
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
private
|
|
47
|
-
|
|
48
|
-
# @api private
|
|
49
|
-
def setup
|
|
50
|
-
return unless code_reloading?
|
|
51
|
-
@app = Shotgun::Loader.new(rackup)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# @api private
|
|
55
|
-
def environment
|
|
56
|
-
Components['environment']
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# @since 0.8.0
|
|
60
|
-
# @api private
|
|
61
|
-
def code_reloading?
|
|
62
|
-
Hanami.code_reloading?
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# @api private
|
|
66
|
-
def rackup
|
|
67
|
-
environment.rackup.to_s
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# @api private
|
|
71
|
-
def preload
|
|
72
|
-
if code_reloading?
|
|
73
|
-
Shotgun.enable_copy_on_write
|
|
74
|
-
Shotgun.preload
|
|
75
|
-
else
|
|
76
|
-
Hanami.boot
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# Options for Rack::Server superclass
|
|
81
|
-
#
|
|
82
|
-
# @since 0.8.0
|
|
83
|
-
# @api private
|
|
84
|
-
def _extract_options
|
|
85
|
-
environment.to_options.merge(
|
|
86
|
-
config: rackup,
|
|
87
|
-
Host: environment.host,
|
|
88
|
-
Port: environment.port,
|
|
89
|
-
AccessLog: []
|
|
90
|
-
)
|
|
91
|
-
end
|
|
92
28
|
end
|
|
93
29
|
end
|
data/lib/hanami/version.rb
CHANGED
data/lib/hanami.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# A complete web framework for Ruby
|
|
4
4
|
#
|
|
@@ -6,277 +6,73 @@ require 'thread'
|
|
|
6
6
|
#
|
|
7
7
|
# @see http://hanamirb.org
|
|
8
8
|
module Hanami
|
|
9
|
-
require
|
|
10
|
-
require
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require 'hanami/application'
|
|
14
|
-
require 'hanami/components'
|
|
15
|
-
require 'hanami/configuration'
|
|
9
|
+
require "hanami/version"
|
|
10
|
+
require "hanami/frameworks"
|
|
11
|
+
require "hanami/container"
|
|
12
|
+
require "hanami/application"
|
|
16
13
|
|
|
17
|
-
# @api private
|
|
18
|
-
# @since 0.6.0
|
|
19
|
-
DEFAULT_PUBLIC_DIRECTORY = 'public'.freeze
|
|
20
|
-
|
|
21
|
-
# @api private
|
|
22
|
-
# @since 0.9.0
|
|
23
14
|
@_mutex = Mutex.new
|
|
24
|
-
@_plugins = Concurrent::Array.new
|
|
25
15
|
|
|
26
|
-
|
|
27
|
-
#
|
|
28
|
-
# Please note that the code for this method is generated by `hanami new`.
|
|
29
|
-
#
|
|
30
|
-
# @param blk [Proc] the configuration block
|
|
31
|
-
#
|
|
32
|
-
# @since 0.9.0
|
|
33
|
-
#
|
|
34
|
-
# @example
|
|
35
|
-
# # config/environment.rb
|
|
36
|
-
#
|
|
37
|
-
# # ...
|
|
38
|
-
#
|
|
39
|
-
# Hanami.configure do
|
|
40
|
-
# mount Admin::Application, at: "/admin"
|
|
41
|
-
# mount Web::Application, at: "/"
|
|
42
|
-
#
|
|
43
|
-
# model do
|
|
44
|
-
# adapter :sql, ENV['DATABASE_URL']
|
|
45
|
-
#
|
|
46
|
-
# migrations "db/migrations"
|
|
47
|
-
# schema "db/schema.sql"
|
|
48
|
-
# end
|
|
49
|
-
#
|
|
50
|
-
# mailer do
|
|
51
|
-
# root "lib/bookshelf/mailers"
|
|
52
|
-
#
|
|
53
|
-
# delivery do
|
|
54
|
-
# development :test
|
|
55
|
-
# test :test
|
|
56
|
-
# # production :smtp, address: ENV['SMTP_HOST'], port: ENV['SMTP_PORT']
|
|
57
|
-
# end
|
|
58
|
-
# end
|
|
59
|
-
# end
|
|
60
|
-
def self.configure(&blk)
|
|
16
|
+
def self.application
|
|
61
17
|
@_mutex.synchronize do
|
|
62
|
-
|
|
63
|
-
end
|
|
64
|
-
end
|
|
18
|
+
raise "Hanami application not configured" unless defined?(@_application)
|
|
65
19
|
|
|
66
|
-
|
|
67
|
-
#
|
|
68
|
-
# @return [Hanami::Configuration] the configuration
|
|
69
|
-
#
|
|
70
|
-
# @see Hanami.configure
|
|
71
|
-
#
|
|
72
|
-
# @since 0.9.0
|
|
73
|
-
# @api private
|
|
74
|
-
def self.configuration
|
|
75
|
-
@_mutex.synchronize do
|
|
76
|
-
raise "Hanami not configured" unless defined?(@_configuration)
|
|
77
|
-
@_configuration
|
|
20
|
+
@_application
|
|
78
21
|
end
|
|
79
22
|
end
|
|
80
23
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
#
|
|
85
|
-
# @since 1.2.0
|
|
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 1.2.0
|
|
109
|
-
# @api private
|
|
110
|
-
def self.plugins
|
|
111
|
-
@_plugins
|
|
112
|
-
end
|
|
24
|
+
def self.application=(app)
|
|
25
|
+
@_mutex.synchronize do
|
|
26
|
+
raise "Hanami application already configured" if defined?(@_application)
|
|
113
27
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
# NOTE: In case this is invoked many times, it guarantees that the boot
|
|
117
|
-
# process happens only once.
|
|
118
|
-
#
|
|
119
|
-
# NOTE: This MUST NOT be wrapped by a Mutex, because it would cause a deadlock.
|
|
120
|
-
#
|
|
121
|
-
# @return [NilClass]
|
|
122
|
-
#
|
|
123
|
-
# @since 0.9.0
|
|
124
|
-
def self.boot
|
|
125
|
-
Components.release if code_reloading?
|
|
126
|
-
Components.resolve('all')
|
|
127
|
-
Hanami::Model.disconnect if defined?(Hanami::Model)
|
|
128
|
-
nil
|
|
28
|
+
@_application = app unless app.name.nil?
|
|
29
|
+
end
|
|
129
30
|
end
|
|
130
31
|
|
|
131
|
-
# Main application that mounts many Rack and/or Hanami applications.
|
|
132
|
-
#
|
|
133
|
-
# This is used as integration point for:
|
|
134
|
-
#
|
|
135
|
-
# * `config.ru` (`run Hanami.app`)
|
|
136
|
-
# * Feature tests (`Capybara.app = Hanami.app`)
|
|
137
|
-
#
|
|
138
|
-
#
|
|
139
|
-
#
|
|
140
|
-
# It lazily loads your Hanami project, in case it wasn't booted on before.
|
|
141
|
-
# This is the case when `hanami server` isn't invoked, but we use different
|
|
142
|
-
# ways to run the project (eg. `rackup`).
|
|
143
|
-
#
|
|
144
|
-
# @return [Hanami::App] the app
|
|
145
|
-
#
|
|
146
|
-
# @since 0.9.0
|
|
147
|
-
# @api private
|
|
148
|
-
#
|
|
149
|
-
# @see Hanami.boot
|
|
150
32
|
def self.app
|
|
151
|
-
|
|
152
|
-
|
|
33
|
+
@_mutex.synchronize do
|
|
34
|
+
raise "Hanami.app not configured" unless defined?(@_app)
|
|
35
|
+
|
|
36
|
+
@_app
|
|
37
|
+
end
|
|
153
38
|
end
|
|
154
39
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
# env variable. If the HANAMI_APPS env variable is not set, it defaults
|
|
159
|
-
# to loading all applications.
|
|
160
|
-
#
|
|
161
|
-
# @return [TrueClass,FalseClass] the result of the check
|
|
162
|
-
#
|
|
163
|
-
# @since 1.1.0
|
|
164
|
-
#
|
|
165
|
-
# @example
|
|
166
|
-
#
|
|
167
|
-
# # Mount hanami app for specific app
|
|
168
|
-
# Hanami.configure do
|
|
169
|
-
# if Hanami.app?(:web)
|
|
170
|
-
# require_relative '../apps/web/application'
|
|
171
|
-
# mount Web::Application, at: '/'
|
|
172
|
-
# end
|
|
173
|
-
# end
|
|
174
|
-
#
|
|
175
|
-
def self.app?(app)
|
|
176
|
-
return true unless ENV.key?('HANAMI_APPS')
|
|
40
|
+
def self.app=(app)
|
|
41
|
+
@_mutex.synchronize do
|
|
42
|
+
raise "Hanami.app already configured" if defined?(@_app)
|
|
177
43
|
|
|
178
|
-
|
|
179
|
-
|
|
44
|
+
@_app = app
|
|
45
|
+
end
|
|
180
46
|
end
|
|
181
47
|
|
|
182
|
-
# Return root of the project (top level directory).
|
|
183
|
-
#
|
|
184
|
-
# @return [Pathname] root path
|
|
185
|
-
#
|
|
186
|
-
# @since 0.3.2
|
|
187
|
-
#
|
|
188
|
-
# @example
|
|
189
|
-
# Hanami.root # => #<Pathname:/Users/luca/Code/bookshelf>
|
|
190
48
|
def self.root
|
|
191
|
-
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
# Project public directory
|
|
195
|
-
#
|
|
196
|
-
# @return [Pathname] public directory
|
|
197
|
-
#
|
|
198
|
-
# @since 0.6.0
|
|
199
|
-
#
|
|
200
|
-
# @example
|
|
201
|
-
# Hanami.public_directory # => #<Pathname:/Users/luca/Code/bookshelf/public>
|
|
202
|
-
def self.public_directory
|
|
203
|
-
root.join(DEFAULT_PUBLIC_DIRECTORY)
|
|
49
|
+
Container.root
|
|
204
50
|
end
|
|
205
51
|
|
|
206
|
-
# Return the current environment
|
|
207
|
-
#
|
|
208
|
-
# @return [String] the current environment
|
|
209
|
-
#
|
|
210
|
-
# @since 0.3.1
|
|
211
|
-
#
|
|
212
|
-
# @see Hanami::Environment#environment
|
|
213
|
-
#
|
|
214
|
-
# @example
|
|
215
|
-
# Hanami.env => "development"
|
|
216
52
|
def self.env
|
|
217
|
-
|
|
53
|
+
(ENV["HANAMI_ENV"] || "development").to_sym
|
|
218
54
|
end
|
|
219
55
|
|
|
220
|
-
# Check to see if specified environment(s) matches the current environment.
|
|
221
|
-
#
|
|
222
|
-
# If multiple names are given, it returns true, if at least one of them
|
|
223
|
-
# matches the current environment.
|
|
224
|
-
#
|
|
225
|
-
# @return [TrueClass,FalseClass] the result of the check
|
|
226
|
-
#
|
|
227
|
-
# @since 0.3.1
|
|
228
|
-
#
|
|
229
|
-
# @see Hanami.env
|
|
230
|
-
#
|
|
231
|
-
# @example Single name
|
|
232
|
-
# puts ENV['HANAMI_ENV'] # => "development"
|
|
233
|
-
#
|
|
234
|
-
# Hanami.env?(:development) # => true
|
|
235
|
-
# Hanami.env?('development') # => true
|
|
236
|
-
#
|
|
237
|
-
# Hanami.env?(:production) # => false
|
|
238
|
-
#
|
|
239
|
-
# @example Multiple names
|
|
240
|
-
# puts ENV['HANAMI_ENV'] # => "development"
|
|
241
|
-
#
|
|
242
|
-
# Hanami.env?(:development, :test) # => true
|
|
243
|
-
# Hanami.env?(:production, :staging) # => false
|
|
244
56
|
def self.env?(*names)
|
|
245
|
-
|
|
57
|
+
names.map(&:to_sym).include?(env)
|
|
246
58
|
end
|
|
247
59
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
# @return [Hanami::Environment] environment
|
|
251
|
-
#
|
|
252
|
-
# @api private
|
|
253
|
-
# @since 0.3.2
|
|
254
|
-
def self.environment
|
|
255
|
-
Components.resolved('environment') do
|
|
256
|
-
Environment.new
|
|
257
|
-
end
|
|
60
|
+
def self.logger
|
|
61
|
+
Container[:logger]
|
|
258
62
|
end
|
|
259
63
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
environment
|
|
270
|
-
Components.resolve('code_reloading')
|
|
271
|
-
Components['code_reloading']
|
|
64
|
+
def self.boot
|
|
65
|
+
@_mutex.synchronize do
|
|
66
|
+
raise "Hanami application already booted" if defined?(@_booted)
|
|
67
|
+
|
|
68
|
+
@_booted = true
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
Container.finalize!
|
|
72
|
+
self.app = application.new
|
|
272
73
|
end
|
|
273
74
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
# @return [Hanami::Logger] the logger
|
|
277
|
-
#
|
|
278
|
-
# @since 1.0.0
|
|
279
|
-
def self.logger
|
|
280
|
-
Components['logger']
|
|
75
|
+
def self.bundler_groups
|
|
76
|
+
[:plugins]
|
|
281
77
|
end
|
|
282
78
|
end
|