utilrb 1.6.6 → 2.0
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/Manifest.txt +10 -9
- data/README.rd +23 -0
- data/Rakefile +40 -37
- data/ext/utilrb/extconf.rb +36 -0
- data/ext/{proc.cc → utilrb/proc.c} +7 -6
- data/ext/utilrb/ruby_allocator.hh +76 -0
- data/ext/{ruby_internals-1.8.h → utilrb/ruby_internals-1.8.h} +0 -0
- data/ext/{ruby_internals-1.9.h → utilrb/ruby_internals-1.9.h} +0 -0
- data/ext/{swap.cc → utilrb/swap.cc} +0 -0
- data/ext/utilrb/utilrb.cc +79 -0
- data/ext/{value_set.cc → utilrb/value_set.cc} +5 -5
- data/ext/{weakref.cc → utilrb/weakref.cc} +0 -0
- data/lib/utilrb/common.rb +7 -2
- data/lib/utilrb/doc/rake.rb +46 -15
- data/lib/utilrb/kernel/load_dsl_file.rb +2 -2
- data/lib/utilrb/kernel/options.rb +6 -0
- data/lib/utilrb/logger/forward.rb +7 -0
- data/lib/utilrb/logger/hierarchy.rb +100 -42
- data/lib/utilrb/logger/indent.rb +38 -3
- data/lib/utilrb/logger/log_pp.rb +1 -1
- data/lib/utilrb/logger/root.rb +27 -12
- data/lib/utilrb/module/inherited_enumerable.rb +2 -196
- data/lib/utilrb/objectstats.rb +4 -1
- data/lib/utilrb/pkgconfig.rb +42 -6
- data/lib/utilrb/rake_common.rb +12 -0
- data/lib/utilrb/ruby_object_graph.rb +195 -46
- data/lib/utilrb/yard.rb +89 -89
- data/test/test_array.rb +1 -1
- data/test/test_dir.rb +1 -1
- data/test/test_enumerable.rb +7 -1
- data/test/test_event_loop.rb +407 -0
- data/test/test_exception.rb +1 -1
- data/test/test_gc.rb +1 -1
- data/test/test_hash.rb +57 -1
- data/test/test_kernel.rb +52 -21
- data/test/test_logger.rb +150 -1
- data/test/test_misc.rb +1 -1
- data/test/test_models.rb +212 -0
- data/test/test_module.rb +41 -71
- data/test/test_object.rb +1 -1
- data/test/test_objectstats.rb +1 -1
- data/test/test_pkgconfig.rb +7 -5
- data/test/test_proc.rb +1 -1
- data/test/test_set.rb +1 -1
- data/test/test_thread_pool.rb +409 -0
- data/test/test_time.rb +6 -6
- data/test/test_unbound_method.rb +1 -1
- metadata +157 -131
- data/README.txt +0 -45
- data/ext/extconf.rb +0 -29
- data/ext/utilrb_ext.cc +0 -144
data/lib/utilrb/doc/rake.rb
CHANGED
@@ -9,43 +9,74 @@ module Utilrb
|
|
9
9
|
rescue LoadError
|
10
10
|
begin
|
11
11
|
require 'rdoc/task'
|
12
|
-
'rdoc
|
12
|
+
'rdoc'
|
13
13
|
rescue LoadError
|
14
|
-
begin
|
15
|
-
require 'rake/rdoctask'
|
16
|
-
'rdoc-old'
|
17
|
-
rescue LoadError
|
18
|
-
end
|
19
14
|
end
|
20
15
|
end
|
21
16
|
|
17
|
+
def self.doc?
|
18
|
+
if DOC_MODE
|
19
|
+
true
|
20
|
+
else
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
22
25
|
def self.doc(target = 'docs', options = Hash.new)
|
26
|
+
if target.kind_of?(Hash)
|
27
|
+
target, options = 'docs', target
|
28
|
+
end
|
29
|
+
|
23
30
|
options = Kernel.validate_options options,
|
24
|
-
:include => [File.join(
|
31
|
+
:include => [File.join('lib', '**', '*.rb'), File.join('ext', '**', '*.cc')],
|
25
32
|
:exclude => [],
|
26
33
|
:target_dir => 'doc',
|
27
34
|
:title => '',
|
28
|
-
:plugins => []
|
35
|
+
:plugins => [],
|
36
|
+
:files => []
|
29
37
|
|
30
38
|
case DOC_MODE
|
31
39
|
when 'yard'
|
32
40
|
task = YARD::Rake::YardocTask.new(target)
|
33
41
|
task.files.concat(options[:include])
|
34
42
|
task.options << '--title' << options[:title] << '--output-dir' << options[:target_dir]
|
43
|
+
if !options[:files].empty?
|
44
|
+
task.options << "--files" << options[:files].join(",")
|
45
|
+
end
|
35
46
|
options[:plugins].each do |plugin_name|
|
36
47
|
require "#{plugin_name}/yard"
|
37
48
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
49
|
+
|
50
|
+
task_clobber = ::Rake::Task.define_task "clobber_#{target}" do
|
51
|
+
FileUtils.rm_rf options[:target_dir]
|
52
|
+
end
|
53
|
+
task_clobber.add_description "Remove #{target} products"
|
54
|
+
|
55
|
+
name = ::Rake.application.current_scope.dup
|
56
|
+
if name.respond_to?(:path)
|
57
|
+
name = name.map(&:to_s).reverse
|
58
|
+
end
|
59
|
+
name << task.name
|
60
|
+
task_re = ::Rake::Task.define_task "re#{target}" do
|
61
|
+
FileUtils.rm_rf options[:target_dir]
|
62
|
+
::Rake::Task[name.join(":")].invoke
|
63
|
+
end
|
64
|
+
task_re.add_description "Force a rebuild of #{target}"
|
65
|
+
|
66
|
+
when "rdoc"
|
67
|
+
task = RDoc::Task.new(target)
|
45
68
|
task.rdoc_files.include(*options[:include])
|
46
69
|
task.rdoc_files.exclude(*options[:exclude])
|
47
70
|
task.title = options[:title]
|
48
71
|
task.rdoc_dir = File.expand_path(options[:target_dir])
|
72
|
+
|
73
|
+
else
|
74
|
+
[target, "re#{target}"].each do |task_name|
|
75
|
+
t = ::Rake::Task.define_task(task_name) do
|
76
|
+
STDERR.puts "Documentation generation is disabled: install either the yard or rdoc gems"
|
77
|
+
end
|
78
|
+
t.add_description "Disabled on this installation as neither yard nor rdoc are available"
|
79
|
+
end
|
49
80
|
end
|
50
81
|
end
|
51
82
|
end
|
@@ -150,12 +150,12 @@ module Kernel
|
|
150
150
|
def dsl_exec_common(file, proxied_object, context, full_backtrace, *exceptions, &code)
|
151
151
|
load_dsl_filter_backtrace(file, full_backtrace, *exceptions) do
|
152
152
|
sandbox = with_module(*context) do
|
153
|
-
Class.new do
|
153
|
+
Class.new(BasicObject) do
|
154
154
|
def self.name; "" end
|
155
155
|
attr_accessor :main_object
|
156
156
|
def initialize(obj); @main_object = obj end
|
157
157
|
def method_missing(*m, &block)
|
158
|
-
main_object.
|
158
|
+
main_object.__send__(*m, &block)
|
159
159
|
end
|
160
160
|
end
|
161
161
|
end
|
@@ -57,6 +57,12 @@ module Kernel
|
|
57
57
|
return *[known_options, unknown_options]
|
58
58
|
end
|
59
59
|
|
60
|
+
# Normalizes all keys in the given option hash to symbol and returns the
|
61
|
+
# modified hash
|
62
|
+
def normalize_options(options)
|
63
|
+
options.to_sym_keys
|
64
|
+
end
|
65
|
+
|
60
66
|
# Validates an option hash, with default value support. See #filter_options
|
61
67
|
#
|
62
68
|
# In the first form, +option_hash+ should contain keys which are also
|
@@ -15,10 +15,17 @@ class Logger
|
|
15
15
|
EOF
|
16
16
|
end
|
17
17
|
|
18
|
+
# Forwarded to {Logger#silent}
|
19
|
+
def log_silent(&block)
|
20
|
+
logger.silent(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Forwarded to {Logger#nest}
|
18
24
|
def log_nest(size, level = nil, &block)
|
19
25
|
logger.nest(size, level, &block)
|
20
26
|
end
|
21
27
|
|
28
|
+
# Forwarded to {Logger#log_pp}
|
22
29
|
def log_pp(level, object, *first_line_format)
|
23
30
|
logger.log_pp(level, object, *first_line_format)
|
24
31
|
end
|
@@ -1,9 +1,65 @@
|
|
1
1
|
require 'facets/module/spacename'
|
2
2
|
require 'facets/kernel/constant'
|
3
|
+
require 'utilrb/object/attribute'
|
3
4
|
require 'utilrb/object/singleton_class'
|
4
5
|
require 'utilrb/logger/forward'
|
5
6
|
|
6
7
|
class Logger
|
8
|
+
module HierarchyElement
|
9
|
+
attribute :log_children do
|
10
|
+
Array.new
|
11
|
+
end
|
12
|
+
|
13
|
+
# Makes it so that this level of the module hierarchy has its own
|
14
|
+
# logger. If +new_progname+ and/or +new_level+ are nil, the associated
|
15
|
+
# value are taken from the parent's logger.
|
16
|
+
def make_own_logger(new_progname = nil, new_level = nil)
|
17
|
+
new_logger = @logger || self.logger.dup
|
18
|
+
if new_progname
|
19
|
+
new_logger.progname = new_progname
|
20
|
+
end
|
21
|
+
if new_level
|
22
|
+
new_logger.level = new_level
|
23
|
+
end
|
24
|
+
self.logger = new_logger
|
25
|
+
end
|
26
|
+
|
27
|
+
# Allows to change the logger object at this level of the hierarchy
|
28
|
+
#
|
29
|
+
# This is usually not used directly: a new logger can be created with
|
30
|
+
# Hierarchy#make_own_logger and removed with Hierarchy#reset_own_logger
|
31
|
+
def logger=(new_logger)
|
32
|
+
@logger = new_logger
|
33
|
+
log_children.each do |child|
|
34
|
+
child.reset_default_logger
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Removes a logger defined at this level of the module hierarchy. The
|
39
|
+
# logging methods will now access the parent's module logger.
|
40
|
+
def reset_own_logger
|
41
|
+
@logger = nil
|
42
|
+
log_children.each do |child|
|
43
|
+
child.reset_default_logger
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def reset_default_logger
|
48
|
+
@__utilrb_hierarchy__default_logger = nil
|
49
|
+
log_children.each do |child|
|
50
|
+
child.reset_default_logger
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def logger
|
55
|
+
if defined?(@logger) && @logger
|
56
|
+
return @logger
|
57
|
+
elsif defined?(@__utilrb_hierarchy__default_logger) && @__utilrb_hierarchy__default_logger
|
58
|
+
return @__utilrb_hierarchy__default_logger
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
7
63
|
# Define a hierarchy of loggers mapped to the module hierarchy.
|
8
64
|
#
|
9
65
|
# It defines the #logger accessor which either returns the logger
|
@@ -26,26 +82,11 @@ class Logger
|
|
26
82
|
# "extend Hierarchy" will also add the Forward support if the parent module
|
27
83
|
# has it.
|
28
84
|
module Hierarchy
|
29
|
-
|
30
|
-
#
|
31
|
-
# This is usually not used directly: a new logger can be created with
|
32
|
-
# Hierarchy#make_own_logger and removed with Hierarchy#reset_own_logger
|
33
|
-
attr_writer :logger
|
85
|
+
include HierarchyElement
|
34
86
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.extended(obj) # :nodoc:
|
42
|
-
if obj.kind_of?(Module)
|
43
|
-
parent_module = constant(obj.spacename)
|
44
|
-
if (parent_module.singleton_class.ancestors.include?(Logger::Forward))
|
45
|
-
obj.send(:extend, Logger::Forward)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
87
|
+
# Exception raised when a module/class in the logger hierarchy cannot
|
88
|
+
# find a parent logger
|
89
|
+
class NoParentLogger < RuntimeError; end
|
49
90
|
|
50
91
|
# Returns true if the local module has its own logger, and false if it
|
51
92
|
# returns the logger of the parent
|
@@ -53,40 +94,57 @@ class Logger
|
|
53
94
|
defined?(@logger) && @logger
|
54
95
|
end
|
55
96
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
def make_own_logger(new_progname = nil, new_level = nil)
|
60
|
-
if !has_own_logger?
|
61
|
-
@logger = self.logger.dup
|
62
|
-
end
|
63
|
-
if new_progname
|
64
|
-
@logger.progname = new_progname
|
65
|
-
end
|
66
|
-
if new_level
|
67
|
-
@logger.level = new_level
|
97
|
+
def self.included(obj) # :nodoc:
|
98
|
+
if obj.singleton_class.ancestors.include?(::Logger::Forward)
|
99
|
+
obj.send(:include, ::Logger::Forward)
|
68
100
|
end
|
69
|
-
@logger
|
70
101
|
end
|
71
102
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
103
|
+
def self.extended(obj) # :nodoc:
|
104
|
+
obj.logger # initialize the default logger. Also does some checking
|
105
|
+
if obj.kind_of?(Module) && !obj.spacename.empty?
|
106
|
+
parent_module = constant(obj.spacename)
|
107
|
+
if (parent_module.singleton_class.ancestors.include?(::Logger::Forward))
|
108
|
+
obj.send(:extend, ::Logger::Forward)
|
109
|
+
end
|
110
|
+
end
|
76
111
|
end
|
77
112
|
|
78
113
|
# Returns the logger object that should be used to log at this level of
|
79
114
|
# the module hierarchy
|
80
115
|
def logger
|
81
|
-
if
|
82
|
-
return
|
83
|
-
elsif defined?(@default_logger) && @default_logger
|
84
|
-
return @default_logger
|
116
|
+
if logger = super
|
117
|
+
return logger
|
85
118
|
end
|
86
119
|
|
87
|
-
|
120
|
+
@__utilrb_hierarchy__default_logger =
|
88
121
|
if kind_of?(Module)
|
89
|
-
|
122
|
+
m = self
|
123
|
+
while m
|
124
|
+
if m.name && !m.spacename.empty?
|
125
|
+
parent_module =
|
126
|
+
begin
|
127
|
+
constant(m.spacename)
|
128
|
+
rescue NameError
|
129
|
+
end
|
130
|
+
if parent_module.respond_to?(:logger)
|
131
|
+
break
|
132
|
+
end
|
133
|
+
end
|
134
|
+
if m.respond_to?(:superclass)
|
135
|
+
m = m.superclass
|
136
|
+
else
|
137
|
+
m = nil; break
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
if !m
|
142
|
+
raise NoParentLogger, "cannot find a logger for #{self}"
|
143
|
+
end
|
144
|
+
if parent_module.respond_to? :log_children
|
145
|
+
parent_module.log_children << self
|
146
|
+
end
|
147
|
+
parent_module.logger
|
90
148
|
else
|
91
149
|
self.class.logger
|
92
150
|
end
|
data/lib/utilrb/logger/indent.rb
CHANGED
@@ -1,14 +1,47 @@
|
|
1
1
|
require 'utilrb/object/attribute'
|
2
2
|
class Logger
|
3
|
+
# [Integer] the current nest size
|
3
4
|
attribute(:nest_size) { 0 }
|
5
|
+
|
6
|
+
# Sets the absolute number of spaces that should be prepended to every
|
7
|
+
# message
|
8
|
+
#
|
9
|
+
# You usually want to increment / decrement this with {nest}
|
4
10
|
def nest_size=(new_value)
|
5
11
|
@nest_string = nil
|
12
|
+
if new_value < 0
|
13
|
+
raise ArgumentError, "negative value for nest_size. You probably have unbalanced nest calls"
|
14
|
+
end
|
6
15
|
@nest_size = new_value
|
7
16
|
end
|
8
17
|
|
9
|
-
|
10
|
-
|
11
|
-
|
18
|
+
# Adds a certain number number of spaces to the current indentation level
|
19
|
+
#
|
20
|
+
# @overload nest(size)
|
21
|
+
# Permanently adds a number of spaces to the current indentation
|
22
|
+
# @param [Integer] size the number of spaces that should be added to
|
23
|
+
# {nest_size}
|
24
|
+
#
|
25
|
+
# @overload nest(size) { }
|
26
|
+
# Adds a number of spaces to the current indentation for the duration of
|
27
|
+
# the block, and restores the original indentation afterwards.
|
28
|
+
#
|
29
|
+
# @param [Integer] size the number of spaces that should be added to
|
30
|
+
# {nest_size}
|
31
|
+
#
|
32
|
+
# @overload nest(size, log_level) { }
|
33
|
+
# Shortcut for
|
34
|
+
# @example
|
35
|
+
#
|
36
|
+
# logger.send(log_level) do
|
37
|
+
# logger.nest(size) do
|
38
|
+
# ...
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
def nest(size, log_level = nil)
|
43
|
+
if log_level
|
44
|
+
send(log_level) do
|
12
45
|
nest(size) do
|
13
46
|
yield
|
14
47
|
end
|
@@ -29,6 +62,8 @@ class Logger
|
|
29
62
|
end
|
30
63
|
end
|
31
64
|
|
65
|
+
# Overloaded from the base logger implementation to add the current
|
66
|
+
# indentation
|
32
67
|
def format_message(severity, datetime, progname, msg)
|
33
68
|
if !@nest_string
|
34
69
|
@nest_string = " " * self.nest_size
|
data/lib/utilrb/logger/log_pp.rb
CHANGED
@@ -34,7 +34,7 @@ class Logger
|
|
34
34
|
def log_pp(level, object, *first_line_format)
|
35
35
|
send(level) do
|
36
36
|
first_line = !first_line_format.empty? && defined?(HighLine)
|
37
|
-
|
37
|
+
self.class.pp_to_array(object).each do |line|
|
38
38
|
if first_line
|
39
39
|
line = color(line, *first_line_format)
|
40
40
|
first_line = false
|
data/lib/utilrb/logger/root.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'utilrb/logger/hierarchy'
|
1
2
|
class Logger
|
2
3
|
HAS_COLOR =
|
3
4
|
begin
|
@@ -16,9 +17,12 @@ class Logger
|
|
16
17
|
# Defines a logger on a module, allowing to use that module as a root in a
|
17
18
|
# hierarchy (i.e. having submodules use the Logger::Hierarchy support)
|
18
19
|
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
20
|
+
# @param [String] progname is used as the logger's program name
|
21
|
+
# @param [Integer/Symbol] base_level is the level at which the logger is
|
22
|
+
# initialized, this can be either a symbol from [:DEBUG, :INFO, :WARN,
|
23
|
+
# :ERROR, :FATAL] or the integer constants from Logger::DEBUG,
|
24
|
+
# Logger::INFO, etc. This value is overriden if the BASE_LOG_LEVEL
|
25
|
+
# environment variable is set.
|
22
26
|
#
|
23
27
|
# If a block is given, it will be provided the message severity, time,
|
24
28
|
# program name and text and should return the formatted message.
|
@@ -27,15 +31,22 @@ class Logger
|
|
27
31
|
# accessed. Moreover, it includes Logger::Forward, which allows to access
|
28
32
|
# the logger's output methods on the module directly
|
29
33
|
#
|
30
|
-
#
|
31
|
-
#
|
34
|
+
# @example
|
32
35
|
# module MyModule
|
33
|
-
# extend Logger.Root('MyModule',
|
36
|
+
# extend Logger.Root('MyModule', Logger::WARN)
|
34
37
|
# end
|
35
38
|
#
|
36
39
|
# MyModule.info "text"
|
37
40
|
# MyModule.warn "warntext"
|
41
|
+
#
|
38
42
|
def self.Root(progname, base_level, &block)
|
43
|
+
begin
|
44
|
+
base_level = ENV['BASE_LOG_LEVEL'].upcase.to_sym if ENV['BASE_LOG_LEVEL']
|
45
|
+
base_level = Logger.const_get( base_level ) if base_level.is_a? Symbol
|
46
|
+
rescue Exception => e
|
47
|
+
raise ArgumentError, "Log level #{base_level} is not available in the ruby Logger"
|
48
|
+
end
|
49
|
+
|
39
50
|
console = @console
|
40
51
|
formatter =
|
41
52
|
if block then lambda(&block)
|
@@ -48,17 +59,21 @@ class Logger
|
|
48
59
|
|
49
60
|
Module.new do
|
50
61
|
include Logger::Forward
|
62
|
+
include Logger::HierarchyElement
|
51
63
|
|
52
|
-
|
53
|
-
|
54
|
-
|
64
|
+
def has_own_logger?; true end
|
65
|
+
|
66
|
+
define_method :logger do
|
67
|
+
if logger = super()
|
68
|
+
return logger
|
69
|
+
end
|
70
|
+
|
71
|
+
logger = ::Logger.new(STDOUT)
|
55
72
|
logger.level = base_level
|
56
73
|
logger.progname = progname
|
57
74
|
logger.formatter = formatter
|
58
|
-
|
75
|
+
@__utilrb_hierarchy__default_logger = logger
|
59
76
|
end
|
60
|
-
|
61
|
-
attr_accessor :logger
|
62
77
|
end
|
63
78
|
end
|
64
79
|
end
|