debug_logging 3.0.0 → 3.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cab0a0dee00124b49ff568d1b1f8dbeaee9ba25b975af8d3fa1f0b4d3af88054
4
- data.tar.gz: f8427104b804d23a284edd3ab8878c96273e8edf4dec850ae3001c15a60bf6ed
3
+ metadata.gz: efda45f99c32dcb0acc32896a61f2d209c527cf62bd74a74282cf044607f396f
4
+ data.tar.gz: d4af27fc700abaa9a536d15c56af36f8a202db7c40d0107a8d8eb1262252aaeb
5
5
  SHA512:
6
- metadata.gz: e871fdb1af74fe7b17c5e66b918edcec67d696b4d45b9bca79025b2a9c35c41a42aa1c8794bd0184aacf34e39ce4c43348ed6b6b96e6d17abb180db10fcabc3b
7
- data.tar.gz: 389312d99d1060d3349bf8f9a1e05a579dfeaf17c40151d1670483152da18c043a4a2b401749dad884b99b9acf3042dcc75e61189e0fc7141ca41d28bac6f264
6
+ metadata.gz: d857b33f90f75e8bdfb3f2deedfb5c503bd90adbabb6b9aead0ecb305ba72715c25435f9d543ff8471454b5c9c5ff631792b870a97864fdb30e530ba4c0e6fb0
7
+ data.tar.gz: 6985ed5caff4dbe017946a61b4f4242867110bcafcf266b62c98ce340d8af28f148b1dee364d3291296d2d5444789a429b254bedcd54bd63be28e4ce5a771b10
@@ -33,7 +33,7 @@ Metrics/AbcSize:
33
33
  # Configuration parameters: CountComments, CountAsOne, ExcludedMethods.
34
34
  # ExcludedMethods: refine
35
35
  Metrics/BlockLength:
36
- Max: 756
36
+ Max: 810
37
37
 
38
38
  # Offense count: 6
39
39
  # Configuration parameters: CountBlocks.
@@ -87,9 +87,13 @@ Style/Documentation:
87
87
  - 'lib/debug_logging.rb'
88
88
  - 'lib/debug_logging/argument_printer.rb'
89
89
  - 'lib/debug_logging/class_logger.rb'
90
+ - 'lib/debug_logging/class_notifier.rb'
90
91
  - 'lib/debug_logging/configuration.rb'
91
92
  - 'lib/debug_logging/instance_logger.rb'
92
93
  - 'lib/debug_logging/instance_logger_modulizer.rb'
94
+ - 'lib/debug_logging/instance_notifier.rb'
95
+ - 'lib/debug_logging/instance_notifier_modulizer.rb'
96
+ - 'lib/debug_logging/log_subscriber.rb'
93
97
  - 'lib/simple_debug_logging.rb'
94
98
 
95
99
  # Offense count: 1
@@ -99,6 +103,7 @@ Style/Documentation:
99
103
  Style/EmptyElse:
100
104
  Exclude:
101
105
  - 'lib/debug_logging/class_logger.rb'
106
+ - 'lib/debug_logging/class_notifier.rb'
102
107
 
103
108
  # Offense count: 2
104
109
  # Configuration parameters: EnforcedStyle.
@@ -111,7 +116,9 @@ Style/FormatStringToken:
111
116
  Style/IdenticalConditionalBranches:
112
117
  Exclude:
113
118
  - 'lib/debug_logging/class_logger.rb'
119
+ - 'lib/debug_logging/class_notifier.rb'
114
120
  - 'lib/debug_logging/instance_logger_modulizer.rb'
121
+ - 'lib/debug_logging/instance_notifier_modulizer.rb'
115
122
 
116
123
  # Offense count: 1
117
124
  Style/MultilineBlockChain:
data/README.md CHANGED
@@ -29,7 +29,9 @@ Unobtrusive, inheritable-overridable-configurable, drop-in debug logging, that w
29
29
  * *single line config, per class/instance/method config*
30
30
  * *separate logger, if needed*
31
31
  * *log method calls, also when exit scope*
32
- * *Prevents heavy computation of strings with `logger.debug { 'log me' }` block format.*
32
+ * *Prevents heavy computation of strings with `logger.debug { 'log me' }` block format, since v1.0.12*
33
+ * *ActiveSupport::Notifications integration for instrumenting/logging events on class and instance methods, since v3.1*
34
+ * *Optional instance variable logging, sine v3.1*
33
35
  * **so many free ponies** 🎠🐴🎠🐴🎠🐴
34
36
 
35
37
  ## Next Level Magic
@@ -40,7 +42,10 @@ Herein you will find:
40
42
  * Zero tolerance policy on monkey patching
41
43
  * 100% clean, 0% obtrusive
42
44
  * 100% tested
43
- * 100% Ruby 2.3+ compatible
45
+ * 100% Ruby 2.1+ compatible
46
+ - use version ~1.0 for Ruby < 2.3
47
+ - use version ~2.0 for Ruby 2.3
48
+ - use version ~3.0 for Ruby 2.4+
44
49
 
45
50
  NOTE: The manner this is made to work for class methods is totally different than the way this is made to work for instance methods.
46
51
 
@@ -62,8 +67,6 @@ Or install it yourself as:
62
67
 
63
68
  ## Usage
64
69
 
65
- NOTE: Starting with version `1.0.12` this gem utilizes the `logger.debug { "block format" }` to avoid heavy debug processing when the log level threshold is set higher than the level of the statements produced as a result of the configuration of this gem.
66
-
67
70
  Crack open the specs for more complex usage examples than the ones below.
68
71
 
69
72
  ### Without Rails
@@ -85,6 +88,7 @@ DebugLogging.configuration.last_hash_max_length = 1_000
85
88
  DebugLogging.configuration.args_max_length = 1_000
86
89
  DebugLogging.configuration.instance_benchmarks = false
87
90
  DebugLogging.configuration.class_benchmarks = false
91
+ DebugLogging.configuration.active_support_notifications = false
88
92
  DebugLogging.configuration.colorized_chain_for_method = false # e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
89
93
  DebugLogging.configuration.colorized_chain_for_class = false # e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
90
94
  DebugLogging.configuration.add_invocation_id = true # identify a method call uniquely in a log, pass a proc for colorization, e.g. ->(colorized_string) { colorized_string.light_black }
@@ -104,6 +108,7 @@ DebugLogging.configure do |config|
104
108
  config.args_max_length = 1_000
105
109
  config.instance_benchmarks = false
106
110
  config.class_benchmarks = false
111
+ config.active_support_notifications = false
107
112
  config.colorized_chain_for_method = false # e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
108
113
  config.colorized_chain_for_class = false # e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
109
114
  config.add_invocation_id = true # identify a method call uniquely in a log, pass a proc for colorization, e.g. ->(colorized_string) { colorized_string.light_black }
@@ -127,7 +132,7 @@ Just send along a hash of the config options when you call `logged` or `include
127
132
  DebugLogging.configuration.logger = Rails.logger
128
133
  ```
129
134
 
130
- Every time a method is called, get logs, optionally with arguments, a benchmarck, and a unique invocation identifier:
135
+ Every time a method is called, you can now get logs, optionally with arguments, a benchmark, and a unique invocation identifier:
131
136
 
132
137
  ```ruby
133
138
  class Car
@@ -170,6 +175,60 @@ class Car
170
175
  end
171
176
  ```
172
177
 
178
+ ### ActiveSupport::Notifications integration
179
+
180
+ To use `ActiveSupport::Notifications` integration, enable `active_support_notifications` in the config, either single line or block style:
181
+
182
+ ```ruby
183
+ DebugLogging.configuration.active_support_notifications = true
184
+ ```
185
+
186
+ or
187
+
188
+ ```ruby
189
+ DebugLogging.configure do |config|
190
+ config.active_support_notifications = true
191
+ end
192
+ ```
193
+
194
+ Every time a method is called, class and instance method events are instrumented, consumed and logged:
195
+
196
+ ```ruby
197
+ class Car
198
+
199
+ # adds the helper methods to the class, all are prefixed with debug_*,
200
+ # except for the instrumented class method, which comes from extending DebugLogging::ClassNotifier
201
+ extend DebugLogging
202
+
203
+ # For instance methods:
204
+ # Option 1: specify the exact method(s) to add instrumentation to (including capturing instance variable values as part of the event payload)
205
+ include DebugLogging::InstanceNotifier.new(i_methods: [:drive,
206
+ :stop,
207
+ [:turn, { instance_variables: %i[direction angle] }]])
208
+
209
+ # Provides the `notifies` method decorator
210
+ extend DebugLogging::ClassNotifier
211
+
212
+ notifies def make; new; end
213
+ def design(*args); new; end
214
+ def safety(*args); new; end
215
+ def dealer_options(*args); new; end
216
+ notifies :design, :safety
217
+ # adding additional event payload options for any instance method(s), by passing a hash as the last argument
218
+ notifies :dealer_options, { sport_package: true }
219
+
220
+ def drive(speed); speed; end
221
+ def stop(**opts); 0; end
222
+
223
+ # For instance methods:
224
+ # Option 2: add instrumentation to all instance methods defined above (but *not* defined below)
225
+ include DebugLogging::InstanceNotifier.new(i_methods: self.instance_methods(false))
226
+
227
+ def will_not_be_logged; false; end
228
+
229
+ end
230
+ ```
231
+
173
232
  ## Development
174
233
 
175
234
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -202,7 +261,7 @@ dependency on this gem using the [Pessimistic Version Constraint](http://docs.ru
202
261
  For example:
203
262
 
204
263
  ```ruby
205
- spec.add_dependency 'debug_logging', '~> 2.0'
264
+ spec.add_dependency 'debug_logging', '~> 3.1'
206
265
  ```
207
266
 
208
267
  ## License [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
@@ -27,6 +27,7 @@ Automatically log selected methods and their arguments as they are called at run
27
27
  spec.required_ruby_version = '>= 2.4.0' # Uses magic comments
28
28
 
29
29
  spec.add_runtime_dependency 'colorize', '>= 0'
30
+ spec.add_development_dependency 'activesupport', '~> 5.2', '>= 5.2.4.4'
30
31
  spec.add_development_dependency 'bundler', '>= 2'
31
32
  spec.add_development_dependency 'byebug', '>= 11'
32
33
  spec.add_development_dependency 'rake', '>= 13'
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'debug_logging/log_subscriber'
4
+ require 'debug_logging/class_notifier'
5
+ require 'debug_logging/instance_notifier_modulizer'
6
+ require 'debug_logging/instance_notifier'
@@ -6,6 +6,10 @@ module DebugLogging
6
6
  "completed in #{format('%f', tms.real)}s (#{format('%f', tms.total)}s CPU)"
7
7
  end
8
8
 
9
+ def debug_event_name_to_s(method_to_notify: nil)
10
+ "#{method_to_notify}.log"
11
+ end
12
+
9
13
  def debug_invocation_id_to_s(args: nil, config_proxy: nil)
10
14
  if config_proxy.debug_add_invocation_id
11
15
  invocation = " ~#{args.object_id}@#{(Time.now.to_f.to_s % '%#-21a')[4..-4]}~"
@@ -79,7 +83,7 @@ module DebugLogging
79
83
  # handle double splat
80
84
  printed_args += ("**#{args.map(&:inspect).join(', ').tap { |x| add_args_ellipsis = x.length > config_proxy.debug_args_max_length }}")[0..(config_proxy.debug_args_max_length)]
81
85
  else
82
- printed_args += args.map(&:inspect).join(', ').tap { |x| add_args_ellipsis = x.length > config_proxy.debug_args_max_length}[0..(config_proxy.debug_args_max_length)]
86
+ printed_args += args.map(&:inspect).join(', ').tap { |x| add_args_ellipsis = x.length > config_proxy.debug_args_max_length }[0..(config_proxy.debug_args_max_length)]
83
87
  end
84
88
  printed_args += config_proxy.debug_ellipsis if add_args_ellipsis
85
89
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DebugLogging
4
+ module ClassNotifier
5
+ def notifies(*methods_to_notify)
6
+ payload = methods_to_notify.last.is_a?(Hash) && methods_to_notify.pop || {}
7
+ if methods_to_notify.first.is_a?(Array)
8
+ methods_to_notify = methods_to_notify.shift
9
+ else
10
+ # logged :meth1, :meth2, :meth3 without options is valid too
11
+ end
12
+ methods_to_notify.each do |method_to_notify|
13
+ # method name must be a symbol
14
+ method_to_notify = method_to_notify.to_sym
15
+ original_method = method(method_to_notify)
16
+ config_proxy = nil
17
+ (class << self; self; end).class_eval do
18
+ define_method(method_to_notify) do |*args, &block|
19
+ config_proxy = if (proxy = instance_variable_get(DebugLogging::Configuration.config_pointer('k', method_to_notify)))
20
+ proxy
21
+ else
22
+ proxy = if !payload.empty?
23
+ Configuration.new(**debug_config.to_hash.merge(payload))
24
+ else
25
+ debug_config
26
+ end
27
+ proxy.register(method_to_notify)
28
+ instance_variable_set(DebugLogging::Configuration.config_pointer('k', method_to_notify), proxy)
29
+ proxy
30
+ end
31
+ ActiveSupport::Notifications.instrument(
32
+ debug_event_name_to_s(method_to_notify: method_to_notify), { args: args }.merge(payload)
33
+ ) do
34
+ original_method.call(*args, &block)
35
+ end
36
+ end
37
+ end
38
+
39
+ ActiveSupport::Notifications.subscribe(/log/) do |*args|
40
+ config_proxy&.log do
41
+ DebugLogging::LogSubscriber.log_event(ActiveSupport::Notifications::Event.new(*args))
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -9,7 +9,7 @@ module DebugLogging
9
9
  attr_accessor :logger, :log_level, :multiple_last_hashes, :last_hash_to_s_proc, :last_hash_max_length,
10
10
  :args_max_length, :colorized_chain_for_method, :colorized_chain_for_class, :add_invocation_id,
11
11
  :ellipsis, :mark_scope_exit
12
- attr_reader :instance_benchmarks, :class_benchmarks, :methods_to_log
12
+ attr_reader :instance_benchmarks, :class_benchmarks, :active_support_notifications, :methods_to_log
13
13
  # alias the readers to the debug_* prefix so an instance of this class
14
14
  # can have the same API granted by `extend DebugLogging`
15
15
  #
@@ -59,13 +59,14 @@ module DebugLogging
59
59
  @last_hash_to_s_proc = options.key?(:last_hash_to_s_proc) ? options[:last_hash_to_s_proc] : nil
60
60
  @last_hash_max_length = options.key?(:last_hash_max_length) ? options[:last_hash_max_length] : 1_000
61
61
  @args_max_length = options.key?(:args_max_length) ? options[:args_max_length] : 1_000
62
- @instance_benchmarks = options.key?(:instance_benchmarks) ? options[:instance_benchmarks] : false
63
- @class_benchmarks = options.key?(:class_benchmarks) ? options[:class_benchmarks] : false
64
62
  @colorized_chain_for_method = options.key?(:colorized_chain_for_method) ? options[:colorized_chain_for_method] : false
65
63
  @colorized_chain_for_class = options.key?(:colorized_chain_for_class) ? options[:colorized_chain_for_class] : false
66
64
  @add_invocation_id = options.key?(:add_invocation_id) ? options[:add_invocation_id] : true
67
65
  @ellipsis = options.key?(:ellipsis) ? options[:ellipsis] : DEFAULT_ELLIPSIS
68
66
  @mark_scope_exit = options.key?(:mark_scope_exit) ? options[:mark_scope_exit] : false
67
+ self.instance_benchmarks = options.key?(:instance_benchmarks) ? options[:instance_benchmarks] : false
68
+ self.class_benchmarks = options.key?(:class_benchmarks) ? options[:class_benchmarks] : false
69
+ self.active_support_notifications = options.key?(:active_support_notifications) ? options[:active_support_notifications] : false
69
70
  @methods_to_log = []
70
71
  end
71
72
 
@@ -108,6 +109,11 @@ module DebugLogging
108
109
  @class_benchmarks = class_benchmarks
109
110
  end
110
111
 
112
+ def active_support_notifications=(active_support_notifications)
113
+ require 'debug_logging/active_support_notifications' if active_support_notifications
114
+ @active_support_notifications = active_support_notifications
115
+ end
116
+
111
117
  def to_hash
112
118
  {
113
119
  logger: logger,
@@ -122,7 +128,8 @@ module DebugLogging
122
128
  colorized_chain_for_class: colorized_chain_for_class,
123
129
  add_invocation_id: add_invocation_id,
124
130
  ellipsis: ellipsis,
125
- mark_scope_exit: mark_scope_exit
131
+ mark_scope_exit: mark_scope_exit,
132
+ active_support_notifications: active_support_notifications
126
133
  }
127
134
  end
128
135
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DebugLogging
4
+ class InstanceNotifier < Module
5
+ def initialize(i_methods: nil)
6
+ super()
7
+ @instance_methods_to_notify = Array(i_methods) if i_methods
8
+ end
9
+
10
+ def included(base)
11
+ return unless @instance_methods_to_notify
12
+
13
+ base.send(:include, ArgumentPrinter)
14
+ instance_method_notifier = DebugLogging::InstanceNotifierModulizer.to_mod(methods_to_notify: @instance_methods_to_notify)
15
+ base.send(:prepend, instance_method_notifier)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DebugLogging
4
+ module InstanceNotifierModulizer
5
+ def self.to_mod(methods_to_notify: nil)
6
+ Module.new do
7
+ Array(methods_to_notify).each do |method_to_notify|
8
+ # method name must be a symbol
9
+ payload = method_to_notify.is_a?(Array) && method_to_notify.last.is_a?(Hash) && method_to_notify.pop || {}
10
+ if method_to_notify.is_a?(Array)
11
+ method_to_notify = method_to_notify.first&.to_sym
12
+ else
13
+ method_to_notify.to_sym
14
+ end
15
+ config_proxy = nil
16
+ define_method(method_to_notify) do |*args, &block|
17
+ config_proxy = if (proxy = instance_variable_get(DebugLogging::Configuration.config_pointer('i', method_to_notify)))
18
+ proxy
19
+ else
20
+ proxy = if !payload.empty?
21
+ Configuration.new(**self.class.debug_config.to_hash.merge(payload))
22
+ else
23
+ self.class.debug_config
24
+ end
25
+ proxy.register(method_to_notify)
26
+ instance_variable_set(DebugLogging::Configuration.config_pointer('i', method_to_notify), proxy)
27
+ proxy
28
+ end
29
+ if payload.key?(:instance_variables)
30
+ payload[:instance_variables].each do |k|
31
+ payload[k] = instance_variable_get("@#{k}") if instance_variable_get("@#{k}")
32
+ end
33
+ payload.delete(:instance_variables)
34
+ end
35
+ ActiveSupport::Notifications.instrument(
36
+ self.class.debug_event_name_to_s(method_to_notify: method_to_notify), { args: args }.merge(payload)
37
+ ) do
38
+ super(*args, &block)
39
+ end
40
+ end
41
+
42
+ ActiveSupport::Notifications.subscribe(/log/) do |*args|
43
+ config_proxy&.log do
44
+ DebugLogging::LogSubscriber.log_event(ActiveSupport::Notifications::Event.new(*args))
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/log_subscriber'
4
+
5
+ module DebugLogging
6
+ class LogSubscriber < ActiveSupport::LogSubscriber
7
+ class << self
8
+ attr_accessor :event
9
+ end
10
+ attach_to :log
11
+
12
+ EVENT_FORMAT_STRING = '%<name>s (%<duration>.3f secs) start=%<time>s end=%<end>s payload=%<payload>s'
13
+
14
+ def self.log_event(event)
15
+ @event = event
16
+ if event.payload && event.payload[:exception_object]
17
+ exception = event.payload[:exception_object]
18
+ "#{event.name} [ERROR] : \n#{exception.class} : #{exception.message}\n" + exception.backtrace.join("\n")
19
+ end
20
+ format(EVENT_FORMAT_STRING, event_to_format_options(event))
21
+ end
22
+
23
+ # @param [ActiveSupport::Notifications::Event]
24
+ # @return [Hash]
25
+ def self.event_to_format_options(event)
26
+ {
27
+ name: event.name,
28
+ duration: Rational(event.duration, 1000).to_f,
29
+ time: event.time,
30
+ end: event.end,
31
+ payload: event.payload
32
+ }
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DebugLogging
4
- VERSION = '3.0.0'
4
+ VERSION = '3.1.0'
5
5
  end
@@ -21,8 +21,6 @@
21
21
  # logged :a_class_method
22
22
  # end
23
23
  #
24
- # Make sure you have the latest debug_logging gem (>= 1.0.10) installed for this to work
25
- #
26
24
  # In an irb session:
27
25
  # >> require_relative 'unobtrusively_logged'
28
26
  # => true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: debug_logging
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-07 00:00:00.000000000 Z
11
+ date: 2020-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -24,6 +24,26 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.2'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 5.2.4.4
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '5.2'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 5.2.4.4
27
47
  - !ruby/object:Gem::Dependency
28
48
  name: bundler
29
49
  requirement: !ruby/object:Gem::Requirement
@@ -159,11 +179,16 @@ files:
159
179
  - bin/setup
160
180
  - debug_logging.gemspec
161
181
  - lib/debug_logging.rb
182
+ - lib/debug_logging/active_support_notifications.rb
162
183
  - lib/debug_logging/argument_printer.rb
163
184
  - lib/debug_logging/class_logger.rb
185
+ - lib/debug_logging/class_notifier.rb
164
186
  - lib/debug_logging/configuration.rb
165
187
  - lib/debug_logging/instance_logger.rb
166
188
  - lib/debug_logging/instance_logger_modulizer.rb
189
+ - lib/debug_logging/instance_notifier.rb
190
+ - lib/debug_logging/instance_notifier_modulizer.rb
191
+ - lib/debug_logging/log_subscriber.rb
167
192
  - lib/debug_logging/version.rb
168
193
  - lib/simple_debug_logging.rb
169
194
  homepage: https://github.com/pboling/debug_logging