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
@@ -1,421 +0,0 @@
1
- require "hanami/utils/file_list"
2
- require "securerandom"
3
-
4
- module Hanami
5
- # Hanami CLI
6
- #
7
- # @since 1.1.0
8
- class CLI
9
- module Commands
10
- # @since 1.1.0
11
- # @api private
12
- module Project # rubocop:disable Metrics/ModuleLength
13
- # @since 1.1.0
14
- # @api private
15
- def self.readme(*)
16
- root.join("README.md")
17
- end
18
-
19
- # @since 1.1.0
20
- # @api private
21
- def self.gemfile(*)
22
- root.join("Gemfile")
23
- end
24
-
25
- # @since 1.1.0
26
- # @api private
27
- def self.rakefile(*)
28
- root.join("Rakefile")
29
- end
30
-
31
- # @since 1.1.0
32
- # @api private
33
- def self.hanamirc(*)
34
- root.join(".hanamirc")
35
- end
36
-
37
- # @since 1.1.0
38
- # @api private
39
- def self.gitignore(*)
40
- root.join(".gitignore")
41
- end
42
-
43
- # @since 1.1.0
44
- # @api private
45
- def self.config_ru(*)
46
- root.join("config.ru")
47
- end
48
-
49
- # @since 1.1.0
50
- # @api private
51
- def self.environment(*)
52
- root.join("config", "environment.rb")
53
- end
54
-
55
- # @since 1.1.0
56
- # @api private
57
- def self.boot(*)
58
- root.join("config", "boot.rb")
59
- end
60
-
61
- # @since 1.1.0
62
- # @api private
63
- def self.initializers(*)
64
- root.join("config", "initializers")
65
- end
66
-
67
- # @since 1.1.0
68
- # @api private
69
- def self.env(*, environment)
70
- root.join(".env.#{environment}")
71
- end
72
-
73
- # @since 1.1.0
74
- # @api private
75
- def self.db(*)
76
- root.join("db")
77
- end
78
-
79
- # @since 1.1.0
80
- # @api private
81
- def self.db_schema(*)
82
- root.join("db", "schema.sql")
83
- end
84
-
85
- # @since 1.1.0
86
- # @api private
87
- def self.migrations(*)
88
- root.join("db", "migrations")
89
- end
90
-
91
- # @since 1.1.0
92
- # @api private
93
- def self.migration(context)
94
- filename = MIGRATION_FILENAME_PATTERN % { timestamp: migration_timestamp, name: context.migration }
95
-
96
- root.join("db", "migrations", "#{filename}.rb")
97
- end
98
-
99
- # @since 1.1.0
100
- # @api private
101
- def self.migration_timestamp
102
- Time.now.utc.strftime(MIGRATION_TIMESTAMP_FORMAT)
103
- end
104
-
105
- # @since 1.1.0
106
- # @api private
107
- def self.find_migration(context)
108
- list(root.join("db", "migrations", "*_#{context.migration}.rb")).first
109
- end
110
-
111
- # @since 1.1.0
112
- # @api private
113
- def self.project(context)
114
- root.join("lib", "#{context.options.fetch(:project)}.rb")
115
- end
116
-
117
- # @since 1.1.0
118
- # @api private
119
- def self.mailers(context)
120
- root.join("lib", context.options.fetch(:project), "mailers")
121
- end
122
-
123
- # @since 1.1.0
124
- # @api private
125
- def self.mailers_templates(context)
126
- root.join("lib", context.options.fetch(:project), "mailers", "templates")
127
- end
128
-
129
- # @since 1.1.0
130
- # @api private
131
- def self.mailer(context)
132
- root.join("lib", context.options.fetch(:project), "mailers", "#{context.mailer}.rb")
133
- end
134
-
135
- # @since 1.1.0
136
- # @api private
137
- def self.mailer_templates(context)
138
- list root.join("lib", context.options.fetch(:project), "mailers", "templates", "#{context.mailer}.*.*")
139
- end
140
-
141
- # @since 1.1.0
142
- # @api private
143
- def self.entities(context)
144
- root.join("lib", context.options.fetch(:project), "entities")
145
- end
146
-
147
- # @since 1.1.0
148
- # @api private
149
- def self.entity(context)
150
- root.join("lib", context.options.fetch(:project), "entities", "#{context.model}.rb")
151
- end
152
-
153
- # @since 1.1.0
154
- # @api private
155
- def self.repositories(context)
156
- root.join("lib", context.options.fetch(:project), "repositories")
157
- end
158
-
159
- # @since 1.1.0
160
- # @api private
161
- def self.repository(context)
162
- root.join("lib", context.options.fetch(:project), "repositories", "#{context.model}_repository.rb")
163
- end
164
-
165
- # @since 1.1.0
166
- # @api private
167
- def self.public_directory(*)
168
- root.join("public")
169
- end
170
-
171
- # @since 1.1.0
172
- # @api private
173
- def self.assets_manifest(*)
174
- root.join("public", "assets.json")
175
- end
176
-
177
- # @since 1.1.0
178
- # @api private
179
- def self.public_app_assets(context)
180
- # FIXME: extract this URL to path conversion into Hanami::Utils
181
- assets_directory = context.base_url.sub(/\A\//, "").split("/")
182
- root.join("public", "assets", *assets_directory)
183
- end
184
-
185
- # @since 1.1.0
186
- # @api private
187
- def self.mailer_template(context, format)
188
- root.join("lib", context.options.fetch(:project), "mailers", "templates", "#{context.mailer}.#{format}.#{context.options.fetch(:template)}")
189
- end
190
-
191
- # @since 1.1.0
192
- # @api private
193
- def self.app_application(context)
194
- root.join("apps", context.app, "application.rb")
195
- end
196
-
197
- # @since 1.1.0
198
- # @api private
199
- def self.app_sessions_secret
200
- SecureRandom.hex(32)
201
- end
202
-
203
- # @since 1.1.0
204
- # @api private
205
- def self.app_routes(context)
206
- root.join("apps", context.app, "config", "routes.rb")
207
- end
208
-
209
- # @since 1.1.0
210
- # @api private
211
- def self.app_layout(context)
212
- root.join("apps", context.app, "views", "application_layout.rb")
213
- end
214
-
215
- # @since 1.1.0
216
- # @api private
217
- def self.app_template(context)
218
- root.join("apps", context.app, "templates", "application.html.#{context.template}")
219
- end
220
-
221
- # @since 1.1.0
222
- # @api private
223
- def self.app_favicon(context)
224
- root.join("apps", context.app, "assets", "favicon.ico")
225
- end
226
-
227
- # @since 1.1.0
228
- # @api private
229
- def self.controllers(context)
230
- root.join("apps", context.app, "controllers")
231
- end
232
-
233
- # @since 1.1.0
234
- # @api private
235
- def self.images(context)
236
- root.join("apps", context.app, "assets", "images")
237
- end
238
-
239
- # @since 1.1.0
240
- # @api private
241
- def self.javascripts(context)
242
- root.join("apps", context.app, "assets", "javascripts")
243
- end
244
-
245
- # @since 1.1.0
246
- # @api private
247
- def self.stylesheets(context)
248
- root.join("apps", context.app, "assets", "stylesheets")
249
- end
250
-
251
- # @since 1.1.0
252
- # @api private
253
- def self.action(context)
254
- root.join("apps", context.app, "controllers", context.controller, "#{context.action}.rb")
255
- end
256
-
257
- # @since 1.1.0
258
- # @api private
259
- def self.view(context)
260
- root.join("apps", context.app, "views", context.controller, "#{context.action}.rb")
261
- end
262
-
263
- # @since 1.1.0
264
- # @api private
265
- def self.template(context)
266
- root.join("apps", context.app, "templates", context.controller, "#{context.action}.html.#{context.options.fetch(:template)}")
267
- end
268
-
269
- # @since 1.1.0
270
- # @api private
271
- def self.templates(context)
272
- list root.join("apps", context.app, "templates", context.controller, "#{context.action}.*.*")
273
- end
274
-
275
- # @since 1.1.0
276
- # @api private
277
- def self.entities_spec(context)
278
- root.join("spec", context.options.fetch(:project), "entities")
279
- end
280
-
281
- # @since 1.1.0
282
- # @api private
283
- def self.entity_spec(context)
284
- root.join("spec", context.options.fetch(:project), "entities", "#{context.model}_spec.rb")
285
- end
286
-
287
- # @since 1.1.0
288
- # @api private
289
- def self.repositories_spec(context)
290
- root.join("spec", context.options.fetch(:project), "repositories")
291
- end
292
-
293
- # @since 1.1.0
294
- # @api private
295
- def self.repository_spec(context)
296
- root.join("spec", context.options.fetch(:project), "repositories", "#{context.model}_repository_spec.rb")
297
- end
298
-
299
- # @since 1.1.0
300
- # @api private
301
- def self.mailers_spec(context)
302
- root.join("spec", context.options.fetch(:project), "mailers")
303
- end
304
-
305
- # @since 1.1.0
306
- # @api private
307
- def self.mailer_spec(context)
308
- root.join("spec", context.options.fetch(:project), "mailers", "#{context.mailer}_spec.rb")
309
- end
310
-
311
- # @since 1.1.0
312
- # @api private
313
- def self.app_spec(context)
314
- root.join("spec", context.app)
315
- end
316
-
317
- def self.app_layout_spec(context)
318
- root.join("spec", context.app, "views", "application_layout_spec.rb")
319
- end
320
-
321
- # @since 1.1.0
322
- # @api private
323
- def self.controllers_spec(context)
324
- root.join("spec", context.app, "controllers")
325
- end
326
-
327
- # @since 1.1.0
328
- # @api private
329
- def self.action_spec(context)
330
- root.join("spec", context.app, "controllers", context.controller, "#{context.action}_spec.rb")
331
- end
332
-
333
- # @since 1.1.0
334
- # @api private
335
- def self.view_spec(context)
336
- root.join("spec", context.app, "views", context.controller, "#{context.action}_spec.rb")
337
- end
338
-
339
- # @since 1.1.0
340
- # @api private
341
- def self.features_spec(context)
342
- root.join("spec", context.app, "features")
343
- end
344
-
345
- # @since 1.1.0
346
- # @api private
347
- def self.dotrspec(*)
348
- root.join(".rspec")
349
- end
350
-
351
- # @since 1.1.0
352
- # @api private
353
- def self.spec_helper(*)
354
- root.join("spec", "spec_helper.rb")
355
- end
356
-
357
- # @since 1.1.0
358
- # @api private
359
- def self.features_helper(*)
360
- root.join("spec", "features_helper.rb")
361
- end
362
-
363
- # @since 1.1.0
364
- # @api private
365
- def self.support_spec(*)
366
- root.join("spec", "support")
367
- end
368
-
369
- # @since 1.1.0
370
- # @api private
371
- def self.capybara(*)
372
- root.join("spec", "support", "capybara.rb")
373
- end
374
-
375
- # @since 1.1.0
376
- # @api private
377
- def self.app(context)
378
- root.join("apps", context.app)
379
- end
380
-
381
- # @since 1.1.0
382
- # @api private
383
- def self.app?(context)
384
- apps.include?(context.app)
385
- end
386
-
387
- # @since 1.1.0
388
- # @api private
389
- def self.apps
390
- Dir.glob(root.join("apps", "*")).map { |app| File.basename(app) }
391
- end
392
-
393
- # @since 1.1.0
394
- # @api private
395
- def self.keep(path)
396
- root.join(path, ".gitkeep")
397
- end
398
-
399
- # @since 1.1.0
400
- # @api private
401
- def self.list(pattern)
402
- Hanami::Utils::FileList[pattern]
403
- end
404
-
405
- # @since 1.1.0
406
- # @api private
407
- def self.root
408
- File
409
- end
410
-
411
- # @since 1.1.0
412
- # @api private
413
- MIGRATION_TIMESTAMP_FORMAT = "%Y%m%d%H%M%S".freeze
414
-
415
- # @since 1.1.0
416
- # @api private
417
- MIGRATION_FILENAME_PATTERN = "%{timestamp}_%{name}".freeze # rubocop:disable Style/FormatStringToken
418
- end
419
- end
420
- end
421
- end
@@ -1,21 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- # @since 1.1.0
5
- # @api private
6
- class Routes < Command
7
- requires "routes.inspector"
8
-
9
- desc "Prints routes"
10
-
11
- # @since 1.1.0
12
- # @api private
13
- def call(*)
14
- puts requirements['routes.inspector'].inspect
15
- end
16
- end
17
- end
18
-
19
- register "routes", Commands::Routes
20
- end
21
- end
@@ -1,31 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- # @since 1.1.0
5
- # @api private
6
- class Templates
7
- NAMESPACE = name.sub(Utils::String.demodulize(name), "").freeze
8
-
9
- # @since 1.1.0
10
- # @api private
11
- def initialize(klass)
12
- word = klass.name.sub(NAMESPACE, "").split("::").map(&:downcase)
13
- @root = Pathname.new(File.join(__dir__, *word))
14
- freeze
15
- end
16
-
17
- # @since 1.1.0
18
- # @api private
19
- def find(*names)
20
- @root.join(*names)
21
- end
22
-
23
- private
24
-
25
- # @since 1.1.0
26
- # @api private
27
- attr_reader :root
28
- end
29
- end
30
- end
31
- end
@@ -1,19 +0,0 @@
1
- module Hanami
2
- class CLI
3
- module Commands
4
- # @since 1.1.0
5
- # @api private
6
- class Version < Command
7
- desc "Print Hanami version"
8
-
9
- # @since 1.1.0
10
- # @api private
11
- def call(*)
12
- puts "v#{Hanami::VERSION}"
13
- end
14
- end
15
- end
16
-
17
- register "version", Commands::Version, aliases: ["v", "-v", "--version"]
18
- end
19
- end
@@ -1,109 +0,0 @@
1
- require 'rack/common_logger'
2
- require 'hanami/utils/hash'
3
-
4
- module Hanami
5
- # Rack logger for Hanami.app
6
- #
7
- # @since 1.0.0
8
- # @api private
9
- class CommonLogger < Rack::CommonLogger
10
- private
11
-
12
- # @since 1.0.0
13
- # @api private
14
- HTTP_VERSION = 'HTTP_VERSION'.freeze
15
-
16
- # @since 1.0.0
17
- # @api private
18
- REQUEST_METHOD = 'REQUEST_METHOD'.freeze
19
-
20
- # @since 1.0.0
21
- # @api private
22
- HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'.freeze
23
-
24
- # @since 1.0.0
25
- # @api private
26
- REMOTE_ADDR = 'REMOTE_ADDR'.freeze
27
-
28
- # @since 1.0.0
29
- # @api private
30
- SCRIPT_NAME = 'SCRIPT_NAME'.freeze
31
-
32
- # @since 1.0.0
33
- # @api private
34
- PATH_INFO = 'PATH_INFO'.freeze
35
-
36
- # @since 1.0.0
37
- # @api private
38
- RACK_ERRORS = 'rack.errors'.freeze
39
-
40
- # @since 1.1.0
41
- # @api private
42
- QUERY_HASH = 'rack.request.query_hash'.freeze
43
-
44
- # @since 1.1.0
45
- # @api private
46
- FORM_HASH = 'rack.request.form_hash'.freeze
47
-
48
- # @since 1.3.0
49
- # @api private
50
- ROUTER_PARAMS = 'router.params'.freeze
51
-
52
- # @since 1.0.0
53
- # @api private
54
- #
55
- # rubocop:disable Metrics/AbcSize
56
- # rubocop:disable Metrics/MethodLength
57
- def log(env, status, header, began_at)
58
- now = ElapsedTime.call
59
- length = extract_content_length(header)
60
-
61
- msg = Hash[
62
- http: env[HTTP_VERSION],
63
- verb: env[REQUEST_METHOD],
64
- status: status.to_s[0..3],
65
- ip: env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR],
66
- path: env[SCRIPT_NAME] + env[PATH_INFO].to_s,
67
- length: length,
68
- params: extract_params(env),
69
- elapsed: now - began_at
70
- ]
71
-
72
- logger = @logger || env[RACK_ERRORS]
73
- # Standard library logger doesn't support write but it supports << which actually
74
- # calls to write on the log device without formatting
75
- if logger.respond_to?(:write)
76
- logger.write(msg)
77
- else
78
- logger.info(msg)
79
- end
80
- end
81
- # rubocop:enable Metrics/MethodLength
82
- # rubocop:enable Metrics/AbcSize
83
-
84
- # @since 1.1.0
85
- # @api private
86
- def extract_params(env)
87
- result = env.fetch(QUERY_HASH, {})
88
- result.merge!(env.fetch(FORM_HASH, {}))
89
- result.merge!(Utils::Hash.deep_stringify(env.fetch(ROUTER_PARAMS, {})))
90
- result
91
- end
92
-
93
- # Wrapper which uses Rack's monotonic clock_time (used for began_at since Rack 2.1.0)
94
- #
95
- # @since 1.3.4
96
- # @api private
97
- class ElapsedTime
98
- @clock = if Gem::Version.new(Rack::RELEASE) >= Gem::Version.new('2.1.0')
99
- -> { Rack::Utils.clock_time }
100
- else
101
- -> { Time.now }
102
- end.freeze
103
-
104
- def self.call
105
- @clock.call
106
- end
107
- end
108
- end
109
- end
@@ -1,59 +0,0 @@
1
- module Hanami
2
- # @since 0.9.0
3
- # @api private
4
- module Components
5
- # @since 0.9.0
6
- # @api private
7
- module App
8
- # hanami-assets configuration for a single Hanami application in the project.
9
- #
10
- # @since 0.9.0
11
- # @api private
12
- class Assets
13
- # Configure hanami-assets for a single Hanami application in the project.
14
- #
15
- # @param app [Hanami::Configuration::App] a Hanami application
16
- #
17
- # @since 0.9.0
18
- # @api private
19
- #
20
- # rubocop:disable Metrics/AbcSize
21
- # rubocop:disable Metrics/MethodLength
22
- def self.resolve(app)
23
- config = app.configuration
24
- namespace = app.namespace
25
-
26
- unless namespace.const_defined?('Assets', false)
27
- assets = Hanami::Assets.duplicate(namespace) do
28
- root config.root
29
-
30
- scheme config.scheme
31
- host config.host
32
- port config.port
33
-
34
- public_directory Hanami.public_directory
35
- prefix Utils::PathPrefix.new('/assets').join(config.path_prefix)
36
-
37
- manifest Hanami.public_directory.join('assets.json')
38
- compile true
39
-
40
- config.assets.__apply(self)
41
- end
42
-
43
- assets.configure do
44
- cdn host != config.host
45
- end
46
-
47
- namespace.const_set('Assets', assets)
48
- end
49
-
50
- name = "#{app.app_name}.assets"
51
- Components.resolved(name, namespace.const_get('Assets').configuration)
52
- Components[name]
53
- end
54
- end
55
- # rubocop:enable Metrics/MethodLength
56
- # rubocop:enable Metrics/AbcSize
57
- end
58
- end
59
- end