majic 0.1 → 0.2
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/library/majic/class.rb +11 -0
- data/library/majic/logging.rb +136 -0
- data/library/majic/object.rb +11 -0
- data/library/majic.rb +7 -3
- metadata +21 -29
@@ -0,0 +1,136 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Majic
|
4
|
+
module Logging
|
5
|
+
Levels = [:debug, :info, :warn, :error, :fatal]
|
6
|
+
LevelColors = { debug: :white, info: :blue, warn: :yellow, error: :red, fatal: :orange }
|
7
|
+
|
8
|
+
DefaultNameCutoff = 10
|
9
|
+
UnknownLevelError = Class.new RuntimeError
|
10
|
+
|
11
|
+
@level = Levels.first
|
12
|
+
@stream = $stdout
|
13
|
+
@mutex = Mutex.new
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def included klass
|
17
|
+
klass.metaclass.send :attr_accessor, :logger
|
18
|
+
klass.logger = Logger.new klass
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_accessor :level, :stream
|
22
|
+
attr_reader :mutex
|
23
|
+
|
24
|
+
attr_writer :name_cutoff
|
25
|
+
def name_cutoff; @name_cutoff or DefaultNameCutoff end
|
26
|
+
def name_cutoff?; !!@name_cutoff end
|
27
|
+
|
28
|
+
def level= level
|
29
|
+
raise UnknownLevelError unless Levels.include? level
|
30
|
+
@level = level
|
31
|
+
end
|
32
|
+
|
33
|
+
def level_index
|
34
|
+
Levels.index level
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def log *messages
|
39
|
+
logger_instance = (metaclass.respond_to?(:logger) && metaclass.logger or self.class.logger)
|
40
|
+
|
41
|
+
if messages.empty?
|
42
|
+
logger_instance
|
43
|
+
else
|
44
|
+
logger_instance.debug *messages
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Logger
|
49
|
+
TimeFormat = '%H:%M:%S'
|
50
|
+
|
51
|
+
attr_writer :name
|
52
|
+
|
53
|
+
@@names = Set.new
|
54
|
+
|
55
|
+
class << self
|
56
|
+
def name_width; Logging.name_cutoff or @@names.map(&:length).max end
|
57
|
+
end
|
58
|
+
|
59
|
+
def initialize object
|
60
|
+
@object = object
|
61
|
+
@@names << name
|
62
|
+
end
|
63
|
+
|
64
|
+
def log level, *messages
|
65
|
+
return if not should_message? level
|
66
|
+
|
67
|
+
Logging.mutex.synchronize do
|
68
|
+
messages.each do |message|
|
69
|
+
Logging.stream.puts format(level, message).force_encoding 'utf-8'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
Levels.each do |level|
|
75
|
+
define_method level do |*messages|
|
76
|
+
log level, *messages
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def name_self object, name
|
81
|
+
# FIXME: This appears not to be called when attaching to a metaclass.
|
82
|
+
# An investigation is in order.
|
83
|
+
Logging.included object.metaclass
|
84
|
+
|
85
|
+
object.extend Logging
|
86
|
+
object.log.name = name
|
87
|
+
end
|
88
|
+
|
89
|
+
def name
|
90
|
+
@name or default_name
|
91
|
+
end
|
92
|
+
|
93
|
+
def name= name
|
94
|
+
@@names.delete @name
|
95
|
+
@name = name
|
96
|
+
@@names << @name
|
97
|
+
end
|
98
|
+
|
99
|
+
protected
|
100
|
+
|
101
|
+
def default_name
|
102
|
+
cutoff = Logging.name_cutoff
|
103
|
+
|
104
|
+
default_name = if Module === @object
|
105
|
+
name = @object.to_s
|
106
|
+
name.sub! /^.+?::/, '' while name.include? '::' and name.length > cutoff
|
107
|
+
name
|
108
|
+
else
|
109
|
+
@object.to_s
|
110
|
+
end
|
111
|
+
|
112
|
+
default_name.truncate! cutoff, :middle if default_name.length > cutoff
|
113
|
+
|
114
|
+
default_name
|
115
|
+
end
|
116
|
+
|
117
|
+
def format level, message
|
118
|
+
name = self.name.ljust(Logger.name_width) ^ :bold
|
119
|
+
[timestamp, name, level_string(level), " #{message}"].join " "
|
120
|
+
end
|
121
|
+
|
122
|
+
def should_message? level
|
123
|
+
Levels.index(level) >= Logging.level_index
|
124
|
+
end
|
125
|
+
|
126
|
+
def timestamp
|
127
|
+
Time.now.strftime TimeFormat
|
128
|
+
end
|
129
|
+
|
130
|
+
def level_string level
|
131
|
+
max_width = Levels.map(&:length).max
|
132
|
+
level.to_s.capitalize.rjust(max_width) ^ LevelColors[level]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
data/library/majic.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
require 'majic/class'
|
6
|
+
require 'majic/logging'
|
3
7
|
require 'majic/ansi_escape'
|
4
8
|
|
5
9
|
module Majic
|
6
|
-
|
7
|
-
def to_s; join '.' end
|
8
|
-
end
|
10
|
+
Version = "0.2"
|
9
11
|
end
|
12
|
+
|
13
|
+
::Logging = Majic::Logging unless defined? ::Logging
|
metadata
CHANGED
@@ -1,57 +1,49 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: majic
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
4
5
|
prerelease:
|
5
|
-
version: "0.1"
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Mikkel Kroman
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-02-04 00:00:00 +01:00
|
14
|
-
default_executable:
|
12
|
+
date: 2011-10-15 00:00:00.000000000 Z
|
15
13
|
dependencies: []
|
16
|
-
|
17
14
|
description:
|
18
15
|
email: mk@maero.dk
|
19
16
|
executables: []
|
20
|
-
|
21
17
|
extensions: []
|
22
|
-
|
23
18
|
extra_rdoc_files: []
|
24
|
-
|
25
|
-
files:
|
19
|
+
files:
|
26
20
|
- library/majic.rb
|
27
21
|
- library/majic/ansi_escape.rb
|
28
|
-
|
22
|
+
- library/majic/logging.rb
|
23
|
+
- library/majic/class.rb
|
24
|
+
- library/majic/object.rb
|
29
25
|
homepage:
|
30
26
|
licenses: []
|
31
|
-
|
32
27
|
post_install_message:
|
33
28
|
rdoc_options: []
|
34
|
-
|
35
|
-
require_paths:
|
29
|
+
require_paths:
|
36
30
|
- library
|
37
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
32
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version:
|
43
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
38
|
none: false
|
45
|
-
requirements:
|
46
|
-
- -
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version:
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
49
43
|
requirements: []
|
50
|
-
|
51
44
|
rubyforge_project:
|
52
|
-
rubygems_version: 1.
|
45
|
+
rubygems_version: 1.8.10
|
53
46
|
signing_key:
|
54
47
|
specification_version: 3
|
55
48
|
summary: A set of utillities for Ruby
|
56
49
|
test_files: []
|
57
|
-
|