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