hanami 0.9.2 → 1.0.0.beta1

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/FEATURES.md +5 -0
  4. data/hanami.gemspec +8 -8
  5. data/lib/hanami.rb +25 -1
  6. data/lib/hanami/app.rb +4 -0
  7. data/lib/hanami/application.rb +1 -14
  8. data/lib/hanami/application_configuration.rb +2 -37
  9. data/lib/hanami/cli_base.rb +15 -0
  10. data/lib/hanami/cli_sub_commands/destroy.rb +2 -2
  11. data/lib/hanami/cli_sub_commands/generate.rb +2 -1
  12. data/lib/hanami/commands/generate/abstract.rb +5 -0
  13. data/lib/hanami/commands/generate/mailer.rb +2 -2
  14. data/lib/hanami/commands/generate/model.rb +24 -8
  15. data/lib/hanami/commands/new/abstract.rb +1 -1
  16. data/lib/hanami/commands/new/container.rb +1 -0
  17. data/lib/hanami/common_logger.rb +73 -0
  18. data/lib/hanami/components.rb +11 -0
  19. data/lib/hanami/components/app/controller.rb +1 -0
  20. data/lib/hanami/components/components.rb +73 -20
  21. data/lib/hanami/configuration.rb +12 -0
  22. data/lib/hanami/env.rb +2 -0
  23. data/lib/hanami/environment.rb +5 -1
  24. data/lib/hanami/generators/app/application.rb.tt +0 -30
  25. data/lib/hanami/generators/application/container/Gemfile.tt +0 -1
  26. data/lib/hanami/generators/application/container/config/boot.rb.tt +2 -0
  27. data/lib/hanami/generators/application/container/config/environment.rb.tt +14 -5
  28. data/lib/hanami/generators/database_config.rb +1 -1
  29. data/lib/hanami/generators/mailer/{mailer_spec.rb.tt → mailer_spec.rb.minitest.tt} +0 -0
  30. data/lib/hanami/generators/mailer/mailer_spec.rb.rspec.tt +5 -0
  31. data/lib/hanami/generators/model/migration.rb.tt +10 -0
  32. data/lib/hanami/mailer/glue.rb +4 -46
  33. data/lib/hanami/server.rb +4 -12
  34. data/lib/hanami/static.rb +4 -8
  35. data/lib/hanami/version.rb +1 -1
  36. metadata +25 -62
  37. data/lib/hanami/components/app/logger.rb +0 -30
  38. data/lib/hanami/config/logger.rb +0 -200
  39. data/lib/hanami/generators/application/app/.env.development.tt +0 -4
  40. data/lib/hanami/generators/application/app/.env.test.tt +0 -4
  41. data/lib/hanami/generators/application/app/.gitignore +0 -0
  42. data/lib/hanami/generators/application/app/.gitkeep +0 -1
  43. data/lib/hanami/generators/application/app/Gemfile.tt +0 -57
  44. data/lib/hanami/generators/application/app/Rakefile.minitest.tt +0 -12
  45. data/lib/hanami/generators/application/app/Rakefile.rspec.tt +0 -9
  46. data/lib/hanami/generators/application/app/apps/.gitkeep.tt +0 -1
  47. data/lib/hanami/generators/application/app/capybara.rb.rspec.tt +0 -8
  48. data/lib/hanami/generators/application/app/config.ru.tt +0 -3
  49. data/lib/hanami/generators/application/app/config/application.rb.tt +0 -347
  50. data/lib/hanami/generators/application/app/config/environment.rb.tt +0 -4
  51. data/lib/hanami/generators/application/app/config/initializers/.gitkeep +0 -0
  52. data/lib/hanami/generators/application/app/config/routes.rb.tt +0 -5
  53. data/lib/hanami/generators/application/app/db/.gitkeep +0 -1
  54. data/lib/hanami/generators/application/app/favicon.ico +0 -0
  55. data/lib/hanami/generators/application/app/features_helper.rb.minitest.tt +0 -11
  56. data/lib/hanami/generators/application/app/features_helper.rb.rspec.tt +0 -12
  57. data/lib/hanami/generators/application/app/gitignore.tt +0 -2
  58. data/lib/hanami/generators/application/app/gitignore_with_db.tt +0 -4
  59. data/lib/hanami/generators/application/app/gitignore_with_sqlite.tt +0 -3
  60. data/lib/hanami/generators/application/app/hanamirc.tt +0 -4
  61. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +0 -35
  62. data/lib/hanami/generators/application/app/lib/chirp/entities/.gitkeep +0 -1
  63. data/lib/hanami/generators/application/app/lib/chirp/repositories/.gitkeep +0 -1
  64. data/lib/hanami/generators/application/app/rspec.rspec.tt +0 -2
  65. data/lib/hanami/generators/application/app/schema.sql.tt +0 -0
  66. data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +0 -7
  67. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +0 -104
  68. data/lib/hanami/generators/application/app/templates/application.html.erb.tt +0 -10
  69. data/lib/hanami/generators/application/app/templates/application.html.haml.tt +0 -7
  70. data/lib/hanami/generators/application/app/templates/application.html.slim.tt +0 -8
  71. data/lib/hanami/generators/application/app/views/application_layout.rb.tt +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dac74bd1407b2a277b071bfd1c678d561b5d1385
4
- data.tar.gz: df791585b6be2709032db1ac7d492ab5d165da3e
3
+ metadata.gz: f3cd82f3f62f3ac1ec9c0fdd9bbcf07acad469b5
4
+ data.tar.gz: 130099379546f16fa1bc40db4bc902617f9aa7d2
5
5
  SHA512:
6
- metadata.gz: '00007885789a92bc354914bdaf4a35330b33bdf066d01bccc438f35e5ddc606fe7464284893a49cbab28225a0d590d84265acc5ccb3ef88044c3d82082140968'
7
- data.tar.gz: 0b9bfe9ec4eb0924f44a43dc053cadaf86fdf6b30dc9f393e4806710845ed2e254424719b3e4d657f6e20808f5cd2f228b1d4535b312e4eb40f0c6332f01e390
6
+ metadata.gz: 68533ad169554fa89c2375a54b98f10fd2f6bb7b999ff943b3196e53e535286a4b44cd7bbe55384c6badfcc99fe4c8d8d52190bfc4e1dced51ac126e1a8d89e5
7
+ data.tar.gz: 4ec5c3a0b46abdacd53f4fe7b853933eb851a957d667c9932eb329e0d51a798aa4f196c8c724d9e6d869fca9a8d707a6ce0ff6ad5f067a9f728cec067794c3bd
@@ -1,6 +1,32 @@
1
1
  # Hanami
2
2
  The web, with simplicity.
3
3
 
4
+ ## v1.0.0.beta1 - 2017-02-14
5
+ ### Added
6
+ - [Luca Guidi] Official support for Ruby: MRI 2.4
7
+ - [yjukaku] CLI: `hanami generate model` now also generates a migration
8
+ - [Luca Guidi] Generate `config/boot.rb` for new Hanami projects.
9
+ - [Luca Guidi] Introduced `Hanami.logger` as project logger
10
+ - [Luca Guidi] Automatic logging of HTTP requests, migrations, and SQL queries
11
+ - [Luca Guidi] Introduced `environment` for env specific settings in `config/environment.rb`
12
+
13
+ ### Fixed
14
+ - [Marcello Rocha] Fix Hanami::Mailer loading
15
+ - [Kai Kuchenbecker] Serve only existing assets with `Hanami::Static`
16
+ - [Gabriel Gizotti] Ensure inline ENV vars to not be overwritten by `.env.*` files
17
+ - [Adrian Madrid] Ensure new Hanami projects to have the right `jdbc` prefix for JRuby
18
+ - [Luca Guidi] Fixed code reloading for objects under `lib/`
19
+ - [Semyon Pupkov] Ensure generated mailer to respect the project name under `lib/`
20
+ - [Semyon Pupkov] Fixed generation of mailer settings for new projects
21
+ - [Victor Franco] Fixed CLI subcommands help output
22
+
23
+ ### Changed
24
+ - [Ozawa Sakuro] Don't include `bundler` as a dependency `Gemfile` for new Hanami projects
25
+ - [Luca Guidi] Make compatible with Rack 2.0 only
26
+ - [Luca Guidi] Removed `logger` settings from Hanami applications
27
+ - [Luca Guidi] Removed logger for Hanami applications (eg `Web.logger`)
28
+ - [Luca Guidi] Changed mailer syntax in `config/enviroment.rb`
29
+
4
30
  ## v0.9.2 - 2016-12-19
5
31
  ## Added
6
32
  - [The Crab] Mark unit tests/specs as pending for generated actions and views
@@ -3,6 +3,11 @@
3
3
 
4
4
  ## Features
5
5
 
6
+ ## v1.0.0.beta1 - 2017-02-14
7
+ - CLI: `hanami generate model` now also generates a migration
8
+ - Project logger `Hanami.logger`
9
+ - Automatic logging of HTTP requests, migrations, and SQL queries
10
+
6
11
  ## v0.9.2 - 2016-12-19
7
12
 
8
13
  ## v0.9.1 - 2016-11-18
@@ -21,14 +21,14 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
23
23
 
24
- spec.add_dependency 'hanami-utils', '~> 0.9'
25
- spec.add_dependency 'hanami-validations', '~> 0.7'
26
- spec.add_dependency 'hanami-router', '~> 0.8', '>= 0.8.1'
27
- spec.add_dependency 'hanami-controller', '~> 0.8'
28
- spec.add_dependency 'hanami-view', '~> 0.8'
29
- spec.add_dependency 'hanami-helpers', '~> 0.5'
30
- spec.add_dependency 'hanami-mailer', '~> 0.4'
31
- spec.add_dependency 'hanami-assets', '~> 0.4'
24
+ spec.add_dependency 'hanami-utils', '~> 1.0.0.beta1'
25
+ spec.add_dependency 'hanami-validations', '~> 1.0.0.beta1'
26
+ spec.add_dependency 'hanami-router', '~> 1.0.0.beta1'
27
+ spec.add_dependency 'hanami-controller', '~> 1.0.0.beta1'
28
+ spec.add_dependency 'hanami-view', '~> 1.0.0.beta1'
29
+ spec.add_dependency 'hanami-helpers', '~> 1.0.0.beta1'
30
+ spec.add_dependency 'hanami-mailer', '~> 1.0.0.beta1'
31
+ spec.add_dependency 'hanami-assets', '~> 1.0.0.beta1'
32
32
  spec.add_dependency 'concurrent-ruby', '~> 1.0'
33
33
  spec.add_dependency 'thor', '~> 0.19'
34
34
  spec.add_dependency 'bundler', '~> 1.13'
@@ -52,7 +52,7 @@ module Hanami
52
52
  # delivery do
53
53
  # development :test
54
54
  # test :test
55
- # # production :smtp, address: ENV['SMTP_HOST'], port: 1025
55
+ # # production :smtp, address: ENV['SMTP_HOST'], port: ENV['SMTP_PORT']
56
56
  # end
57
57
  # end
58
58
  # end
@@ -90,6 +90,7 @@ module Hanami
90
90
  # @since 0.9.0
91
91
  # @api private
92
92
  def self.boot
93
+ Components.release if code_reloading?
93
94
  Components.resolve('all')
94
95
  end
95
96
 
@@ -195,4 +196,27 @@ module Hanami
195
196
  Environment.new
196
197
  end
197
198
  end
199
+
200
+ # Check if code reloading is enabled.
201
+ #
202
+ # @return [TrueClass,FalseClass] the result of the check
203
+ #
204
+ # @since 1.0.0.beta1
205
+ # @api private
206
+ #
207
+ # @see http://hanamirb.org/guides/projects/code-reloading/
208
+ def self.code_reloading?
209
+ environment
210
+ Components.resolve('code_reloading')
211
+ Components['code_reloading']
212
+ end
213
+
214
+ # Project logger
215
+ #
216
+ # @return [Hanami::Logger] the logger
217
+ #
218
+ # @since 1.0.0.beta1
219
+ def self.logger
220
+ Components['logger']
221
+ end
198
222
  end
@@ -2,6 +2,7 @@ require 'rack'
2
2
  require 'rack/builder'
3
3
  require 'hanami/router'
4
4
  require 'hanami/components'
5
+ require 'hanami/common_logger'
5
6
 
6
7
  module Hanami
7
8
  # Main application that mounts many Rack and/or Hanami applications.
@@ -62,6 +63,9 @@ module Hanami
62
63
  # @since 0.9.0
63
64
  # @api private
64
65
  def middleware(environment)
66
+ builder.use Hanami::CommonLogger, Hanami.logger
67
+ builder.use Rack::ContentLength
68
+
65
69
  if middleware = environment.static_assets_middleware # rubocop:disable Lint/AssignmentInCondition
66
70
  builder.use middleware
67
71
  end
@@ -31,19 +31,6 @@ module Hanami
31
31
  base.extend(ClassMethods)
32
32
  base.namespace.module_eval do
33
33
  class << self
34
- # Logger for this application
35
- #
36
- # @return [Hanami::Logger] the logger for this Hanami application
37
- #
38
- # @since 0.9.0
39
- # @api public
40
- #
41
- # @example
42
- #
43
- # Web.logger
44
- # Admin.logger
45
- attr_accessor :logger
46
-
47
34
  # Routes for this application
48
35
  #
49
36
  # @return [Hanami::Routes] the routes for this Hanami application
@@ -124,7 +111,7 @@ module Hanami
124
111
  # @api private
125
112
  def configuration=(configuration)
126
113
  @_lock.synchronize do
127
- raise "Can't assign configuration more than once (#{app_name})" unless @configuration.nil?
114
+ # raise "Can't assign configuration more than once (#{app_name})" unless @configuration.nil?
128
115
  @configuration = configuration
129
116
  end
130
117
  end
@@ -5,7 +5,6 @@ require 'hanami/middleware'
5
5
  require 'hanami/config/cookies'
6
6
  require 'hanami/config/framework_configuration'
7
7
  require 'hanami/config/load_paths'
8
- require 'hanami/config/logger'
9
8
  require 'hanami/config/routes'
10
9
  require 'hanami/config/security'
11
10
  require 'hanami/config/sessions'
@@ -21,7 +20,7 @@ module Hanami
21
20
  # @see Hanami::Configuration#ssl?
22
21
  SSL_SCHEME = 'https'.freeze
23
22
 
24
- # @since x.x.x
23
+ # @since 1.0.0.beta1
25
24
  # @api private
26
25
  DEFAULT_SSL_PORT = 443
27
26
 
@@ -1398,7 +1397,7 @@ module Hanami
1398
1397
  # module Bookshelf
1399
1398
  # class Application < Hanami::Application
1400
1399
  # configure do
1401
- # adapter :sql, 'postgres://localhost/database'
1400
+ # adapter :sql, 'postgresql://localhost/database'
1402
1401
  # model.adapter :sql, 'sqlite://db/bookshelf_development'
1403
1402
  # end
1404
1403
  # end
@@ -1495,40 +1494,6 @@ module Hanami
1495
1494
  @view ||= Config::FrameworkConfiguration.new
1496
1495
  end
1497
1496
 
1498
- # Defines a Config::Logger instance to the logger configuration.
1499
- #
1500
- # This instance will be used to generate the hanami logger available on application module.
1501
- #
1502
- # @return [Config::Logger] Configure logger instance
1503
- #
1504
- # @since 0.5.0
1505
- #
1506
- # @example Define a logger
1507
- # require 'hanami'
1508
- #
1509
- # module Bookshelf
1510
- # class Application < Hanami::Application
1511
- # configure do
1512
- # logger.stream 'path/to/log/file'
1513
- # end
1514
- # load!
1515
- # end
1516
- #
1517
- # module Controllers::Error
1518
- # class Index
1519
- # include Bookshelf::Action
1520
- #
1521
- # def call(params)
1522
- # Bookshelf::Logger.info "Logging to STDOUT"
1523
- # end
1524
- # end
1525
- # end
1526
- # end
1527
- #
1528
- def logger
1529
- @logger ||= Config::Logger.new
1530
- end
1531
-
1532
1497
  # @since 0.9.0
1533
1498
  # @api private
1534
1499
  def app_name
@@ -27,5 +27,20 @@ module Hanami
27
27
  def define_commands(&blk)
28
28
  class_eval(&blk) if block_given?
29
29
  end
30
+
31
+ def banner(command, nspace = true, subcommand = false)
32
+ super(command, nspace, namespace != 'hanami:cli')
33
+ end
34
+
35
+ def handle_argument_error(command, error, args, arity)
36
+ name = [(namespace == 'hanami:cli' ? nil : namespace), command.name].compact.join(" ")
37
+
38
+ msg = "ERROR: \"#{basename} #{name}\" was called with "
39
+ msg << "no arguments" if args.empty?
40
+ msg << "arguments " << args.inspect unless args.empty?
41
+ msg << "\nUsage: #{banner(command).inspect}"
42
+
43
+ raise Thor::InvocationError, msg
44
+ end
30
45
  end
31
46
  end
@@ -28,7 +28,7 @@ module Hanami
28
28
  def actions(application_name = nil, controller_and_action_name)
29
29
  if Hanami::Environment.new(options).container? && application_name.nil?
30
30
  msg = "ERROR: \"hanami destroy action\" was called with arguments [\"#{controller_and_action_name}\"]\n" \
31
- "Usage: \"hanami action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME\""
31
+ "Usage: \"hanami destroy action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME\""
32
32
  fail Error, msg
33
33
  end
34
34
 
@@ -60,7 +60,7 @@ module Hanami
60
60
  `hanami destroy model` will destroy an entity along with repository
61
61
  and corresponding tests
62
62
 
63
- > $ hanami generate model car
63
+ > $ hanami destroy model car
64
64
  EOS
65
65
 
66
66
  def model(name)
@@ -40,7 +40,7 @@ module Hanami
40
40
  def actions(application_name = nil, controller_and_action_name)
41
41
  if Hanami::Environment.new(options).container? && application_name.nil?
42
42
  msg = "ERROR: \"hanami generate action\" was called with arguments [\"#{controller_and_action_name}\"]\n" \
43
- "Usage: \"hanami action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME\""
43
+ "Usage: \"hanami generate action APPLICATION_NAME CONTROLLER_NAME#ACTION_NAME\""
44
44
  fail Error, msg
45
45
  end
46
46
 
@@ -77,6 +77,7 @@ module Hanami
77
77
  > $ hanami generate model vehicles/car
78
78
  EOS
79
79
  method_option :test, desc: 'Defines the testing Framework to be used. Default is defined through your .hanamirc file.'
80
+ method_option :skip_migration, desc: 'Skips the generation of a migration to create the model\'s table', default: false, type: :boolean
80
81
  def model(name)
81
82
  if options[:help]
82
83
  invoke :help, ['model']
@@ -53,6 +53,11 @@ module Hanami
53
53
  end
54
54
  end
55
55
 
56
+ # @since 1.0.0.beta1
57
+ # @api private
58
+ def project_name
59
+ Utils::String.new(Hanami::Environment.new.project_name).underscore
60
+ end
56
61
  end
57
62
  end
58
63
  end
@@ -50,7 +50,7 @@ module Hanami
50
50
  # @since 0.x.x
51
51
  # @api private
52
52
  def map_templates
53
- add_mapping("mailer_spec.rb.tt", mailer_spec_path)
53
+ add_mapping("mailer_spec.rb.#{test_framework.framework}.tt", mailer_spec_path)
54
54
  add_mapping("mailer.rb.tt", mailer_path)
55
55
  add_mapping("template.txt.tt", txt_template_path)
56
56
  add_mapping("template.html.tt", html_template_path)
@@ -110,7 +110,7 @@ module Hanami
110
110
  end
111
111
 
112
112
  def core_root
113
- Pathname.new("lib").join(::File.basename(Dir.getwd))
113
+ Pathname.new("lib").join(project_name)
114
114
  end
115
115
  end
116
116
  end
@@ -1,16 +1,22 @@
1
1
  require 'hanami/commands/generate/abstract'
2
+ require 'hanami/commands/generate/migration'
2
3
 
3
4
  module Hanami
4
5
  module Commands
5
6
  class Generate
6
7
  class Model < Abstract
7
8
 
8
- attr_reader :input, :model_name
9
+ attr_reader :input, :model_name, :table_name
9
10
 
10
11
  def initialize(options, model_name)
11
12
  super(options)
12
13
  @input = Utils::String.new(model_name).underscore
13
14
  @model_name = Utils::String.new(@input).classify
15
+ @table_name = Utils::String.new(@input).pluralize
16
+
17
+ unless skip_migration?
18
+ Components.resolve('model.configuration')
19
+ end
14
20
 
15
21
  assert_model_name!
16
22
  end
@@ -18,13 +24,17 @@ module Hanami
18
24
  def map_templates
19
25
  add_mapping('entity.rb.tt', entity_path)
20
26
  add_mapping('repository.rb.tt', repository_path)
27
+ unless skip_migration?
28
+ add_mapping('migration.rb.tt', migration_path)
29
+ end
21
30
  add_mapping("entity_spec.#{ test_framework.framework }.tt", entity_spec_path,)
22
31
  add_mapping("repository_spec.#{ test_framework.framework }.tt", repository_spec_path)
23
32
  end
24
33
 
25
34
  def template_options
26
35
  {
27
- model_name: model_name
36
+ model_name: model_name,
37
+ table_name: table_name
28
38
  }
29
39
  end
30
40
 
@@ -57,6 +67,10 @@ module Hanami
57
67
  end
58
68
  end
59
69
 
70
+ def skip_migration?
71
+ options.fetch(:skip_migration, false)
72
+ end
73
+
60
74
  def model_root
61
75
  Pathname.new('lib').join(project_name)
62
76
  end
@@ -73,6 +87,14 @@ module Hanami
73
87
  model_root.join('repositories', "#{ model_name_underscored }_repository.rb").to_s
74
88
  end
75
89
 
90
+ # @since 0.9.1
91
+ # @api private
92
+ def migration_path
93
+ timestamp = Time.now.utc.strftime(Migration::TIMESTAMP_FORMAT)
94
+ filename = Migration::FILENAME_PATTERN % { timestamp: timestamp, name: "create_#{table_name}"}
95
+ Hanami::Model.configuration.migrations.join(filename)
96
+ end
97
+
76
98
  # @since 0.5.0
77
99
  # @api private
78
100
  def entity_spec_path
@@ -91,12 +113,6 @@ module Hanami
91
113
  def model_name_underscored
92
114
  input
93
115
  end
94
-
95
- # @since 0.8.0
96
- # @api private
97
- def project_name
98
- Utils::String.new(Hanami::Environment.new.project_name).underscore
99
- end
100
116
  end
101
117
  end
102
118
  end
@@ -29,7 +29,7 @@ module Hanami
29
29
  assert_name!
30
30
  assert_architecture!
31
31
 
32
- @hanami_model_version = '~> 0.7'
32
+ @hanami_model_version = '~> 1.0.0.beta1'
33
33
  @database_config = Hanami::Generators::DatabaseConfig.new(options[:database], project_name)
34
34
  @test_framework = Hanami::Generators::TestFramework.new(hanamirc, @options[:test])
35
35
  @template_engine = Hanami::Generators::TemplateEngine.new(hanamirc, @options[:template])
@@ -43,6 +43,7 @@ module Hanami
43
43
  add_mapping('.env.test.tt', '.env.test')
44
44
  add_mapping('Gemfile.tt', 'Gemfile')
45
45
  add_mapping('config.ru.tt', 'config.ru')
46
+ add_mapping('config/boot.rb.tt', 'config/boot.rb')
46
47
  add_mapping('config/environment.rb.tt', 'config/environment.rb')
47
48
  add_mapping('lib/project.rb.tt', "lib/#{ project_name }.rb")
48
49
  end
@@ -0,0 +1,73 @@
1
+ require 'rack/common_logger'
2
+
3
+ module Hanami
4
+ # Rack logger for Hanami.app
5
+ #
6
+ # @since 1.0.0.beta1
7
+ # @api private
8
+ class CommonLogger < Rack::CommonLogger
9
+ private
10
+
11
+ # @since 1.0.0.beta1
12
+ # @api private
13
+ HTTP_VERSION = 'HTTP_VERSION'.freeze
14
+
15
+ # @since 1.0.0.beta1
16
+ # @api private
17
+ REQUEST_METHOD = 'REQUEST_METHOD'.freeze
18
+
19
+ # @since 1.0.0.beta1
20
+ # @api private
21
+ HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'.freeze
22
+
23
+ # @since 1.0.0.beta1
24
+ # @api private
25
+ REMOTE_ADDR = 'REMOTE_ADDR'.freeze
26
+
27
+ # @since 1.0.0.beta1
28
+ # @api private
29
+ SCRIPT_NAME = 'SCRIPT_NAME'.freeze
30
+
31
+ # @since 1.0.0.beta1
32
+ # @api private
33
+ PATH_INFO = 'PATH_INFO'.freeze
34
+
35
+ # @since 1.0.0.beta1
36
+ # @api private
37
+ QUERY_STRING = 'QUERY_STRING'.freeze
38
+
39
+ # @since 1.0.0.beta1
40
+ # @api private
41
+ RACK_ERRORS = 'rack.errors'.freeze
42
+
43
+ # @since 1.0.0.beta1
44
+ # @api private
45
+ #
46
+ # rubocop:disable Metrics/AbcSize
47
+ # rubocop:disable Metrics/MethodLength
48
+ def log(env, status, header, began_at)
49
+ now = Time.now
50
+ length = extract_content_length(header)
51
+
52
+ msg = Hash[
53
+ http: env[HTTP_VERSION],
54
+ verb: env[REQUEST_METHOD],
55
+ status: status.to_s[0..3],
56
+ ip: env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR],
57
+ path: env[SCRIPT_NAME] + env[PATH_INFO],
58
+ query: env[QUERY_STRING],
59
+ length: length,
60
+ elapsed: now - began_at
61
+ ]
62
+
63
+ logger = @logger || env[RACK_ERRORS]
64
+ # Standard library logger doesn't support write but it supports << which actually
65
+ # calls to write on the log device without formatting
66
+ if logger.respond_to?(:write)
67
+ logger.write(msg)
68
+ else
69
+ logger.info(msg)
70
+ end
71
+ end
72
+ end
73
+ end