y_support 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7b23faa0d465f3f3a15b4528d5fcfb0a32c6c7f
4
- data.tar.gz: 3ef03c2bc2154ff8b552f388726daf8b7a82ab8c
3
+ metadata.gz: 759b0ff1cab2ec03f748370b5cf7914ba85fffd7
4
+ data.tar.gz: 05aa1789b0a44fac0e98a7e3f1be9dc9bd77e726
5
5
  SHA512:
6
- metadata.gz: 53bcbc5db8d0cdedef378c15d87414d76f12a4d65b42274b9b224fd8d95c36620249057c6deac5aa4b03623b925dcdf75a88899975ccd4b46e33c54ef4419e21
7
- data.tar.gz: 5f65f0d77dd1dd2b8808b40b9218b934287636ac5436a785c0ef465bbcbde96fb74815b8c3c9d365faa37d50b8cb2b0cfe0f151c81ea213bce3992ee159d09bd
6
+ metadata.gz: 6ce6a5309f0d05cfc049bc2ad4264465e05a41320863257e318a15895a3f7e33608e90d2c479305d05120073e351446404130c9989d6f870f9f0f64de99e4b81
7
+ data.tar.gz: 458aa7e250fc6e902e6943fd6d74cd5a49ffe3ef84b334f62022fb3d8b19750b0393109f6fa4ad28a29ffa8018ee30750c9a2012d4f1170b3e8899bb955a2326
@@ -4,7 +4,7 @@ require 'y_support'
4
4
 
5
5
  # Object, whose business is to stay local to methods. Optional signature
6
6
  # provides additional level of safety in ensuring object locality. (Signature
7
- # accessor is :signature, aliased as (small Greek sigma).)
7
+ # accessor is :signature, aliased as :σ, small Greek sigma.)
8
8
  #
9
9
  class LocalObject
10
10
  attr_reader :signature
@@ -13,23 +13,27 @@ class LocalObject
13
13
  # Optional argument signature provides additional level of safety in
14
14
  # ascertaining that the object indeed is of local origin.
15
15
  #
16
- def initialize signature=__callee__
17
- @signature=signature
16
+ def initialize signature=caller_locations( 1, 1 )[0].label
17
+ @signature = signature
18
18
  end
19
19
 
20
20
  # True if the (optional) signature matches.
21
21
  #
22
- def local_object? signature=__callee__
22
+ def local_object? signature=caller_locations( 1, 1 )[0].label
23
23
  signature == self.signature
24
24
  end
25
25
  alias ℓ? local_object?
26
26
  end
27
27
 
28
-
28
+ # Object class is patched with #LocalObject (alias L!) constructor, and
29
+ # #local_object?, alias #ℓ? inquirer.
30
+ #
29
31
  class Object
30
32
  # LocalObject constructor.
31
33
  #
32
- def LocalObject signature=nil; LocalObject.new signature end
34
+ def LocalObject signature=caller_locations( 1, 1 )[0].label
35
+ LocalObject.new signature
36
+ end
33
37
  alias L! LocalObject
34
38
 
35
39
  # False for normal objects, overriden in the LocalObject class.
@@ -1,4 +1,3 @@
1
- #encoding: utf-8
2
1
  require 'y_support'
3
2
 
4
3
  # Typing library.
@@ -1,4 +1,4 @@
1
- #encoding: utf-8
1
+ # -*- coding: utf-8 -*-
2
2
  require 'y_support'
3
3
 
4
4
  # A mixin imitating Ruby constant magic, plus automation of :name alias :ɴ
@@ -24,23 +24,20 @@ require 'y_support'
24
24
  #
25
25
  module NameMagic
26
26
  DEBUG = false
27
- PROBLEM_MODULES = [ 'Gem', 'Rack', 'ActiveSupport' ]
28
27
 
29
28
  def self.included target
30
29
  case target
31
- when Class then
30
+ when Class then # we will decorate its #new method
32
31
  class << target
33
- # Make space for the decorator #new:
34
- alias :original_method_new :new
32
+ alias :original_method_new :new # Make space to decorate #new
35
33
  end
36
34
  # Attach the decorators etc.
37
35
  target.extend ::NameMagic::ClassMethods
38
36
  target.extend ::NameMagic::NamespaceMethods
39
37
  # Attach namespace methods to also to the namespace, if given.
40
38
  begin
41
- unless target == target.namespace
42
- target.namespace.extend ::NameMagic::NamespaceMethods
43
- end
39
+ target.namespace.extend ::NameMagic::NamespaceMethods unless
40
+ target.namespace == target
44
41
  rescue NoMethodError
45
42
  end
46
43
  else # it is a Module; we'll infect it with this #included method
@@ -50,13 +47,13 @@ module NameMagic
50
47
  target.method( :pre_included )
51
48
  rescue NameError
52
49
  end
53
- if pre_included_of_the_target then
50
+ if pre_included_of_the_target then # target has #pre_included hook
54
51
  target.define_singleton_method :included do |ç|
55
52
  pre_included_of_the_target.( ç )
56
53
  included_of_self.call( ç )
57
54
  included_of_the_target.call( ç )
58
55
  end
59
- else
56
+ else # target has no #pre_included hook
60
57
  target.define_singleton_method :included do |ç|
61
58
  included_of_self.( ç )
62
59
  included_of_the_target.( ç )
@@ -101,8 +98,7 @@ module NameMagic
101
98
  # Names an instance, aggresively (overwrites existing names).
102
99
  #
103
100
  def name!( ɴ )
104
- # get previous name of this instance, if any
105
- old_ɴ = self.class.__instances__[ self ]
101
+ old_ɴ = self.class.__instances__[ self ] # get instance's old name, if any
106
102
  # honor the hook
107
103
  name_set_closure = self.class.instance_variable_get :@name_set_closure
108
104
  ɴ = name_set_closure.( ɴ, self, old_ɴ ) if name_set_closure
@@ -111,7 +107,7 @@ module NameMagic
111
107
  # otherwise, rudely remove the collider, if any
112
108
  pair = self.class.__instances__.rassoc( ɴ )
113
109
  self.class.__forget__( pair[0] ) if pair
114
- # and add add self to the namespace
110
+ # and add self to the namespace instead
115
111
  self.class.namespace.const_set ɴ, self # write a constant
116
112
  self.class.__instances__[ self ] = ɴ # write to __instances__
117
113
  self.class.__forget__ old_ɴ # forget the old name of self
@@ -155,10 +151,10 @@ module NameMagic
155
151
  self
156
152
  end
157
153
 
158
- # Returns the instance of the class using NameMagic, specified by the
159
- # argument. NameError is raised, if the argument does not represent a valid
160
- # instance name, or if the argument itself is not a valid instance (in
161
- # which case it is returned unchanged).
154
+ # Returns an instance identiified by the argument. NameError is raised, if
155
+ # the argument does not identify an instance. (It can be an instance name
156
+ # as string, symbol, or an instance itself, in which case it is merely
157
+ # returned without changes.)
162
158
  #
163
159
  def instance arg
164
160
  const_magic
@@ -224,7 +220,7 @@ module NameMagic
224
220
  }
225
221
  end
226
222
  alias :forget_nameless_instances :forget_anonymous_instances
227
-
223
+
228
224
  # Clears class-owned references to all the instances.
229
225
  #
230
226
  def forget_all_instances
@@ -261,35 +257,22 @@ module NameMagic
261
257
  # Checks all the constants in some module's namespace, recursively.
262
258
  #
263
259
  def serve_all_modules
264
- incriminated_ids = ( nameless_instances + __avid_instances__ )
265
- .map( &:object_id ).uniq
266
- ObjectSpace.each_object Module do |ɱ|
267
- # hack against bugs when getting constants from URI
268
- next if ::NameMagic::PROBLEM_MODULES.any? { |problem_ς|
269
- begin
270
- ɱ.name.to_s.start_with? problem_ς
271
- rescue NoMethodError, ArgumentError
272
- end
273
- }
260
+ todo = ( nameless_instances + __avid_instances__ ).map( &:object_id ).uniq
261
+ ObjectSpace.each_object Module do |ɱ| # for all the modules...
274
262
  puts ɱ if ::NameMagic::DEBUG
275
- # check all the module constants:
276
- ɱ.constants( false ).each do |const_ß|
277
- begin # insurance against buggy dynamic loading of constants
263
+ ɱ.constants( false ).each do |const_ß| # and all the constants...
264
+ begin # insurance against constant dynamic loading fails
278
265
  ◉ = ɱ.const_get( const_ß )
279
- rescue
266
+ rescue LoadError, StandardError
280
267
  next
281
268
  end
282
- # is it a wanted object?
283
- if incriminated_ids.include? ◉.object_id then
284
- if __avid_instances__.map( &:object_id ).include? ◉.object_id then
285
- # name avidly
286
- __avid_instances__.delete_if { |instance| # make not avid first
287
- instance.object_id == ◉.object_id
288
- }
289
- ◉.name! const_ß # and then name it rudely
290
- else # name this anonymous instance cautiously
291
- # honor name_set_closure
292
- ɴ = if @name_set_closure then
269
+ if todo.include? ◉.object_id then # is it a wanted object?
270
+ if __avid_instances__.map( &:object_id ).include? ◉.object_id # avid
271
+ __avid_instances__ # 1. remove from avid list
272
+ .delete_if { |instance| instance.object_id == ◉.object_id }
273
+ ◉.name! const_ß # 2. name rudely
274
+ else # not avid
275
+ ɴ = if @name_set_closure then # honor name_set_closure
293
276
  @name_set_closure.( const_ß, ◉, nil )
294
277
  else const_ß end
295
278
  ɴ = validate_capitalization( ɴ ).to_sym
@@ -301,14 +284,12 @@ module NameMagic
301
284
  raise NameError, "Another #{self} named '#{ɴ}' already " +
302
285
  "exists!" unless conflicter == ◉
303
286
  else
304
- # add the instance to the namespace
305
- __instances__[] = ɴ
306
- namespace.const_set ɴ, ◉
287
+ __instances__[ ◉ ] = ɴ # add the instance to the namespace
288
+ namespace.const_set ɴ, # add the instance to the namespace
307
289
  end
308
290
  end
309
- # and stop working in case there are no more unnamed instances
310
- incriminated_ids.delete ◉.object_id
311
- break if incriminated_ids.empty?
291
+ todo.delete ◉.object_id # remove the id from todo list
292
+ break if todo.empty?
312
293
  end
313
294
  end # each
314
295
  end # each_object Module
@@ -316,7 +297,7 @@ module NameMagic
316
297
 
317
298
  # Checks whether a name starts with a capital letter.
318
299
  #
319
- def validate_capitalization( name )
300
+ def validate_capitalization name
320
301
  ɴ = name.to_s
321
302
  # check whether the name starts with 'A'..'Z'
322
303
  raise NameError, "#{self.class} name must start with a capital " +
@@ -326,48 +307,41 @@ module NameMagic
326
307
  end
327
308
 
328
309
  module ClassMethods
329
- # In addition to its ability to assign name to the target instance when
330
- # the instance is assigned to a constant (aka. constant magic), NameMagic
331
- # redefines #new class method to consume named parameter :name, alias :ɴ,
332
- # thus providing another option for naming of the target instance.
310
+ # In addition to 'constant magic' ability (name upon constant assignment),
311
+ # NameMagic redefines class method #new so that it eats parameter :name,
312
+ # alias :ɴ, and takes care of naming the instance accordingly. Option
313
+ # :name_avid can also be supplied (true/false), which makes the naming
314
+ # avid if true. (Avid, or aggresive naming means that the instance being
315
+ # named overwrites whatever was stored under that name earlier.)
333
316
  #
334
317
  def new *args, &block
335
318
  oo = args[-1].is_a?( Hash ) ? args.pop : {} # extract hash
336
- # consume :name named argument if it was supplied
337
- ɴß = if oo[:name] then oo.delete :name
338
- elsif oo[:ɴ] then oo.delete :ɴ
319
+ ɴß = if oo[:name] then oo.delete :name # consume :name if supplied
320
+ elsif oo[] then oo.delete :ɴ # consume :ɴ if supplied
339
321
  else nil end
340
- # Expecting true/false, if :name_avid option is given
341
- avid = oo[:name_avid] ? oo.delete( :name_avid ) : false
342
- # Avoid name collisions unless avid
322
+ avid = oo[:name_avid] ? oo.delete( :name_avid ) : false # => true/false
323
+ # Avoid overwriting existing names unless avid:
343
324
  raise NameError, "#{self} instance #{ɴß} already exists!" if
344
325
  __instances__.keys.include? ɴß unless avid
345
- # instantiate
326
+ # Instantiate:
346
327
  args << oo unless oo.empty? # fuse hash
347
328
  new_inst = original_method_new *args, &block
348
- # treat the instance as unnamed at first
349
- __instances__.merge! new_inst => nil
329
+ __instances__.merge! new_inst => nil # Instance is created unnamed
350
330
  # honor the hook
351
- @new_instance_closure.call( new_inst ) if @new_instance_closure
352
- # and then name it if name was supplied, or make it avid
353
- # (avid instances will steal names from their competitors)
354
- if ɴß then
331
+ @new_instance_closure.( new_inst ) if @new_instance_closure
332
+ if ɴß then # name was supplied, name the instance
355
333
  if avid then new_inst.name! ɴß else new_inst.name = ɴß end
356
- else
334
+ else # name wasn't supplied, make the instance avid
357
335
  __avid_instances__ << new_inst
358
336
  end
359
- # return the new instance
360
- return new_inst
337
+ return new_inst # return the new instance
361
338
  end
362
339
 
363
- # Compared to #new method, #new! uses avid mode: without
364
- # concerns about overwriting existing named instances.
340
+ # Calls #new in avid mode (name_avid: true).
365
341
  #
366
342
  def new! *args, &block
367
- # extract options
368
- if args[-1].is_a? Hash then oo = args.pop else oo = {} end
369
- # and call #new with added name_avid: true
370
- new *args, oo.merge!( name_avid: true )
343
+ oo = args[-1].is_a?( Hash ) ? args.pop : {} # extract options
344
+ new *args, oo.merge!( name_avid: true ), &block
371
345
  end
372
346
  end # module ClassMethods
373
347
  end # module NameMagic
@@ -1,3 +1,3 @@
1
1
  module YSupport
2
- VERSION = "1.1.0"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/y_support.rb CHANGED
@@ -1,33 +1,5 @@
1
1
  #encoding: utf-8
2
2
 
3
- require "y_support/version"
4
-
5
- # What follows is a commented-out list of interesting StdLibs. They may
6
- # or may no be required in various parts of y_support.
3
+ # YSupport is a collection of methods used in Y gems.
7
4
  #
8
- # require 'matrix' # in stdlib_ext/matrix/misc.rb
9
- # require 'mathn'
10
- # require 'set'
11
- # require 'csv'
12
-
13
- # What follows is a commented-out list of interesting ActiveSupport parts.
14
- # These may or may not be required in various parts of y_support.
15
- #
16
- # require 'active_support/core_ext/module/delegation'
17
- # require 'active_support/core_ext/object/blank' # in object/misc.rb, string/misc.rb
18
- # require 'active_support/core_ext/object/duplicable'
19
- # require 'active_support/core_ext/string/starts_ends_with'
20
- # require 'active_support/core_ext/string/strip'
21
- # require 'active_support/core_ext/string/inflections' # in autoreq; module/misc.rb
22
- # require 'active_support/core_ext/integer/multiple'
23
- # require 'active_support/core_ext/integer/inflections'
24
- # require 'active_support/core_ext/enumerable'
25
- # require 'active_support/core_ext/array/extract_options'
26
- # require 'active_support/core_ext/hash/conversions' # such as #to_xml
27
- # require 'active_support/core_ext/hash/reverse_merge' # aliased in hash/misc.rb
28
- # require 'active_support/core_ext/hash/deep_merge'
29
- # require 'active_support/core_ext/hash/diff'
30
- # require 'active_support/core_ext/hash/except'
31
- # require 'active_support/core_ext/hash/keys'
32
- # require 'active_support/core_ext/hash/slice'
33
- # require 'active_support/core_ext/hash/indifferent_access'
5
+ require "y_support/version"
data/test/misc_test.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #! /usr/bin/ruby
2
- #encoding: utf-8
2
+ # -*- coding: utf-8 -*-
3
3
 
4
4
  require 'test/unit'
5
5
  require 'shoulda'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: y_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - boris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-16 00:00:00.000000000 Z
11
+ date: 2013-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport