hanami 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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