lookout-rack-utils 4.0.0.44 → 5.0.0.49

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
- SHA1:
3
- metadata.gz: c8d885772670c69b20f26cad8eafdf9a09414556
4
- data.tar.gz: 5dff0ce7ee50afd78f03766167f6983cb26984d7
2
+ SHA256:
3
+ metadata.gz: 07ec222e8dfb77be261665631a968c43ec2f4a96e480ec7526315884a9c7518f
4
+ data.tar.gz: 5b8203b6bccc84e42275726154290f991e3fdbdcee903d8ee4e4d34a4be2f72c
5
5
  SHA512:
6
- metadata.gz: e8ace2cb4663df9464a78ad5d34611f1c64ac2d26dfc162ebf5e0aa88a876d6bc914aac86dcb5cf1d7c3ceecb80fea6166078e8ce15c4d004305e7f454bc9c9f
7
- data.tar.gz: 5ed83519a13bd1f937c0a46f7d5a470feeea95c4b120a825af32f1c17683df18841f3b1e9a76c26921b2abfc3dd07b79df89bf17128aa51accb8dfc3a6b50299
6
+ metadata.gz: b04ac7ce56b5b97da144db91eed4348b4282a670954e38f62bc47e8027de3c742b015a3c4ab0f3b1fb6fa9e1bd1aa62336ff759661a46f5cbb2cb01272fcd80c
7
+ data.tar.gz: 6dd0b2f45b7c1ccec1240b83eccbff9033114043bcb9f4060f94655032cd8254bf88da0865283220f3fa6c0d0334e9e23f2e928d5ece75eba7405679efbf8832
@@ -1,8 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - jruby
4
+ - 2.5
4
5
  - 2.3
5
- - 1.9.3
6
6
  deploy:
7
7
  provider: rubygems
8
8
  api_key:
data/README.md CHANGED
@@ -59,8 +59,17 @@ app:
59
59
  Note that we expect `t(*args)` to be called in the context of a request.
60
60
 
61
61
  ### Lookout::Rack::Utils::Log
62
- You'll need configatron set up. If `Lookout::Rack::Utils::Graphite` is
63
- present, it will increment those stats whenever a log is written.
62
+
63
+ The logger can be configured with
64
+
65
+ ```ruby
66
+ Lookout::Rack::Utils::Log.set_instance(my_logger)
67
+ ```
68
+
69
+ By default it will use a Lookout::Rack::Utils::LookoutLogger, which
70
+ wraps Log4R. You'll need configatron set up. If
71
+ `Lookout::Rack::Utils::Graphite` is present, it will increment those
72
+ stats whenever a log is written.
64
73
 
65
74
  ```ruby
66
75
  configatron.project_name = 'My project name'
@@ -1,90 +1,126 @@
1
1
  require 'rubygems'
2
2
  require 'log4r'
3
- require 'singleton'
4
3
  require 'time'
4
+ require 'thread'
5
5
  require 'configatron'
6
6
 
7
7
  module Lookout::Rack::Utils
8
- # Logging. Logs to log/<project_name>.log with the format:
8
+ # Logging. By default, logs to log/<project_name>.log with the format:
9
9
  #
10
10
  # [Log Level]: [Timestamp (ISO-8601)]: [File:linenum]: [Log Message]
11
11
  #
12
12
  # Use through the helper:
13
13
  # log.warn 'This is my log message'
14
14
  #
15
+ # Default logger may be replaced by calling
16
+ #
17
+ # Log.set_instance(my_logger)
15
18
  class Log
16
- include Singleton
17
- include Log4r
19
+ @@instance = nil
18
20
 
19
- # Formatter that include the filename and relative path, and line number in
20
- # output of the caller.
21
- #
22
- # Since all callers go through the methods defined in this class to log, we
23
- # look at the second line of the tracer output, removing everything but the
24
- # directories after the project directory.
21
+ # Initialize singleton instance to be an instance of
22
+ # +Lookout::Rack::Utils::LookoutLogger+, with the given options
23
+ def self.create_instance
24
+ raise "Already initialized Log" if instance_set?
25
+ @@instance = LookoutLogger.new
26
+ end
27
+
28
+ # Explicitly set singleton instance. The instance must implement the
29
+ # same base API as +::Logger+
30
+ def self.set_instance(instance)
31
+ raise "Already initialized Log" if instance_set?
32
+ @@instance = instance
33
+ end
34
+
35
+ # Clear singleton instance, for use in testing ONLY
36
+ def self.clear_instance
37
+ @@instance = nil
38
+ end
39
+
40
+ # Check if the instance has been set
41
+ def self.instance_set?
42
+ defined?(@@instance) && !!@@instance
43
+ end
44
+
45
+ # Access singleton instance, which must have been initialized with
46
+ # .create_instance or .set_instance
47
+ def self.instance
48
+ create_instance if @@instance.nil?
49
+ @@instance
50
+ end
51
+ end
52
+
53
+ # Formatter that include the filename and relative path, and line number in
54
+ # output of the caller.
55
+ #
56
+ # Since all callers go through the methods defined in this class to log, we
57
+ # look at the second line of the tracer output, removing everything but the
58
+ # directories after the project directory.
59
+ #
60
+ class LookoutFormatter < Log4r::Formatter
61
+ # Return the project base directory for filtering to help with
62
+ # identifiying the filename and line number when formatting the log
63
+ # message
25
64
  #
26
- class LookoutFormatter < Log4r::Formatter
27
- # Return the project base directory for filtering to help with
28
- # identifiying the filename and line number when formatting the log
29
- # message
30
- #
31
- # @return [String] Base directory for the project
32
- def basedir
33
- @basedir ||= File.expand_path(File.join(File.dirname(__FILE__), ".."))
34
- end
65
+ # @return [String] Base directory for the project
66
+ def basedir
67
+ @basedir ||= File.expand_path(File.join(File.dirname(__FILE__), ".."))
68
+ end
35
69
 
36
- # Return the common base directory between this project and the
37
- # given trace. If no common base directory is found, return
38
- # basedir.
39
- #
40
- # This memoizes the result, which can be bad if the first log
41
- # comes from an unusual place. However, in all current uses this
42
- # is running from an unpacked jar/war and its vastly faster to
43
- # memoize the result.
44
- #
45
- # @param [String] tracer A line from the LogEvent#tracer Array
46
- # @return [String] Common base directory with the trace
47
- def common_basedir(tracer)
48
- return @common_basedir if @common_basedir
49
-
50
- basedir_pieces = basedir.split(File::SEPARATOR)
51
- trace_pieces = tracer.split(File::SEPARATOR)
52
- i = 0
53
- while basedir_pieces[i] == trace_pieces[i]
54
- i += 1
55
- end
56
- # If there were no common directories (besides /), return our basedir
57
- @common_basedir = (i <= 1) ? basedir : basedir_pieces[0...i].join(File::SEPARATOR)
70
+ # Return the common base directory between this project and the
71
+ # given trace. If no common base directory is found, return
72
+ # basedir.
73
+ #
74
+ # This memoizes the result, which can be bad if the first log
75
+ # comes from an unusual place. However, in all current uses this
76
+ # is running from an unpacked jar/war and its vastly faster to
77
+ # memoize the result.
78
+ #
79
+ # @param [String] tracer A line from the LogEvent#tracer Array
80
+ # @return [String] Common base directory with the trace
81
+ def common_basedir(tracer)
82
+ return @common_basedir if @common_basedir
83
+
84
+ basedir_pieces = basedir.split(File::SEPARATOR)
85
+ trace_pieces = tracer.split(File::SEPARATOR)
86
+ i = 0
87
+ while basedir_pieces[i] == trace_pieces[i]
88
+ i += 1
58
89
  end
90
+ # If there were no common directories (besides /), return our basedir
91
+ @common_basedir = (i <= 1) ? basedir : basedir_pieces[0...i].join(File::SEPARATOR)
92
+ end
59
93
 
60
- # Return a trimmed version of the filename from where a LogEvent occurred
61
- # @param [String] tracer A line from the LogEvent#tracer Array
62
- # @return [String] Trimmed and parsed version of the file ane line number
63
- def event_filename(tracer)
64
- base = common_basedir(tracer)
65
- parts = tracer.match(/#{base}\/(.*:[0-9]+).*:/)
66
-
67
- # If we get no matches back, we're probably in a jar file in which case
68
- # the format of the tracer is going to be abbreviated
69
- if parts.nil?
70
- parts = tracer.match(/(.*:[0-9]+).*:/)
71
- end
72
- return parts[-1] if parts
94
+ # Return a trimmed version of the filename from where a LogEvent occurred
95
+ # @param [String] tracer A line from the LogEvent#tracer Array
96
+ # @return [String] Trimmed and parsed version of the file and line number
97
+ def event_filename(tracer)
98
+ base = common_basedir(tracer)
99
+ parts = tracer.match(/#{base}\/(.*:[0-9]+).*:/)
100
+
101
+ # If we get no matches back, we're probably in a jar file in which case
102
+ # the format of the tracer is going to be abbreviated
103
+ if parts.nil?
104
+ parts = tracer.match(/(.*:[0-9]+).*:/)
73
105
  end
106
+ return parts[-1] if parts
107
+ end
74
108
 
75
- # Receive the LogEvent and pull out the log message and format it for
76
- # display in the logs
77
- #
109
+ # Receive the LogEvent and pull out the log message and format it for
110
+ # display in the logs
111
+ #
78
112
  # @param [Log4r::LogEvent] event
79
- # @return [String] Formatted log message
80
- def format(event)
81
- filename = event_filename(event.tracer[1])
82
- # CCYY-MM-DDThh:mm:ss.sssTZD
83
- time = Time.now.utc.iso8601 3
84
- return "#{Log4r::LNAMES[event.level]}: #{time}: #{filename}: #{event.data}\n"
85
- end
113
+ # @return [String] Formatted log message
114
+ def format(event)
115
+ filename = event_filename(event.tracer[1])
116
+ # CCYY-MM-DDThh:mm:ss.sssTZD
117
+ time = Time.now.utc.iso8601 3
118
+ return "#{Log4r::LNAMES[event.level]}: #{time}: #{filename}: #{event.data}\n"
86
119
  end
120
+ end
87
121
 
122
+ class LookoutLogger
123
+ include Log4r
88
124
 
89
125
  attr_reader :outputter
90
126
 
@@ -1,7 +1,7 @@
1
1
  module Lookout
2
2
  module Rack
3
3
  module Utils
4
- VERSION = "4.0.0"
4
+ VERSION = "5.0.0"
5
5
  end
6
6
  end
7
7
  end
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rspec", "~> 3.0"
24
24
  spec.add_development_dependency "rspec-its"
25
25
  spec.add_development_dependency "rack-test"
26
- spec.add_development_dependency "sinatra"
26
+ spec.add_development_dependency "sinatra", '~> 2.0'
27
27
  spec.add_development_dependency "timecop"
28
28
 
29
29
  spec.add_runtime_dependency "i18n"
@@ -4,7 +4,64 @@ require 'timecop'
4
4
  require 'configatron'
5
5
 
6
6
  describe Lookout::Rack::Utils::Log do
7
- subject(:log) { described_class.instance }
7
+ before(:each) do
8
+ described_class.clear_instance
9
+ end
10
+
11
+ after(:each) do
12
+ described_class.clear_instance
13
+ end
14
+
15
+ describe '.create_instance' do
16
+ it 'creates an instance' do
17
+ described_class.create_instance
18
+ expect(described_class.instance).to be_a(Lookout::Rack::Utils::LookoutLogger)
19
+ end
20
+
21
+ context 'if an instance has been created' do
22
+ before :each do
23
+ described_class.create_instance
24
+ end
25
+ it 'raises if called twice' do
26
+ expect { described_class.create_instance }.to raise_error /Already initialized/
27
+ end
28
+ end
29
+ end
30
+
31
+ describe '.set_instance' do
32
+ let(:instance) { double('Logger') }
33
+
34
+ it 'sets instance' do
35
+ described_class.set_instance(instance)
36
+ expect(described_class.instance).to eq instance
37
+ end
38
+
39
+ context 'if an instance has been created' do
40
+ before :each do
41
+ described_class.set_instance(instance)
42
+ end
43
+ it 'raises if called twice' do
44
+ expect { described_class.set_instance(instance) }.to raise_error /Already initialized/
45
+ end
46
+ end
47
+ end
48
+
49
+ describe '.instance' do
50
+ let(:instance) { double('Logger') }
51
+
52
+ it 'creates default instance if not set' do
53
+ expect(described_class.instance).to be_a(Lookout::Rack::Utils::LookoutLogger)
54
+ end
55
+
56
+ it 'returns set instance if set' do
57
+ described_class.set_instance(instance)
58
+ expect(described_class.instance).to eq(instance)
59
+ end
60
+ end
61
+ end
62
+
63
+ describe Lookout::Rack::Utils::LookoutLogger do
64
+ subject(:log) { described_class.new }
8
65
  let(:log_message) { 'foo' }
9
66
  let(:filename) { "log" }
10
67
  let(:exclude_levels) { [] }
@@ -90,7 +147,7 @@ describe Lookout::Rack::Utils::Log do
90
147
  end
91
148
  end
92
149
 
93
- describe Lookout::Rack::Utils::Log::LookoutFormatter do
150
+ describe Lookout::Rack::Utils::LookoutFormatter do
94
151
  subject(:formatter) { described_class.new }
95
152
  let(:logger) do
96
153
  logger = double('Mock Logger')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lookout-rack-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.44
4
+ version: 5.0.0.49
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-18 00:00:00.000000000 Z
11
+ date: 2018-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: sinatra
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '2.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '2.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: timecop
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -241,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
241
  version: '0'
242
242
  requirements: []
243
243
  rubyforge_project:
244
- rubygems_version: 2.6.13
244
+ rubygems_version: 2.7.8
245
245
  signing_key:
246
246
  specification_version: 4
247
247
  summary: ''