logbert 0.6.4 → 0.6.13

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
2
  SHA1:
3
- metadata.gz: c133267e75a816038c4abdafba21f850d4a0731f
4
- data.tar.gz: 6bd905d93430880aa4889e11e4ceb063f1581673
3
+ metadata.gz: 26bafce2e48323c5a058c24fcb462e6502c09493
4
+ data.tar.gz: 69b57207d64eac6b5a7588f1fcec11efcf725de3
5
5
  SHA512:
6
- metadata.gz: 26f685bcedaf8d2fbfec4dc5caff3f212d5e9a3c10d547f07c785a95497e9fa0ca7c2d02b4efbd7faaa721c4278def872b34001f829671131f7035a1e3084d83
7
- data.tar.gz: be0035b051689de397e889f75a3777bbecd806ad99720ea5201ff937ed39ede1506838e4f23b6e1b9a2c6e2c8d87d90e4fdf61cae53915c973cf635a4abc2cda
6
+ metadata.gz: 5ce4a7daaa541567e830819e6e24d86b7cd2257cf13872d8cb0845a85888de23a4b46531e31798580403414566c37e910cc8345aeaf0a7f0388ab160df207522
7
+ data.tar.gz: dd8351a14e2440195f0591a277c2689e448957fd3005bc512f8affef7d1943e039aa4e266c0883ccb5a1aa7c8322c5c0be2b24ce63c07904f82cb45f9989b4a7
@@ -4,7 +4,7 @@ require 'logbert/message'
4
4
  module Logbert
5
5
 
6
6
  module Formatters
7
-
7
+
8
8
  class Formatter
9
9
  def format(msg)
10
10
  raise NotImplementedError
@@ -14,7 +14,20 @@ module Logbert
14
14
  class SimpleFormatter < Formatter
15
15
  def format(msg)
16
16
  level = msg.level.to_s.upcase.ljust(8)
17
- "#{level} [time='#{msg.time}' pid='#{msg.pid}' logger='#{msg.logger}'] : #{msg.content}"
17
+ output = "#{level} [time='#{msg.time}' pid='#{msg.pid}' logger='#{msg.logger}'] : #{msg.content}"
18
+ if msg.exception
19
+ output = [output, "\n\nException information:\n", msg.exception.class, ": ", msg.exception.message, "\n"]
20
+
21
+ backtrace = backtrace = msg.exception.backtrace
22
+ if backtrace
23
+ output += [backtrace.join($/), "\n\n"]
24
+ else
25
+ output << "(Backtrace is unavailable)\n\n"
26
+ end
27
+
28
+ output = output.join
29
+ end
30
+ return output
18
31
  end
19
32
  end
20
33
 
@@ -21,75 +21,101 @@ module Logbert
21
21
  def to_s
22
22
  @name.to_s
23
23
  end
24
+
25
+ def inspect
26
+ "Level(#{@name.inspect}, #{@value})"
27
+ end
24
28
  end
25
29
 
26
30
  # This class doubles as a mixin. Bazinga!
27
31
  class LevelManager < Module
28
32
 
29
33
  def initialize
30
- @name_to_level = {}
31
- @value_to_level = {}
34
+ @level_to_aliases = {}
32
35
 
33
36
  @quick_lookup = {}
34
37
 
35
38
  Logbert::DefaultLevels.each{|name, value| self.define_level(name, value)}
39
+ self.alias_level :warn, :warning
36
40
  end
37
41
 
38
- def names
39
- @name_to_level.keys
40
- end
41
-
42
- def values
43
- @value_to_level.keys
44
- end
45
-
42
+
46
43
  def levels
47
- @name_to_level.values
48
- end
44
+ @level_to_aliases.keys
45
+ end
49
46
 
47
+ def aliases_for(level)
48
+ level = self.level_for(level)
49
+ @level_to_aliases.fetch(level)
50
+ end
50
51
 
51
52
  def define_level(name, value)
52
- unless name.instance_of?(Symbol) or name.instance_of?(String)
53
- raise ArgumentError, "The Level's name must be a Symbol or a String"
54
- end
53
+ raise ArgumentError, "The Level's name must implement #to_sym" unless name.respond_to? :to_sym
55
54
  raise ArgumentError, "The Level's value must be an Integer" unless value.is_a? Integer
56
55
 
57
- # TODO: Verify that the name/value are not already taken
58
- raise KeyError, "A Level with that name is already defined: #{name}" if @name_to_level.has_key? name
59
- raise KeyError, "A Level with that value is already defined: #{value}" if @value_to_level.has_key? value
56
+ name = name.to_sym
57
+
58
+ raise KeyError, "A Level with that name is already defined: #{name}" if @quick_lookup.has_key? name
59
+ raise KeyError, "A Level with that value is already defined: #{value}" if @quick_lookup.has_key? value
60
60
 
61
61
  level = Level.new(name, value)
62
62
 
63
- @name_to_level[name] = level
64
- @value_to_level[value] = level
65
63
  @quick_lookup[name] = @quick_lookup[value] = @quick_lookup[level] = level
64
+ @level_to_aliases[level] = [name]
66
65
 
67
66
  self.create_logging_method(name)
68
67
  self.create_predicate_method(name, value)
68
+
69
+ return level
69
70
  end
71
+
72
+
73
+ def alias_level(alias_name, level)
74
+ raise ArgumentError, "The Level alias must implement #to_sym: #{alias_name}" unless alias_name.respond_to? :to_sym
75
+
76
+ alias_name = alias_name.to_sym
77
+
78
+ preexisting_level = @quick_lookup[alias_name]
79
+ if preexisting_level
80
+ raise KeyError, "The alias is already taken: #{alias_name} -> #{preexisting_level}"
81
+ end
82
+
83
+ level = self.level_for!(level, false)
70
84
 
85
+ @level_to_aliases[level] << alias_name
86
+ @quick_lookup[alias_name] = level
87
+
88
+ alias_method alias_name, level.name
89
+ alias_method "#{alias_name}?", "#{level.name}?"
90
+
91
+ return level
92
+ end
71
93
 
72
- def [](x)
94
+
95
+ def level_for(x, allow_virtual_levels = true)
73
96
  @quick_lookup[x] or begin
74
97
  if x.is_a? Integer
75
- # Return either the pre-defined level, or produce a virtual level.
76
- level = @value_to_level[x] || Logbert::Level.new("LEVEL_#{x}".to_sym, x)
77
- return level
78
- elsif x.is_a? String
79
- level = @name_to_level[x.to_sym]
98
+ return Logbert::Level.new("LEVEL_#{x}".to_sym, x) if allow_virtual_levels
99
+ elsif x.respond_to? :to_sym
100
+ level = @quick_lookup[x.to_sym]
80
101
  return level if level
81
102
  end
82
-
83
- raise KeyError, "No Level could be found for input: #{x}"
103
+
104
+ nil
84
105
  end
85
106
  end
86
-
107
+
108
+ def level_for!(x, allow_virtual_levels = true)
109
+ self.level_for(x, allow_virtual_levels) or raise KeyError, "No Level could be found for input: #{x}"
110
+ end
111
+
112
+ alias :[] :level_for
87
113
 
88
114
  protected
89
115
 
90
116
  def create_logging_method(level_name)
91
- define_method level_name do |content = nil, &block|
92
- self.log(level_name, content, &block)
117
+ define_method level_name do |*args, &block|
118
+ self.log(level_name, *args, &block)
93
119
  end
94
120
  end
95
121
 
@@ -41,8 +41,18 @@ module Logbert
41
41
  self.factory.root
42
42
  end
43
43
 
44
- def log(level, content = nil, &block)
45
- message = Logbert::Message.create(self, @level_manager[level], content, &block)
44
+ def log(level, *args, &block)
45
+ content, options = self.prepare_message_args(*args, &block)
46
+
47
+ exception = options[:exc_info]
48
+ if exception
49
+ # If the user passed in an exception, then use that one.
50
+ # Otherwise, check the magic $! variable to see if an
51
+ # exception is currently being handled.
52
+ exception = $! unless exception.is_a? Exception
53
+ end
54
+
55
+ message = Logbert::Message.create(self, @level_manager[level], exception, options, content, &block)
46
56
  handle_message(message)
47
57
  end
48
58
 
@@ -52,6 +62,24 @@ module Logbert
52
62
  end
53
63
 
54
64
  protected
65
+
66
+
67
+ # This method will be unnecessary once we upgrade to Ruby 2.x
68
+ def prepare_message_args(*args, &block)
69
+ if args.size == 0
70
+ return [nil, {}]
71
+ elsif args.size == 1
72
+ if block_given?
73
+ return [nil, args[0]]
74
+ else
75
+ return [args[0], {}]
76
+ end
77
+ elsif args.size == 2
78
+ return [args[0], args[1]]
79
+ else
80
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 0..2)"
81
+ end
82
+ end
55
83
 
56
84
  def handle_message(message)
57
85
  if message.level.value >= self.level.value
@@ -2,20 +2,22 @@
2
2
  module Logbert
3
3
 
4
4
  class Message
5
- attr_reader :logger, :level, :time, :pid, :content_proc
5
+ attr_reader :logger, :level, :time, :pid, :exception, :options, :content_proc
6
6
 
7
- def initialize(logger, level, time, pid, content = nil, &content_proc)
7
+ def initialize(logger, level, time, pid, exception, options, content = nil, &content_proc)
8
8
  @logger = logger
9
9
  @level = level
10
10
  @time = time
11
11
  @pid = pid
12
+ @exception = exception
13
+ @options = options
12
14
 
13
15
  @content = content
14
16
  @content_proc = content_proc
15
17
  end
16
18
 
17
- def self.create(logger, level, content = nil, &content_proc)
18
- Message.new logger, level, Time.now, Process.pid, content, &content_proc
19
+ def self.create(logger, level, exception, options, content = nil, &content_proc)
20
+ Message.new logger, level, Time.now, Process.pid, exception, options, content, &content_proc
19
21
  end
20
22
 
21
23
  # Returns the content. If the content has not been created yet,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logbert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.6.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Lauber