is-monkey 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
data/.yardopts ADDED
@@ -0,0 +1,9 @@
1
+ --no-cache
2
+ --private
3
+ --protected
4
+ --hide-void-return
5
+ --plugin yard-is-monkey
6
+ --title 'Ruby Gems by Ivan Shikhalev'
7
+ --query="/^@@/ !~ o.name && @api.text != 'ignore'"
8
+ lib/**/*.rb ./*.rb
9
+ - *.md
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ class Object
4
+
5
+ # @return [Proc, nil]
6
+ def to_proc
7
+ if respond_to? :call
8
+ method(:call).to_proc
9
+ else
10
+ nil
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ class Object
4
+
5
+ # @return [Object]
6
+ def copy
7
+ Marshal.load(Marshal.dump(self))
8
+ end
9
+
10
+ end
@@ -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
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ # @yield
4
+ def sandbox &block
5
+ lambda do
6
+ $SAFE = 4
7
+ yield
8
+ end.call
9
+ end
10
+
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: