utilrb 1.5.0 → 1.6.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/lib/utilrb/common.rb +1 -1
- data/lib/utilrb/kernel/load_dsl_file.rb +16 -3
- data/lib/utilrb/kernel/options.rb +16 -3
- data/lib/utilrb/logger/hierarchy.rb +27 -11
- data/lib/utilrb/module/const_defined_here_p.rb +1 -0
- data/lib/utilrb/module/include.rb +7 -1
- data/test/test_hash.rb +8 -0
- data/test/test_kernel.rb +41 -0
- metadata +5 -5
data/lib/utilrb/common.rb
CHANGED
@@ -91,12 +91,20 @@ module Kernel
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
def
|
94
|
+
def eval_dsl(text, proxied_object, context, full_backtrace, *exceptions)
|
95
|
+
eval_dsl_file_content(nil, text, proxied_object, context, full_backtrace, *exceptions)
|
96
|
+
end
|
97
|
+
|
98
|
+
def eval_dsl_file_content(file, file_content, proxied_object, context, full_backtrace, *exceptions)
|
95
99
|
code = with_module(*context) do
|
96
100
|
code = <<-EOD
|
97
101
|
Proc.new { #{file_content} }
|
98
102
|
EOD
|
99
|
-
|
103
|
+
if file
|
104
|
+
eval code, binding, file, 1
|
105
|
+
else
|
106
|
+
eval code, binding
|
107
|
+
end
|
100
108
|
end
|
101
109
|
|
102
110
|
dsl_exec_common(file, proxied_object, context, full_backtrace, *exceptions, &code)
|
@@ -125,8 +133,13 @@ module Kernel
|
|
125
133
|
return false
|
126
134
|
end
|
127
135
|
|
128
|
-
eval_dsl_file(file, *args, &block)
|
129
136
|
$LOADED_FEATURES << file
|
137
|
+
begin
|
138
|
+
eval_dsl_file(file, *args, &block)
|
139
|
+
rescue Exception
|
140
|
+
$LOADED_FEATURES.delete(file)
|
141
|
+
raise
|
142
|
+
end
|
130
143
|
true
|
131
144
|
end
|
132
145
|
|
@@ -16,7 +16,20 @@ module Kernel
|
|
16
16
|
# filter_options(option, array) -> known, unknown
|
17
17
|
# filter_options(nil, known_options) -> default_options, {}
|
18
18
|
#
|
19
|
-
def filter_options(options,
|
19
|
+
def filter_options(options, *user_option_spec)
|
20
|
+
option_spec = Hash.new
|
21
|
+
user_option_spec.each do |opt|
|
22
|
+
if opt.respond_to?(:to_hash)
|
23
|
+
option_spec.merge!(opt)
|
24
|
+
elsif opt.respond_to?(:to_ary)
|
25
|
+
opt.each do |key|
|
26
|
+
option_spec[key] = nil
|
27
|
+
end
|
28
|
+
else
|
29
|
+
option_spec[opt] = nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
20
33
|
unknown_options = Hash.new
|
21
34
|
options = options.dup
|
22
35
|
options.delete_if do |key, value|
|
@@ -52,9 +65,9 @@ module Kernel
|
|
52
65
|
# keys. +option_hash+ keys shall be in +known_array+. +nil+ is treated
|
53
66
|
# as an empty option hash, all keys are converted into symbols.
|
54
67
|
#
|
55
|
-
def validate_options(options, known_options)
|
68
|
+
def validate_options(options, *known_options)
|
56
69
|
options ||= Hash.new
|
57
|
-
opt, unknown = Kernel.filter_options(options.to_hash, known_options)
|
70
|
+
opt, unknown = Kernel.filter_options(options.to_hash, *known_options)
|
58
71
|
unless unknown.empty?
|
59
72
|
not_valid = unknown.keys.map { |m| "'#{m}'" }.join(" ")
|
60
73
|
raise ArgumentError, "unknown options #{not_valid}", caller(1)
|
@@ -9,29 +9,36 @@ class Logger
|
|
9
9
|
# It defines the #logger accessor which either returns the logger
|
10
10
|
# attribute of the module, if one is defined, or its parent logger
|
11
11
|
# attribute.
|
12
|
+
#
|
13
|
+
# This module is usually used in conjunction with the Logger::Root method:
|
12
14
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# self.logger = Logger.new
|
15
|
+
# module First
|
16
|
+
# extend Logger.Root("First", :INFO)
|
16
17
|
#
|
17
|
-
#
|
18
|
-
#
|
18
|
+
# module Second
|
19
|
+
# extend Hierarchy
|
20
|
+
# end
|
19
21
|
# end
|
20
|
-
# end
|
21
22
|
#
|
22
|
-
# Second.logger will return First.logger. If we do
|
23
|
-
#
|
24
|
-
#
|
23
|
+
# Second.logger will return First.logger. If we do Second.make_own_logger,
|
24
|
+
# then a different object will be returned.
|
25
|
+
#
|
26
|
+
# "extend Hierarchy" will also add the Forward support if the parent module
|
27
|
+
# has it.
|
25
28
|
module Hierarchy
|
29
|
+
# Allows to change the logger object at this level of the hierarchy
|
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
|
26
33
|
attr_writer :logger
|
27
34
|
|
28
|
-
def self.included(obj)
|
35
|
+
def self.included(obj) # :nodoc:
|
29
36
|
if obj.singleton_class.ancestors.include?(Logger::Forward)
|
30
37
|
obj.send(:include, Logger::Forward)
|
31
38
|
end
|
32
39
|
end
|
33
40
|
|
34
|
-
def self.extended(obj)
|
41
|
+
def self.extended(obj) # :nodoc:
|
35
42
|
if obj.kind_of?(Module)
|
36
43
|
parent_module = constant(obj.spacename)
|
37
44
|
if (parent_module.singleton_class.ancestors.include?(Logger::Forward))
|
@@ -40,10 +47,15 @@ class Logger
|
|
40
47
|
end
|
41
48
|
end
|
42
49
|
|
50
|
+
# Returns true if the local module has its own logger, and false if it
|
51
|
+
# returns the logger of the parent
|
43
52
|
def has_own_logger?
|
44
53
|
defined?(@logger) && @logger
|
45
54
|
end
|
46
55
|
|
56
|
+
# Makes it so that this level of the module hierarchy has its own
|
57
|
+
# logger. If +new_progname+ and/or +new_level+ are nil, the associated
|
58
|
+
# value are taken from the parent's logger.
|
47
59
|
def make_own_logger(new_progname = nil, new_level = nil)
|
48
60
|
if !has_own_logger?
|
49
61
|
@logger = self.logger.dup
|
@@ -57,10 +69,14 @@ class Logger
|
|
57
69
|
@logger
|
58
70
|
end
|
59
71
|
|
72
|
+
# Removes a logger defined at this level of the module hierarchy. The
|
73
|
+
# logging methods will now access the parent's module logger.
|
60
74
|
def reset_own_logger
|
61
75
|
@logger = nil
|
62
76
|
end
|
63
77
|
|
78
|
+
# Returns the logger object that should be used to log at this level of
|
79
|
+
# the module hierarchy
|
64
80
|
def logger
|
65
81
|
if defined?(@logger) && @logger
|
66
82
|
return @logger
|
@@ -13,7 +13,13 @@ class Module
|
|
13
13
|
# ClassExtension in the target, it is created)
|
14
14
|
# * if it is included in a Class, the ClassExtension module
|
15
15
|
# extends the class.
|
16
|
-
def include(
|
16
|
+
def include(*mods)
|
17
|
+
mods.each do |mod|
|
18
|
+
__include_single_module(mod)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def __include_single_module(mod)
|
17
23
|
if mod.const_defined?(:ModuleExtension)
|
18
24
|
if is_a?(Module)
|
19
25
|
unless const_defined?(:ModuleExtension)
|
data/test/test_hash.rb
CHANGED
@@ -27,6 +27,14 @@ class TC_Hash < Test::Unit::TestCase
|
|
27
27
|
assert_equal(["1 => 2", "2 => 3", "3 => ..."].to_set, values.to_set)
|
28
28
|
end
|
29
29
|
|
30
|
+
def test_map_key
|
31
|
+
base = { 1 => 'a', 2 => 'b' }
|
32
|
+
result = base.map_key { |k, v| k += 1 }
|
33
|
+
|
34
|
+
assert_equal({ 1 => 'a', 2 => 'b' }, base)
|
35
|
+
assert_equal({ 2 => 'a', 3 => 'b' }, result)
|
36
|
+
end
|
37
|
+
|
30
38
|
def test_map_value
|
31
39
|
base = { 'a' => 1, 'b' => 2 }
|
32
40
|
result = base.map_value { |k, v| v += 1 }
|
data/test/test_kernel.rb
CHANGED
@@ -203,6 +203,47 @@ class TC_Kernel < Test::Unit::TestCase
|
|
203
203
|
assert(methods.include?('my_method'), "the 'class K' statement did not refer to the already defined class")
|
204
204
|
end
|
205
205
|
|
206
|
+
def test_load_dsl_file_loaded_features_behaviour
|
207
|
+
eval_context = Class.new do
|
208
|
+
attr_reader :real_method_call_count
|
209
|
+
def initialize
|
210
|
+
@real_method_call_count = 0
|
211
|
+
end
|
212
|
+
def real_method
|
213
|
+
@real_method_call_count += 1
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
Tempfile.open('test_eval_dsl_file') do |io|
|
218
|
+
io.puts <<-EOD
|
219
|
+
real_method
|
220
|
+
EOD
|
221
|
+
io.flush
|
222
|
+
|
223
|
+
obj = eval_context.new
|
224
|
+
assert(Kernel.load_dsl_file(io.path, obj, [], false))
|
225
|
+
assert_equal(1, obj.real_method_call_count)
|
226
|
+
assert($LOADED_FEATURES.include?(io.path))
|
227
|
+
assert(!Kernel.load_dsl_file(io.path, obj, [], false))
|
228
|
+
assert_equal(1, obj.real_method_call_count)
|
229
|
+
|
230
|
+
$LOADED_FEATURES.delete(io.path)
|
231
|
+
end
|
232
|
+
|
233
|
+
Tempfile.open('test_eval_dsl_file') do |io|
|
234
|
+
io.puts <<-EOD
|
235
|
+
raise
|
236
|
+
EOD
|
237
|
+
io.flush
|
238
|
+
|
239
|
+
obj = eval_context.new
|
240
|
+
assert(!$LOADED_FEATURES.include?(io.path))
|
241
|
+
assert_raises(RuntimeError) { Kernel.load_dsl_file(io.path, obj, [], false) }
|
242
|
+
assert(!$LOADED_FEATURES.include?(io.path))
|
243
|
+
assert_equal(0, obj.real_method_call_count)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
206
247
|
Utilrb.require_ext('is_singleton?') do
|
207
248
|
def test_is_singleton
|
208
249
|
klass = Class.new
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: utilrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
8
|
+
- 6
|
9
9
|
- 0
|
10
|
-
version: 1.
|
10
|
+
version: 1.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sylvain Joyeux
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2012-03-31 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: facets
|
@@ -229,7 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
229
229
|
requirements: []
|
230
230
|
|
231
231
|
rubyforge_project: utilrb
|
232
|
-
rubygems_version: 1.8.
|
232
|
+
rubygems_version: 1.8.15
|
233
233
|
signing_key:
|
234
234
|
specification_version: 3
|
235
235
|
summary: Yet another Ruby toolkit
|