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.
@@ -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
-