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.
@@ -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
+
@@ -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
@@ -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: