sapience 0.2.4 → 0.2.5

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +21 -0
  3. data/.simplecov +19 -16
  4. data/.travis.yml +3 -3
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +0 -8
  7. data/README.md +5 -0
  8. data/config/default.yml +4 -0
  9. data/docker-compose.yml +14 -0
  10. data/lib/sapience/appender/stream.rb +0 -1
  11. data/lib/sapience/base.rb +34 -4
  12. data/lib/sapience/configuration.rb +41 -20
  13. data/lib/sapience/core_ext/hash.rb +10 -7
  14. data/lib/sapience/core_ext/symbol.rb +15 -0
  15. data/lib/sapience/core_ext/thread.rb +1 -0
  16. data/lib/sapience/extensions/action_cable/tagged_logger_proxy.rb +2 -0
  17. data/lib/sapience/extensions/action_controller/live.rb +2 -0
  18. data/lib/sapience/extensions/action_controller/log_subscriber.rb +76 -121
  19. data/lib/sapience/extensions/action_dispatch/debug_exceptions.rb +2 -0
  20. data/lib/sapience/extensions/action_view/log_subscriber.rb +16 -6
  21. data/lib/sapience/extensions/action_view/streaming_template_renderer.rb +2 -0
  22. data/lib/sapience/extensions/active_job/logging.rb +1 -1
  23. data/lib/sapience/extensions/active_model_serializers/logging.rb +7 -2
  24. data/lib/sapience/extensions/active_record/log_subscriber.rb +45 -29
  25. data/lib/sapience/extensions/rails/rack/logger.rb +1 -0
  26. data/lib/sapience/extensions/rails/rack/logger_info_as_debug.rb +2 -0
  27. data/lib/sapience/formatters/color.rb +0 -1
  28. data/lib/sapience/formatters/default.rb +0 -1
  29. data/lib/sapience/formatters/json.rb +0 -1
  30. data/lib/sapience/formatters/raw.rb +0 -1
  31. data/lib/sapience/log.rb +54 -35
  32. data/lib/sapience/logger.rb +50 -71
  33. data/lib/sapience/rails.rb +17 -20
  34. data/lib/sapience/sapience.rb +23 -27
  35. data/lib/sapience/subscriber.rb +1 -13
  36. data/lib/sapience/version.rb +1 -1
  37. data/lib/sapience.rb +4 -3
  38. data/sapience.gemspec +6 -1
  39. data/test_app/Gemfile +7 -0
  40. data/test_app/Rakefile +2 -0
  41. data/test_app/app/models/post.rb +1 -1
  42. data/test_app/app/views/posts/_form.html.slim +18 -0
  43. data/test_app/app/views/posts/edit.html.slim +8 -0
  44. data/test_app/app/views/posts/index.html.slim +25 -0
  45. data/test_app/app/views/posts/new.html.slim +5 -0
  46. data/test_app/app/views/posts/show.html.slim +15 -0
  47. data/test_app/app/workers/test_worker.rb +17 -0
  48. data/test_app/bin/sneakers +10 -0
  49. data/test_app/config/initializers/sneakers.rb +15 -0
  50. data/test_app/config/sapience_example.yml +24 -0
  51. data/test_app/db/migrate/{20160812093621_create_posts.rb → 20160902141445_create_posts.rb} +1 -1
  52. data/test_app/db/schema.rb +1 -1
  53. data/test_app/lib/external_sneaker.rb +46 -0
  54. data/test_app/spec/factories/posts.rb +7 -0
  55. data/test_app/spec/factories/users.rb +8 -0
  56. data/test_app/spec/rails_helper.rb +8 -3
  57. data/test_app/spec/requests/posts_spec.rb +2 -1
  58. data/test_app/spec/views/posts/edit.html.slim_spec.rb +17 -0
  59. data/test_app/spec/views/posts/index.html.slim_spec.rb +17 -0
  60. data/test_app/spec/views/posts/new.html.slim_spec.rb +17 -0
  61. data/test_app/spec/views/posts/show.html.slim_spec.rb +14 -0
  62. data/test_app/spec/workers/test_worker_spec.rb +36 -0
  63. data/test_app.simplecov +19 -0
  64. metadata +95 -15
  65. data/.coveralls.yml +0 -1
  66. data/lib/sapience/extensions/action_controller/log_subscriber_processing.rb +0 -24
  67. data/test_app/app/views/posts/_form.html.erb +0 -32
  68. data/test_app/app/views/posts/create.html.erb +0 -2
  69. data/test_app/app/views/posts/destroy.html.erb +0 -2
  70. data/test_app/app/views/posts/edit.html.erb +0 -6
  71. data/test_app/app/views/posts/index.html.erb +0 -31
  72. data/test_app/app/views/posts/new.html.erb +0 -5
  73. data/test_app/app/views/posts/show.html.erb +0 -19
  74. data/test_app/app/views/posts/update.html.erb +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 712bcdf7d21dacd21c564c2026a0fffafda3330d
4
- data.tar.gz: 7d0750dea5d0aa3a4c806aec4840149afe98d585
3
+ metadata.gz: f2ab0f8b23cf762ed9d05be6a9c3da70561f0d72
4
+ data.tar.gz: da71798a51acb98d05f161264663da01de0e29d0
5
5
  SHA512:
6
- metadata.gz: 9bed0ad7909f79a32193073372f1f41807bb2ede3c8f0069893b1124239e83349d0518d2c5585c16429ff2814fe24fe411ad3116db04f88307007bf3b3ccd12b
7
- data.tar.gz: b9e635cf195f309a22db4f3a092d2119a9f70f98e61b1329eb9900b44890db771b9e2079757e5f0e5e7669bbdc6a24fa88b375d253129cd465bfd1c50165e2b1
6
+ metadata.gz: 3b8a2241815ad570724c0be06c4f51964577d3b9c38c20f13e3f9273300858bedf9bf5e9b4ffa627803a027824b7a8b826c41a89fa7af94c0b72eef5873547db
7
+ data.tar.gz: b460a771ddbaf06da86ba135563903ccac31c5b0b661db44fb005b2040070c52b2bc003346d5286771790d0a848207dc19c21dd65849c8226564aa22bd4e24ae
data/.codeclimate.yml ADDED
@@ -0,0 +1,21 @@
1
+ ---
2
+ engines:
3
+ csslint:
4
+ enabled: false
5
+ duplication:
6
+ enabled: true
7
+ config:
8
+ languages:
9
+ - ruby
10
+ eslint:
11
+ enabled: false
12
+ fixme:
13
+ enabled: true
14
+ rubocop:
15
+ enabled: true
16
+ ratings:
17
+ paths:
18
+ - "**.rb"
19
+ exclude_paths:
20
+ - config/
21
+ - spec/
data/.simplecov CHANGED
@@ -1,19 +1,22 @@
1
- require "simplecov-json"
2
- require "codeclimate-test-reporter"
3
- require "coveralls"
1
+ if ENV['CODECLIMATE_REPO_TOKEN']
2
+ require "codeclimate-test-reporter"
3
+ CodeClimate::TestReporter.start
4
4
 
5
- CodeClimate::TestReporter.start
6
- SimpleCov.maximum_coverage_drop 1
5
+ # require "coveralls"
6
+ # Coveralls.wear!
7
+ else
8
+ require "simplecov-json"
9
+ SimpleCov.maximum_coverage_drop 1
7
10
 
8
- SimpleCov.formatters = [
9
- SimpleCov::Formatter::HTMLFormatter,
10
- SimpleCov::Formatter::JSONFormatter,
11
- CodeClimate::TestReporter::Formatter,
12
- Coveralls::SimpleCov::Formatter,
13
- ]
11
+ SimpleCov.formatters = [
12
+ SimpleCov::Formatter::HTMLFormatter,
13
+ SimpleCov::Formatter::JSONFormatter,
14
+ ]
14
15
 
15
- SimpleCov.start do
16
- add_filter "/spec/"
17
- add_filter "/bin/"
18
- add_filter "/gemfiles/"
19
- end
16
+ SimpleCov.start do
17
+ add_filter "/spec/"
18
+ add_filter "/bin/"
19
+ add_filter "/gemfiles/"
20
+ end
21
+
22
+ end
data/.travis.yml CHANGED
@@ -3,8 +3,8 @@ language: ruby
3
3
  services:
4
4
  - docker
5
5
  script:
6
- - docker-compose run rspec
7
- - docker-compose run test_app
6
+ - docker-compose run -e TRAVIS=$TRAVIS -e TRAVIS_BRANCH=$TRAVIS_BRANCH -e TRAVIS_JOB_ID=$TRAVIS_JOB_ID -e TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST rspec
7
+ - docker-compose run -e TRAVIS=$TRAVIS -e TRAVIS_BRANCH=$TRAVIS_BRANCH -e TRAVIS_JOB_ID=$TRAVIS_JOB_ID -e TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST test_app
8
8
  notifications:
9
9
  slack:
10
- secure: apFwkfBQ+3NDJgcLNCHQori9qtr6ePaN3Xx7Sy7NVWwYm9BHNxoX/FN8/hxR63JjXrf1C0hK0FLQ0TiA0BN9PgEEIecg78BvWUwMClDDiwhyYN3H0Bbg35PUFtgDIrOGpu/TYlxNmdHEDYEAxaWsl9wSds8pAJsN6m7VTjGfBwJUDcOiM4L1eRpbp7smPqOjmuQFuOJnO8YkPb+6nUfz53cJrMRUdha89Vgmvnw6cP4/Ms1TsL3vKmMSVbGGh/6WNKPjU6IbuUjwlsh6a9xWxQOk6Wnis/Z+kA+T0XbLMuTLLmzRDuql1tjJeMPi+wukmK1a7GjpPkpkzAgwLQ/CkjTBfIRbMyaBYSuAciuOY8PDtCcT4WLwEvdZbkFmhAdSr1RYxIBpONVfZ/5DT3bpk71+O74OIBqxG6NmkiZ0B6u9/KxbnIINLVAcVaqsN8sdSqWlWKzPm45BfGPXGjmGGgIVFU31rs+W5Zs7IYMNUjZxabYKIv9TsBONbogfbcoGZA+rWWUnQdjypNWJS9wyQDvJ4btxqy8YhDfaV6gF30Un5JcAggMutzKJiYi+qAeh0uN3/9XoXV2N6XBnh58h8ny1NY+0vklWhtFGR1wfFAqkDskvCIZabSeJ5bFM6FtNbNKq9tYciS+eAO1vEYQVDFt9eY2uZF2mFDKRnEegHMU=
10
+ secure: apFwkfBQ+3NDJgcLNCHQori9qtr6ePaN3Xx7Sy7NVWwYm9BHNxoX/FN8/hxR63JjXrf1C0hK0FLQ0TiA0BN9PgEEIecg78BvWUwMClDDiwhyYN3H0Bbg35PUFtgDIrOGpu/TYlxNmdHEDYEAxaWsl9wSds8pAJsN6m7VTjGfBwJUDcOiM4L1eRpbp7smPqOjmuQFuOJnO8YkPb+6nUfz53cJrMRUdha89Vgmvnw6cP4/Ms1TsL3vKmMSVbGGh/6WNKPjU6IbuUjwlsh6a9xWxQOk6Wnis/Z+kA+T0XbLMuTLLmzRDuql1tjJeMPi+wukmK1a7GjpPkpkzAgwLQ/CkjTBfIRbMyaBYSuAciuOY8PDtCcT4WLwEvdZbkFmhAdSr1RYxIBpONVfZ/5DT3bpk71+O74OIBqxG6NmkiZ0B6u9/KxbnIINLVAcVaqsN8sdSqWlWKzPm45BfGPXGjmGGgIVFU31rs+W5Zs7IYMNUjZxabYKIv9TsBONbogfbcoGZA+rWWUnQdjypNWJS9wyQDvJ4btxqy8YhDfaV6gF30Un5JcAggMutzKJiYi+qAeh0uN3/9XoXV2N6XBnh58h8ny1NY+0vklWhtFGR1wfFAqkDskvCIZabSeJ5bFM6FtNbNKq9tYciS+eAO1vEYQVDFt9eY2uZF2mFDKRnEegHMU=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## v0.2.3 - Unreleased
2
+
3
+ - Adds debugging and coverage for sneakers integration
4
+
1
5
  ## v0.2.2
2
6
 
3
7
  - Add an instance method for the `#name` of the appender
data/Gemfile CHANGED
@@ -2,11 +2,3 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in sapience.gemspec
4
4
  gemspec
5
-
6
- gem "pry-nav"
7
- gem "sentry-raven"
8
- gem "dogstatsd-ruby"
9
- gem "rails", "~> 5.0.0.1"
10
- gem "grape"
11
- gem "active_model_serializers", "~> 0.10.0"
12
- gem "rspec-wait"
data/README.md CHANGED
@@ -62,6 +62,7 @@ Sapience.configure do |config|
62
62
  { sentry: { dsn: "https://username:password@app.getsentry.com/00000" } },
63
63
  { datadog: { url: "udp://localhost:8125" } },
64
64
  ]
65
+ config.log_executor = :single_thread_executor
65
66
  end
66
67
  ```
67
68
 
@@ -70,6 +71,7 @@ Sapience provides a default configuration that will be used unless another file
70
71
  ```yaml
71
72
  ---
72
73
  default:
74
+ log_executor: single_thread_executor
73
75
  log_level: info
74
76
  appenders:
75
77
  - stream:
@@ -77,6 +79,7 @@ default:
77
79
  formatter: color
78
80
 
79
81
  test:
82
+ log_executor: immediate_executor
80
83
  log_level: warn
81
84
  appenders:
82
85
  - stream:
@@ -84,6 +87,7 @@ test:
84
87
  formatter: color
85
88
 
86
89
  development:
90
+ log_executor: single_thread_executor
87
91
  log_level: debug
88
92
  appenders:
89
93
  - stream:
@@ -91,6 +95,7 @@ development:
91
95
  formatter: color
92
96
 
93
97
  production:
98
+ log_executor: single_thread_executor
94
99
  log_level: warn
95
100
  appenders:
96
101
  - stream:
data/config/default.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  default:
3
+ log_executor: single_thread_executor
3
4
  log_level: info
4
5
  appenders:
5
6
  - stream:
@@ -7,6 +8,7 @@ default:
7
8
  formatter: color
8
9
 
9
10
  test:
11
+ log_executor: immediate_executor
10
12
  log_level: warn
11
13
  appenders:
12
14
  - stream:
@@ -14,6 +16,7 @@ test:
14
16
  formatter: color
15
17
 
16
18
  development:
19
+ log_executor: single_thread_executor
17
20
  log_level: debug
18
21
  appenders:
19
22
  - stream:
@@ -21,6 +24,7 @@ development:
21
24
  formatter: color
22
25
 
23
26
  production:
27
+ log_executor: single_thread_executor
24
28
  log_level: warn
25
29
  appenders:
26
30
  - stream:
data/docker-compose.yml CHANGED
@@ -4,6 +4,12 @@ volumes:
4
4
  driver: local
5
5
 
6
6
  services:
7
+ rabbitmq:
8
+ image: rabbitmq:latest
9
+ environment:
10
+ RABBITMQ_DEFAULT_USER: sapience
11
+ RABBITMQ_DEFAULT_PASS: tests
12
+
7
13
  rails:
8
14
  image: ruby:2.3
9
15
  cpu_shares: 4
@@ -24,12 +30,17 @@ services:
24
30
 
25
31
  # Mount the 'gems' volume on the folder that stores bundled gems:
26
32
  - gems:/usr/local/bundle
33
+
34
+
27
35
  rspec:
28
36
  extends:
29
37
  service: rails
30
38
  entrypoint: /usr/src/app/dev-entrypoint.sh
31
39
  command: bundle exec rake
40
+ depends_on:
41
+ - rabbitmq
32
42
  environment:
43
+ CODECLIMATE_REPO_TOKEN: 204dc055302da6aed94379e249aa0645636d1d1794920c62db05c5fa968215de
33
44
  PATH: /usr/src/app/bin:/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
34
45
 
35
46
  test_app:
@@ -38,5 +49,8 @@ services:
38
49
  working_dir: /usr/src/app/test_app
39
50
  entrypoint: /usr/src/app/dev-entrypoint.sh
40
51
  command: bundle exec rspec
52
+ depends_on:
53
+ - rabbitmq
41
54
  environment:
55
+ AMQP: amqp://sapience:tests@rabbitmq:5672
42
56
  PATH: /usr/src/app/bin:/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
@@ -108,7 +108,6 @@ module Sapience
108
108
  # Ruby or Rails Loggers
109
109
  def log(log)
110
110
  return false unless should_log?(log)
111
-
112
111
  # Since only one appender thread will be writing to the file at a time
113
112
  # it is not necessary to protect access to the file with a semaphore
114
113
  # Allow this logger to filter out log levels lower than it's own
data/lib/sapience/base.rb CHANGED
@@ -128,6 +128,7 @@ module Sapience
128
128
  def push_tags(*tags)
129
129
  Sapience.push_tags(*tags)
130
130
  end
131
+ alias_method :tags=, :push_tags
131
132
 
132
133
  # :nodoc:
133
134
  def pop_tags(quantity = 1)
@@ -144,6 +145,21 @@ module Sapience
144
145
  Sapience.fast_tag(tag, &block)
145
146
  end
146
147
 
148
+ # Returns [Sapience::Formatters::Default] formatter default for this subscriber
149
+ def default_formatter
150
+ Sapience::Formatters::Default.new
151
+ end
152
+
153
+ # Allow application name to be set globally or per subscriber
154
+ def application
155
+ Sapience.config.application
156
+ end
157
+
158
+ # Allow host name to be set globally or per subscriber
159
+ def host
160
+ Sapience.config.host
161
+ end
162
+
147
163
  # Thread specific context information to be logged with every log entry
148
164
  #
149
165
  # Add a payload to all log calls on This Thread within the supplied block
@@ -271,13 +287,15 @@ module Sapience
271
287
  payload = payload.nil? ? self.payload : self.payload.merge(payload)
272
288
  end
273
289
 
290
+ merged_tags = merge_tags_with_payload(payload)
274
291
  # Add caller stack trace
275
292
  backtrace = extract_backtrace if index >= Sapience.config.backtrace_level_index
276
293
 
277
- log = Log.new(level, Thread.current.name, name, message, payload, Time.now, nil, tags, index, exception, nil, backtrace)
294
+ log = Log.new(level, Thread.current.name, name, message, payload, Time.now, nil, merged_tags, index, exception, nil, backtrace)
278
295
 
279
296
  # Logging Hash only?
280
297
  # logger.info(name: 'value')
298
+
281
299
  if payload.nil? && exception.nil? && message.is_a?(Hash)
282
300
  payload = message.dup
283
301
  min_duration = payload.delete(:min_duration) || 0.0
@@ -291,13 +309,21 @@ module Sapience
291
309
  end
292
310
  log.payload = payload if payload.size > 0
293
311
  end
294
-
295
312
  self.log(log) if include_message?(log)
296
313
  end
297
314
  # rubocop:enable AbcSize, PerceivedComplexity, CyclomaticComplexity, LineLength
298
315
 
299
316
  SELF_PATTERN = File.join("lib", "sapience")
300
317
 
318
+ def merge_tags_with_payload(payload = {})
319
+ merged_tags = tags.dup
320
+ if payload.is_a?(Hash)
321
+ payload_tags = payload.delete(:tags) || []
322
+ merged_tags.concat(payload_tags) if payload_tags.size > 0
323
+ end
324
+ merged_tags.uniq
325
+ end
326
+
301
327
  # Extract the callers backtrace leaving out Sapience
302
328
  def extract_backtrace
303
329
  stack = caller
@@ -346,6 +372,9 @@ module Sapience
346
372
  if self.payload
347
373
  payload = payload.nil? ? self.payload : self.payload.merge(payload)
348
374
  end
375
+
376
+ merged_tags = merge_tags_with_payload(payload)
377
+
349
378
  if exception
350
379
  logged_exception = exception
351
380
  backtrace = nil
@@ -370,7 +399,8 @@ module Sapience
370
399
  logged_exception = nil
371
400
  backtrace = exception.backtrace
372
401
  end
373
- log = Log.new(level, Thread.current.name, name, message, payload, end_time, duration, tags, index, logged_exception, metric, backtrace) # rubocop:disable LineLength
402
+
403
+ log = Log.new(level, Thread.current.name, name, message, payload, end_time, duration, merged_tags, index, logged_exception, metric, backtrace) # rubocop:disable LineLength
374
404
  self.log(log) if include_message?(log)
375
405
  fail exception
376
406
  elsif duration >= min_duration
@@ -378,7 +408,7 @@ module Sapience
378
408
  # Add caller stack trace
379
409
  backtrace = extract_backtrace if index >= Sapience.config.backtrace_level_index
380
410
 
381
- log = Log.new(level, Thread.current.name, name, message, payload, end_time, duration, tags, index, nil, metric, backtrace) # rubocop:disable LineLength
411
+ log = Log.new(level, Thread.current.name, name, message, payload, end_time, duration, merged_tags, index, nil, metric, backtrace) # rubocop:disable LineLength
382
412
  self.log(log) if include_message?(log)
383
413
  end
384
414
  end
@@ -1,30 +1,38 @@
1
1
  require "ostruct"
2
2
 
3
3
  module Sapience
4
+ UnkownLogLevel = Class.new(StandardError)
5
+ InvalidLogExecutor = Class.new(StandardError)
6
+
4
7
  # rubocop:disable ClassVars
5
8
  class Configuration
6
9
  attr_reader :default_level, :backtrace_level, :backtrace_level_index
7
10
  attr_writer :host
8
- attr_accessor :application, :ap_options, :appenders
11
+ attr_accessor :application, :ap_options, :appenders, :log_executor
9
12
 
13
+ SUPPORTED_EXECUTORS = %i(single_thread_executor immediate_executor).freeze
10
14
  DEFAULT = {
11
15
  log_level: :info,
12
16
  application: "Sapience",
13
17
  host: nil,
14
18
  ap_options: { multiline: false },
15
19
  appenders: [{ stream: { io: STDOUT, formatter: :color } }],
20
+ log_executor: :single_thread_executor,
16
21
  }.freeze
17
22
 
18
23
  # Initial default Level for all new instances of Sapience::Logger
19
24
  def initialize(options = {}) # rubocop:disable AbcSize
20
25
  fail ArgumentError, "options need to be a hash" unless options.is_a?(Hash)
21
- @options = DEFAULT.merge(options.deep_symbolize_keys!)
26
+ @options = DEFAULT.merge(options.deep_symbolize_keyz!)
27
+ @options[:log_executor] &&= @options[:log_executor].to_sym
28
+ validate_log_executor!(@options[:log_executor])
22
29
  self.default_level = @options[:log_level].to_sym
23
30
  self.backtrace_level = @options[:log_level].to_sym
24
31
  self.application = @options[:application]
25
32
  self.host = @options[:host]
26
33
  self.ap_options = @options[:ap_options]
27
34
  self.appenders = @options[:appenders]
35
+ self.log_executor = @options[:log_executor]
28
36
  end
29
37
 
30
38
  # Sets the global default log level
@@ -44,25 +52,35 @@ module Sapience
44
52
  def level_to_index(level) # rubocop:disable AbcSize, PerceivedComplexity, CyclomaticComplexity
45
53
  return if level.nil?
46
54
 
47
- index =
48
- if level.is_a?(Symbol)
49
- LEVELS.index(level)
50
- elsif level.is_a?(String)
51
- level = level.downcase.to_sym
55
+ case level
56
+ when Symbol
52
57
  LEVELS.index(level)
53
- elsif level.is_a?(Integer) && defined?(::Logger::Severity)
54
- # Mapping of Rails and Ruby Logger levels to Sapience levels
55
- @@map_levels ||= begin
56
- levels = []
57
- ::Logger::Severity.constants.each do |constant|
58
- levels[::Logger::Severity.const_get(constant)] = LEVELS.find_index(constant.downcase.to_sym) || LEVELS.find_index(:error) # rubocop:disable LineLength
59
- end
60
- levels
61
- end
62
- @@map_levels[level]
58
+ when String
59
+ LEVELS.index(level.downcase.to_sym)
60
+ when Integer
61
+ map_levels[level] || fail_with_unkown_log_level!(level)
62
+ else
63
+ fail_with_unkown_log_level!(level)
63
64
  end
64
- fail "Invalid level:#{level.inspect} being requested. Must be one of #{LEVELS.inspect}" unless index
65
- index
65
+ end
66
+
67
+ def fail_with_unkown_log_level!(level)
68
+ fail UnkownLogLevel,
69
+ "Invalid level:#{level.inspect} being requested." \
70
+ " Must be one of #{LEVELS.inspect}"
71
+ end
72
+
73
+ # Mapping of Rails and Ruby Logger levels to Sapience levels
74
+ def map_levels
75
+ return [] unless defined?(::Logger::Severity)
76
+ @@map_levels ||=
77
+ ::Logger::Severity.constants.each_with_object([]) do |constant, levels|
78
+ levels[::Logger::Severity.const_get(constant)] = level_by_index_or_error(constant)
79
+ end
80
+ end
81
+
82
+ def level_by_index_or_error(constant)
83
+ LEVELS.find_index(constant.downcase.to_sym) || LEVELS.find_index(:error)
66
84
  end
67
85
 
68
86
  def default_level_index
@@ -92,6 +110,9 @@ module Sapience
92
110
  @host ||= Socket.gethostname
93
111
  end
94
112
 
95
-
113
+ def validate_log_executor!(log_executor)
114
+ return true if SUPPORTED_EXECUTORS.include?(log_executor)
115
+ fail InvalidLogExecutor, "#{log_executor} is unsupported. Use (#{SUPPORTED_EXECUTORS.join(", ")})"
116
+ end
96
117
  end
97
118
  end
@@ -1,25 +1,28 @@
1
1
  class Hash
2
2
  # Returns a Hash with all keys symbolized
3
- def deep_symbolize_keys!
4
- deep_transform_keys! { |key| key.to_sym rescue key } # rubocop:disable RescueModifier
3
+ def deep_symbolize_keyz!
4
+ deep_transform_keyz! { |key| key.to_sym rescue key } # rubocop:disable RescueModifier
5
5
  end
6
+ alias_method :deep_symbolize_keys!, :deep_symbolize_keyz!
6
7
 
7
- def deep_transform_keys!(&block)
8
- _deep_transform_keys_in_object!(self, &block)
8
+ def deep_transform_keyz!(&block)
9
+ _deep_transform_keyz_in_object!(self, &block)
9
10
  end
11
+ alias_method :deep_transform_keys!, :deep_transform_keyz!
10
12
 
11
- def _deep_transform_keys_in_object!(object, &block)
13
+ def _deep_transform_keyz_in_object!(object, &block)
12
14
  case object
13
15
  when Hash
14
16
  object.keys.each do |key|
15
17
  value = object.delete(key)
16
- object[yield(key)] = _deep_transform_keys_in_object!(value, &block)
18
+ object[yield(key)] = _deep_transform_keyz_in_object!(value, &block)
17
19
  end
18
20
  object
19
21
  when Array
20
- object.map! { |e| _deep_transform_keys_in_object!(e, &block) }
22
+ object.map! { |e| _deep_transform_keyz_in_object!(e, &block) }
21
23
  else
22
24
  object
23
25
  end
24
26
  end
27
+ alias_method :_deep_transform_keys_in_object!, :_deep_transform_keyz_in_object!
25
28
  end
@@ -0,0 +1,15 @@
1
+ class Symbol
2
+ def camelize(uppercase_first_letter = true)
3
+ string = to_s
4
+ string = if uppercase_first_letter
5
+ string.sub(/^[a-z\d]*/) { $&.capitalize }
6
+ else
7
+ string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { $&.downcase }
8
+ end
9
+ string.gsub!(/(?:_|(\/))([a-z\d]*)/i) do
10
+ "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}"
11
+ end
12
+ string.gsub!(/\//, "::")
13
+ string
14
+ end unless :sym.respond_to?(:camelize)
15
+ end
@@ -1,4 +1,5 @@
1
1
  require "thread"
2
+
2
3
  class Thread
3
4
  # Returns the name of the current thread
4
5
  # Default:
@@ -1,4 +1,6 @@
1
1
  class ActionCable::Connection::TaggedLoggerProxy # rubocop:disable ClassAndModuleChildren
2
+ alias_method :orig_tag, :tag
3
+
2
4
  def tag(logger, &block)
3
5
  current_tags = tags - logger.tags
4
6
  logger.tagged(*current_tags, &block)
@@ -1,5 +1,7 @@
1
1
  # Log actual exceptions, not a string representation
2
+
2
3
  module ActionController::Live # rubocop:disable ClassAndModuleChildren
4
+ undef_method :log_error
3
5
  def log_error(exception)
4
6
  logger.fatal(exception)
5
7
  end