logbert 0.6.4 → 0.6.13

Sign up to get free protection for your applications and to get access to all the features.
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