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