lib/uuid4.rb in uuid4-1.2.1 vs lib/uuid4.rb in uuid4-1.3.0
- old
+ new
@@ -58,10 +58,18 @@
@value
end
alias_method :to_i, :to_int
+ def hash
+ @value.hash
+ end
+
+ def eql?(object)
+ object.is_a?(::UUID4) && object.hash === hash
+ end
+
def inspect
"<UUID4:#{to_s}>"
end
def components
@@ -77,36 +85,49 @@
protected
attr_reader :value
class << self
+ alias _new new
+ private :_new
+
def new(value = nil)
if value.nil?
super(SecureRandom.uuid.tr('-', '').hex)
- elsif value.is_a?(UUID4)
+ elsif (value = try_convert(value))
value
- elsif value.respond_to?(:to_uuid4)
- value.to_uuid4
- elsif value.respond_to?(:to_int) && valid_int?(value = value.to_int)
- super(value)
- elsif (ret = _parse(value))
- super(ret)
else
raise TypeError.new "Invalid UUID: #{value.inspect}"
end
end
- def _parse(value)
- if value.respond_to?(:to_int) && valid_int?(value = value.to_int)
- return value
+ def try_convert(value)
+ if value.nil? || value.is_a?(::UUID4)
+ value
+ elsif value.respond_to?(:to_uuid4)
+ value.to_uuid4
+ elsif (value = _parse(value))
+ _new value
end
+ end
- FORMATTERS.each do |formatter|
- val = formatter.decode(value) if formatter.respond_to?(:decode)
- return val if val
+ def valid?(value)
+ if value.is_a?(::UUID4)
+ true
+ else
+ !try_convert(value).nil?
end
+ end
- nil
+ def _parse(value)
+ if value.respond_to?(:to_int) && valid_int?(value = value.to_int)
+ value
+ else
+ # Return the result of the first formatter that can decode this value
+ FORMATTERS.lazy.map { |formatter|
+ formatter.decode(value) if formatter.respond_to?(:decode)
+ }.find(&:itself)
+ end
end
def valid_int?(int)
int.to_s(16).rjust(32, '0') =~ Formatter::Compact::REGEXP
end