gem_logger 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/.gitignore +1 -0
- data/.travis.yml +6 -1
- data/Gemfile +2 -1
- data/README.md +26 -0
- data/gem_logger.gemspec +1 -1
- data/lib/gem_logger.rb +3 -44
- data/lib/gem_logger/basic_logger.rb +2 -2
- data/lib/gem_logger/context_handler.rb +31 -0
- data/lib/gem_logger/gem_logger.rb +45 -0
- data/lib/gem_logger/logger_support.rb +72 -8
- data/lib/gem_logger/version.rb +1 -1
- data/test/test_helper.rb +13 -12
- data/test/unit/gem_logger/context_handler_test.rb +45 -0
- data/test/unit/gem_logger/logger_support_test.rb +160 -42
- metadata +61 -72
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YmU1OWJkMTFmMTg5MWExNDYwMzJjOWQ2OWM4N2ViZTI1ZDU3ZDQyM2MzOTc4
|
10
|
-
ZDBlZGVjODBhMGIwNTk3MmM0NzFkNGNjMTZlNTcxMGJmMTBkZWU4MTI0ZjYy
|
11
|
-
OTE1NDBlYzRiNjZhYmJiZWU2MDA0MmYxY2U2OGVjZjgwZjU1MzA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MzYzZmMxYzAzYTZjOTRmNjUyOWI4YWY5NGRjYjZiNDhiNzM2OTdhMDAwNzdk
|
14
|
-
NzI4ZDhkZGY5OTBhZWY2MDI4ZjdlY2E2MzNiNzNlYzFhYzc0ZjljM2YxZGIx
|
15
|
-
NWEzODBlZDcxY2FkMTQ5MzQxNTlhNjdlYjc4Njc1NTI1ODMwMGY=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cac9834fee2a3e0b443c0385601b22831093517f
|
4
|
+
data.tar.gz: 312e92da1a677e310c80b02b42ccb94cce8cfa52
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 31460132ab3adec8fa05f3457cdf1b39629b7870aa86a5f3a619e43661afeb66f11b0f94cb55e7a13a50089e8e0c51637c3112456b64201ea6ef4f652eb5db53
|
7
|
+
data.tar.gz: 09e7ed4a79a2ee5ab9e5cb45e8781b021cfd249148a21f6d99883a1dd98fe453b41f83275058de4f6092596850b5107613070b28e805cfdd352c890a250c85bb
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -2,9 +2,10 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in gem_logger.gemspec
|
4
4
|
gemspec
|
5
|
-
|
6
5
|
# so we can test GemLogger.logger_concern
|
7
6
|
gem "lumber", :require => false
|
8
7
|
|
9
8
|
# for code coverage during travis-ci test runs
|
10
9
|
gem 'coveralls', :require => false
|
10
|
+
|
11
|
+
gem "mocha", :require => false
|
data/README.md
CHANGED
@@ -21,3 +21,29 @@ Include the GemLogger::Logger concern into the classes that need to be able to l
|
|
21
21
|
|
22
22
|
end
|
23
23
|
|
24
|
+
## Context
|
25
|
+
|
26
|
+
It is also possible to add context to your log messages through the context call:
|
27
|
+
|
28
|
+
MyClass.logger.context(:key => 'value').debug("I want context here")
|
29
|
+
|
30
|
+
as well as include backtraces and context to exceptions by calling the log_exception method with the error and a custom message:
|
31
|
+
|
32
|
+
MyClass.logger.log_exception(StandardError.new('uh oh'), 'This is bad')
|
33
|
+
|
34
|
+
By default, log_exception uses the ERROR level, but also accepts a level as an option:
|
35
|
+
|
36
|
+
MyClass.logger.log_exception(StandardError.new('uh oh'), 'This is bad', {:level => :debug})
|
37
|
+
|
38
|
+
Unless otherwise specified, the context is added to the beginning of the log message in a basic key = value format. You can, however, define your own context handler, and pass it in on initialization:
|
39
|
+
|
40
|
+
GemLogger.configure do |config| do
|
41
|
+
config.context_handler = MyHandler
|
42
|
+
end
|
43
|
+
|
44
|
+
The class should implement:
|
45
|
+
get_context - initialize and return the context
|
46
|
+
add_to_context(key, val) - add a given value to the context at key
|
47
|
+
remove_from_context(key) - remove the key from the context
|
48
|
+
format_msg_with_context(msg) - takes the base log message and adds the context to it, returning the final message.
|
49
|
+
|
data/gem_logger.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
-
spec.add_development_dependency "minitest"
|
23
|
+
spec.add_development_dependency "minitest", "~> 4.0"
|
24
24
|
spec.add_development_dependency "minitest_should"
|
25
25
|
spec.add_development_dependency "minitest-reporters"
|
26
26
|
spec.add_development_dependency "factory_girl"
|
data/lib/gem_logger.rb
CHANGED
@@ -2,51 +2,10 @@ require "gem_logger/version"
|
|
2
2
|
|
3
3
|
require 'logger'
|
4
4
|
require 'active_support/concern'
|
5
|
+
require 'active_support/core_ext/object'
|
5
6
|
require 'active_support/core_ext/module/delegation'
|
6
7
|
|
7
8
|
require "gem_logger/basic_logger"
|
9
|
+
require "gem_logger/context_handler"
|
10
|
+
require "gem_logger/gem_logger"
|
8
11
|
require "gem_logger/logger_support"
|
9
|
-
|
10
|
-
# To configure gem_logger, add something like the
|
11
|
-
# following to an initializer (defaults shown):
|
12
|
-
#
|
13
|
-
# GemLogger.configure do |config|
|
14
|
-
#
|
15
|
-
# # The default logger instance to use
|
16
|
-
# # (optional, defaults to Logger.new)
|
17
|
-
# config.default_logger = CustomLogger.new
|
18
|
-
#
|
19
|
-
# # module to include when GemLogger::LoggerSupport is included
|
20
|
-
# # (optional, defaults to GemLogger::BasicLogger)
|
21
|
-
# config.logger_concern = SomeModule
|
22
|
-
#
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
module GemLogger
|
26
|
-
|
27
|
-
# Allows configuring via class accessors
|
28
|
-
class << self
|
29
|
-
# The logger concern (ActiveSupport::Concern) to include when clients include GemLogger::Logger
|
30
|
-
# The module needs to cause a class level "logger" method (returning the logger instance) to be deSupportfined on the client
|
31
|
-
attr_accessor :logger_concern
|
32
|
-
end
|
33
|
-
|
34
|
-
# default values
|
35
|
-
self.logger_concern = GemLogger::BasicLogger
|
36
|
-
|
37
|
-
# The default_logger to use with GemLogger::BasicLogger
|
38
|
-
def self.default_logger
|
39
|
-
@default_logger ||= ::Logger.new(STDOUT)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Set the default_logger to use with GemLogger::BasicLogger
|
43
|
-
def self.default_logger=(default_logger)
|
44
|
-
@default_logger = default_logger
|
45
|
-
end
|
46
|
-
|
47
|
-
# Allows configuring via class accessors
|
48
|
-
def self.configure
|
49
|
-
yield self
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module GemLogger
|
2
|
+
module ContextHandler
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
# Initializes and returns context hash.
|
6
|
+
def get_context
|
7
|
+
@context_hash ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_to_context(key, value)
|
11
|
+
@context_hash[key.to_s] = value.to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def remove_from_context(key)
|
15
|
+
@context_hash.delete(key.to_s)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Adds the keys/values to the message to be logged in a basic [key=val] format.
|
19
|
+
def format_msg_with_context(msg)
|
20
|
+
if @context_hash.keys.length > 0
|
21
|
+
msg_context = '['
|
22
|
+
@context_hash.each do |k, v|
|
23
|
+
msg_context += "#{k}=#{v} "
|
24
|
+
end
|
25
|
+
msg_context += '] '
|
26
|
+
msg = msg.prepend(msg_context)
|
27
|
+
end
|
28
|
+
msg
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# To configure gem_logger, add something like the
|
2
|
+
# following to an initializer (defaults shown):
|
3
|
+
#
|
4
|
+
# GemLogger.configure do |config|
|
5
|
+
#
|
6
|
+
# # The default logger instance to use
|
7
|
+
# # (optional, defaults to Logger.new)
|
8
|
+
# config.default_logger = CustomLogger.new
|
9
|
+
#
|
10
|
+
# # module to include when GemLogger::LoggerSupport is included
|
11
|
+
# # (optional, defaults to GemLogger::BasicLogger)
|
12
|
+
# config.logger_concern = SomeModule
|
13
|
+
#
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
module GemLogger
|
17
|
+
|
18
|
+
# Allows configuring via class accessors
|
19
|
+
class << self
|
20
|
+
# The logger concern (ActiveSupport::Concern) to include when clients include GemLogger::Logger
|
21
|
+
# The module needs to cause a class level "logger" method (returning the logger instance) to be defined on the client
|
22
|
+
attr_accessor :logger_concern
|
23
|
+
attr_accessor :context_handler
|
24
|
+
end
|
25
|
+
|
26
|
+
# default values
|
27
|
+
self.logger_concern = GemLogger::BasicLogger
|
28
|
+
self.context_handler = GemLogger::ContextHandler
|
29
|
+
|
30
|
+
# The default_logger to use with GemLogger::BasicLogger
|
31
|
+
def self.default_logger
|
32
|
+
@default_logger ||= ::Logger.new(STDOUT).extend(LoggerSupport::LogContext)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Set the default_logger to use with GemLogger::BasicLogger
|
36
|
+
def self.default_logger=(default_logger)
|
37
|
+
@default_logger = default_logger
|
38
|
+
end
|
39
|
+
|
40
|
+
# Allows configuring via class accessors
|
41
|
+
def self.configure
|
42
|
+
yield self
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
module GemLogger
|
2
2
|
module LoggerSupport
|
3
|
-
|
3
|
+
|
4
4
|
extend ActiveSupport::Concern
|
5
|
-
|
5
|
+
|
6
6
|
included do
|
7
7
|
# A guard to prevent misuse, may just want a log message instead of a hard fail
|
8
8
|
if self.class == Module && ! self.singleton_class.included_modules.include?(ActiveSupport::Concern)
|
9
9
|
raise ArgumentError, "module that includes #{self.name} must be an ActiveSupport::Concern"
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
include GemLogger.logger_concern
|
13
|
-
|
14
|
-
delegate :logger, :log_exception, :log_warning, :log_message, :to => "self.class"
|
13
|
+
|
14
|
+
delegate :logger, :log_exception, :log_warning, :log_message, :to => "self.class"
|
15
15
|
end
|
16
|
-
|
17
|
-
module ClassMethods
|
18
16
|
|
17
|
+
module ClassMethods
|
18
|
+
# @deprecated Consider using {#logger.context(:exception => exception.class).error("Exception: ...")} instead
|
19
19
|
def log_exception(exception, opts={})
|
20
20
|
logger.error("Exception #{generate_message(exception, opts)}")
|
21
21
|
end
|
@@ -44,7 +44,71 @@ module GemLogger
|
|
44
44
|
|
45
45
|
"#{log_encode(message_prefix)}#{log_encode(exception.inspect)}, #{log_encode(opts.inspect)}:\n#{exception.backtrace.collect {|x| log_encode(x)}.join("\n") rescue 'no backtrace'}"
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
module ContextLoggerCommon
|
52
|
+
# @param [Hash] added_context - A hash containing context that will be added to the log messages produced by the
|
53
|
+
# returned logger
|
54
|
+
# @returns [LogContextLogger] - logger with the added context
|
55
|
+
def context(added_context)
|
56
|
+
LogContextLogger.new(self.logger, self.log_context.merge(added_context))
|
57
|
+
end
|
58
|
+
|
59
|
+
# Adds an event_type to the context
|
60
|
+
# @param [Symbol] event_type - The event type, which will be added to the context of this log statement
|
61
|
+
def event_context(event_type)
|
62
|
+
context(:event_type => event_type)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Adds an exception class to the context
|
66
|
+
# @param [Exception] exception
|
67
|
+
def exception_context(exception)
|
68
|
+
context(:exception => exception.class.to_s)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Logs an exception, including the backtrace.
|
72
|
+
# @param [Exception] exception
|
73
|
+
# @param [String] message
|
74
|
+
# @option [Symbol] :level - The log level to log the message at (default :error)
|
75
|
+
def log_exception(e, message, options = {})
|
76
|
+
level = options.delete(:level) || :error
|
77
|
+
backtrace = e.backtrace.try{ |b| b.join("\n") } || '(no backtrace)'
|
78
|
+
exception_context(e).send(level, "#{message}: #{e} #{backtrace}")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# The base context logger.
|
83
|
+
module LogContext
|
84
|
+
include ContextLoggerCommon
|
85
|
+
|
86
|
+
def log_context
|
87
|
+
{}
|
88
|
+
end
|
89
|
+
|
90
|
+
def logger
|
91
|
+
self
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
LogContextLogger = Struct.new(:logger, :log_context) do
|
96
|
+
include ContextLoggerCommon
|
97
|
+
include GemLogger.context_handler
|
98
|
+
|
99
|
+
[:debug, :info, :warn, :error, :fatal].each do |method|
|
100
|
+
define_method(method) { |msg| self.log(method, msg) }
|
101
|
+
end
|
102
|
+
|
103
|
+
def log(level, msg)
|
104
|
+
existing_context = get_context
|
105
|
+
self.log_context.each { |k,v| add_to_context(k, v) }
|
106
|
+
msg = format_msg_with_context(msg)
|
107
|
+
self.logger.send(level, msg)
|
108
|
+
ensure
|
109
|
+
self.log_context.each { |k,v| remove_from_context(k) }
|
110
|
+
existing_context.each { |k,v| add_to_context(k, v) }
|
111
|
+
end
|
48
112
|
end
|
49
113
|
|
50
114
|
end
|
data/lib/gem_logger/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -17,14 +17,15 @@ end
|
|
17
17
|
require 'minitest/autorun'
|
18
18
|
require 'minitest/should'
|
19
19
|
require "minitest/reporters"
|
20
|
+
require "mocha/setup"
|
20
21
|
|
21
22
|
reporter = ENV['REPORTER']
|
22
23
|
reporter = case reporter
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
24
|
+
when 'none' then nil
|
25
|
+
when 'spec' then MiniTest::Reporters::SpecReporter.new
|
26
|
+
when 'progress' then MiniTest::Reporters::ProgressReporter.new
|
27
|
+
else MiniTest::Reporters::DefaultReporter.new
|
28
|
+
end
|
28
29
|
MiniTest::Reporters.use!(reporter) if reporter
|
29
30
|
|
30
31
|
require 'gem_logger'
|
@@ -36,7 +37,7 @@ class << MiniTest::Unit.runner
|
|
36
37
|
# Minitest runs each context as a suite
|
37
38
|
# Minitest filters methods by matching against: <suite>#test_0001_<should>
|
38
39
|
# Nested contexts are separted by spaces in rubymine, but ::s in minitest
|
39
|
-
|
40
|
+
|
40
41
|
def _run_suites(suites, type)
|
41
42
|
if options[:filter]
|
42
43
|
if options[:filter] =~ /\/\\Atest\\: (.*) should (.*)\\\.\//
|
@@ -49,21 +50,21 @@ class << MiniTest::Unit.runner
|
|
49
50
|
options[:filter] = "/\\A#{context_filter}(Test)?#test(_\\d+)?_should_#{should_filter}\\Z/"
|
50
51
|
end
|
51
52
|
end
|
52
|
-
|
53
|
+
|
53
54
|
super
|
54
55
|
end
|
55
|
-
|
56
|
+
|
56
57
|
# Prevent "Empty test suite" verbosity when running in rubymine
|
57
58
|
def _run_suite(suite, type)
|
58
|
-
|
59
|
+
|
59
60
|
filter = options[:filter] || '/./'
|
60
|
-
filter = Regexp.new $1 if filter =~ /\/(.*)\//
|
61
|
+
filter = Regexp.new $1 if filter =~ /\/(.*)\//
|
61
62
|
all_test_methods = suite.send "#{type}_methods"
|
62
63
|
filtered_test_methods = all_test_methods.find_all { |m|
|
63
64
|
filter === m || filter === "#{suite}##{m}"
|
64
65
|
}
|
65
|
-
|
66
|
-
if filtered_test_methods.size > 0
|
66
|
+
|
67
|
+
if filtered_test_methods.size > 0
|
67
68
|
super
|
68
69
|
else
|
69
70
|
[0, 0]
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
module GemLogger
|
4
|
+
class ContextHandlerTest < Minitest::Should::TestCase
|
5
|
+
|
6
|
+
setup do
|
7
|
+
class MyClass
|
8
|
+
include GemLogger::ContextHandler
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
should "return empty hash on get_context" do
|
13
|
+
assert_equal Hash.new, MyClass.new.get_context
|
14
|
+
end
|
15
|
+
|
16
|
+
should 'add given arguments to context on add_context' do
|
17
|
+
klass = MyClass.new
|
18
|
+
klass.get_context
|
19
|
+
klass.add_to_context('foo', 'bar')
|
20
|
+
assert_equal Hash['foo', 'bar'], klass.get_context
|
21
|
+
end
|
22
|
+
|
23
|
+
should "convert add_to_context args to strings" do
|
24
|
+
klass = MyClass.new
|
25
|
+
klass.get_context
|
26
|
+
klass.add_to_context(:foo, :bar)
|
27
|
+
assert_equal Hash['foo', 'bar'], klass.get_context
|
28
|
+
end
|
29
|
+
|
30
|
+
should "pass remove_from_context to Log4r remove" do
|
31
|
+
klass = MyClass.new
|
32
|
+
klass.get_context
|
33
|
+
klass.remove_from_context('foo')
|
34
|
+
assert_equal Hash.new, klass.get_context
|
35
|
+
end
|
36
|
+
|
37
|
+
should "convert remove_from_context args to strings" do
|
38
|
+
klass = MyClass.new
|
39
|
+
klass.get_context
|
40
|
+
klass.add_to_context('foo', 'bar')
|
41
|
+
klass.remove_from_context(:foo)
|
42
|
+
assert_equal Hash.new, klass.get_context
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -2,42 +2,42 @@ require_relative '../../test_helper'
|
|
2
2
|
|
3
3
|
module GemLogger
|
4
4
|
class LoggerSupportTest < Minitest::Should::TestCase
|
5
|
-
|
5
|
+
|
6
6
|
setup do
|
7
7
|
@uniq = SecureRandom.uuid.gsub("-", "")
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
teardown do
|
11
11
|
LoggerSupportTest.constants.grep(/^Foo/).each do |c|
|
12
12
|
LoggerSupportTest.send(:remove_const, c)
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def new_module(module_name, &block)
|
17
17
|
mod = self.class.const_set module_name, Module.new
|
18
18
|
mod.class_eval(&block)
|
19
19
|
mod
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
# can't do this dynamically as the class name needs to be set at inheritance time for lumber to work
|
23
23
|
def new_class(class_name, super_class=nil, &block)
|
24
24
|
s = "class #{class_name}"
|
25
25
|
s << " < #{super_class}" if super_class
|
26
26
|
s << "; end"
|
27
|
-
|
27
|
+
|
28
28
|
eval(s)
|
29
29
|
clazz = self.class.const_get(class_name)
|
30
30
|
clazz.class_eval(&block)
|
31
31
|
clazz
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
context "BasicLogger" do
|
35
|
-
|
35
|
+
|
36
36
|
setup do
|
37
37
|
@old_default_logger = GemLogger.default_logger
|
38
38
|
GemLogger.default_logger = Minitest::Mock.new
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
teardown do
|
42
42
|
GemLogger.default_logger.verify
|
43
43
|
GemLogger.default_logger = @old_default_logger
|
@@ -49,14 +49,14 @@ module GemLogger
|
|
49
49
|
foo.logger.expect(:debug, nil, ['hi'])
|
50
50
|
foo.new.member_method
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
should "have a logger instance accessible from a class method " do
|
54
54
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; def self.class_method; logger.debug('hi'); end; }
|
55
55
|
assert foo.respond_to?(:logger)
|
56
56
|
foo.logger.expect(:debug, nil, ['hi'])
|
57
57
|
foo.class_method
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
should "have a logger instance when in a nested module" do
|
61
61
|
foomod = new_module("FooMod#{@uniq}") { extend ActiveSupport::Concern; include GemLogger::LoggerSupport; }
|
62
62
|
foo = new_class("Foo#{@uniq}") { include foomod; def member_method; logger.debug('hi'); end; }
|
@@ -64,50 +64,50 @@ module GemLogger
|
|
64
64
|
foo.logger.expect(:debug, nil, ['hi'])
|
65
65
|
foo.new.member_method
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
should "fail when included in a module that is not a Concern" do
|
69
69
|
assert_raises(ArgumentError) do
|
70
70
|
new_module("FooMod#{@uniq}") { include GemLogger::LoggerSupport; }
|
71
71
|
end
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
should "have a log_exception method accessible from an instance method" do
|
75
75
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; def member_method; log_exception(RuntimeError.new("hell")); end; }
|
76
76
|
assert foo.new.respond_to?(:log_exception)
|
77
77
|
foo.logger.expect(:error, nil, [/.*/])
|
78
78
|
foo.new.member_method
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
should "have a log_exception method accessible from a class method " do
|
82
82
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; def self.class_method; log_exception(RuntimeError.new("hell")); end; }
|
83
83
|
assert foo.respond_to?(:log_exception)
|
84
84
|
foo.logger.expect(:error, nil, [/.*/])
|
85
85
|
foo.class_method
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
should "log_exception should populate class name as controller and method name as action" do
|
89
89
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; def self.class_method; log_exception(RuntimeError.new("hell")); end; }
|
90
90
|
foo.logger.expect(:error, nil, [/.*/])
|
91
91
|
foo.class_method
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
should "not raise exception on bad encoding" do
|
95
95
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; def self.class_method; log_exception(RuntimeError.new("\xE2".force_encoding('ASCII-8BIT'))); end; }
|
96
96
|
foo.logger.expect(:error, nil, [/.*/])
|
97
97
|
foo.class_method
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
context 'Generate Message' do
|
101
101
|
should 'properly generate messages with a message prefix' do
|
102
102
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; }
|
103
103
|
assert_match /^prefix /, foo.generate_message(StandardError.new('Hello'), {:message_prefix => 'prefix'})
|
104
104
|
end
|
105
|
-
|
105
|
+
|
106
106
|
should 'properly generate messages with a blank message prefix' do
|
107
107
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; }
|
108
108
|
assert_match /^#<StandardError: Hello>/, foo.generate_message(StandardError.new('Hello'), {:message_prefix => ''})
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
should 'properly generate messages with no message prefix' do
|
112
112
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; }
|
113
113
|
assert_match /^#<StandardError: Hello>/, foo.generate_message(StandardError.new('Hello'), {})
|
@@ -115,75 +115,193 @@ module GemLogger
|
|
115
115
|
end
|
116
116
|
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
|
+
context "logger with added context" do
|
120
|
+
|
121
|
+
setup do
|
122
|
+
class Foo; include GemLogger::LoggerSupport; end
|
123
|
+
end
|
124
|
+
|
125
|
+
should "add the context to generated messages" do
|
126
|
+
|
127
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with("ctx", "1")
|
128
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with('ctx')
|
129
|
+
Foo.logger.expects(:info).with("msg")
|
130
|
+
|
131
|
+
Foo.logger.context("ctx" => "1").info("msg")
|
132
|
+
end
|
133
|
+
|
134
|
+
should "allow symbols as contexts" do
|
135
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with(:ctx, "1")
|
136
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with(:ctx)
|
137
|
+
|
138
|
+
Foo.logger.context(:ctx => "1").info("msg")
|
139
|
+
end
|
140
|
+
|
141
|
+
should "implement debug" do
|
142
|
+
Foo.logger.expects(:debug).with("[ctx=1 ] msg")
|
143
|
+
Foo.logger.context(:ctx => "1").debug("msg")
|
144
|
+
end
|
145
|
+
|
146
|
+
should "implement info" do
|
147
|
+
Foo.logger.expects(:info).with("[ctx=1 ] msg")
|
148
|
+
Foo.logger.context(:ctx => "1").info("msg")
|
149
|
+
end
|
150
|
+
|
151
|
+
should "implement warn" do
|
152
|
+
Foo.logger.expects(:warn).with("[ctx=1 ] msg")
|
153
|
+
Foo.logger.context(:ctx => "1").warn("msg")
|
154
|
+
end
|
155
|
+
|
156
|
+
should "implement error" do
|
157
|
+
Foo.logger.expects(:error).with("[ctx=1 ] msg")
|
158
|
+
Foo.logger.context(:ctx => "1").error("msg")
|
159
|
+
end
|
160
|
+
|
161
|
+
should "implement fatal" do
|
162
|
+
Foo.logger.expects(:fatal).with("[ctx=1 ] msg")
|
163
|
+
Foo.logger.context(:ctx => "1").fatal("msg")
|
164
|
+
end
|
165
|
+
|
166
|
+
should 'allow context to be chained' do
|
167
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with('ctx', '1')
|
168
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with('ctx')
|
169
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with('ctx2', '2')
|
170
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with('ctx2')
|
171
|
+
Foo.logger.expects(:info).with("msg")
|
172
|
+
|
173
|
+
Foo.logger.context("ctx" => "1").context("ctx2" => "2").info("msg")
|
174
|
+
end
|
175
|
+
|
176
|
+
context "event_context" do
|
177
|
+
should "add the event_type as context" do
|
178
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with(:event_type, :test_event)
|
179
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with(:event_type)
|
180
|
+
|
181
|
+
Foo.logger.expects(:info).with("msg")
|
182
|
+
Foo.logger.event_context(:test_event).info("msg")
|
183
|
+
end
|
184
|
+
|
185
|
+
should "include the context of the logger used" do
|
186
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with(:event_type, :test_event)
|
187
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with(:event_type)
|
188
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with(:ctx, '1')
|
189
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with(:ctx)
|
190
|
+
|
191
|
+
Foo.logger.expects(:error).with("msg")
|
192
|
+
Foo.logger.context(:ctx => "1").event_context(:test_event).error("msg")
|
193
|
+
end
|
194
|
+
|
195
|
+
should 'restore previous log context after logging' do
|
196
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.stubs(:get_context).returns({'foo' => 'bar'})
|
197
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with(:event_type, {'foo' => 'baz'})
|
198
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with(:event_type)
|
199
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:format_msg_with_context).with('msg')
|
200
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with('foo', 'bar')
|
201
|
+
|
202
|
+
Foo.logger.event_context('foo' => 'baz').info("msg")
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
context "exception_context" do
|
207
|
+
should "add the exception class as context" do
|
208
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with(:exception, 'StandardError')
|
209
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with(:exception)
|
210
|
+
|
211
|
+
Foo.logger.expects(:info).with("msg")
|
212
|
+
Foo.logger.exception_context(StandardError.new).info("msg")
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
context "log_exception" do
|
217
|
+
should "add the exception class as context" do
|
218
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:add_to_context).with(:exception, 'StandardError')
|
219
|
+
GemLogger::LoggerSupport::LogContextLogger.any_instance.expects(:remove_from_context).with(:exception)
|
220
|
+
|
221
|
+
Foo.logger.expects(:error)
|
222
|
+
Foo.logger.log_exception(StandardError.new, "msg")
|
223
|
+
end
|
224
|
+
|
225
|
+
should "log the backtrace" do
|
226
|
+
Foo.logger.expects(:error).with("[exception=StandardError ] msg: err (no backtrace)")
|
227
|
+
Foo.logger.log_exception(StandardError.new("err"), "msg")
|
228
|
+
end
|
229
|
+
|
230
|
+
should 'allow the level to be changed as an option' do
|
231
|
+
Foo.logger.expects(:warn).with("[exception=StandardError ] msg: err (no backtrace)")
|
232
|
+
Foo.logger.log_exception(StandardError.new("err"), "msg", :level => :warn)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
119
237
|
context "lumber integration" do
|
120
|
-
|
238
|
+
|
121
239
|
setup do
|
122
240
|
require 'lumber'
|
123
|
-
|
241
|
+
|
124
242
|
yml = <<-EOF
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
243
|
+
log4r_config:
|
244
|
+
pre_config:
|
245
|
+
root:
|
246
|
+
level: 'DEBUG'
|
247
|
+
loggers:
|
248
|
+
- name: "rails"
|
249
|
+
level: DEBUG
|
250
|
+
outputters: []
|
133
251
|
EOF
|
134
|
-
|
252
|
+
|
135
253
|
cfg = Log4r::YamlConfigurator
|
136
254
|
cfg.load_yaml_string(yml)
|
137
255
|
logger = Log4r::Logger['rails']
|
138
|
-
sio = StringIO.new
|
256
|
+
sio = StringIO.new
|
139
257
|
logger.outputters = [Log4r::IOOutputter.new("sbout", sio)]
|
140
|
-
|
258
|
+
|
141
259
|
Log4r::YamlConfigurator.stub(:load_yaml_file, nil) do
|
142
260
|
root = File.expand_path("../../..", __FILE__)
|
143
261
|
Lumber.init(:root => root, :env => 'test', :config_file => __FILE__)
|
144
262
|
end
|
145
|
-
|
263
|
+
|
146
264
|
@old_logger_concern = GemLogger.logger_concern
|
147
265
|
GemLogger.logger_concern = Lumber::LoggerSupport
|
148
266
|
end
|
149
|
-
|
267
|
+
|
150
268
|
teardown do
|
151
269
|
GemLogger.logger_concern = @old_logger_concern
|
152
270
|
end
|
153
|
-
|
271
|
+
|
154
272
|
should "have a logger instance accessible from an instance method" do
|
155
273
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; }
|
156
274
|
assert_equal "rails::GemLogger::LoggerSupportTest::#{foo.name.split('::').last}", foo.new.logger.fullname
|
157
275
|
end
|
158
|
-
|
276
|
+
|
159
277
|
should "have a logger instance accessible from a class method " do
|
160
278
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; }
|
161
279
|
assert_equal "rails::GemLogger::LoggerSupportTest::#{foo.name.split('::').last}", foo.logger.fullname
|
162
280
|
end
|
163
|
-
|
281
|
+
|
164
282
|
should "have a logger instance when in a nested module" do
|
165
283
|
foomod = new_module("FooMod#{@uniq}") { extend ActiveSupport::Concern; include GemLogger::LoggerSupport; }
|
166
284
|
foo = new_class("Foo#{@uniq}") { include foomod; }
|
167
285
|
assert_equal "rails::GemLogger::LoggerSupportTest::#{foo.name.split('::').last}", foo.logger.fullname
|
168
286
|
end
|
169
|
-
|
287
|
+
|
170
288
|
should "have correct logger instance with multiple includes" do
|
171
289
|
foomod = new_module("FooMod#{@uniq}") { extend ActiveSupport::Concern; include GemLogger::LoggerSupport; }
|
172
290
|
foo = new_class("Foo#{@uniq}") { include GemLogger::LoggerSupport; include foomod; }
|
173
291
|
assert_equal "rails::GemLogger::LoggerSupportTest::#{foo.name.split('::').last}", foo.logger.fullname
|
174
292
|
end
|
175
|
-
|
293
|
+
|
176
294
|
should "have correct logger instance with includes and inheritance" do
|
177
295
|
foosuper = new_class("FooSuper#{@uniq}") { include GemLogger::LoggerSupport; }
|
178
296
|
foo = new_class("Foo#{@uniq}", foosuper) { }
|
179
|
-
assert_equal "rails::GemLogger::LoggerSupportTest::#{
|
297
|
+
assert_equal "rails::GemLogger::LoggerSupportTest::#{foo.name.split('::').last}", foo.logger.fullname
|
180
298
|
end
|
181
|
-
|
299
|
+
|
182
300
|
should "have correct logger instance with multiple includes and inheritance" do
|
183
301
|
foomod = new_module("FooMod#{@uniq}") { extend ActiveSupport::Concern; include GemLogger::LoggerSupport; }
|
184
302
|
foosuper = new_class("FooSuper#{@uniq}") { include foomod; }
|
185
303
|
foo = new_class("Foo#{@uniq}", foosuper) { include GemLogger::LoggerSupport; include foomod; }
|
186
|
-
assert_equal "rails::GemLogger::LoggerSupportTest::#{
|
304
|
+
assert_equal "rails::GemLogger::LoggerSupportTest::#{foo.name.split('::').last}", foo.logger.fullname
|
187
305
|
end
|
188
306
|
|
189
307
|
end
|
metadata
CHANGED
@@ -1,141 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Conway
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
prerelease: false
|
15
14
|
name: bundler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
|
-
- - ~>
|
17
|
+
- - "~>"
|
19
18
|
- !ruby/object:Gem::Version
|
20
19
|
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
21
22
|
version_requirements: !ruby/object:Gem::Requirement
|
22
23
|
requirements:
|
23
|
-
- - ~>
|
24
|
+
- - "~>"
|
24
25
|
- !ruby/object:Gem::Version
|
25
26
|
version: '1.3'
|
26
|
-
type: :development
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
prerelease: false
|
29
28
|
name: rake
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
31
30
|
requirements:
|
32
|
-
- -
|
31
|
+
- - ">="
|
33
32
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
35
|
-
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
MA==
|
42
|
-
type: :development
|
40
|
+
version: '0'
|
43
41
|
- !ruby/object:Gem::Dependency
|
44
|
-
prerelease: false
|
45
42
|
name: minitest
|
46
43
|
requirement: !ruby/object:Gem::Requirement
|
47
44
|
requirements:
|
48
|
-
- -
|
45
|
+
- - "~>"
|
49
46
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
51
|
-
|
47
|
+
version: '4.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
52
50
|
version_requirements: !ruby/object:Gem::Requirement
|
53
51
|
requirements:
|
54
|
-
- -
|
52
|
+
- - "~>"
|
55
53
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
57
|
-
MA==
|
58
|
-
type: :development
|
54
|
+
version: '4.0'
|
59
55
|
- !ruby/object:Gem::Dependency
|
60
|
-
prerelease: false
|
61
56
|
name: minitest_should
|
62
57
|
requirement: !ruby/object:Gem::Requirement
|
63
58
|
requirements:
|
64
|
-
- -
|
59
|
+
- - ">="
|
65
60
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
67
|
-
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
68
64
|
version_requirements: !ruby/object:Gem::Requirement
|
69
65
|
requirements:
|
70
|
-
- -
|
66
|
+
- - ">="
|
71
67
|
- !ruby/object:Gem::Version
|
72
|
-
version:
|
73
|
-
MA==
|
74
|
-
type: :development
|
68
|
+
version: '0'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
|
-
prerelease: false
|
77
70
|
name: minitest-reporters
|
78
71
|
requirement: !ruby/object:Gem::Requirement
|
79
72
|
requirements:
|
80
|
-
- -
|
73
|
+
- - ">="
|
81
74
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
83
|
-
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
|
-
- -
|
80
|
+
- - ">="
|
87
81
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
89
|
-
MA==
|
90
|
-
type: :development
|
82
|
+
version: '0'
|
91
83
|
- !ruby/object:Gem::Dependency
|
92
|
-
prerelease: false
|
93
84
|
name: factory_girl
|
94
85
|
requirement: !ruby/object:Gem::Requirement
|
95
86
|
requirements:
|
96
|
-
- -
|
87
|
+
- - ">="
|
97
88
|
- !ruby/object:Gem::Version
|
98
|
-
version:
|
99
|
-
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
100
92
|
version_requirements: !ruby/object:Gem::Requirement
|
101
93
|
requirements:
|
102
|
-
- -
|
94
|
+
- - ">="
|
103
95
|
- !ruby/object:Gem::Version
|
104
|
-
version:
|
105
|
-
MA==
|
106
|
-
type: :development
|
96
|
+
version: '0'
|
107
97
|
- !ruby/object:Gem::Dependency
|
108
|
-
prerelease: false
|
109
98
|
name: faker
|
110
99
|
requirement: !ruby/object:Gem::Requirement
|
111
100
|
requirements:
|
112
|
-
- -
|
101
|
+
- - ">="
|
113
102
|
- !ruby/object:Gem::Version
|
114
|
-
version:
|
115
|
-
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
116
106
|
version_requirements: !ruby/object:Gem::Requirement
|
117
107
|
requirements:
|
118
|
-
- -
|
108
|
+
- - ">="
|
119
109
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
121
|
-
MA==
|
122
|
-
type: :development
|
110
|
+
version: '0'
|
123
111
|
- !ruby/object:Gem::Dependency
|
124
|
-
prerelease: false
|
125
112
|
name: activesupport
|
126
113
|
requirement: !ruby/object:Gem::Requirement
|
127
114
|
requirements:
|
128
|
-
- -
|
115
|
+
- - ">="
|
129
116
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
131
|
-
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
132
120
|
version_requirements: !ruby/object:Gem::Requirement
|
133
121
|
requirements:
|
134
|
-
- -
|
122
|
+
- - ">="
|
135
123
|
- !ruby/object:Gem::Version
|
136
|
-
version:
|
137
|
-
MA==
|
138
|
-
type: :runtime
|
124
|
+
version: '0'
|
139
125
|
description: Allows classes/modules in gems to have logger class/instance methods
|
140
126
|
with a pluggable Logger implementation
|
141
127
|
email:
|
@@ -144,9 +130,9 @@ executables: []
|
|
144
130
|
extensions: []
|
145
131
|
extra_rdoc_files: []
|
146
132
|
files:
|
147
|
-
- .coveralls.yml
|
148
|
-
- .gitignore
|
149
|
-
- .travis.yml
|
133
|
+
- ".coveralls.yml"
|
134
|
+
- ".gitignore"
|
135
|
+
- ".travis.yml"
|
150
136
|
- Gemfile
|
151
137
|
- LICENSE.txt
|
152
138
|
- README.md
|
@@ -154,10 +140,13 @@ files:
|
|
154
140
|
- gem_logger.gemspec
|
155
141
|
- lib/gem_logger.rb
|
156
142
|
- lib/gem_logger/basic_logger.rb
|
143
|
+
- lib/gem_logger/context_handler.rb
|
144
|
+
- lib/gem_logger/gem_logger.rb
|
157
145
|
- lib/gem_logger/logger_support.rb
|
158
146
|
- lib/gem_logger/version.rb
|
159
147
|
- test/test_helper.rb
|
160
148
|
- test/unit/gem_logger/basic_logger_test.rb
|
149
|
+
- test/unit/gem_logger/context_handler_test.rb
|
161
150
|
- test/unit/gem_logger/logger_support_test.rb
|
162
151
|
- test/unit/gem_logger_test.rb
|
163
152
|
homepage: ''
|
@@ -170,19 +159,17 @@ require_paths:
|
|
170
159
|
- lib
|
171
160
|
required_ruby_version: !ruby/object:Gem::Requirement
|
172
161
|
requirements:
|
173
|
-
- -
|
162
|
+
- - ">="
|
174
163
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
176
|
-
MA==
|
164
|
+
version: '0'
|
177
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
166
|
requirements:
|
179
|
-
- -
|
167
|
+
- - ">="
|
180
168
|
- !ruby/object:Gem::Version
|
181
|
-
version:
|
182
|
-
MA==
|
169
|
+
version: '0'
|
183
170
|
requirements: []
|
184
171
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.
|
172
|
+
rubygems_version: 2.2.2
|
186
173
|
signing_key:
|
187
174
|
specification_version: 4
|
188
175
|
summary: Allows classes/modules in gems to have logger class/instance methods with
|
@@ -190,5 +177,7 @@ summary: Allows classes/modules in gems to have logger class/instance methods wi
|
|
190
177
|
test_files:
|
191
178
|
- test/test_helper.rb
|
192
179
|
- test/unit/gem_logger/basic_logger_test.rb
|
180
|
+
- test/unit/gem_logger/context_handler_test.rb
|
193
181
|
- test/unit/gem_logger/logger_support_test.rb
|
194
182
|
- test/unit/gem_logger_test.rb
|
183
|
+
has_rdoc:
|