aboutsummaryrefslogtreecommitdiffstats
path: root/lib/roo/helpers
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2019-01-14 01:41:26 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2019-01-14 01:41:26 -0500
commit6aa7e04e06423e7d92ede727489ea346e88f7108 (patch)
tree9bdec92fd17898b662235bc0a491de827990130c /lib/roo/helpers
parentc59817e300dbe1aab3120cad603cdb14b14ed78b (diff)
parentdddfa903d2b856146f05ffb4415c31d6127bb5bf (diff)
Update upstream source from tag 'upstream/2.8.0'
Update to upstream version '2.8.0' with Debian dir 569f5866fbcf4e449c6c48dc5d20a3ab54f95252
Diffstat (limited to 'lib/roo/helpers')
-rw-r--r--lib/roo/helpers/default_attr_reader.rb20
-rw-r--r--lib/roo/helpers/weak_instance_cache.rb41
2 files changed, 61 insertions, 0 deletions
diff --git a/lib/roo/helpers/default_attr_reader.rb b/lib/roo/helpers/default_attr_reader.rb
new file mode 100644
index 0000000..a02ba84
--- /dev/null
+++ b/lib/roo/helpers/default_attr_reader.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Roo
+ module Helpers
+ module DefaultAttrReader
+ def attr_reader_with_default(attr_hash)
+ attr_hash.each do |attr_name, default_value|
+ instance_variable = :"@#{attr_name}"
+ define_method attr_name do
+ if instance_variable_defined? instance_variable
+ instance_variable_get instance_variable
+ else
+ default_value
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/roo/helpers/weak_instance_cache.rb b/lib/roo/helpers/weak_instance_cache.rb
new file mode 100644
index 0000000..db26de1
--- /dev/null
+++ b/lib/roo/helpers/weak_instance_cache.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require "weakref"
+
+module Roo
+ module Helpers
+ module WeakInstanceCache
+ private
+
+ def instance_cache(key)
+ object = nil
+
+ if instance_variable_defined?(key) && (ref = instance_variable_get(key)) && ref.weakref_alive?
+ begin
+ object = ref.__getobj__
+ rescue => e
+ unless (defined?(::WeakRef::RefError) && e.is_a?(::WeakRef::RefError)) || (defined?(RefError) && e.is_a?(RefError))
+ raise e
+ end
+ end
+ end
+
+ unless object
+ object = yield
+ ObjectSpace.define_finalizer(object, instance_cache_finalizer(key))
+ instance_variable_set(key, WeakRef.new(object))
+ end
+
+ object
+ end
+
+ def instance_cache_finalizer(key)
+ proc do |object_id|
+ if instance_variable_defined?(key) && (ref = instance_variable_get(key)) && (!ref.weakref_alive? || ref.__getobj__.object_id == object_id)
+ remove_instance_variable(key)
+ end
+ end
+ end
+ end
+ end
+end