notarius 0.1.0 → 0.2.6
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.
- data/README.md +9 -3
- data/history.md +44 -0
- data/lib/notarius.rb +32 -28
- data/lib/notarius/config.rb +10 -0
- data/lib/notarius/formatter.rb +36 -35
- data/lib/notarius/secretary.rb +33 -24
- data/lib/notarius/version.rb +1 -1
- data/rakefile.rb +27 -3
- data/roadmap.md +43 -0
- data/spec/config_spec.rb +1 -1
- data/spec/formatter_spec.rb +37 -13
- data/spec/notarius_spec.rb +4 -4
- data/spec/secretary_spec.rb +26 -28
- metadata +4 -3
- data/lib/notarius/exception.rb +0 -4
data/README.md
CHANGED
@@ -3,7 +3,7 @@ Notarius
|
|
3
3
|
|
4
4
|
Notarius is a logging library with opinions. The word "notarius" is
|
5
5
|
Latin for "shorthand writer". To this end, Notarius does everything
|
6
|
-
possible to encourage you to write short useful log messages.
|
6
|
+
possible to encourage you to write short useful log messages.
|
7
7
|
|
8
8
|
* Whitespace is converted to spaces.
|
9
9
|
* Lines are truncated to 140 characters.
|
@@ -66,7 +66,7 @@ NAME is the string you passed to the `configure` method) and call
|
|
66
66
|
responds to `:message`, `:backtrace`, or `:inspect`.
|
67
67
|
|
68
68
|
```ruby
|
69
|
-
class Player
|
69
|
+
class Player
|
70
70
|
include Notarius::BIG
|
71
71
|
|
72
72
|
def move direction
|
@@ -116,7 +116,7 @@ this:
|
|
116
116
|
level [timestamp] message
|
117
117
|
! backtrace
|
118
118
|
! backtrace
|
119
|
-
! backtrace
|
119
|
+
! backtrace
|
120
120
|
```
|
121
121
|
|
122
122
|
This makes it easy to log exceptions. More importantly, it makes it easy
|
@@ -137,6 +137,12 @@ intend.
|
|
137
137
|
|
138
138
|
Notarius tries to make things easier.
|
139
139
|
|
140
|
+
History
|
141
|
+
-------
|
142
|
+
|
143
|
+
See the {file:roadmap.md} for where this is going, and {file:history.md}
|
144
|
+
for where it's been.
|
145
|
+
|
140
146
|
License
|
141
147
|
-------
|
142
148
|
|
data/history.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
### 0.2.6 / 2012-07-15 ###
|
2
|
+
|
3
|
+
* 1 minor enhancement
|
4
|
+
* Adds a "history.md" file to keep track of changes.
|
5
|
+
|
6
|
+
### 0.2.5 / 2012-07-14 ###
|
7
|
+
|
8
|
+
* 2 minor enhancements
|
9
|
+
* Adds a "yard" task for generating documentation.
|
10
|
+
* Fleshes out documentation of the public API.
|
11
|
+
|
12
|
+
### 0.2.4 / 2012-07-08 ###
|
13
|
+
|
14
|
+
* 1 minor enhancement
|
15
|
+
* Cleans up code to improve readability.
|
16
|
+
|
17
|
+
### 0.2.3 / 2012-07-07 ###
|
18
|
+
|
19
|
+
* 1 bug fix
|
20
|
+
* Fixes whitespace handling in severity levels.
|
21
|
+
|
22
|
+
### 0.2.2 / 2012-07-05 ###
|
23
|
+
|
24
|
+
* 1 bug fix
|
25
|
+
* Fixes message formatting so each line is tweetable.
|
26
|
+
|
27
|
+
### 0.2.1 / 2012-07-04 ###
|
28
|
+
|
29
|
+
* 2 minor enhancements
|
30
|
+
* Adds a "flog" task for checking code complexity.
|
31
|
+
* Cleans up code to improve readability.
|
32
|
+
|
33
|
+
### 0.2.0 / 2012-07-02 ###
|
34
|
+
|
35
|
+
* 1 minor enhancement
|
36
|
+
* Drops custom exception classes in favor of using RuntimeError.
|
37
|
+
|
38
|
+
* 1 bug fix
|
39
|
+
* Fixes specs so they can run with the "-w" flag without warnings.
|
40
|
+
|
41
|
+
### 0.1.0 / 2012-07-01 ###
|
42
|
+
|
43
|
+
* 1 major enhancement
|
44
|
+
* Birthday!
|
data/lib/notarius.rb
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
require 'notarius/secretary'
|
2
2
|
require 'notarius/config'
|
3
|
-
require 'notarius/exception'
|
4
3
|
require 'notarius/version'
|
5
4
|
|
5
|
+
##
|
6
|
+
# Notarius is a logging library with opinions.
|
7
|
+
|
6
8
|
module Notarius
|
7
9
|
@configs = {}
|
8
10
|
|
9
11
|
##
|
10
|
-
#
|
12
|
+
# Configures a logging module. If a matching module exists, it will be
|
13
|
+
# reconfigured. Otherwise, a new module will be created.
|
11
14
|
#
|
12
|
-
# @
|
15
|
+
# @param [#to_s] name the module's name
|
16
|
+
# @yieldparam log [Config] the module's configuration
|
17
|
+
# @return [void]
|
13
18
|
#
|
14
19
|
# @example
|
15
20
|
# Notarius.configure 'BIG' do |log|
|
@@ -19,13 +24,13 @@ module Notarius
|
|
19
24
|
|
20
25
|
def self.configure name, &block
|
21
26
|
name = namespace name
|
22
|
-
@configs[name]
|
23
|
-
@configs[name]
|
27
|
+
@configs[name] ||= Config.new
|
28
|
+
block.call @configs[name] if block
|
24
29
|
return if self.const_defined? name
|
25
30
|
|
26
31
|
mod = Module.new do
|
27
32
|
define_method :log do
|
28
|
-
@secretary
|
33
|
+
@secretary ||= Secretary.new
|
29
34
|
@secretary.configure Notarius.config(name)
|
30
35
|
@secretary
|
31
36
|
end
|
@@ -34,9 +39,11 @@ module Notarius
|
|
34
39
|
end
|
35
40
|
|
36
41
|
##
|
37
|
-
#
|
38
|
-
# @
|
39
|
-
# @
|
42
|
+
# Gets the configuration for a module.
|
43
|
+
# @private
|
44
|
+
# @param [String] name the module's name
|
45
|
+
# @return [Config, nil] the module's configuration or +nil+ if none
|
46
|
+
# was found
|
40
47
|
|
41
48
|
def self.config name
|
42
49
|
validate name
|
@@ -44,19 +51,18 @@ module Notarius
|
|
44
51
|
end
|
45
52
|
|
46
53
|
##
|
47
|
-
#
|
48
|
-
# @
|
49
|
-
# @
|
54
|
+
# Validates a module's configuration.
|
55
|
+
# @private
|
56
|
+
# @param [String] name the module's name
|
57
|
+
# @return [void]
|
58
|
+
# @raise [RuntimeError] if the module's file is used by another module
|
50
59
|
|
51
60
|
def self.validate name
|
52
61
|
config = @configs[name]
|
53
|
-
if config
|
62
|
+
if config && config.file
|
54
63
|
@configs.each do |n, c|
|
55
|
-
if n != name && c.file
|
56
|
-
|
57
|
-
Notarius::#{name} logs to the same file as Notarius::#{n}.
|
58
|
-
EOF
|
59
|
-
raise Notarius::Exception.new message
|
64
|
+
if n != name && c.file == config.file
|
65
|
+
fail "Notarius::#{name} logs to the same file as Notarius::#{n}."
|
60
66
|
end
|
61
67
|
end
|
62
68
|
end
|
@@ -64,19 +70,17 @@ EOF
|
|
64
70
|
private_class_method :validate
|
65
71
|
|
66
72
|
##
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
# @
|
71
|
-
# @
|
72
|
-
# @return [String] converted namespace
|
73
|
+
# Generates a name that can be used for a module.
|
74
|
+
# @private
|
75
|
+
# @param [#to_s] name the requested name
|
76
|
+
# @return [String] the module's name
|
77
|
+
# @raise [RuntimeError] if the requested name is empty
|
73
78
|
|
74
79
|
def self.namespace name
|
75
80
|
name = name.to_s
|
76
|
-
if name.empty?
|
77
|
-
|
78
|
-
|
79
|
-
name[0, 1].upcase + name[1, name.size]
|
81
|
+
fail "namespaces can't be empty" if name.empty?
|
82
|
+
name[0] = name[0].capitalize
|
83
|
+
name
|
80
84
|
end
|
81
85
|
private_class_method :namespace
|
82
86
|
end
|
data/lib/notarius/config.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
module Notarius
|
2
|
+
##
|
3
|
+
# Holds the configuration for a logging module.
|
4
|
+
|
2
5
|
class Config
|
6
|
+
##
|
7
|
+
# Turn console logging on or off. Default is off.
|
8
|
+
# @return [Boolean] whether console logging is enabled
|
3
9
|
attr_accessor :console
|
10
|
+
|
11
|
+
##
|
12
|
+
# Turn file logging on or off. Default is off.
|
13
|
+
# @return [String, nil] the path to the file or +nil+ if off
|
4
14
|
attr_accessor :file
|
5
15
|
end
|
6
16
|
end
|
data/lib/notarius/formatter.rb
CHANGED
@@ -2,18 +2,19 @@ require 'time'
|
|
2
2
|
|
3
3
|
module Notarius
|
4
4
|
##
|
5
|
-
# Handles formatting of log messages. It's compatable with Ruby's
|
6
|
-
# +Logger
|
5
|
+
# Handles formatting of log messages. It's compatable with Ruby's
|
6
|
+
# +Logger+ class, but has its own opinions:
|
7
7
|
#
|
8
8
|
# * Whitespace in the message is converted to spaces.
|
9
|
-
# * Output is truncated to 140 characters.
|
9
|
+
# * Output is truncated to 140 characters per line.
|
10
10
|
# * Timestamps are formatted as ISO 8601 in UTC.
|
11
11
|
# * Lines in call stacks are prefixed with !'s.
|
12
12
|
# * Any of the arguments to #call can be nil.
|
13
13
|
|
14
14
|
class Formatter
|
15
15
|
##
|
16
|
-
# This is the interface Ruby's
|
16
|
+
# Generates a formatted log statement. This is the interface Ruby's
|
17
|
+
# +Logger+ class expects.
|
17
18
|
# @param [String] severity the severity level of the message
|
18
19
|
# @param [Date] timestamp the timestamp for the message
|
19
20
|
# @param [Object] application unused
|
@@ -22,51 +23,51 @@ module Notarius
|
|
22
23
|
# @return [String] formatted as "SEVERITY [timestamp] message\\n"
|
23
24
|
|
24
25
|
def call severity, timestamp, application, message
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
make_tweetable(
|
26
|
+
lines = []
|
27
|
+
lines << format_message(severity, timestamp, message)
|
28
|
+
lines << format_backtrace(message)
|
29
|
+
lines.flatten!
|
30
|
+
lines.map! { |line| make_tweetable(line) }
|
31
|
+
"#{lines.join("\n")}\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def format_message severity, timestamp, message
|
38
|
+
severity = format_severity severity
|
39
|
+
timestamp = format_timestamp timestamp
|
40
|
+
message = parse_message message
|
41
|
+
"#{severity} #{timestamp} #{message}".strip
|
42
|
+
end
|
43
|
+
|
44
|
+
def format_backtrace message
|
45
|
+
trace = message.respond_to?(:backtrace) ? [message.backtrace] : []
|
46
|
+
trace.flatten!
|
47
|
+
trace.compact!
|
48
|
+
trace.map { |line| "! #{clean_message(line)}" }
|
30
49
|
end
|
31
50
|
|
32
51
|
def format_severity severity
|
33
|
-
severity.
|
52
|
+
severity.upcase.gsub(/\s+/, '') if severity
|
34
53
|
end
|
35
|
-
private :format_severity
|
36
54
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
result << message.message
|
41
|
-
else
|
42
|
-
result << message
|
43
|
-
end
|
44
|
-
if message.respond_to?(:backtrace)
|
45
|
-
backtrace = [message.backtrace]
|
46
|
-
backtrace.flatten!
|
47
|
-
backtrace.compact!
|
48
|
-
result << backtrace.map { |line| "! %s" % clean_message(line) }
|
49
|
-
end
|
50
|
-
result.flatten!
|
51
|
-
result.map! { |line| clean_message(line) }
|
52
|
-
result.join("\n")
|
55
|
+
def parse_message message
|
56
|
+
message = message.message if message.respond_to?(:message)
|
57
|
+
clean_message(message || '')
|
53
58
|
end
|
54
|
-
private :format_message
|
55
59
|
|
56
60
|
def clean_message message
|
57
61
|
message = message.inspect unless message.kind_of?(String)
|
58
|
-
message.gsub(
|
62
|
+
message.strip.gsub(/\s+/, ' ')
|
59
63
|
end
|
60
|
-
private :clean_message
|
61
64
|
|
62
|
-
def format_timestamp timestamp
|
63
|
-
timestamp.utc.iso8601
|
65
|
+
def format_timestamp timestamp
|
66
|
+
"[#{timestamp.utc.iso8601}]" if timestamp
|
64
67
|
end
|
65
|
-
private :format_timestamp
|
66
68
|
|
67
69
|
def make_tweetable message
|
68
|
-
message.length > 140 ? message[0, 137]
|
70
|
+
message.length > 140 ? "#{message[0, 137]}..." : message
|
69
71
|
end
|
70
|
-
private :make_tweetable
|
71
72
|
end
|
72
73
|
end
|
data/lib/notarius/secretary.rb
CHANGED
@@ -2,9 +2,12 @@ require 'notarius/formatter'
|
|
2
2
|
require 'logger'
|
3
3
|
|
4
4
|
module Notarius
|
5
|
+
##
|
6
|
+
# Provides an API for logging modules.
|
7
|
+
|
5
8
|
class Secretary
|
6
9
|
##
|
7
|
-
#
|
10
|
+
# Creates a new instance of a Secretary.
|
8
11
|
# @return [Secretary]
|
9
12
|
|
10
13
|
def initialize
|
@@ -13,46 +16,48 @@ module Notarius
|
|
13
16
|
end
|
14
17
|
|
15
18
|
##
|
16
|
-
#
|
17
|
-
# @param [Config] config the configuration
|
18
|
-
|
19
|
+
# Configures a Secretary.
|
20
|
+
# @param [Config] config the configuration
|
21
|
+
# @return [void]
|
22
|
+
|
19
23
|
def configure config
|
20
|
-
|
21
|
-
|
22
|
-
else
|
23
|
-
delete :console
|
24
|
-
end
|
25
|
-
if config.file
|
26
|
-
add :file, config.file
|
27
|
-
else
|
28
|
-
delete :file
|
29
|
-
end
|
24
|
+
update :console, config.console, $stdout
|
25
|
+
update :file, config.file
|
30
26
|
end
|
31
27
|
|
32
28
|
##
|
33
|
-
#
|
29
|
+
# Logs an informative message. Informative messages show up the log
|
34
30
|
# with "INFO" at the start of the line.
|
31
|
+
# @param [String, #message, #backtrace, #inspect] message
|
32
|
+
# @return [void]
|
35
33
|
|
36
34
|
def info message
|
37
35
|
log Logger::INFO, message
|
38
36
|
end
|
39
37
|
|
40
38
|
##
|
41
|
-
#
|
39
|
+
# Logs a warning message. Warning messages show up in the log with
|
42
40
|
# "WARN" at the start of the line.
|
41
|
+
# @param [String, #message, #backtrace, #inspect] message
|
42
|
+
# @return [void]
|
43
43
|
|
44
44
|
def warn message
|
45
45
|
log Logger::WARN, message
|
46
46
|
end
|
47
47
|
|
48
48
|
##
|
49
|
-
#
|
49
|
+
# Logs an error message. Error messages show up in the log with
|
50
50
|
# "ERROR" at the start of the line.
|
51
|
+
# @param [String, #message, #backtrace, #inspect] message
|
52
|
+
# @return [void]
|
51
53
|
|
52
54
|
def error message
|
53
55
|
log Logger::ERROR, message
|
54
56
|
end
|
55
57
|
|
58
|
+
|
59
|
+
private
|
60
|
+
|
56
61
|
def log severity, message
|
57
62
|
@loggers.each do |key, logger|
|
58
63
|
if message != @messages[key]
|
@@ -61,28 +66,32 @@ module Notarius
|
|
61
66
|
end
|
62
67
|
end
|
63
68
|
end
|
64
|
-
|
69
|
+
|
70
|
+
def update key, stream, default = nil
|
71
|
+
if stream
|
72
|
+
add key, logger(stream, default)
|
73
|
+
else
|
74
|
+
delete key
|
75
|
+
end
|
76
|
+
end
|
65
77
|
|
66
78
|
def add key, stream
|
67
79
|
@loggers[key] = Logger.new stream
|
68
80
|
@loggers[key].formatter = Formatter.new
|
69
81
|
end
|
70
|
-
private :add
|
71
82
|
|
72
83
|
def delete key
|
73
84
|
logger = @loggers.delete(key)
|
74
|
-
logger.close
|
85
|
+
logger.close unless logger.nil?
|
75
86
|
end
|
76
|
-
private :delete
|
77
87
|
|
78
88
|
def logger *args
|
79
89
|
args.find { |arg| loggable?(arg) }
|
80
90
|
end
|
81
|
-
private :logger
|
82
91
|
|
83
92
|
def loggable? stream
|
84
|
-
stream.respond_to?(:write) && stream.respond_to?(:close)
|
93
|
+
io = stream.respond_to?(:write) && stream.respond_to?(:close)
|
94
|
+
io || stream.kind_of?(String)
|
85
95
|
end
|
86
|
-
private :loggable?
|
87
96
|
end
|
88
97
|
end
|
data/lib/notarius/version.rb
CHANGED
data/rakefile.rb
CHANGED
@@ -10,7 +10,9 @@ desc 'Run specs.'
|
|
10
10
|
task :default => :spec
|
11
11
|
|
12
12
|
desc 'Run specs.'
|
13
|
-
RSpec::Core::RakeTask.new :spec
|
13
|
+
RSpec::Core::RakeTask.new :spec do |t|
|
14
|
+
t.ruby_opts = ['-w']
|
15
|
+
end
|
14
16
|
|
15
17
|
desc 'Generate SimpleCov spec coverage.'
|
16
18
|
RSpec::Core::RakeTask.new :coverage do |t|
|
@@ -22,16 +24,38 @@ task :build do
|
|
22
24
|
sh "gem build #{name}.gemspec"
|
23
25
|
end
|
24
26
|
|
25
|
-
desc 'Install the gem'
|
27
|
+
desc 'Install the gem.'
|
26
28
|
task :install do
|
27
29
|
sh "gem install ./#{name}-#{version}.gem"
|
28
30
|
end
|
29
31
|
|
30
|
-
desc 'Uninstall the gem'
|
32
|
+
desc 'Uninstall the gem.'
|
31
33
|
task :uninstall do
|
32
34
|
sh "gem uninstall #{name}"
|
33
35
|
end
|
34
36
|
|
37
|
+
begin
|
38
|
+
gem 'flog'
|
39
|
+
desc 'Flog the code.'
|
40
|
+
task :flog, [:flags] do |t, args|
|
41
|
+
flags = args[:flags] ? "-#{args[:flags]}" : ''
|
42
|
+
files = FileList['lib/**/*.rb'].join(' ')
|
43
|
+
sh "flog #{flags} #{files}"
|
44
|
+
end
|
45
|
+
rescue Gem::LoadError
|
46
|
+
end
|
47
|
+
|
48
|
+
begin
|
49
|
+
gem 'yard'
|
50
|
+
desc 'Generate documentation with YARD.'
|
51
|
+
task :yard, [:options] => :clean do |t, args|
|
52
|
+
options = args[:options] || ''
|
53
|
+
options += ' --reload' if options.include? 'server'
|
54
|
+
sh "yard #{options}"
|
55
|
+
end
|
56
|
+
rescue Gem::LoadError
|
57
|
+
end
|
58
|
+
|
35
59
|
def name
|
36
60
|
@name ||= Dir['*.gemspec'].first.split('.').first
|
37
61
|
end
|
data/roadmap.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
Notarius
|
2
|
+
========
|
3
|
+
|
4
|
+
Notarius releases are named after Latin [book sizes][]. We go from
|
5
|
+
something large and course, _folio_, to someting fine and specific,
|
6
|
+
_duodecimo_. In a similar fashion to the [git flow][] branching model,
|
7
|
+
releases are unversioned. This is a general timeline for what gets
|
8
|
+
worked on when.
|
9
|
+
|
10
|
+
The current release, version 0.2.6, corresponds to the _quarto_ stage.
|
11
|
+
|
12
|
+
folio
|
13
|
+
-----
|
14
|
+
|
15
|
+
Initial API design, including configuration syntax and how namespaces
|
16
|
+
work with each other. Support for logging to the console (STDOUT) and
|
17
|
+
logging to a file. Basic documentation in YARD, and most code covered
|
18
|
+
in RSpec.
|
19
|
+
|
20
|
+
quarto
|
21
|
+
------
|
22
|
+
|
23
|
+
Clean up of YARD and RSpec documentation so it looks and feels
|
24
|
+
consistant. Most code is documented. Tightening of specs to reduce code
|
25
|
+
duplication and cover more edge cases. Migration of code to private
|
26
|
+
classes and methods to keep the API clean.
|
27
|
+
|
28
|
+
octavo
|
29
|
+
------
|
30
|
+
|
31
|
+
Elmination of Ruby headers in log files. All code is documented. Support
|
32
|
+
for setting logging level per logger. Ability to log blocks with delayed
|
33
|
+
evaluation. Stripping of color codes from file logging.
|
34
|
+
|
35
|
+
duodecimo
|
36
|
+
---------
|
37
|
+
|
38
|
+
Syslog support, both local and remote. Ability to specify stream (STDOUT
|
39
|
+
or STDERR) when logging to console. Handle internationalization (multi
|
40
|
+
byte log messages) nicely.
|
41
|
+
|
42
|
+
[book sizes]: http://en.wikipedia.org/wiki/Book_size "Book size on Wikipedia"
|
43
|
+
[git flow]: http://nvie.com/posts/a-successful-git-branching-model/ "A successful Git branching model >> nvie.com"
|
data/spec/config_spec.rb
CHANGED
data/spec/formatter_spec.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'notarius/formatter'
|
2
2
|
|
3
3
|
describe Notarius::Formatter do
|
4
|
-
describe 'call' do
|
4
|
+
describe '#call' do
|
5
5
|
let(:formatter) { Notarius::Formatter.new }
|
6
6
|
|
7
|
+
it 'allows all arguments to be nil' do
|
8
|
+
message = formatter.call(nil, nil, nil, nil)
|
9
|
+
message.should == "\n"
|
10
|
+
end
|
11
|
+
|
7
12
|
it 'converts whitespace to spaces' do
|
8
13
|
message = "\sMessage\r\nwith\twhitespace "
|
9
14
|
message = formatter.call(nil, nil, nil, message)
|
@@ -21,9 +26,10 @@ describe Notarius::Formatter do
|
|
21
26
|
message.should == "INFO\n"
|
22
27
|
end
|
23
28
|
|
24
|
-
it 'removes
|
25
|
-
|
26
|
-
message
|
29
|
+
it 'removes whitespace from severity' do
|
30
|
+
timestamp = Time.parse('2012-07-07 16:20:29 -0400')
|
31
|
+
message = formatter.call("\s\rWA\tRN\n", timestamp, nil, nil)
|
32
|
+
message.should == "WARN [2012-07-07T20:20:29Z]\n"
|
27
33
|
end
|
28
34
|
|
29
35
|
it 'ignores program name field' do
|
@@ -37,9 +43,30 @@ describe Notarius::Formatter do
|
|
37
43
|
be more than 140 characters so that Notarius can trim it
|
38
44
|
down to something more reasonable in length.
|
39
45
|
EOF
|
40
|
-
message.
|
41
|
-
message = formatter.call(
|
42
|
-
message.strip.
|
46
|
+
message.should have_at_least(141).characters
|
47
|
+
message = formatter.call('INFO', nil, nil, message)
|
48
|
+
message.strip.should have(140).characters
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'makes exceptions tweetable' do
|
52
|
+
message = <<-EOF
|
53
|
+
This is a really, really long message that needs to
|
54
|
+
be more than 140 characters so that Notarius can trim it
|
55
|
+
down to something more reasonable in length.
|
56
|
+
EOF
|
57
|
+
message.should have_at_least(141).characters
|
58
|
+
|
59
|
+
backtrace = <<-EOF
|
60
|
+
This is a really, really long backtrace that needs to
|
61
|
+
be more than 140 characters so that Notarius can trim it
|
62
|
+
down to something more reasonable in length.
|
63
|
+
EOF
|
64
|
+
backtrace.should have_at_least(141).characters
|
65
|
+
|
66
|
+
exception = Exception.new(message)
|
67
|
+
exception.set_backtrace [backtrace]
|
68
|
+
lines = formatter.call('INFO', nil, nil, exception).split("\n")
|
69
|
+
lines.each { |line| line.should have(140).characters }
|
43
70
|
end
|
44
71
|
|
45
72
|
it 'formats messages as "LEVEL [timestamp] message\n"' do
|
@@ -55,11 +82,9 @@ describe Notarius::Formatter do
|
|
55
82
|
|
56
83
|
it 'formats exceptions nicely' do
|
57
84
|
exception = Exception.new('message')
|
58
|
-
exception.set_backtrace ['trace this line', 'back to here']
|
85
|
+
exception.set_backtrace ['trace this line', 'back to here']
|
59
86
|
lines = formatter.call(nil, nil, nil, exception).split("\n")
|
60
|
-
lines
|
61
|
-
lines[1].should == '! trace this line'
|
62
|
-
lines[2].should == '! back to here'
|
87
|
+
lines.should == ['message', '! trace this line', '! back to here']
|
63
88
|
end
|
64
89
|
|
65
90
|
it 'formats objects nicely' do
|
@@ -99,8 +124,7 @@ describe Notarius::Formatter do
|
|
99
124
|
end
|
100
125
|
end
|
101
126
|
lines = formatter.call(nil, nil, nil, exception.new).split("\n")
|
102
|
-
lines
|
103
|
-
lines[1].should == '! backtrace'
|
127
|
+
lines.should == ['message', '! backtrace']
|
104
128
|
end
|
105
129
|
end
|
106
130
|
end
|
data/spec/notarius_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'notarius'
|
|
2
2
|
require 'tempfile'
|
3
3
|
|
4
4
|
describe Notarius do
|
5
|
-
def tempfiles *prefixes
|
5
|
+
def tempfiles *prefixes
|
6
6
|
files = prefixes.map { |prefix| Tempfile.new prefix }
|
7
7
|
begin
|
8
8
|
paths = files.map { |file| file.path }
|
@@ -91,7 +91,7 @@ describe Notarius do
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
expect { monster.new }.to raise_error(
|
94
|
+
expect { monster.new }.to raise_error(RuntimeError)
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
@@ -104,13 +104,13 @@ describe Notarius do
|
|
104
104
|
it 'throws an error if a namespace is empty' do
|
105
105
|
expect do
|
106
106
|
Notarius.configure ''
|
107
|
-
end.to raise_error(
|
107
|
+
end.to raise_error(RuntimeError)
|
108
108
|
end
|
109
109
|
|
110
110
|
it 'throws an error if a namespace is nil' do
|
111
111
|
expect do
|
112
112
|
Notarius.configure nil
|
113
|
-
end.to raise_error(
|
113
|
+
end.to raise_error(RuntimeError)
|
114
114
|
end
|
115
115
|
end
|
116
116
|
end
|
data/spec/secretary_spec.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
require 'notarius/secretary'
|
2
|
+
require 'notarius/config'
|
2
3
|
require 'stringio'
|
3
4
|
|
4
5
|
describe Notarius::Secretary do
|
6
|
+
def match_message level, message
|
7
|
+
match(/^#{level.upcase} \[[^\]]+\] #{message}\n$/)
|
8
|
+
end
|
9
|
+
|
5
10
|
describe 'logging' do
|
6
11
|
let(:logger) { StringIO.new }
|
7
12
|
let(:secretary) do
|
@@ -12,24 +17,17 @@ describe Notarius::Secretary do
|
|
12
17
|
s
|
13
18
|
end
|
14
19
|
|
15
|
-
before
|
20
|
+
before do
|
16
21
|
logger.truncate 0
|
17
22
|
logger.rewind
|
18
23
|
end
|
19
24
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
secretary.warn 'warning message'
|
27
|
-
logger.string.should match(/^WARN \[[^\]]+\] warning message\n$/)
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'can log error messages' do
|
31
|
-
secretary.error 'error message'
|
32
|
-
logger.string.should match(/^ERROR \[[^\]]+\] error message\n$/)
|
25
|
+
%w{info warn error}.each do |level|
|
26
|
+
it "can log #{level} messages" do
|
27
|
+
message = "#{level} message"
|
28
|
+
secretary.send(level.to_sym, message)
|
29
|
+
logger.string.should match_message(level, message)
|
30
|
+
end
|
33
31
|
end
|
34
32
|
end
|
35
33
|
|
@@ -46,8 +44,8 @@ describe Notarius::Secretary do
|
|
46
44
|
secretary.configure config
|
47
45
|
|
48
46
|
secretary.info 'info message'
|
49
|
-
io1.string.should
|
50
|
-
io2.string.should
|
47
|
+
io1.string.should match_message(:INFO, 'info message')
|
48
|
+
io2.string.should match_message(:INFO, 'info message')
|
51
49
|
end
|
52
50
|
|
53
51
|
it 'defaults console to stdout' do
|
@@ -62,10 +60,10 @@ describe Notarius::Secretary do
|
|
62
60
|
secretary.configure config
|
63
61
|
secretary.info 'message'
|
64
62
|
ensure
|
65
|
-
$stdout = stdout
|
63
|
+
$stdout = stdout
|
66
64
|
end
|
67
65
|
|
68
|
-
output.string.should
|
66
|
+
output.string.should match_message(:INFO, 'message')
|
69
67
|
end
|
70
68
|
|
71
69
|
it 'removes a logger when no longer referenced' do
|
@@ -79,25 +77,25 @@ describe Notarius::Secretary do
|
|
79
77
|
secretary = Notarius::Secretary.new
|
80
78
|
secretary.configure config1
|
81
79
|
secretary.info 'noodles'
|
82
|
-
io1.string.should
|
83
|
-
io2.string.should
|
80
|
+
io1.string.should match_message(:INFO, 'noodles')
|
81
|
+
io2.string.should match_message(:INFO, 'noodles')
|
84
82
|
|
85
|
-
secretary.configure Notarius::Config.new
|
83
|
+
secretary.configure Notarius::Config.new
|
86
84
|
secretary.info 'pasta'
|
87
|
-
io1.string.should_not
|
88
|
-
io2.string.should_not
|
85
|
+
io1.string.should_not match_message(:INFO, 'pasta')
|
86
|
+
io2.string.should_not match_message(:INFO, 'pasta')
|
89
87
|
end
|
90
88
|
|
91
89
|
it 'closes a logger when it removes it' do
|
92
90
|
config = Notarius::Config.new
|
93
|
-
config.console = StringIO.new
|
91
|
+
config.console = StringIO.new
|
94
92
|
|
95
93
|
secretary = Notarius::Secretary.new
|
96
94
|
secretary.configure config
|
97
95
|
secretary.info 'noodles'
|
98
|
-
config.console.string.should
|
96
|
+
config.console.string.should match_message(:INFO, 'noodles')
|
99
97
|
|
100
|
-
secretary.configure Notarius::Config.new
|
98
|
+
secretary.configure Notarius::Config.new
|
101
99
|
secretary.info 'pasta'
|
102
100
|
config.console.should be_closed
|
103
101
|
end
|
@@ -122,7 +120,7 @@ describe Notarius::Secretary do
|
|
122
120
|
|
123
121
|
secretary.info 'same message'
|
124
122
|
|
125
|
-
io1.string.should_not
|
126
|
-
io2.string.should
|
123
|
+
io1.string.should_not match_message(:INFO, 'same message')
|
124
|
+
io2.string.should match_message(:INFO, 'same message')
|
127
125
|
end
|
128
126
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: notarius
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -73,14 +73,15 @@ extra_rdoc_files: []
|
|
73
73
|
files:
|
74
74
|
- LICENSE.md
|
75
75
|
- README.md
|
76
|
+
- history.md
|
76
77
|
- lib/notarius.rb
|
77
78
|
- lib/notarius/config.rb
|
78
|
-
- lib/notarius/exception.rb
|
79
79
|
- lib/notarius/formatter.rb
|
80
80
|
- lib/notarius/secretary.rb
|
81
81
|
- lib/notarius/version.rb
|
82
82
|
- notarius.gemspec
|
83
83
|
- rakefile.rb
|
84
|
+
- roadmap.md
|
84
85
|
- spec/config_spec.rb
|
85
86
|
- spec/formatter_spec.rb
|
86
87
|
- spec/notarius_spec.rb
|
data/lib/notarius/exception.rb
DELETED