sapience 0.2.4 → 0.2.5

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