hanami 1.3.5 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -41
  3. data/FEATURES.md +2 -12
  4. data/LICENSE.md +1 -1
  5. data/README.md +5 -8
  6. data/bin/hanami +6 -4
  7. data/hanami.gemspec +24 -28
  8. data/lib/hanami/application.rb +44 -176
  9. data/lib/hanami/boot.rb +6 -0
  10. data/lib/hanami/cli/commands/command.rb +21 -29
  11. data/lib/hanami/cli/commands/server.rb +63 -14
  12. data/lib/hanami/cli/commands.rb +5 -42
  13. data/lib/hanami/configuration/cookies.rb +24 -0
  14. data/lib/hanami/configuration/middleware.rb +8 -28
  15. data/lib/hanami/configuration/security.rb +141 -0
  16. data/lib/hanami/configuration/sessions.rb +50 -0
  17. data/lib/hanami/configuration.rb +181 -191
  18. data/lib/hanami/container.rb +107 -0
  19. data/lib/hanami/frameworks.rb +24 -18
  20. data/lib/hanami/routes.rb +17 -205
  21. data/lib/hanami/server.rb +5 -69
  22. data/lib/hanami/version.rb +3 -1
  23. data/lib/hanami.rb +39 -243
  24. metadata +36 -233
  25. data/lib/hanami/action/csrf_protection.rb +0 -211
  26. data/lib/hanami/action/routing_helpers.rb +0 -40
  27. data/lib/hanami/app.rb +0 -96
  28. data/lib/hanami/application_configuration.rb +0 -1495
  29. data/lib/hanami/application_name.rb +0 -108
  30. data/lib/hanami/application_namespace.rb +0 -14
  31. data/lib/hanami/assets/asset.rb +0 -72
  32. data/lib/hanami/assets/static.rb +0 -102
  33. data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
  34. data/lib/hanami/cli/commands/assets.rb +0 -16
  35. data/lib/hanami/cli/commands/console.rb +0 -95
  36. data/lib/hanami/cli/commands/db/apply.rb +0 -32
  37. data/lib/hanami/cli/commands/db/console.rb +0 -44
  38. data/lib/hanami/cli/commands/db/create.rb +0 -32
  39. data/lib/hanami/cli/commands/db/drop.rb +0 -32
  40. data/lib/hanami/cli/commands/db/migrate.rb +0 -39
  41. data/lib/hanami/cli/commands/db/prepare.rb +0 -32
  42. data/lib/hanami/cli/commands/db/rollback.rb +0 -59
  43. data/lib/hanami/cli/commands/db/version.rb +0 -32
  44. data/lib/hanami/cli/commands/db.rb +0 -32
  45. data/lib/hanami/cli/commands/destroy/action.rb +0 -137
  46. data/lib/hanami/cli/commands/destroy/app.rb +0 -159
  47. data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
  48. data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
  49. data/lib/hanami/cli/commands/destroy/model.rb +0 -84
  50. data/lib/hanami/cli/commands/destroy.rb +0 -26
  51. data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
  52. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
  53. data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
  54. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
  55. data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
  56. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
  57. data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
  58. data/lib/hanami/cli/commands/generate/action.rb +0 -321
  59. data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
  60. data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
  61. data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
  62. data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
  63. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
  64. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
  65. data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
  66. data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
  67. data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
  68. data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
  69. data/lib/hanami/cli/commands/generate/app.rb +0 -243
  70. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
  71. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
  72. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
  73. data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
  74. data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
  75. data/lib/hanami/cli/commands/generate/migration.rb +0 -41
  76. data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
  77. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
  78. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
  79. data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
  80. data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
  81. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
  82. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
  83. data/lib/hanami/cli/commands/generate/model.rb +0 -125
  84. data/lib/hanami/cli/commands/generate/secret.rb +0 -48
  85. data/lib/hanami/cli/commands/generate.rb +0 -28
  86. data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
  87. data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
  88. data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
  89. data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
  90. data/lib/hanami/cli/commands/new/README.md.erb +0 -33
  91. data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
  92. data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
  93. data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
  94. data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
  95. data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
  96. data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
  97. data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
  98. data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
  99. data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
  100. data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
  101. data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
  102. data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
  103. data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
  104. data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
  105. data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
  106. data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
  107. data/lib/hanami/cli/commands/new.rb +0 -578
  108. data/lib/hanami/cli/commands/project.rb +0 -421
  109. data/lib/hanami/cli/commands/routes.rb +0 -21
  110. data/lib/hanami/cli/commands/templates.rb +0 -31
  111. data/lib/hanami/cli/commands/version.rb +0 -19
  112. data/lib/hanami/common_logger.rb +0 -109
  113. data/lib/hanami/components/app/assets.rb +0 -59
  114. data/lib/hanami/components/app/controller.rb +0 -74
  115. data/lib/hanami/components/app/routes.rb +0 -59
  116. data/lib/hanami/components/app/view.rb +0 -44
  117. data/lib/hanami/components/component.rb +0 -182
  118. data/lib/hanami/components/components.rb +0 -479
  119. data/lib/hanami/components/routes_inspector.rb +0 -72
  120. data/lib/hanami/components.rb +0 -156
  121. data/lib/hanami/config/cookies.rb +0 -69
  122. data/lib/hanami/config/framework_configuration.rb +0 -43
  123. data/lib/hanami/config/load_paths.rb +0 -46
  124. data/lib/hanami/config/mapper.rb +0 -47
  125. data/lib/hanami/config/routes.rb +0 -20
  126. data/lib/hanami/config/security.rb +0 -110
  127. data/lib/hanami/config/sessions.rb +0 -119
  128. data/lib/hanami/configuration/app.rb +0 -21
  129. data/lib/hanami/early_hints.rb +0 -129
  130. data/lib/hanami/env.rb +0 -69
  131. data/lib/hanami/environment.rb +0 -541
  132. data/lib/hanami/environment_application_configurations.rb +0 -37
  133. data/lib/hanami/hanamirc.rb +0 -169
  134. data/lib/hanami/mailer/glue.rb +0 -27
  135. data/lib/hanami/middleware_stack.rb +0 -172
  136. data/lib/hanami/rake_helper.rb +0 -78
  137. data/lib/hanami/rake_tasks.rb +0 -3
  138. data/lib/hanami/rendering_policy.rb +0 -94
  139. data/lib/hanami/routing/default.rb +0 -32
  140. data/lib/hanami/setup.rb +0 -3
  141. data/lib/hanami/static.rb +0 -63
  142. data/lib/hanami/templates/default.html.erb +0 -30
  143. data/lib/hanami/templates/welcome.html.erb +0 -52
  144. data/lib/hanami/views/default.rb +0 -37
  145. data/lib/hanami/views/default_template_finder.rb +0 -22
  146. data/lib/hanami/views/null_view.rb +0 -15
  147. data/lib/hanami/welcome.rb +0 -41
data/lib/hanami/routes.rb CHANGED
@@ -1,219 +1,31 @@
1
- require 'hanami/utils/escape'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Hanami
4
- # Routes factory
4
+ # Hanami application routes
5
5
  #
6
- # A Hanami application has this factory instantiated by default and associated
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
- # Initialize the factory
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
- # Return a relative path for the given route name
25
- #
26
- # @param name [Symbol] the route name
27
- # @param args [Array,nil] an optional set of arguments that is passed down
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
- # Return an absolute path for the given route name
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
- # Recognize a route from a Rack env.
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
- protected
206
-
207
- # @since 0.3.0
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
- require 'rack'
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Hanami
2
4
  # Hanami version
3
5
  #
@@ -6,7 +8,7 @@ module Hanami
6
8
  module Version
7
9
  # @since 0.9.0
8
10
  # @api private
9
- VERSION = '1.3.5'.freeze
11
+ VERSION = "2.0.0.alpha1"
10
12
 
11
13
  # @since 0.9.0
12
14
  # @api private
data/lib/hanami.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'thread'
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 'hanami/version'
10
- require 'hanami/frameworks'
11
- require 'hanami/environment'
12
- require 'hanami/app'
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
- # Configure Hanami project
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
- @_configuration = Hanami::Configuration.new(&blk)
63
- end
64
- end
18
+ raise "Hanami application not configured" unless defined?(@_application)
65
19
 
66
- # Hanami configuration
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
- # Configure a plugin
82
- #
83
- # @see Hanami.configure
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
- # Boot your Hanami project
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
- boot
152
- App.new(configuration, environment)
33
+ @_mutex.synchronize do
34
+ raise "Hanami.app not configured" unless defined?(@_app)
35
+
36
+ @_app
37
+ end
153
38
  end
154
39
 
155
- # Check if an application is allowed to load.
156
- #
157
- # The list of applications to be loaded can be set via the `HANAMI_APPS`
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
- allowed_apps = ENV['HANAMI_APPS'].to_s.split(',')
179
- allowed_apps.include?(app.to_s.downcase)
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
- environment.root
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
- environment.environment
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
- environment.environment?(*names)
57
+ names.map(&:to_sym).include?(env)
246
58
  end
247
59
 
248
- # Current environment
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
- # Check if code reloading is enabled.
261
- #
262
- # @return [TrueClass,FalseClass] the result of the check
263
- #
264
- # @since 1.0.0
265
- # @api private
266
- #
267
- # @see https://guides.hanamirb.org/projects/code-reloading
268
- def self.code_reloading?
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
- # Project logger
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