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 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: