lib/propertybase_id.rb in propertybase_id-0.2.0 vs lib/propertybase_id.rb in propertybase_id-0.3.0

- old
+ new

@@ -1,91 +1,90 @@ require "propertybase_id/version" -require "propertybase_id/local_random" require "propertybase_id/generator" require "propertybase_id/mappings" class PropertybaseId - attr_reader :object + attr_reader :object_id attr_reader :host_id attr_reader :time attr_reader :process_id attr_reader :counter - def initialize(object:, host_id:, time:, process_id:, counter:) - @object = object && object.dup.freeze + def initialize(object_id:, host_id:, time:, process_id:, counter:) + @object_id = object_id @host_id = host_id @time = time @process_id = process_id @counter = counter - validate! end + def object + @_object ||= self.class.team_from_object_id(@object_id || "") + end + def to_s @_string ||= begin object_str = format_number(@object_id, 3) host_str = format_number(@host_id, 2) time_str = format_number(@time, 6) process_str = format_number(@process_id, 2) - counter_str = format_number(@counter, 3) + counter_str = format_number(@counter, 5) "#{object_str}#{host_str}#{time_str}#{process_str}#{counter_str}" end end def ==(o) self.class == o.class && - self.object == o.object && + self.object_id == o.object_id && self.host_id == o.host_id && self.process_id == o.process_id && self.time == o.time && self.counter == o.counter end alias_method :eql?, :== def hash [ - @object_id, - @host_id, - @time, - @process_id, - @counter, + object_id, + host_id, + time, + process_id, + counter, ].hash end def self.generate(object:) - @_generator ||= begin - PropertybaseId::Generator.new - end - @_generator.generate(object: object) + @@generator.generate(object: object) end def self.parse(input_id) - raise ArgumentError, "invalid length (#{input_id.size})" if input_id.size != 16 + raise ArgumentError, "invalid length (#{input_id.size})" if input_id.size != 18 - _, object_id, host_id, time, process_id, counter = input_id.match(/(\w{3})(\w{2})(\w{6})(\w{2})(\w{3})/).to_a + _, object_id, host_id, time, process_id, counter = input_id.match(/(\w{3})(\w{2})(\w{6})(\w{2})(\w{5})/).to_a - object, _ = PropertybaseId::Mappings.objects.select{|_, v| v == object_id.to_i(36) }.first + team_from_object_id(object_id.to_i(36)) - raise ArgumentError, "No object to id #{object_id}" if object.nil? - new( - object: object, + object_id: object_id.to_i(36), host_id: host_id.to_i(36), time: time.to_i(36), process_id: process_id.to_i(36), counter: counter.to_i(36), ) end private - def validate! - @object_id ||= PropertybaseId::Mappings.objects.fetch(object) do - raise ArgumentError, "Object #{object.inspect} not found" - end - end - def format_number(integer, length) integer.to_s(36).rjust(length, "0") end + + def self.team_from_object_id(input_id) + obj, _ = PropertybaseId::Mappings.objects.select{|_, v| v == input_id }.first + raise ArgumentError, "No object to id #{input_id.to_s(36)}" if obj.nil? + obj + end + + @@generator = PropertybaseId::Generator.new end