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