hanami 0.9.2 → 1.0.0.beta1

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