cow_proxy 0.1.1 → 0.1.2

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: ce226b279191db83c5d94fdcd974f9ff078f9aed
4
- data.tar.gz: 209d901098c7203cd6c08194fe5565a432885c71
3
+ metadata.gz: d055ad28e6ab0d7c88bb1543ab122b1b9dd310ba
4
+ data.tar.gz: 18b291113a0cd6b3b9662b4640e7087bd126297a
5
5
  SHA512:
6
- metadata.gz: 02695f8b475ab7c813d169a4eb44ae91c2a6b00ec7a0ad41f690667a2bca29b3cedb228c72e1d572a917bbfafd54ddf8080badb0770e229a956e37bb00e52789
7
- data.tar.gz: 64156f469d1b130068bfdaeced1988c8daad0528ce28ced26ebc132dcb74785602faa36457632ba79bc00d7bfb6c3fef2c08007543e5909d5a31115970b88a75
6
+ metadata.gz: 607ea8e8a4a7d0bf713c65aeb55993e778f0fab06ebe9050de0a98ed7bd3e46c5c3c70cbe6388a1d03579baf45d756677954a6672a3b90ffaf95a2bf5bf280d8
7
+ data.tar.gz: 7a167b8d6f5df69eea9579e5ba161a0e780c1338411fb43ee3197dc9a98ae298289d26d6d7cfb64945f75c8d7449d82659ae4066fb459b47d53f78f1982fdc49
@@ -14,7 +14,7 @@
14
14
  module CowProxy
15
15
  class << self
16
16
  # @!visibility private
17
- @@wrapper_classes = {}
17
+ @@wrapper_classes = {Integer: nil, Float: nil, Symbol: nil, TrueClass: nil, FalseClass: nil, NilClass: nil}
18
18
 
19
19
  # Create new proxy class for klass, with copy on write enabled.
20
20
  #
@@ -35,20 +35,26 @@ module CowProxy
35
35
  # Register proxy to be used when wrapping an object of klass.
36
36
  #
37
37
  # It's called automatically when inheriting from class returned by WrapClass
38
+ # Can be called with nil proxy_klass to disable wrapping objects of klass, for
39
+ # example Integer is registered with nil because there is no point in wrapping
40
+ # immutable classes.
38
41
  #
39
42
  # @return proxy_klass
40
43
  def register_proxy(klass, proxy_klass)
41
- debug "register proxy for #{klass} with #{proxy_klass} < #{proxy_klass.superclass}" unless @@wrapper_classes[klass]
44
+ debug { "register proxy for #{klass} with #{proxy_klass} < #{proxy_klass.superclass}" } unless @@wrapper_classes[klass]
42
45
  @@wrapper_classes[klass] ||= proxy_klass
43
46
  end
44
47
 
45
48
  # Returns a proxy wrapping obj, using registered class for obj's class.
46
49
  # If no class is registered for obj's class, it uses default proxy, without
47
- # copy on write
50
+ # copy on write.
51
+ #
52
+ # If class is registered with nil Proxy, return obj.
48
53
  #
49
54
  # @return wrapped obj with CowProxy class
50
55
  def wrap(obj)
51
- wrapper_class(obj).new(obj)
56
+ klass = wrapper_class(obj)
57
+ klass ? klass.new(obj) : obj
52
58
  end
53
59
 
54
60
  # Returns proxy wrapper class for obj.
@@ -59,20 +65,29 @@ module CowProxy
59
65
  # if none is registered
60
66
  def wrapper_class(obj)
61
67
  # only classes with defined wrapper and Structs has COW enabled by default
62
- @@wrapper_classes[obj.class] || _WrapClass(obj.class, obj.class < Struct, true)
68
+ if @@wrapper_classes.has_key?(obj.class)
69
+ @@wrapper_classes[obj.class]
70
+ else
71
+ _WrapClass(obj.class, obj.class < Struct, true)
72
+ end
63
73
  end
64
74
 
65
75
  # Print debug line if debug is enabled (ENV['DEBUG'] true)
76
+ # Accepts a block instead of line, so interpolation is skipped
77
+ # when debug is disabled
78
+ #
66
79
  # @param [String] line debug line to print
67
80
  # @return nil
68
- def debug(line)
69
- Kernel.puts line if ENV['DEBUG']
81
+ def debug(line = nil)
82
+ return unless ENV['DEBUG']
83
+ line ||= yield if block_given?
84
+ Kernel.puts line
70
85
  end
71
86
 
72
87
  private
73
88
  def _WrapClass(klass, cow = true, register = false)
74
89
  proxy_superclass = get_proxy_klass_for(klass.superclass) || Base
75
- debug "create new proxy class for #{klass}#{" from #{proxy_superclass}" if proxy_superclass}"
90
+ debug { "create new proxy class for #{klass}#{" from #{proxy_superclass}" if proxy_superclass}" }
76
91
  proxy_klass = Class.new(proxy_superclass) do |k|
77
92
  k.wrapped_class = klass
78
93
  end
@@ -31,7 +31,7 @@ module CowProxy
31
31
  inst_var = "@#{method}" if method.to_s =~ /^\w+$/
32
32
  return _instance_variable_get(inst_var) if inst_var && _instance_variable_defined?(inst_var)
33
33
  if method.to_s =~ /^(\w+)=$/ && _instance_variable_defined?("@#{$1}")
34
- CowProxy.debug "remove #{$1}"
34
+ CowProxy.debug { "remove #{$1}" }
35
35
  _remove_instance_variable "@#{$1}"
36
36
  end
37
37
  __wrapped_method__(inst_var, cow_enabled, method, *args, &block)
@@ -61,7 +61,7 @@ module CowProxy
61
61
  # another CowProxy.
62
62
  # @return duplicated wrapped object
63
63
  def __copy_on_write__(parent = true)
64
- CowProxy.debug "copy on write on #{__getobj__.class.name}"
64
+ CowProxy.debug { "copy on write on #{__getobj__.class.name}" }
65
65
  return @delegate_dc_obj if @dc_obj_duplicated
66
66
  @delegate_dc_obj = @delegate_dc_obj.dup.tap do |new_target|
67
67
  @dc_obj_duplicated = true
@@ -83,7 +83,7 @@ module CowProxy
83
83
 
84
84
  def __wrap__(value, inst_var = nil)
85
85
  if value.frozen?
86
- CowProxy.debug "wrap #{value.class.name} with parent #{self.class.name}"
86
+ CowProxy.debug { "wrap #{value.class.name} with parent #{__getobj__.class.name}" }
87
87
  wrap_value = CowProxy.wrapper_class(value).new(value, self, inst_var)
88
88
  _instance_variable_set(inst_var, wrap_value) if inst_var
89
89
  wrap_value
@@ -91,7 +91,7 @@ module CowProxy
91
91
  end
92
92
 
93
93
  def __wrapped_value__(inst_var, method, *args, &block)
94
- CowProxy.debug "run on #{__getobj__.class.name} (#{__getobj__.object_id}) #{method} #{args.inspect unless args.empty?}"
94
+ CowProxy.debug { "run on #{__getobj__.class.name} (#{__getobj__.object_id}) #{method} #{args.inspect unless args.empty?}" }
95
95
  value = __getobj__.__send__(method, *args, &block)
96
96
  wrap_value = __wrap__(value, inst_var) if inst_var && args.empty? && block.nil?
97
97
  wrap_value || value
@@ -101,9 +101,9 @@ module CowProxy
101
101
  __wrapped_value__(inst_var, method, *args, &block)
102
102
  rescue => e
103
103
  raise unless cow && e.message =~ /^can't modify frozen/
104
- CowProxy.debug "copy on write to run #{method} #{args.inspect unless args.empty?} (#{e.message})"
104
+ CowProxy.debug { "copy on write to run #{method} #{args.inspect unless args.empty?} (#{e.message})" }
105
105
  __copy_on_write__
106
- CowProxy.debug "new target #{__getobj__.class.name} (#{__getobj__.object_id})"
106
+ CowProxy.debug { "new target #{__getobj__.class.name} (#{__getobj__.object_id})" }
107
107
  __wrapped_value__(inst_var, method, *args, &block)
108
108
  end
109
109
 
@@ -1,4 +1,7 @@
1
1
  module CowProxy
2
2
  class String < WrapClass(::String)
3
+ def to_str
4
+ __getobj__.to_str
5
+ end
3
6
  end
4
7
  end
@@ -2,7 +2,7 @@ module CowProxy
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- PATCH = 1
5
+ PATCH = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cow_proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergio Cambra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-21 00:00:00.000000000 Z
11
+ date: 2017-03-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Make a COW proxy for a frozen object (or deep frozen), it will delegate
14
14
  every read method to proxied object, wrap value in COW proxy if frozen. Trying to