hanami 2.3.2 → 3.0.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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +103 -19
  3. data/LICENSE +20 -0
  4. data/README.md +18 -35
  5. data/hanami.gemspec +36 -37
  6. data/lib/hanami/app.rb +12 -2
  7. data/lib/hanami/config/db.rb +2 -0
  8. data/lib/hanami/config/i18n.rb +138 -0
  9. data/lib/hanami/config/logger.rb +15 -7
  10. data/lib/hanami/config/null_config.rb +1 -1
  11. data/lib/hanami/config/views.rb +17 -0
  12. data/lib/hanami/config.rb +66 -22
  13. data/lib/hanami/errors.rb +6 -0
  14. data/lib/hanami/extensions/action/i18n_helper.rb +64 -0
  15. data/lib/hanami/extensions/action/name_inferrer.rb +34 -0
  16. data/lib/hanami/extensions/action/slice_configured_action.rb +31 -2
  17. data/lib/hanami/extensions/action.rb +20 -7
  18. data/lib/hanami/extensions/mailer/slice_configured_mailer.rb +134 -0
  19. data/lib/hanami/extensions/mailer.rb +28 -0
  20. data/lib/hanami/extensions/operation/slice_configured_db_operation.rb +2 -0
  21. data/lib/hanami/extensions/view/context.rb +26 -4
  22. data/lib/hanami/extensions/view/part.rb +2 -0
  23. data/lib/hanami/extensions/view/slice_configured_context.rb +7 -0
  24. data/lib/hanami/extensions/view/slice_configured_part.rb +2 -0
  25. data/lib/hanami/extensions/view/slice_configured_view.rb +8 -8
  26. data/lib/hanami/extensions/view/standard_helpers.rb +4 -0
  27. data/lib/hanami/extensions.rb +6 -1
  28. data/lib/hanami/helpers/assets_helper.rb +0 -4
  29. data/lib/hanami/helpers/form_helper.rb +1 -1
  30. data/lib/hanami/helpers/i18n_helper.rb +241 -0
  31. data/lib/hanami/logger/rack_formatter.rb +73 -0
  32. data/lib/hanami/logger/sql_formatter.rb +80 -0
  33. data/lib/hanami/logger/sql_logger.rb +48 -0
  34. data/lib/hanami/middleware/render_errors.rb +2 -2
  35. data/lib/hanami/providers/db.rb +7 -2
  36. data/lib/hanami/providers/db_logging.rb +4 -7
  37. data/lib/hanami/providers/i18n/backend.rb +373 -0
  38. data/lib/hanami/providers/i18n/locale/en.yml +57 -0
  39. data/lib/hanami/providers/i18n.rb +114 -0
  40. data/lib/hanami/providers/logger.rb +23 -1
  41. data/lib/hanami/providers/mailers.rb +101 -0
  42. data/lib/hanami/routes.rb +1 -0
  43. data/lib/hanami/settings/composite_store.rb +53 -0
  44. data/lib/hanami/settings.rb +4 -4
  45. data/lib/hanami/slice/router.rb +15 -10
  46. data/lib/hanami/slice.rb +102 -11
  47. data/lib/hanami/slice_configurable.rb +1 -3
  48. data/lib/hanami/slice_registrar.rb +2 -2
  49. data/lib/hanami/universal_logger.rb +250 -0
  50. data/lib/hanami/version.rb +1 -1
  51. data/lib/hanami/web/rack_logger.rb +2 -80
  52. data/lib/hanami/web/welcome.html.erb +443 -58
  53. data/lib/hanami.rb +4 -2
  54. metadata +34 -280
  55. data/CODE_OF_CONDUCT.md +0 -74
  56. data/FEATURES.md +0 -269
  57. data/LICENSE.md +0 -22
  58. data/spec/integration/action/cookies_spec.rb +0 -58
  59. data/spec/integration/action/csrf_protection_spec.rb +0 -54
  60. data/spec/integration/action/format_config_spec.rb +0 -129
  61. data/spec/integration/action/routes_spec.rb +0 -71
  62. data/spec/integration/action/sessions_spec.rb +0 -50
  63. data/spec/integration/action/slice_configuration_spec.rb +0 -284
  64. data/spec/integration/action/view_rendering/automatic_rendering_spec.rb +0 -247
  65. data/spec/integration/action/view_rendering/paired_view_inference_spec.rb +0 -115
  66. data/spec/integration/action/view_rendering/view_context_spec.rb +0 -221
  67. data/spec/integration/action/view_rendering_spec.rb +0 -89
  68. data/spec/integration/assets/assets_spec.rb +0 -155
  69. data/spec/integration/assets/cross_slice_assets_helpers_spec.rb +0 -129
  70. data/spec/integration/assets/serve_static_assets_spec.rb +0 -152
  71. data/spec/integration/code_loading/loading_from_app_spec.rb +0 -152
  72. data/spec/integration/code_loading/loading_from_lib_spec.rb +0 -242
  73. data/spec/integration/code_loading/loading_from_slice_spec.rb +0 -165
  74. data/spec/integration/container/application_routes_helper_spec.rb +0 -48
  75. data/spec/integration/container/auto_injection_spec.rb +0 -53
  76. data/spec/integration/container/auto_registration_spec.rb +0 -86
  77. data/spec/integration/container/autoloader_spec.rb +0 -82
  78. data/spec/integration/container/imports_spec.rb +0 -253
  79. data/spec/integration/container/prepare_container_spec.rb +0 -125
  80. data/spec/integration/container/provider_environment_spec.rb +0 -52
  81. data/spec/integration/container/provider_lifecycle_spec.rb +0 -61
  82. data/spec/integration/container/shutdown_spec.rb +0 -91
  83. data/spec/integration/container/standard_providers/rack_provider_spec.rb +0 -44
  84. data/spec/integration/container/standard_providers_spec.rb +0 -124
  85. data/spec/integration/db/auto_registration_spec.rb +0 -39
  86. data/spec/integration/db/commands_spec.rb +0 -80
  87. data/spec/integration/db/db_inflector_spec.rb +0 -57
  88. data/spec/integration/db/db_slices_spec.rb +0 -398
  89. data/spec/integration/db/db_spec.rb +0 -245
  90. data/spec/integration/db/gateways_spec.rb +0 -361
  91. data/spec/integration/db/logging_spec.rb +0 -301
  92. data/spec/integration/db/mappers_spec.rb +0 -84
  93. data/spec/integration/db/provider_config_spec.rb +0 -88
  94. data/spec/integration/db/provider_spec.rb +0 -35
  95. data/spec/integration/db/relations_spec.rb +0 -60
  96. data/spec/integration/db/repo_spec.rb +0 -300
  97. data/spec/integration/db/slices_importing_from_parent.rb +0 -130
  98. data/spec/integration/dotenv_loading_spec.rb +0 -138
  99. data/spec/integration/logging/exception_logging_spec.rb +0 -120
  100. data/spec/integration/logging/notifications_spec.rb +0 -68
  101. data/spec/integration/logging/request_logging_spec.rb +0 -202
  102. data/spec/integration/operations/extension_spec.rb +0 -122
  103. data/spec/integration/rack_app/body_parser_spec.rb +0 -108
  104. data/spec/integration/rack_app/method_override_spec.rb +0 -97
  105. data/spec/integration/rack_app/middleware_spec.rb +0 -720
  106. data/spec/integration/rack_app/non_booted_rack_app_spec.rb +0 -104
  107. data/spec/integration/rack_app/rack_app_spec.rb +0 -442
  108. data/spec/integration/rake_tasks_spec.rb +0 -107
  109. data/spec/integration/router/resource_routes_spec.rb +0 -281
  110. data/spec/integration/settings/access_in_slice_class_body_spec.rb +0 -83
  111. data/spec/integration/settings/access_to_constants_spec.rb +0 -46
  112. data/spec/integration/settings/loading_from_env_spec.rb +0 -188
  113. data/spec/integration/settings/settings_component_loading_spec.rb +0 -113
  114. data/spec/integration/settings/slice_registration_spec.rb +0 -145
  115. data/spec/integration/settings/using_types_spec.rb +0 -80
  116. data/spec/integration/setup_spec.rb +0 -165
  117. data/spec/integration/slices/external_slice_spec.rb +0 -91
  118. data/spec/integration/slices/slice_configuration_spec.rb +0 -42
  119. data/spec/integration/slices/slice_loading_spec.rb +0 -171
  120. data/spec/integration/slices/slice_registrations_spec.rb +0 -80
  121. data/spec/integration/slices/slice_routing_spec.rb +0 -219
  122. data/spec/integration/slices_spec.rb +0 -471
  123. data/spec/integration/view/config/default_context_spec.rb +0 -149
  124. data/spec/integration/view/config/inflector_spec.rb +0 -57
  125. data/spec/integration/view/config/part_class_spec.rb +0 -147
  126. data/spec/integration/view/config/part_namespace_spec.rb +0 -103
  127. data/spec/integration/view/config/paths_spec.rb +0 -119
  128. data/spec/integration/view/config/scope_class_spec.rb +0 -147
  129. data/spec/integration/view/config/scope_namespace_spec.rb +0 -103
  130. data/spec/integration/view/config/template_spec.rb +0 -38
  131. data/spec/integration/view/context/assets_spec.rb +0 -79
  132. data/spec/integration/view/context/inflector_spec.rb +0 -40
  133. data/spec/integration/view/context/request_spec.rb +0 -57
  134. data/spec/integration/view/context/routes_spec.rb +0 -84
  135. data/spec/integration/view/helpers/form_helper_spec.rb +0 -174
  136. data/spec/integration/view/helpers/part_helpers_spec.rb +0 -124
  137. data/spec/integration/view/helpers/scope_helpers_spec.rb +0 -84
  138. data/spec/integration/view/helpers/user_defined_helpers/part_helpers_spec.rb +0 -162
  139. data/spec/integration/view/helpers/user_defined_helpers/scope_helpers_spec.rb +0 -119
  140. data/spec/integration/view/parts/default_rendering_spec.rb +0 -138
  141. data/spec/integration/view/slice_configuration_spec.rb +0 -289
  142. data/spec/integration/view/views_spec.rb +0 -103
  143. data/spec/integration/web/content_security_policy_nonce_spec.rb +0 -251
  144. data/spec/integration/web/render_detailed_errors_spec.rb +0 -107
  145. data/spec/integration/web/render_errors_spec.rb +0 -242
  146. data/spec/integration/web/welcome_view_spec.rb +0 -84
  147. data/spec/spec_helper.rb +0 -28
  148. data/spec/support/app_integration.rb +0 -157
  149. data/spec/support/coverage.rb +0 -1
  150. data/spec/support/matchers.rb +0 -32
  151. data/spec/support/rspec.rb +0 -27
  152. data/spec/unit/hanami/config/actions/content_security_policy_spec.rb +0 -96
  153. data/spec/unit/hanami/config/actions/cookies_spec.rb +0 -46
  154. data/spec/unit/hanami/config/actions/csrf_protection_spec.rb +0 -58
  155. data/spec/unit/hanami/config/actions/default_values_spec.rb +0 -43
  156. data/spec/unit/hanami/config/actions/sessions_spec.rb +0 -48
  157. data/spec/unit/hanami/config/actions_spec.rb +0 -52
  158. data/spec/unit/hanami/config/base_url_spec.rb +0 -25
  159. data/spec/unit/hanami/config/console_spec.rb +0 -22
  160. data/spec/unit/hanami/config/db_spec.rb +0 -38
  161. data/spec/unit/hanami/config/inflector_spec.rb +0 -35
  162. data/spec/unit/hanami/config/logger_spec.rb +0 -195
  163. data/spec/unit/hanami/config/render_detailed_errors_spec.rb +0 -25
  164. data/spec/unit/hanami/config/render_errors_spec.rb +0 -25
  165. data/spec/unit/hanami/config/router_spec.rb +0 -44
  166. data/spec/unit/hanami/config/slices_spec.rb +0 -34
  167. data/spec/unit/hanami/config/views_spec.rb +0 -80
  168. data/spec/unit/hanami/env_spec.rb +0 -37
  169. data/spec/unit/hanami/extensions/view/context_spec.rb +0 -59
  170. data/spec/unit/hanami/helpers/assets_helper/asset_url_spec.rb +0 -120
  171. data/spec/unit/hanami/helpers/assets_helper/audio_tag_spec.rb +0 -132
  172. data/spec/unit/hanami/helpers/assets_helper/favicon_tag_spec.rb +0 -87
  173. data/spec/unit/hanami/helpers/assets_helper/image_tag_spec.rb +0 -92
  174. data/spec/unit/hanami/helpers/assets_helper/javascript_tag_spec.rb +0 -143
  175. data/spec/unit/hanami/helpers/assets_helper/stylesheet_tag_spec.rb +0 -126
  176. data/spec/unit/hanami/helpers/assets_helper/video_tag_spec.rb +0 -136
  177. data/spec/unit/hanami/helpers/form_helper_spec.rb +0 -2857
  178. data/spec/unit/hanami/port_spec.rb +0 -117
  179. data/spec/unit/hanami/providers/db/config/default_config_spec.rb +0 -100
  180. data/spec/unit/hanami/providers/db/config/gateway_spec.rb +0 -73
  181. data/spec/unit/hanami/providers/db/config_spec.rb +0 -143
  182. data/spec/unit/hanami/router/errors/not_allowed_error_spec.rb +0 -27
  183. data/spec/unit/hanami/router/errors/not_found_error_spec.rb +0 -22
  184. data/spec/unit/hanami/settings/env_store_spec.rb +0 -52
  185. data/spec/unit/hanami/settings_spec.rb +0 -111
  186. data/spec/unit/hanami/slice_configurable_spec.rb +0 -141
  187. data/spec/unit/hanami/slice_name_spec.rb +0 -47
  188. data/spec/unit/hanami/slice_spec.rb +0 -99
  189. data/spec/unit/hanami/web/rack_logger_spec.rb +0 -99
@@ -0,0 +1,250 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Hanami
6
+ # An adapter that optionally wraps the logger configured for a Hanami app. Ensures that both
7
+ # structured and tagged logging can be used across the Hanami framework.
8
+ #
9
+ # Provides `.call` as its main entrypoint, expecting a logger object. If a compatible logger is
10
+ # given (such as the Dry Logger instance provided by default in Hanami apps), then that logger is
11
+ # returned directly and not wrapped.
12
+ #
13
+ # If a non-compatible logger is given, then it will be wrapped by an instance of UniversalLogger,
14
+ # which adapts a structured and tagged logging API to the given logger.
15
+ #
16
+ # This leads to two levels of logger enhancement:
17
+ #
18
+ # 1. Structured-capable loggers (accepts keyword arguments, but no `#tagged` method): tags are are
19
+ # provided as a `:tags` keyword argument when logging.
20
+ # 2. Legacy loggers (such as the Ruby standard `Logger`, no keyword arguments, no `#tagged`
21
+ # method): messages are logged as JSON, with tags under a `"tags"` key.
22
+ #
23
+ # This adapter is used for all loggers configured in Hanami apps.
24
+ #
25
+ # @api public
26
+ # @since 3.0.0
27
+ class UniversalLogger
28
+ class << self
29
+ # Wrap a logger if needed, or return it as-is if fully compatible.
30
+ #
31
+ # @param logger [Object] the logger to wrap
32
+ # @return [Object, UniversalLogger] the original logger or wrapped logger
33
+ #
34
+ # @api private
35
+ def call(logger)
36
+ return logger if compatible_logger?(logger)
37
+
38
+ new(logger)
39
+ end
40
+
41
+ # @api private
42
+ alias_method :[], :call
43
+
44
+ # @api private
45
+ def compatible_logger?(logger)
46
+ structured_logger?(logger) && tagged_logger?(logger)
47
+ end
48
+
49
+ # @api private
50
+ def tagged_logger?(logger)
51
+ logger.respond_to?(:tagged)
52
+ end
53
+
54
+ # @api private
55
+ def structured_logger?(logger)
56
+ logger.respond_to?(:info) &&
57
+ logger.method(:info).parameters.any? { |(type, _)| type == :keyrest }
58
+ end
59
+ end
60
+
61
+ # @api public
62
+ # @since 3.0.0
63
+ attr_reader :logger
64
+
65
+ # @api private
66
+ def initialize(logger)
67
+ @logger = logger
68
+ @structured_logger = self.class.structured_logger?(logger)
69
+ @tags_thread_key = :"hanami_universal_logger_tags_#{object_id}"
70
+ end
71
+
72
+ # @api private
73
+ LOG_LEVEL_METHODS = %i[debug info warn error fatal unknown].freeze
74
+ private_constant :LOG_LEVEL_METHODS
75
+
76
+ # @!method debug(message = nil, **payload, &blk)
77
+ # Logs a debug message.
78
+ #
79
+ # @param message [String, nil] the log message
80
+ # @param payload [Hash] structured data to include in the log entry
81
+ # @yieldreturn [Hash] additional payload data to merge
82
+ # @return [void]
83
+ #
84
+ # @api public
85
+ # @since 3.0.0
86
+
87
+ # @!method info(message = nil, **payload, &blk)
88
+ # Logs an info message.
89
+ #
90
+ # @param message [String, nil] the log message
91
+ # @param payload [Hash] structured data to include in the log entry
92
+ # @yieldreturn [Hash] additional payload data to merge
93
+ # @return [void]
94
+ # @api public
95
+ # @since 3.0.0
96
+
97
+ # @!method warn(message = nil, **payload, &blk)
98
+ # Logs a warning message.
99
+ #
100
+ # @param message [String, nil] the log message
101
+ # @param payload [Hash] structured data to include in the log entry
102
+ # @yieldreturn [Hash] additional payload data to merge
103
+ # @return [void]
104
+ #
105
+ # @api public
106
+ # @since 3.0.0
107
+
108
+ # @!method error(message = nil, **payload, &blk)
109
+ # Logs an error message.
110
+ #
111
+ # @param message [String, nil] the log message
112
+ # @param payload [Hash] structured data to include in the log entry
113
+ # @yieldreturn [Hash] additional payload data to merge
114
+ # @return [void]
115
+ #
116
+ # @api public
117
+ # @since 3.0.0
118
+
119
+ # @!method fatal(message = nil, **payload, &blk)
120
+ # Logs a fatal message.
121
+ #
122
+ # @param message [String, nil] the log message
123
+ # @param payload [Hash] structured data to include in the log entry
124
+ # @yieldreturn [Hash] additional payload data to merge
125
+ # @return [void]
126
+ #
127
+ # @api public
128
+ # @since 3.0.0
129
+
130
+ # @!method unknown(message = nil, **payload, &blk)
131
+ # Logs a message with unknown severity.
132
+ #
133
+ # @param message [String, nil] the log message
134
+ # @param payload [Hash] structured data to include in the log entry
135
+ # @yieldreturn [Hash] additional payload data to merge
136
+ # @return [void]
137
+ #
138
+ # @api public
139
+ # @since 3.0.0
140
+
141
+ LOG_LEVEL_METHODS.each do |level|
142
+ define_method(level) do |message = nil, **payload, &blk|
143
+ _log(level, message, payload, &blk)
144
+ end
145
+ end
146
+
147
+ # @api public
148
+ # @since 3.0.0
149
+ def add(severity, message = nil, progname = nil, &blk)
150
+ # Convert severity to a level symbol if it's an integer (the standard Logger uses integers).
151
+ level = _severity_to_level(severity)
152
+
153
+ payload = {}
154
+ payload[:progname] = progname if progname
155
+
156
+ _log(level, message, payload, &blk)
157
+ end
158
+
159
+ # @api public
160
+ # @since 3.0.0
161
+ alias_method :log, :add
162
+
163
+ # @api public
164
+ # @since 3.0.0
165
+ def tagged(*tags)
166
+ previous_tags = _current_tags
167
+ self._current_tags = tags
168
+ begin
169
+ yield
170
+ ensure
171
+ self._current_tags = previous_tags
172
+ end
173
+ end
174
+
175
+ private
176
+
177
+ # Delegates any other methods to the wrapped logger.
178
+ def method_missing(method, ...)
179
+ if logger.respond_to?(method)
180
+ logger.public_send(method, ...)
181
+ else
182
+ super
183
+ end
184
+ end
185
+
186
+ def respond_to_missing?(method, include_private = false)
187
+ logger.respond_to?(method, include_private) || super
188
+ end
189
+
190
+ # Maps a standard Logger severity integer (e.g. 1) to a level name (`:info`).
191
+ #
192
+ # We need this be able to support the basic `Logger#log` and `#add` methods in addition to the
193
+ # named severity methods.
194
+ def _severity_to_level(severity)
195
+ return severity if severity.is_a?(Symbol)
196
+
197
+ SEVERITY_MAP.fetch(severity, :unknown)
198
+ end
199
+
200
+ SEVERITY_MAP = {
201
+ 0 => :debug, # Logger::DEBUG
202
+ 1 => :info, # Logger::INFO
203
+ 2 => :warn, # Logger::WARN
204
+ 3 => :error, # Logger::ERROR
205
+ 4 => :fatal, # Logger::FATAL
206
+ 5 => :unknown # Logger::UNKNOWN
207
+ }.freeze
208
+ private_constant :SEVERITY_MAP
209
+
210
+ def _log(level, message, payload, &blk)
211
+ if @structured_logger
212
+ _log_structured(level, message, payload, &blk)
213
+ else
214
+ _log_json(level, message, payload, &blk)
215
+ end
216
+ end
217
+
218
+ def _log_structured(method, message, payload)
219
+ payload = payload.merge(yield) if block_given?
220
+
221
+ tags = _current_tags
222
+ payload[:tags] = tags if tags && !tags.empty?
223
+
224
+ logger.public_send(method, message, **payload)
225
+ end
226
+
227
+ def _log_json(method, message, payload)
228
+ json_data =
229
+ if block_given?
230
+ yield
231
+ else
232
+ payload[:message] = message if message
233
+ payload
234
+ end
235
+
236
+ tags = _current_tags
237
+ json_data[:tags] = tags if tags && !tags.empty?
238
+
239
+ logger.public_send(method, JSON.generate(json_data))
240
+ end
241
+
242
+ def _current_tags
243
+ Thread.current[@tags_thread_key]
244
+ end
245
+
246
+ def _current_tags=(tags)
247
+ Thread.current[@tags_thread_key] = tags
248
+ end
249
+ end
250
+ end
@@ -7,7 +7,7 @@ module Hanami
7
7
  # @api private
8
8
  module Version
9
9
  # @api public
10
- VERSION = "2.3.2"
10
+ VERSION = "3.0.0"
11
11
 
12
12
  # @since 0.9.0
13
13
  # @api private
@@ -56,87 +56,10 @@ module Hanami
56
56
  end
57
57
  end
58
58
 
59
- # @since 2.1.0
60
- # @api private
61
- class UniversalLogger
62
- class << self
63
- # @since 2.1.0
64
- # @api private
65
- def call(logger)
66
- return logger if compatible_logger?(logger)
67
-
68
- new(logger)
69
- end
70
-
71
- # @since 2.1.0
72
- # @api private
73
- alias_method :[], :call
74
-
75
- private
76
-
77
- def compatible_logger?(logger)
78
- logger.respond_to?(:tagged) && accepts_entry_payload?(logger)
79
- end
80
-
81
- def accepts_entry_payload?(logger)
82
- logger.method(:info).parameters.any? { |(type, _)| type == :keyrest }
83
- end
84
- end
85
-
86
- # @since 2.1.0
87
- # @api private
88
- attr_reader :logger
89
-
90
- # @since 2.1.0
91
- # @api private
92
- def initialize(logger)
93
- @logger = logger
94
- end
95
-
96
- # @since 2.1.0
97
- # @api private
98
- def tagged(*, &blk)
99
- blk.call
100
- end
101
-
102
- # Logs the entry as JSON.
103
- #
104
- # This ensures a reasonable (and parseable) representation of our log payload structures for
105
- # loggers that are configured to wholly replace Hanami's default logger.
106
- #
107
- # @since 2.1.0
108
- # @api private
109
- def info(message = nil, **payload, &blk)
110
- logger.info do
111
- if blk
112
- JSON.generate(blk.call)
113
- else
114
- payload[:message] = message if message
115
- JSON.generate(payload)
116
- end
117
- end
118
- end
119
-
120
- # @see info
121
- #
122
- # @since 2.1.0
123
- # @api private
124
- def error(message = nil, **payload, &blk)
125
- logger.error do
126
- if blk
127
- JSON.generate(blk.call)
128
- else
129
- payload[:message] = message if message
130
- JSON.generate(payload)
131
- end
132
- end
133
- end
134
- end
135
-
136
59
  # @api private
137
60
  # @since 2.0.0
138
61
  def initialize(logger, env: :development)
139
- @logger = UniversalLogger[logger]
62
+ @logger = logger
140
63
  extend(Development) if %i[development test].include?(env)
141
64
  end
142
65
 
@@ -157,7 +80,6 @@ module Hanami
157
80
  # @since 2.0.0
158
81
  def log_request(env, status, elapsed)
159
82
  logger.tagged(:rack) do
160
-
161
83
  logger.info do
162
84
  data(env, status: status, elapsed: elapsed)
163
85
  end
@@ -189,7 +111,7 @@ module Hanami
189
111
  length: extract_content_length(env),
190
112
  params: env.fetch(ROUTER_PARAMS, EMPTY_PARAMS),
191
113
  elapsed: elapsed,
192
- elapsed_unit: MICROSECOND,
114
+ elapsed_unit: MICROSECOND
193
115
  }
194
116
  end
195
117