cow_proxy 0.1.1 → 0.1.2

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