majic 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ class Object
4
+ def metaclass
5
+ class << self; self end
6
+ end
7
+
8
+ def include! klass
9
+ metaclass.__send__ :include, klass
10
+ end
11
+ end
@@ -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
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ class Object
4
+ def metaclass
5
+ class << self; self end
6
+ end
7
+
8
+ def include! object
9
+ metaclass.__send__ :include, klass
10
+ end
11
+ 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
- class << Version = [0,1]
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
- has_rdoc: true
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: 1.9.1
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: "0"
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
49
43
  requirements: []
50
-
51
44
  rubyforge_project:
52
- rubygems_version: 1.5.0
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
-