is-monkey 0.5.4
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/.yardopts +9 -0
- data/lib/is/monkey/anyproc.rb +14 -0
- data/lib/is/monkey/copy.rb +10 -0
- data/lib/is/monkey/keys.rb +43 -0
- data/lib/is/monkey/namespace.rb +40 -0
- data/lib/is/monkey/properties.rb +393 -0
- data/lib/is/monkey/sandbox.rb +10 -0
- metadata +53 -0
data/.yardopts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# encoding : utf-8
|
|
2
|
+
|
|
3
|
+
class Symbol
|
|
4
|
+
|
|
5
|
+
# @return [self]
|
|
6
|
+
def to_key
|
|
7
|
+
self
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# @return [String]
|
|
11
|
+
def to_name
|
|
12
|
+
to_s.gsub '_', '-'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class String
|
|
18
|
+
|
|
19
|
+
# @return [Symbol]
|
|
20
|
+
def to_key
|
|
21
|
+
gsub('-', '_').intern
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [self]
|
|
25
|
+
def to_name
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Integer
|
|
32
|
+
|
|
33
|
+
# @return [self]
|
|
34
|
+
def to_key
|
|
35
|
+
self
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @return [self]
|
|
39
|
+
def to_name
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'is/monkey/sandbox'
|
|
4
|
+
|
|
5
|
+
class Module
|
|
6
|
+
|
|
7
|
+
# @return [String]
|
|
8
|
+
def basename
|
|
9
|
+
name.split('::')[-1]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# @return [Module]
|
|
13
|
+
def namespace
|
|
14
|
+
begin
|
|
15
|
+
nm = name
|
|
16
|
+
if (i = nm.rindex '::')
|
|
17
|
+
ns = sandbox { eval nm[0...i] }
|
|
18
|
+
return ns
|
|
19
|
+
end
|
|
20
|
+
rescue
|
|
21
|
+
end
|
|
22
|
+
return nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @param [Module] other
|
|
26
|
+
# @return [Boolean]
|
|
27
|
+
def in? other
|
|
28
|
+
ns = self
|
|
29
|
+
while (ns = ns.namespace)
|
|
30
|
+
return true if ns == other
|
|
31
|
+
end
|
|
32
|
+
return false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Boolean]
|
|
36
|
+
def global?
|
|
37
|
+
! namespace
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'set'
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
class Module
|
|
7
|
+
|
|
8
|
+
# @overload property *args, opts = {}
|
|
9
|
+
# @param [Array<Symbol>] args
|
|
10
|
+
# @param [Hash] opts
|
|
11
|
+
# @option opts [Proc] :init
|
|
12
|
+
# @option opts [Object] :default
|
|
13
|
+
# @option opts [#===] :validator
|
|
14
|
+
# @option opts [Class] :class
|
|
15
|
+
# @option opts [true] :null
|
|
16
|
+
# @yield [value]
|
|
17
|
+
# @return [void]
|
|
18
|
+
def property *args, &block
|
|
19
|
+
@properties ||= {}
|
|
20
|
+
if Hash === args[-1]
|
|
21
|
+
opts = args.pop
|
|
22
|
+
else
|
|
23
|
+
opts = {}
|
|
24
|
+
end
|
|
25
|
+
init = opts[:init]
|
|
26
|
+
default = opts[:default]
|
|
27
|
+
validator = opts[:validator]
|
|
28
|
+
valclass = opts[:class]
|
|
29
|
+
valnull = opts[:null]
|
|
30
|
+
inh = opts[:inheritance]
|
|
31
|
+
args.each do |a|
|
|
32
|
+
getter = a.intern
|
|
33
|
+
attr_accessor getter
|
|
34
|
+
variable = "@#{getter}".intern
|
|
35
|
+
setter = "#{getter}=".intern
|
|
36
|
+
|
|
37
|
+
get_proc = define_method getter do |*values|
|
|
38
|
+
if ! instance_variable_defined?(variable)
|
|
39
|
+
instance_variable_set variable,
|
|
40
|
+
singleton_class.properties[getter].default(self)
|
|
41
|
+
end
|
|
42
|
+
value = instance_variable_get variable
|
|
43
|
+
if ! values.empty?
|
|
44
|
+
if value.respond_to? :append!
|
|
45
|
+
value.append! *values
|
|
46
|
+
elsif values.size == 1
|
|
47
|
+
value = values[0]
|
|
48
|
+
else
|
|
49
|
+
value = values
|
|
50
|
+
end
|
|
51
|
+
send setter, value
|
|
52
|
+
end
|
|
53
|
+
result = instance_variable_get variable
|
|
54
|
+
if inh && Class === self && superclass && superclass.respond_to?(getter)
|
|
55
|
+
sup = superclass.send getter
|
|
56
|
+
if sup.respond_to? :append
|
|
57
|
+
result = sup.append result
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
result
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
if block_given?
|
|
64
|
+
set_proc = define_method setter, &block
|
|
65
|
+
else
|
|
66
|
+
|
|
67
|
+
set_proc = define_method setter do |value|
|
|
68
|
+
if validator && !(validator === value || valnull && value == nil)
|
|
69
|
+
raise 'Invalid property value!'
|
|
70
|
+
elsif valclass && !(valclass === value || valnull && value == nil)
|
|
71
|
+
raise 'Invalid property value class!'
|
|
72
|
+
end
|
|
73
|
+
instance_variable_set variable, value
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
@properties[getter] = Is::Property.new self, getter,
|
|
79
|
+
opts.merge(:getter => get_proc, :setter => set_proc)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @return [Hash{Symbol => Is::Property}]
|
|
84
|
+
def properties
|
|
85
|
+
result = @properties || {}
|
|
86
|
+
ancestors.each do |mod|
|
|
87
|
+
result = mod.properties.merge result if mod != self
|
|
88
|
+
end
|
|
89
|
+
if self < Class && superclass
|
|
90
|
+
result = superclass.properties.merge result
|
|
91
|
+
end
|
|
92
|
+
result
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private :property
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
class Object
|
|
100
|
+
|
|
101
|
+
# @param [Array<Symbol>] args
|
|
102
|
+
# @return [Hash{Symbol => Object}]
|
|
103
|
+
def property_values *args
|
|
104
|
+
result = {}
|
|
105
|
+
if args.size != 0
|
|
106
|
+
args.each do |arg|
|
|
107
|
+
prop = arg.intern
|
|
108
|
+
result[prop] = send prop
|
|
109
|
+
end
|
|
110
|
+
else
|
|
111
|
+
singleton_class.properties.each do |prop, _|
|
|
112
|
+
result[prop] = send prop
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
result
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
class Array
|
|
121
|
+
|
|
122
|
+
# @param [Array] values
|
|
123
|
+
# @return [self]
|
|
124
|
+
def append! *values
|
|
125
|
+
push *values
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# @param [Array] values
|
|
129
|
+
# @return [Array]
|
|
130
|
+
def append *values
|
|
131
|
+
dup.append! *values
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class Hash
|
|
137
|
+
|
|
138
|
+
# @param [Array<Hash>] values
|
|
139
|
+
# @return [self]
|
|
140
|
+
def append! *values
|
|
141
|
+
values.each do |a|
|
|
142
|
+
merge! a
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# @param [Array<Hash>] values
|
|
147
|
+
# @return [Hash]
|
|
148
|
+
def append *values
|
|
149
|
+
dup.append! *values
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
class Set
|
|
155
|
+
|
|
156
|
+
# @overload append! *values
|
|
157
|
+
# @param [Array] values
|
|
158
|
+
# @overload append! value
|
|
159
|
+
# @param [Set] value
|
|
160
|
+
# @return [self]
|
|
161
|
+
def append! *values
|
|
162
|
+
if values.size == 1 && Set === values[0]
|
|
163
|
+
merge values[0]
|
|
164
|
+
else
|
|
165
|
+
merge values
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# @overload append *values
|
|
170
|
+
# @param [Array] values
|
|
171
|
+
# @overload append value
|
|
172
|
+
# @param [Set] value
|
|
173
|
+
# @return [Set]
|
|
174
|
+
def append *values
|
|
175
|
+
dup.append! *values
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
class String
|
|
181
|
+
|
|
182
|
+
# @param [Array] values
|
|
183
|
+
# @return [self]
|
|
184
|
+
def append! *values
|
|
185
|
+
self << ($, + values.join)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# @param [Array] values
|
|
189
|
+
# @return [String]
|
|
190
|
+
def append *values
|
|
191
|
+
dup.append! *values
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
module Is
|
|
197
|
+
|
|
198
|
+
class Property
|
|
199
|
+
|
|
200
|
+
# @return [Symbol]
|
|
201
|
+
attr_reader :name
|
|
202
|
+
|
|
203
|
+
# @return [Proc]
|
|
204
|
+
attr_reader :getter
|
|
205
|
+
|
|
206
|
+
# @return [Proc]
|
|
207
|
+
attr_reader :setter
|
|
208
|
+
|
|
209
|
+
# @return [Hash]
|
|
210
|
+
attr_reader :options
|
|
211
|
+
|
|
212
|
+
# @return [Module]
|
|
213
|
+
attr_reader :owner
|
|
214
|
+
|
|
215
|
+
def getter
|
|
216
|
+
@opts[:getter]
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def setter
|
|
220
|
+
@opts[:setter]
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def options
|
|
224
|
+
@opts
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# @param [Module] owner
|
|
228
|
+
# @param [Symbol] name
|
|
229
|
+
# @param [Hash] opts
|
|
230
|
+
def initialize owner, name, opts = {}
|
|
231
|
+
@owner = owner
|
|
232
|
+
@name = name.intern
|
|
233
|
+
@opts = opts
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# @param [Object] obj
|
|
237
|
+
# @return [Object, nil]
|
|
238
|
+
def default obj
|
|
239
|
+
if Class === obj && obj.superclass && obj.superclass.respond_to?(@name)
|
|
240
|
+
v = obj.superclass.send @name
|
|
241
|
+
else
|
|
242
|
+
v = nil
|
|
243
|
+
end
|
|
244
|
+
if v == nil
|
|
245
|
+
if @opts.has_key? :init
|
|
246
|
+
v = @opts[:init].call obj
|
|
247
|
+
elsif @opts.has_key? :default
|
|
248
|
+
v = @opts[:default]
|
|
249
|
+
elsif @opts.has_key? :class
|
|
250
|
+
begin
|
|
251
|
+
v = @opts[:class].new
|
|
252
|
+
rescue
|
|
253
|
+
v = nil
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
v
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# @param [Object] value
|
|
261
|
+
# @return [Boolean]
|
|
262
|
+
def === value
|
|
263
|
+
if @opts[:validator]
|
|
264
|
+
@opts[:validator] === value
|
|
265
|
+
elsif @opts[:class]
|
|
266
|
+
@opts[:class] === value
|
|
267
|
+
else
|
|
268
|
+
true
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
module Validators
|
|
273
|
+
|
|
274
|
+
class OR
|
|
275
|
+
|
|
276
|
+
# @param [Array<#===>] args
|
|
277
|
+
def initialize *args
|
|
278
|
+
@args = args
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# @param [Object] value
|
|
282
|
+
# @return [Boolean]
|
|
283
|
+
def === value
|
|
284
|
+
@args.each do |v|
|
|
285
|
+
if v === value
|
|
286
|
+
return true
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
return false
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
class AND
|
|
295
|
+
|
|
296
|
+
# @param [Array<#===>] args
|
|
297
|
+
def initialize *args
|
|
298
|
+
@args = args
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
# @param [Object] value
|
|
302
|
+
# @return [Boolean]
|
|
303
|
+
def === value
|
|
304
|
+
@args.each do |v|
|
|
305
|
+
if !(v === value)
|
|
306
|
+
return false
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
return true
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
class NOT
|
|
315
|
+
|
|
316
|
+
# @param [#===] arg
|
|
317
|
+
def initialize arg
|
|
318
|
+
@arg = arg
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
# @param [Object] value
|
|
322
|
+
# @return [Boolean]
|
|
323
|
+
def === value
|
|
324
|
+
!(@arg === value)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
class ANY < OR
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
class ALL < AND
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
class ONE
|
|
336
|
+
|
|
337
|
+
# @param [Array<#===>] args
|
|
338
|
+
def initialize *args
|
|
339
|
+
@or = OR.new *args
|
|
340
|
+
@and = AND.new *args
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# @param [Object] value
|
|
344
|
+
# @return [Boolean]
|
|
345
|
+
def === value
|
|
346
|
+
@or === value && !(@and === value)
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# @param [Array<#===>] args
|
|
352
|
+
# @return [OR]
|
|
353
|
+
def v_or *args
|
|
354
|
+
OR.new *args
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
# @param [Array<#===>] args
|
|
358
|
+
# @return [AND]
|
|
359
|
+
def v_and *args
|
|
360
|
+
AND.new *args
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
# @param [#===] arg
|
|
364
|
+
# @return [NOT]
|
|
365
|
+
def v_not arg
|
|
366
|
+
NOT.new arg
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
# @param [Array<#===>] args
|
|
370
|
+
# @return [ANY]
|
|
371
|
+
def v_any *args
|
|
372
|
+
ANY.new *args
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
# @param [Array<#===>] args
|
|
376
|
+
# @return [ALL]
|
|
377
|
+
def v_all *args
|
|
378
|
+
ALL.new *args
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
# @param [Array<#===>] args
|
|
382
|
+
# @return [ONE]
|
|
383
|
+
def v_one *args
|
|
384
|
+
ONE.new *args
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
module_function :v_or, :v_and, :v_not, :v_any, :v_all, :v_one
|
|
388
|
+
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: is-monkey
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.5.4
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Ivan Shikhalev
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2013-05-11 00:00:00.000000000 Z
|
|
13
|
+
dependencies: []
|
|
14
|
+
description: The set of monkey-patching.
|
|
15
|
+
email: shikhalev@gmail.com
|
|
16
|
+
executables: []
|
|
17
|
+
extensions: []
|
|
18
|
+
extra_rdoc_files: []
|
|
19
|
+
files:
|
|
20
|
+
- lib/is/monkey/sandbox.rb
|
|
21
|
+
- lib/is/monkey/keys.rb
|
|
22
|
+
- lib/is/monkey/namespace.rb
|
|
23
|
+
- lib/is/monkey/copy.rb
|
|
24
|
+
- lib/is/monkey/properties.rb
|
|
25
|
+
- lib/is/monkey/anyproc.rb
|
|
26
|
+
- .yardopts
|
|
27
|
+
homepage: https://github.com/shikhalev/gems/
|
|
28
|
+
licenses:
|
|
29
|
+
- GNU LGPL
|
|
30
|
+
post_install_message:
|
|
31
|
+
rdoc_options: []
|
|
32
|
+
require_paths:
|
|
33
|
+
- lib
|
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
35
|
+
none: false
|
|
36
|
+
requirements:
|
|
37
|
+
- - ! '>='
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: 1.9.2
|
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ! '>='
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '0'
|
|
46
|
+
requirements: []
|
|
47
|
+
rubyforge_project:
|
|
48
|
+
rubygems_version: 1.8.25
|
|
49
|
+
signing_key:
|
|
50
|
+
specification_version: 3
|
|
51
|
+
summary: The set of monkey-patching
|
|
52
|
+
test_files: []
|
|
53
|
+
has_rdoc:
|