yeti_logger 3.0.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 +7 -0
- data/.gitignore +20 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +18 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README.md +193 -0
- data/Rakefile +12 -0
- data/lib/yeti_logger.rb +164 -0
- data/lib/yeti_logger/configuration.rb +14 -0
- data/lib/yeti_logger/constants.rb +5 -0
- data/lib/yeti_logger/message_formatters.rb +93 -0
- data/lib/yeti_logger/test_helper.rb +65 -0
- data/lib/yeti_logger/version.rb +3 -0
- data/lib/yeti_logger/wrapped_logger.rb +24 -0
- data/spec/lib/yeti_logger/message_formatters_spec.rb +143 -0
- data/spec/lib/yeti_logger/test_helper_spec.rb +140 -0
- data/spec/lib/yeti_logger/wrapped_logger_spec.rb +28 -0
- data/spec/lib/yeti_logger_spec.rb +218 -0
- data/spec/spec_helper.rb +30 -0
- data/yeti_logger.gemspec +28 -0
- metadata +156 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yeti_logger/test_helper'
|
3
|
+
|
4
|
+
class NakedLogger
|
5
|
+
include YetiLogger
|
6
|
+
end
|
7
|
+
|
8
|
+
describe YetiLogger::WrappedLogger do
|
9
|
+
include YetiLogger::TestHelper
|
10
|
+
|
11
|
+
let(:instance) { NakedLogger.new }
|
12
|
+
let(:logger) { instance.as_logger }
|
13
|
+
|
14
|
+
YetiLogger::LEVELS.each do |level|
|
15
|
+
describe "##{level}" do
|
16
|
+
it "forwards #{level} to the instance" do
|
17
|
+
expect(instance).to receive("log_#{level}").with('foo')
|
18
|
+
logger.send(level, 'foo')
|
19
|
+
end
|
20
|
+
|
21
|
+
it "forwards #{level} with a block to the instance" do
|
22
|
+
expect(instance).to receive("log_#{level}").and_call_original
|
23
|
+
should_log(level).with("NakedLogger: from block")
|
24
|
+
logger.send(level) { 'from block' }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,218 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yeti_logger/test_helper'
|
3
|
+
|
4
|
+
# Class used for class and instance level testing
|
5
|
+
module Yucatan
|
6
|
+
class YellinYeti
|
7
|
+
include YetiLogger
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Used for testing via module and also by inclusion into rspecs.
|
12
|
+
module ModularLog
|
13
|
+
include YetiLogger
|
14
|
+
|
15
|
+
def invoke_logger
|
16
|
+
log_warn "invoke via include"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Class used for class and instance level testing
|
21
|
+
module Yucatan
|
22
|
+
class YellinYeti
|
23
|
+
include YetiLogger
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Used for testing via module and also by inclusion into rspecs.
|
28
|
+
module ModularLog
|
29
|
+
include YetiLogger
|
30
|
+
|
31
|
+
def invoke_logger
|
32
|
+
log_warn "invoke via include"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe YetiLogger do
|
37
|
+
|
38
|
+
include YetiLogger::TestHelper
|
39
|
+
|
40
|
+
include ModularLog
|
41
|
+
|
42
|
+
let(:instance) { Yucatan::YellinYeti.new }
|
43
|
+
let(:data) do
|
44
|
+
{
|
45
|
+
"pet" => "dog",
|
46
|
+
"color" => "brown"
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
let(:ex) do
|
51
|
+
e = nil
|
52
|
+
begin
|
53
|
+
raise Exception.new("breakin!")
|
54
|
+
rescue Exception => exception
|
55
|
+
e = exception
|
56
|
+
end
|
57
|
+
e
|
58
|
+
end
|
59
|
+
let(:runtime) do
|
60
|
+
e = nil
|
61
|
+
begin
|
62
|
+
raise "fail!"
|
63
|
+
rescue Exception => ex
|
64
|
+
e = ex
|
65
|
+
end
|
66
|
+
e
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'has a version number' do
|
70
|
+
expect(YetiLogger::VERSION).to_not be_nil
|
71
|
+
end
|
72
|
+
|
73
|
+
it "can be used by rspec code that includes modules that use it" do
|
74
|
+
should_log(:warn).with(/.*invoke via include/)
|
75
|
+
invoke_logger
|
76
|
+
end
|
77
|
+
|
78
|
+
[ Yucatan::YellinYeti, Yucatan::YellinYeti.new, ModularLog ].each do |target|
|
79
|
+
class_name = "Yucatan::YellinYeti"
|
80
|
+
target_type = "instance"
|
81
|
+
if target.class == Class
|
82
|
+
target_type = "class"
|
83
|
+
elsif target.class == Module
|
84
|
+
class_name = "ModularLog"
|
85
|
+
target_type = "module"
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when used with a #{target_type}" do
|
89
|
+
|
90
|
+
# Debug tested separately below.
|
91
|
+
%w{ info warn error fatal }.each do |level|
|
92
|
+
|
93
|
+
it "has #{target_type} methods for level '#{level}'" do
|
94
|
+
should_log(level).with("#{class_name}: #{target_type}-stuffs")
|
95
|
+
target.send("log_#{level}", "#{target_type}-stuffs")
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
# There is a lot of debug output, so we can't verify it like we do the other
|
101
|
+
# levels. For now, just validate the method is there.
|
102
|
+
it "can call a #{target_type} debug method" do
|
103
|
+
target.log_debug("#{target_type} debuggin")
|
104
|
+
end
|
105
|
+
|
106
|
+
it "can log key value pairs at #{target_type} level" do
|
107
|
+
should_log(:info).with("#{class_name}: pet=dog color=brown")
|
108
|
+
target.log_info(data)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "can log exceptions at #{target_type} level" do
|
112
|
+
should_log(:info) do |m|
|
113
|
+
m.start_with?("#{class_name}: breakin!").should == true
|
114
|
+
m.include?("/spec/lib/yeti_logger_spec.rb:").should == true
|
115
|
+
end
|
116
|
+
target.log_info(ex)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "can log subclasses of exceptions at #{target_type} level" do
|
120
|
+
should_log(:info) do |m|
|
121
|
+
m.start_with?("#{class_name}: fail!").should == true
|
122
|
+
m.include?("/spec/lib/yeti_logger_spec.rb:").should == true
|
123
|
+
end
|
124
|
+
target.log_info(runtime)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "can log messages and exceptions at #{target_type} level" do
|
128
|
+
re = /#{class_name}:\ssomething\sException:\sbreakin!\sError\sClass:\sException
|
129
|
+
.*\/spec\/lib\/yeti_logger_spec\.rb:.*/x
|
130
|
+
should_log(:info).with(re)
|
131
|
+
expect(ex.backtrace).to_not be_nil
|
132
|
+
target.log_info("something", ex)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "will only log exception messages if it has no backtrace at #{target_type} level" do
|
136
|
+
should_log(:info).with("#{class_name}: blat!")
|
137
|
+
target.log_info(Exception.new("blat!"))
|
138
|
+
end
|
139
|
+
|
140
|
+
it "can be called without arguments" do
|
141
|
+
should_log(:info).with("#{class_name}: ")
|
142
|
+
target.log_info
|
143
|
+
end
|
144
|
+
|
145
|
+
it "can log string messages from block" do
|
146
|
+
should_log(:info).with("#{class_name}: from block")
|
147
|
+
target.log_info { "from block" }
|
148
|
+
end
|
149
|
+
|
150
|
+
it "can log hash messages from block" do
|
151
|
+
should_log(:info).with("#{class_name}: pet=dog color=brown")
|
152
|
+
target.log_info { data }
|
153
|
+
end
|
154
|
+
|
155
|
+
it "can log exceptions from block" do
|
156
|
+
should_log(:info) do |m|
|
157
|
+
m.start_with?("#{class_name}: breakin!").should == true
|
158
|
+
m.include?("/spec/lib/yeti_logger_spec.rb:").should == true
|
159
|
+
end
|
160
|
+
target.log_info { ex }
|
161
|
+
end
|
162
|
+
|
163
|
+
it "only logs the block and ignores the obj argument" do
|
164
|
+
should_log(:info).with("#{class_name}: and block")
|
165
|
+
target.log_info("argument") { "and block" }
|
166
|
+
end
|
167
|
+
|
168
|
+
it "only logs the block and ignores both obj and ex arguments" do
|
169
|
+
should_log(:info).with("#{class_name}: and block")
|
170
|
+
target.log_info("argument", ex) { "and block" }
|
171
|
+
end
|
172
|
+
|
173
|
+
it "will not evaluate block unless the log level is high enough" do
|
174
|
+
with_log_level(Logger::INFO) do
|
175
|
+
target.log_info do
|
176
|
+
@my_var = 2
|
177
|
+
"incremented at info"
|
178
|
+
end
|
179
|
+
expect(@my_var).to eq(2)
|
180
|
+
target.log_debug do
|
181
|
+
@my_var = 3
|
182
|
+
"incremented at debug?"
|
183
|
+
end
|
184
|
+
expect(@my_var).to eq(2)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
end # Iterate over class & instance
|
190
|
+
|
191
|
+
describe '#log_time' do
|
192
|
+
|
193
|
+
it "logs time at the info level by default" do
|
194
|
+
should_log(:info)
|
195
|
+
instance.log_time("query_db") do
|
196
|
+
sleep 0.1
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
it "logs at the user-specified level when asked" do
|
201
|
+
should_log(:warn)
|
202
|
+
instance.log_time("query", :warn) do
|
203
|
+
sleep 0.01
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
describe '#as_logger' do
|
209
|
+
it 'returns a WrappedLogger' do
|
210
|
+
expect(instance.as_logger).to be_instance_of(YetiLogger::WrappedLogger)
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'uses the current instance as the wrapped object' do
|
214
|
+
expect(instance.as_logger.instance_variable_get(:@obj)).to eql(instance)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Start up coverage before anything else,
|
2
|
+
# otherwise we only get coverage for rspecs.
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start do
|
5
|
+
add_filter "/spec/" # ignore spec files
|
6
|
+
end
|
7
|
+
SimpleCov.minimum_coverage 100
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
10
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
11
|
+
require 'rspec'
|
12
|
+
require 'active_support/log_subscriber/test_helper'
|
13
|
+
|
14
|
+
require 'yeti_logger'
|
15
|
+
require 'yeti_logger/test_helper'
|
16
|
+
|
17
|
+
# Requires supporting files with custom matchers and macros, etc,
|
18
|
+
# in ./support/ and its subdirectories.
|
19
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
20
|
+
|
21
|
+
RSpec.configure do |config|
|
22
|
+
config.include ActiveSupport::LogSubscriber::TestHelper
|
23
|
+
|
24
|
+
config.before do
|
25
|
+
YetiLogger.configure do |config|
|
26
|
+
config.logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/yeti_logger.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'yeti_logger/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "yeti_logger"
|
8
|
+
spec.version = YetiLogger::VERSION
|
9
|
+
spec.authors = ["Yesware, Inc"]
|
10
|
+
spec.email = ["engineering@yesware.com"]
|
11
|
+
spec.description = %q{Provides standardized logging}
|
12
|
+
spec.summary = spec.description
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency 'activesupport'
|
22
|
+
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
spec.add_development_dependency "yard"
|
26
|
+
spec.add_development_dependency "kramdown"
|
27
|
+
spec.add_development_dependency "simplecov"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yeti_logger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yesware, Inc
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: kramdown
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Provides standardized logging
|
98
|
+
email:
|
99
|
+
- engineering@yesware.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".rspec"
|
106
|
+
- ".ruby-version"
|
107
|
+
- ".travis.yml"
|
108
|
+
- CHANGELOG.md
|
109
|
+
- Gemfile
|
110
|
+
- MIT-LICENSE
|
111
|
+
- README.md
|
112
|
+
- Rakefile
|
113
|
+
- lib/yeti_logger.rb
|
114
|
+
- lib/yeti_logger/configuration.rb
|
115
|
+
- lib/yeti_logger/constants.rb
|
116
|
+
- lib/yeti_logger/message_formatters.rb
|
117
|
+
- lib/yeti_logger/test_helper.rb
|
118
|
+
- lib/yeti_logger/version.rb
|
119
|
+
- lib/yeti_logger/wrapped_logger.rb
|
120
|
+
- spec/lib/yeti_logger/message_formatters_spec.rb
|
121
|
+
- spec/lib/yeti_logger/test_helper_spec.rb
|
122
|
+
- spec/lib/yeti_logger/wrapped_logger_spec.rb
|
123
|
+
- spec/lib/yeti_logger_spec.rb
|
124
|
+
- spec/spec_helper.rb
|
125
|
+
- yeti_logger.gemspec
|
126
|
+
homepage: ''
|
127
|
+
licenses:
|
128
|
+
- MIT
|
129
|
+
metadata: {}
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
requirements: []
|
145
|
+
rubyforge_project:
|
146
|
+
rubygems_version: 2.4.6
|
147
|
+
signing_key:
|
148
|
+
specification_version: 4
|
149
|
+
summary: Provides standardized logging
|
150
|
+
test_files:
|
151
|
+
- spec/lib/yeti_logger/message_formatters_spec.rb
|
152
|
+
- spec/lib/yeti_logger/test_helper_spec.rb
|
153
|
+
- spec/lib/yeti_logger/wrapped_logger_spec.rb
|
154
|
+
- spec/lib/yeti_logger_spec.rb
|
155
|
+
- spec/spec_helper.rb
|
156
|
+
has_rdoc:
|