y_support 2.1.5 → 2.1.12
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.
- checksums.yaml +4 -4
- data/LICENSE.txt +675 -0
- data/Rakefile +1 -1
- data/lib/y_support/abstract_algebra.rb +1 -0
- data/lib/y_support/all.rb +1 -0
- data/lib/y_support/core_ext/array.rb +2 -2
- data/lib/y_support/core_ext/class/misc.rb +2 -3
- data/lib/y_support/core_ext/class.rb +2 -2
- data/lib/y_support/core_ext/enumerable/misc.rb +1 -1
- data/lib/y_support/core_ext/enumerable.rb +2 -2
- data/lib/y_support/core_ext/hash/misc.rb +26 -39
- data/lib/y_support/core_ext/hash.rb +2 -2
- data/lib/y_support/core_ext/module/misc.rb +39 -1
- data/lib/y_support/core_ext/module.rb +2 -2
- data/lib/y_support/core_ext/numeric/misc.rb +0 -2
- data/lib/y_support/core_ext/numeric.rb +2 -2
- data/lib/y_support/core_ext/object/inspection.rb +0 -2
- data/lib/y_support/core_ext/object/misc.rb +31 -16
- data/lib/y_support/core_ext/object.rb +3 -3
- data/lib/y_support/core_ext/string/misc.rb +7 -7
- data/lib/y_support/core_ext/string.rb +2 -2
- data/lib/y_support/core_ext/symbol/misc.rb +2 -3
- data/lib/y_support/core_ext/symbol.rb +2 -2
- data/lib/y_support/core_ext.rb +0 -2
- data/lib/y_support/inert_recorder.rb +1 -1
- data/lib/y_support/kde.rb +1 -0
- data/lib/y_support/name_magic/array.rb +27 -7
- data/lib/y_support/name_magic/class_methods.rb +52 -58
- data/lib/y_support/name_magic/hash.rb +18 -4
- data/lib/y_support/name_magic/namespace_methods.rb +241 -174
- data/lib/y_support/name_magic.rb +82 -38
- data/lib/y_support/null_object.rb +8 -7
- data/lib/y_support/respond_to.rb +1 -2
- data/lib/y_support/stdlib_ext/matrix/misc.rb +0 -2
- data/lib/y_support/stdlib_ext/matrix.rb +2 -2
- data/lib/y_support/stdlib_ext.rb +1 -0
- data/lib/y_support/try.rb +1 -1
- data/lib/y_support/typing/array/typing.rb +45 -4
- data/lib/y_support/typing/array.rb +1 -1
- data/lib/y_support/typing/enumerable/typing.rb +26 -28
- data/lib/y_support/typing/enumerable.rb +1 -1
- data/lib/y_support/typing/hash/typing.rb +47 -29
- data/lib/y_support/typing/hash.rb +1 -1
- data/lib/y_support/typing/module/typing.rb +4 -6
- data/lib/y_support/typing/module.rb +1 -1
- data/lib/y_support/typing/object/typing.rb +64 -61
- data/lib/y_support/typing/object.rb +1 -1
- data/lib/y_support/typing.rb +4 -26
- data/lib/y_support/unicode.rb +5 -7
- data/lib/y_support/version.rb +1 -1
- data/lib/y_support/x.rb +11 -8
- data/lib/y_support.rb +2 -2
- data/test/abstract_algebra_test.rb +44 -55
- data/test/inert_recorder_test.rb +13 -18
- data/test/local_object_test.rb +13 -18
- data/test/misc_test.rb +15 -10
- data/test/name_magic_test.rb +1 -1
- data/test/null_object_test.rb +19 -26
- data/test/respond_to_test.rb +15 -16
- data/test/typing_test.rb +100 -103
- data/test/x_test.rb +16 -19
- data/y_support.gemspec +21 -17
- metadata +37 -8
- data/LICENSE +0 -22
@@ -1,11 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
# Class methods for the classes that include NameMagic.
|
4
|
+
#
|
3
5
|
module NameMagic::ClassMethods
|
4
6
|
# Presents the instances registered by the namespace. Takes one optional
|
5
7
|
# argument. If set to _false_, the method returns all the instances
|
6
8
|
# registered by the namespace. If set to _true_ (default), only returns
|
7
9
|
# those instances registered by the namespace, which are of exactly the
|
8
|
-
# same class as the receiver.
|
10
|
+
# same class as the receiver (ie. excluding the instances of the subclasses
|
11
|
+
# of this class). Example:
|
9
12
|
#
|
10
13
|
# <code>
|
11
14
|
# class Animal; include NameMagic end
|
@@ -23,10 +26,12 @@ module NameMagic::ClassMethods
|
|
23
26
|
option ? ii.select { |i| i.kind_of? self } : ii
|
24
27
|
end
|
25
28
|
|
26
|
-
#
|
27
|
-
#
|
29
|
+
# Deprecated method to get full names of the named instances. Use
|
30
|
+
# <code>instances.names</code> instead. Takes one optional argument,
|
31
|
+
# same as +#instances+ method.
|
28
32
|
#
|
29
33
|
def instance_names option=true
|
34
|
+
warn "Method #instance_names is deprecated. Use 'instances._names_' or 'instances.names' instead!"
|
30
35
|
instances( option ).names( false )
|
31
36
|
end
|
32
37
|
|
@@ -36,8 +41,7 @@ module NameMagic::ClassMethods
|
|
36
41
|
# +#const_magic+.)
|
37
42
|
#
|
38
43
|
def __instances__
|
39
|
-
|
40
|
-
namespace.__instances__
|
44
|
+
namespace == self ? super : namespace.__instances__
|
41
45
|
end
|
42
46
|
|
43
47
|
# Presents namespace-owned +@avid_instances+ (array of avid instances). "Avid"
|
@@ -45,8 +49,7 @@ module NameMagic::ClassMethods
|
|
45
49
|
# registered instance. (This method does not trigger +#const_magic+.)
|
46
50
|
#
|
47
51
|
def __avid_instances__
|
48
|
-
|
49
|
-
namespace.__avid_instances__
|
52
|
+
namespace == self ? super : namespace.__avid_instances__
|
50
53
|
end
|
51
54
|
|
52
55
|
# Returns the instance identified by the first argument, which can typically
|
@@ -54,21 +57,21 @@ module NameMagic::ClassMethods
|
|
54
57
|
# returned without change. The second argument is optional, with the same
|
55
58
|
# meaning as in +NameMagic::ClassMethods#instances+ method.
|
56
59
|
#
|
57
|
-
def instance
|
60
|
+
def instance instance, option=true
|
58
61
|
return super if namespace == self
|
59
|
-
namespace.instance(
|
60
|
-
|
61
|
-
|
62
|
+
return namespace.instance( instance ) unless option
|
63
|
+
namespace.instance( instance ).tap { |instance|
|
64
|
+
fail NameError, "No #{self} instance #{instance} registered in " +
|
65
|
+
"#{namespace}!" unless instance.kind_of? self
|
62
66
|
}
|
63
67
|
end
|
64
68
|
|
65
|
-
# Searches all the modules in the the object space for constants
|
66
|
-
#
|
67
|
-
#
|
69
|
+
# Searches all the modules in the the object space for constants pointing to
|
70
|
+
# anonymous instances of this class, and names them accordingly. The number
|
71
|
+
# of remaining anonymous instances is returned.
|
68
72
|
#
|
69
73
|
def const_magic
|
70
|
-
|
71
|
-
namespace.const_magic
|
74
|
+
namespace == self ? super : namespace.const_magic
|
72
75
|
end
|
73
76
|
|
74
77
|
# Returns the nameless instances. The optional argument has the same meaning
|
@@ -76,23 +79,23 @@ module NameMagic::ClassMethods
|
|
76
79
|
#
|
77
80
|
def nameless_instances option=true
|
78
81
|
return super if namespace == self
|
79
|
-
|
80
|
-
|
82
|
+
return namespace.nameless_instances unless option
|
83
|
+
namespace.nameless_instances.select { |i| i.kind_of? self }
|
81
84
|
end
|
82
85
|
|
83
86
|
# Clears namespace-owned references to a specified instance. (This is
|
84
|
-
# different from
|
87
|
+
# different from de-naming an instance by setting <code>inst.name =
|
85
88
|
# nil</code>, which makes the instance anonymous, but still registered.)
|
86
89
|
#
|
87
|
-
def forget
|
88
|
-
|
89
|
-
namespace.forget instance( instance_identifier )
|
90
|
-
end
|
90
|
+
def forget instance, option=true
|
91
|
+
namespace == self || ! option ? super : namespace.forget( instance instance )
|
91
92
|
end
|
92
93
|
|
93
94
|
# Clears namespace-owned references to an instance, without performing
|
94
95
|
# #const_magic first. The argument should be a registered instance. Returns
|
95
|
-
# the instance name
|
96
|
+
# the instance's name for named instances, _nil_ for anonymous instances,
|
97
|
+
# and _false_ if there was no such registered instance. The optional second
|
98
|
+
# argument has the same meaning as in +NameMaic::ClassMethods#instances+.
|
96
99
|
#
|
97
100
|
def __forget__( instance, option=true )
|
98
101
|
return super if namespace == self
|
@@ -104,15 +107,13 @@ module NameMagic::ClassMethods
|
|
104
107
|
# Clears namespace-owned references to all the anonymous instances.
|
105
108
|
#
|
106
109
|
def forget_nameless_instances
|
107
|
-
|
108
|
-
namespace.forget_nameless_instances
|
110
|
+
namespace == self ? super : namespace.forget_nameless_instances
|
109
111
|
end
|
110
112
|
|
111
113
|
# Clears namespace-owned references to all the instances.
|
112
114
|
#
|
113
115
|
def forget_all_instances
|
114
|
-
|
115
|
-
namespace.forget_all_instances
|
116
|
+
namespace == self ? super : namespace.forget_all_instances
|
116
117
|
end
|
117
118
|
|
118
119
|
# Registers a hook to execute upon instantiation. Expects a unary block, whose
|
@@ -120,8 +121,7 @@ module NameMagic::ClassMethods
|
|
120
121
|
# but before naming the instance.
|
121
122
|
#
|
122
123
|
def new_instance_hook &block
|
123
|
-
|
124
|
-
namespace.new_instance_hook &block
|
124
|
+
namespace == self ? super : namespace.new_instance_hook( &block )
|
125
125
|
end
|
126
126
|
|
127
127
|
# Registers a hook to execute upon instance naming. Expects a ternary block,
|
@@ -134,8 +134,7 @@ module NameMagic::ClassMethods
|
|
134
134
|
# constant name.
|
135
135
|
#
|
136
136
|
def name_set_hook &block
|
137
|
-
|
138
|
-
namespace.name_set_hook &block
|
137
|
+
namespace == self ? super : namespace.name_set_hook( &block )
|
139
138
|
end
|
140
139
|
|
141
140
|
# Registers a hook to execute whenever the instance is asked its name. The
|
@@ -146,11 +145,10 @@ module NameMagic::ClassMethods
|
|
146
145
|
# returned.
|
147
146
|
#
|
148
147
|
def name_get_hook &block
|
149
|
-
|
150
|
-
namespace.name_get_hook &block
|
148
|
+
namespace == self ? super : namespace.name_get_hook( &block )
|
151
149
|
end
|
152
150
|
|
153
|
-
# Sets the namespace
|
151
|
+
# Sets the namespace for the class.
|
154
152
|
#
|
155
153
|
def namespace= modul
|
156
154
|
puts "Assigning #{modul} as the namespace of #{self}." if ::NameMagic::DEBUG
|
@@ -164,17 +162,16 @@ module NameMagic::ClassMethods
|
|
164
162
|
nil.tap { self.namespace = self }
|
165
163
|
end
|
166
164
|
|
167
|
-
# In addition the ability to name objects
|
168
|
-
#
|
169
|
-
#
|
170
|
-
#
|
171
|
-
#
|
172
|
-
# another object) if set to _true_.
|
165
|
+
# In addition the ability to name objects by constant assignment, +NameMagic+
|
166
|
+
# redefines #new method so as to swallow name argument +:name+ (alias :ɴ), and
|
167
|
+
# naming the constructed instance by it. Also, +:name_avid+ option may be
|
168
|
+
# supplied, which, if _true_, makes the instance capable of avid naming:
|
169
|
+
# Overwriting (stealing) a name already given to another instance.
|
173
170
|
#
|
174
171
|
def new *args, &block
|
175
172
|
oo = if args[-1].is_a? Hash then args.pop else {} end # extract hash
|
176
173
|
nm = oo.delete( :name ) || oo.delete( :ɴ ) # consume :name / :ɴ if given
|
177
|
-
avid =
|
174
|
+
avid = oo.delete( :name_avid )
|
178
175
|
# Avoid overwriting existing names unless avid:
|
179
176
|
fail NameError, "#{self} instance #{nm} already exists!" if
|
180
177
|
__instances__.keys.include? nm unless avid
|
@@ -185,19 +182,24 @@ module NameMagic::ClassMethods
|
|
185
182
|
λ.( inst ) if λ
|
186
183
|
if nm then # Name supplied, name the instance.
|
187
184
|
avid ? inst.name!( nm ) : inst.name = nm
|
188
|
-
else # Name not
|
189
|
-
__avid_instances__ << inst
|
185
|
+
else # Name not given, make the inst. avid unless expressly prohibited.
|
186
|
+
__avid_instances__ << inst unless avid == false
|
190
187
|
end
|
191
188
|
}
|
192
189
|
end
|
193
190
|
end
|
194
191
|
|
195
|
-
# Calls #new in _avid_ _mode_ (name_avid: true); see #new method for
|
196
|
-
# explanation.
|
192
|
+
# Calls #new in _avid_ _mode_ (<tt>name_avid: true</tt>); see #new method for
|
193
|
+
# avid mode explanation.
|
194
|
+
#
|
195
|
+
def avid *ordered_args, **named_args, &block
|
196
|
+
new *ordered_args, **named_args.update( name_avid: true ), &block
|
197
|
+
end
|
198
|
+
|
199
|
+
# Performs general name validation.
|
197
200
|
#
|
198
|
-
def
|
199
|
-
|
200
|
-
new *args, oo.update( name_avid: true ), &block
|
201
|
+
def validate_name name
|
202
|
+
namespace == self ? super : namespace.validate_name( name )
|
201
203
|
end
|
202
204
|
|
203
205
|
private
|
@@ -205,14 +207,6 @@ module NameMagic::ClassMethods
|
|
205
207
|
# Checks all the constants in some module's namespace, recursively.
|
206
208
|
#
|
207
209
|
def serve_all_modules
|
208
|
-
|
209
|
-
namespace.serve_all_modules
|
210
|
-
end
|
211
|
-
|
212
|
-
# Performs general name validation.
|
213
|
-
#
|
214
|
-
def validate_name name
|
215
|
-
return super if namespace == self
|
216
|
-
namespace.validate_name name
|
210
|
+
namespace == self ? super : namespace.serve_all_modules
|
217
211
|
end
|
218
212
|
end # module NameMagic::ClassMethods
|
@@ -1,17 +1,31 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
class Hash
|
4
|
+
# Maps the hash into one whose keys have been replaced with full names of
|
5
|
+
# the keys (which are assumed to be objects responding to +#full_name+ method).
|
6
|
+
#
|
7
|
+
def keys_to_names # FIXME: Change to keys_to_full_names
|
8
|
+
with_keys do |key| key.name || key end # FIXME: Change name to full_name
|
9
|
+
end
|
10
|
+
|
11
|
+
# Modifies a hash in place so that the keys are replaced with key names (key
|
12
|
+
# objects are assumed to respond to +#name+ method).
|
13
|
+
#
|
14
|
+
def keys_to_names! # FIXME: Change to keys_to_full_names!
|
15
|
+
with_keys! do |key| key.name || key end # FIXME: Change name to full_name
|
16
|
+
end
|
17
|
+
|
4
18
|
# Maps a hash into a hash, whose keys have been replaced with names of the
|
5
19
|
# key objects (which are assumed to respond to +#name+ method).
|
6
20
|
#
|
7
|
-
def
|
8
|
-
with_keys do |key| key.
|
21
|
+
def keys_to_ɴs
|
22
|
+
with_keys do |key| key._name_ || key end
|
9
23
|
end
|
10
24
|
|
11
25
|
# Modifies a hash in place so that the keys are replaced with key names (key
|
12
26
|
# objects are assumed to respond to +#name+ method).
|
13
27
|
#
|
14
|
-
def
|
15
|
-
with_keys! do |key| key.
|
28
|
+
def keys_to_ɴs!
|
29
|
+
with_keys! do |key| key._name_ || key end
|
16
30
|
end
|
17
31
|
end
|