hanami 0.8.0 → 0.9.0

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/FEATURES.md +13 -0
  4. data/README.md +28 -1
  5. data/hanami.gemspec +20 -17
  6. data/lib/hanami.rb +106 -7
  7. data/lib/hanami/action/routing_helpers.rb +2 -2
  8. data/lib/hanami/app.rb +72 -0
  9. data/lib/hanami/application.rb +144 -183
  10. data/lib/hanami/application_configuration.rb +1541 -0
  11. data/lib/hanami/application_name.rb +2 -2
  12. data/lib/hanami/application_namespace.rb +12 -0
  13. data/lib/hanami/assets/asset.rb +3 -1
  14. data/lib/hanami/assets/static.rb +3 -9
  15. data/lib/hanami/cli.rb +10 -7
  16. data/lib/hanami/cli_sub_commands/assets.rb +1 -9
  17. data/lib/hanami/cli_sub_commands/generate.rb +16 -0
  18. data/lib/hanami/commands/apps.rb +4 -0
  19. data/lib/hanami/commands/assets/precompile.rb +6 -19
  20. data/lib/hanami/commands/command.rb +64 -0
  21. data/lib/hanami/commands/console.rb +37 -26
  22. data/lib/hanami/commands/db/apply.rb +4 -2
  23. data/lib/hanami/commands/db/console.rb +11 -27
  24. data/lib/hanami/commands/db/create.rb +4 -2
  25. data/lib/hanami/commands/db/drop.rb +4 -2
  26. data/lib/hanami/commands/db/migrate.rb +11 -5
  27. data/lib/hanami/commands/db/prepare.rb +4 -2
  28. data/lib/hanami/commands/db/version.rb +4 -2
  29. data/lib/hanami/commands/generate/abstract.rb +5 -7
  30. data/lib/hanami/commands/generate/action.rb +18 -6
  31. data/lib/hanami/commands/generate/app.rb +15 -2
  32. data/lib/hanami/commands/generate/migration.rb +3 -2
  33. data/lib/hanami/commands/generate/model.rb +4 -3
  34. data/lib/hanami/commands/generate/secret_token.rb +31 -0
  35. data/lib/hanami/commands/new/abstract.rb +14 -5
  36. data/lib/hanami/commands/new/container.rb +1 -0
  37. data/lib/hanami/commands/routes.rb +5 -22
  38. data/lib/hanami/commands/server.rb +14 -142
  39. data/lib/hanami/components.rb +107 -0
  40. data/lib/hanami/components/app/assets.rb +55 -0
  41. data/lib/hanami/components/app/controller.rb +69 -0
  42. data/lib/hanami/components/app/logger.rb +30 -0
  43. data/lib/hanami/components/app/routes.rb +51 -0
  44. data/lib/hanami/components/app/view.rb +40 -0
  45. data/lib/hanami/components/component.rb +166 -0
  46. data/lib/hanami/components/components.rb +366 -0
  47. data/lib/hanami/components/routes_inspector.rb +70 -0
  48. data/lib/hanami/config/load_paths.rb +7 -6
  49. data/lib/hanami/config/mapper.rb +1 -1
  50. data/lib/hanami/config/security.rb +0 -8
  51. data/lib/hanami/configuration.rb +27 -1697
  52. data/lib/hanami/env.rb +67 -0
  53. data/lib/hanami/environment.rb +31 -21
  54. data/lib/hanami/environment_application_configurations.rb +30 -0
  55. data/lib/hanami/frameworks.rb +1 -0
  56. data/lib/hanami/generators/app/application.rb.tt +2 -2
  57. data/lib/hanami/generators/application/app/Gemfile.tt +3 -1
  58. data/lib/hanami/generators/application/app/config/application.rb.tt +2 -2
  59. data/lib/hanami/generators/application/app/gitignore_with_sqlite.tt +3 -0
  60. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +4 -25
  61. data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +1 -1
  62. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +1 -1
  63. data/lib/hanami/generators/application/container/Gemfile.tt +3 -1
  64. data/lib/hanami/generators/application/container/capybara.rb.rspec.tt +1 -1
  65. data/lib/hanami/generators/application/container/config.ru.tt +1 -1
  66. data/lib/hanami/generators/application/container/config/environment.rb.tt +35 -1
  67. data/lib/hanami/generators/application/container/features_helper.rb.minitest.tt +1 -1
  68. data/lib/hanami/generators/application/container/gitignore_with_sqlite.tt +3 -0
  69. data/lib/hanami/generators/application/container/lib/project.rb.tt +1 -57
  70. data/lib/hanami/generators/application/container/spec_helper.rb.minitest.tt +1 -1
  71. data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +2 -3
  72. data/lib/hanami/generators/database_config.rb +8 -11
  73. data/lib/hanami/generators/model/entity.rb.tt +1 -2
  74. data/lib/hanami/generators/model/repository.rb.tt +1 -2
  75. data/lib/hanami/generators/template_engine.rb +8 -3
  76. data/lib/hanami/generators/test_framework.rb +4 -3
  77. data/lib/hanami/middleware.rb +41 -21
  78. data/lib/hanami/rake_helper.rb +6 -8
  79. data/lib/hanami/server.rb +43 -33
  80. data/lib/hanami/static.rb +2 -2
  81. data/lib/hanami/version.rb +35 -1
  82. data/lib/hanami/welcome.rb +4 -5
  83. metadata +68 -42
  84. data/lib/hanami/commands/db/abstract.rb +0 -19
  85. data/lib/hanami/config/configure.rb +0 -17
  86. data/lib/hanami/config/mapping.rb +0 -12
  87. data/lib/hanami/container.rb +0 -71
  88. data/lib/hanami/generators/application/container/gitignore_with_db.tt +0 -4
  89. data/lib/hanami/loader.rb +0 -257
  90. data/lib/hanami/repositories/car_repository.rb +0 -3
  91. data/lib/hanami/repositories/name_repository.rb +0 -3
@@ -1,17 +0,0 @@
1
- require 'hanami/config/mapper'
2
-
3
- module Hanami
4
- module Config
5
- # Define configuration of application of
6
- # a specific environment
7
- #
8
- # @since 0.2.0
9
- # @api private
10
- class Configure < Mapper
11
- private
12
- def error_message
13
- 'You must specify a block or a file for configuration definition'
14
- end
15
- end
16
- end
17
- end
@@ -1,12 +0,0 @@
1
- require 'hanami/config/mapper'
2
-
3
- module Hanami
4
- module Config
5
- class Mapping < Mapper
6
- private
7
- def error_message
8
- 'You must specify a block or a file for database mapping definitions.'
9
- end
10
- end
11
- end
12
- end
@@ -1,71 +0,0 @@
1
- require 'thread'
2
- require 'rack/builder'
3
- require 'hanami/router'
4
-
5
- module Hanami
6
- class Container
7
- class Mounting
8
- def self.load!(&blk)
9
- new.instance_exec(&blk)
10
- end
11
-
12
- def mount(app, options)
13
- app.configuration.path_prefix options.fetch(:at) if hanami_app?(app)
14
- end
15
-
16
- private
17
-
18
- def hanami_app?(app)
19
- app.ancestors.include? Hanami::Application
20
- end
21
-
22
- def method_missing(m, *args)
23
- end
24
- end
25
-
26
- LOCK = Mutex.new
27
-
28
- attr_reader :routes
29
-
30
- def self.configure(options = {}, &blk)
31
- LOCK.synchronize do
32
- @@options = options
33
- @@configuration = blk
34
-
35
- Mounting.load!(&blk)
36
- end
37
- end
38
-
39
- def initialize
40
- LOCK.synchronize do
41
- assert_configuration_presence!
42
- prepare_middleware_stack!
43
- end
44
- end
45
-
46
- def call(env)
47
- @builder.call(env)
48
- end
49
-
50
- private
51
-
52
- def assert_configuration_presence!
53
- unless self.class.class_variable_defined?(:@@configuration)
54
- raise ArgumentError.new("#{ self.class } doesn't have any application mounted.")
55
- end
56
- end
57
-
58
- def prepare_middleware_stack!
59
- @builder = ::Rack::Builder.new
60
- @routes = Router.new(&@@configuration)
61
-
62
- if middleware = Hanami.environment.static_assets_middleware
63
- @builder.use middleware
64
- end
65
-
66
- @builder.use Rack::MethodOverride
67
-
68
- @builder.run @routes
69
- end
70
- end
71
- end
@@ -1,4 +0,0 @@
1
- /db/<%= config[:project_name] %>_development
2
- /db/<%= config[:project_name] %>_test
3
- /public/assets*
4
- /tmp
data/lib/hanami/loader.rb DELETED
@@ -1,257 +0,0 @@
1
- require 'hanami/utils/class'
2
- require 'hanami/utils/kernel'
3
- require 'hanami/utils/string'
4
- require 'hanami/routes'
5
- require 'hanami/routing/default'
6
- require 'hanami/action/session'
7
- require 'hanami/config/security'
8
- require 'hanami/action/routing_helpers'
9
-
10
- module Hanami
11
- # Load an application
12
- #
13
- # @since 0.1.0
14
- # @api private
15
- class Loader
16
- LOCK = Mutex.new
17
-
18
- STRICT_TRANSPORT_SECURITY_HEADER = 'Strict-Transport-Security'.freeze
19
- STRICT_TRANSPORT_SECURITY_DEFAULT_VALUE = 'max-age=31536000'.freeze
20
-
21
- def initialize(application)
22
- @application = application
23
- @configuration = @application.configuration
24
- end
25
-
26
- def load!
27
- LOCK.synchronize do
28
- load_configuration!
29
- configure_frameworks!
30
- load_configuration_load_paths!
31
- load_rack!
32
- load_frameworks!
33
- load_initializers!
34
- end
35
- end
36
-
37
- private
38
- attr_reader :application, :configuration
39
-
40
- def load_configuration!
41
- configuration.load!(application_module)
42
- end
43
-
44
- def configure_frameworks!
45
- _configure_model_framework! if defined?(Hanami::Model)
46
- _configure_controller_framework!
47
- _configure_view_framework!
48
- _configure_assets_framework!
49
- _configure_logger!
50
- end
51
-
52
- def _configure_controller_framework!
53
- config = configuration
54
- unless namespace.const_defined?('Controller')
55
- controller = Hanami::Controller.duplicate(namespace) do
56
- handle_exceptions config.handle_exceptions
57
- default_request_format config.default_request_format
58
- default_response_format config.default_response_format
59
- default_headers({
60
- Hanami::Config::Security::X_FRAME_OPTIONS_HEADER => config.security.x_frame_options,
61
- Hanami::Config::Security::X_CONTENT_TYPE_OPTIONS_HEADER => config.security.x_content_type_options,
62
- Hanami::Config::Security::X_XSS_PROTECTION_HEADER => config.security.x_xss_protection,
63
- Hanami::Config::Security::CONTENT_SECURITY_POLICY_HEADER => config.security.content_security_policy,
64
- })
65
- default_headers.merge!(STRICT_TRANSPORT_SECURITY_HEADER => STRICT_TRANSPORT_SECURITY_DEFAULT_VALUE) if config.force_ssl
66
-
67
- if config.cookies.enabled?
68
- require 'hanami/action/cookies'
69
- prepare { include Hanami::Action::Cookies }
70
- cookies config.cookies.default_options
71
- end
72
-
73
- if config.sessions.enabled?
74
- prepare do
75
- include Hanami::Action::Session
76
- include Hanami::Action::CSRFProtection
77
- end
78
- end
79
-
80
- prepare { include Hanami::Action::RoutingHelpers }
81
-
82
- config.controller.__apply(self)
83
- end
84
-
85
- namespace.const_set('Controller', controller)
86
- end
87
- end
88
-
89
- def _configure_view_framework!
90
- config = configuration
91
- unless namespace.const_defined?('View')
92
- view = Hanami::View.duplicate(namespace) do
93
- root config.templates
94
- layout config.layout
95
-
96
- config.view.__apply(self)
97
- end
98
-
99
- namespace.const_set('View', view)
100
- end
101
- end
102
-
103
- def _configure_assets_framework!
104
- config = configuration
105
-
106
- unless application_module.const_defined?('Assets')
107
- assets = Hanami::Assets.duplicate(namespace) do
108
- root config.root
109
-
110
- scheme config.scheme
111
- host config.host
112
- port config.port
113
-
114
- public_directory Hanami.public_directory
115
- prefix Utils::PathPrefix.new('/assets').join(config.path_prefix)
116
-
117
- manifest Hanami.public_directory.join('assets.json')
118
- compile true
119
-
120
- config.assets.__apply(self)
121
- end
122
-
123
- assets.configure do
124
- cdn host != config.host
125
- end
126
-
127
- application_module.const_set('Assets', assets)
128
- end
129
- end
130
-
131
- def _configure_model_framework!
132
- config = configuration
133
- if _hanami_model_loaded? && !application_module.const_defined?('Model')
134
- model = Hanami::Model.duplicate(application_module) do
135
- adapter(config.adapter) if config.adapter
136
- mapping(&config.mapping) if config.mapping
137
-
138
- config.model.__apply(self)
139
- end
140
-
141
- application_module.const_set('Model', model)
142
- end
143
- end
144
-
145
- def _configure_logger!
146
- unless application_module.const_defined?('Logger', false)
147
- configuration.logger.app_name(application_module.to_s)
148
- application_module.const_set('Logger', configuration.logger.build)
149
- end
150
- end
151
-
152
- def load_frameworks!
153
- _load_view_framework!
154
- _load_assets_framework!
155
- _load_model_framework!
156
- end
157
-
158
- def _load_view_framework!
159
- namespace.module_eval %{
160
- #{ namespace }::View.load!
161
- }
162
- end
163
-
164
- def _load_assets_framework!
165
- application_module.module_eval %{
166
- #{ application_module }::Assets.load!
167
- }
168
- end
169
-
170
- def _load_model_framework!
171
- return unless _load_model_framework?
172
-
173
- application_module.module_eval %{
174
- #{ application_module }::Model.load!
175
- }
176
- end
177
-
178
- def _load_model_framework?
179
- if _hanami_model_loaded? && application_module.const_defined?('Model')
180
- model = application_module.const_get('Model')
181
- model.configuration.adapter
182
- end
183
- end
184
-
185
- def _hanami_model_loaded?
186
- defined?(Hanami::Model)
187
- end
188
-
189
- def _hanami_mailer_loaded?
190
- defined?(Hanami::Mailer)
191
- end
192
-
193
- def load_configuration_load_paths!
194
- configuration.load_paths.load!(configuration.root)
195
- end
196
-
197
- def load_rack!
198
- _assign_routes_to_application_module!
199
-
200
- return if application.is_a?(Class)
201
- _assign_rendering_policy!
202
- _assign_rack_routes!
203
- _load_rack_middleware!
204
- end
205
-
206
- def _assign_rendering_policy!
207
- application.renderer = RenderingPolicy.new(configuration)
208
- end
209
-
210
- def _assign_rack_routes!
211
- application.routes = application_routes
212
- end
213
-
214
- def _load_rack_middleware!
215
- configuration.middleware.load!(application, namespace)
216
- end
217
-
218
- def _assign_routes_to_application_module!
219
- unless application_module.const_defined?('Routes')
220
- routes = Hanami::Routes.new(application_routes)
221
- application_module.const_set('Routes', routes)
222
- end
223
- end
224
-
225
- def application_module
226
- @application_module ||= Utils::Class.load!(
227
- Utils::String.new(application.name).namespace
228
- )
229
- end
230
-
231
- def application_routes
232
- resolver = Hanami::Routing::EndpointResolver.new(pattern: configuration.controller_pattern, namespace: namespace)
233
- default_app = Hanami::Routing::Default.new
234
- Hanami::Router.new(
235
- parsers: configuration.body_parsers,
236
- resolver: resolver,
237
- default_app: default_app,
238
- scheme: configuration.scheme,
239
- host: configuration.host,
240
- port: configuration.port,
241
- prefix: configuration.path_prefix,
242
- force_ssl: configuration.force_ssl,
243
- &configuration.routes
244
- )
245
- end
246
-
247
- def namespace
248
- configuration.namespace || application_module
249
- end
250
-
251
- def load_initializers!
252
- Dir["#{configuration.root}/config/initializers/**/*.rb"].sort.each do |file|
253
- require file
254
- end
255
- end
256
- end
257
- end
@@ -1,3 +0,0 @@
1
- class CarRepository
2
- include Hanami::Repository
3
- end
@@ -1,3 +0,0 @@
1
- class NameRepository
2
- include Hanami::Repository
3
- end