lib/economic/entity/handle.rb in rconomic-0.5.2 vs lib/economic/entity/handle.rb in rconomic-0.6.0

- old
+ new

@@ -6,26 +6,26 @@ new(options) end def self.id_properties { - :code => 'Code', - :id => 'Id', - :id1 => 'Id1', - :id2 => 'Id2', - :name => 'Name', - :number => 'Number', - :serial_number => 'SerialNumber', - :vat_code => 'VatCode' + :code => "Code", + :id => "Id", + :id1 => "Id1", + :id2 => "Id2", + :name => "Name", + :number => "Number", + :serial_number => "SerialNumber", + :vat_code => "VatCode" } end def self.supported_keys id_properties.keys end - attr_accessor *supported_keys + attr_accessor(*supported_keys) # Returns true if Handle hasn't been initialized with any values yet. This # usually happens when the handle is constructed for an entity whose id # properties (id, number, etc) haven't been set yet. def empty? @@ -34,70 +34,95 @@ def initialize(hash) verify_sanity_of_arguments!(hash) hash = prepare_hash_argument(hash) unless hash.is_a?(self.class) - [:code, :name, :vat_code].each do |key| + [:code, :name, :vat_code, :number].each do |key| instance_variable_set("@#{key}", hash[key]) if hash[key] end - [:id, :id1, :id2, :number, :serial_number].each do |key| + [:id, :id1, :id2, :serial_number].each do |key| instance_variable_set("@#{key}", hash[key].to_i) if hash[key] end end def to_hash(only_keys = id_properties.keys) only_keys = [only_keys].flatten only_keys.each_with_object({}) do |key, hash| property = id_properties[key] - value = self.send(key) + value = send(key) next if value.blank? hash[property] = value end end def [](key) instance_variable_get("@#{key}") end def ==(other) - return true if self.object_id == other.object_id + return true if object_id == other.object_id return false if other.nil? return false if empty? || (other.respond_to?(:empty?) && other.empty?) return false unless other.respond_to?(:id) && other.respond_to?(:number) - self.id == other.id && self.number == other.number && self.id1 == other.id1 && self.id2 == other.id2 + id == other.id && + number == other.number && + id1 == other.id1 && + id2 == other.id2 && + name == other.name end private + def handleish?(object) + return false if object.nil? + return true if object.is_a?(self.class) + return true if object.is_a?(Hash) + false + end + def id_properties self.class.id_properties end + def verify_all_keys_are_known(hash) + if hash.respond_to?(:keys) + unknown_keys = hash.keys - id_properties.keys - id_properties.values + raise( + ArgumentError, + "Unknown keys in handle: #{unknown_keys.inspect}" + ) unless unknown_keys.empty? + end + end + # Raises exceptions if hash doesn't contain values we can use to construct a # new handle def verify_sanity_of_arguments!(hash) - return if hash.is_a?(self.class) + verify_usability_for_handle(hash) + verify_all_keys_are_known(hash) + end - if hash.nil? || (!hash.respond_to?(:to_i) && (!hash.respond_to?(:keys) && !hash.respond_to?(:values))) - raise ArgumentError.new("Expected Number, Hash or Economic::Entity::Handle - got #{hash.inspect}") - end + def verify_usability_for_handle(hash) + return if handleish?(hash) - if hash.respond_to?(:keys) - unknown_keys = hash.keys - id_properties.keys - id_properties.values - raise ArgumentError.new("Unknown keys in handle: #{unknown_keys.inspect}") unless unknown_keys.empty? - end + raise( + ArgumentError, + "Expected Hash or Economic::Entity::Handle - got #{hash.inspect}" + ) end # Examples # - # prepare_hash_argument(12) #=> {:id => 12} - # prepare_hash_argument(:id => 12) #=> {:id => 12} - # prepare_hash_argument('Id' => 12) #=> {:id => 12} - # prepare_hash_argument('Id' => 12, 'Number' => 13) #=> {:id => 12, :number => 13} + # prepare_hash_argument(:id => 12) + # #=> {:id => 12} + # + # prepare_hash_argument('Id' => 12) + # #=> {:id => 12} + # + # prepare_hash_argument('Id' => 12, 'Number' => 13) + # #=> {:id => 12, :number => 13} def prepare_hash_argument(hash) - hash = {:id => hash.to_i} if hash.respond_to?(:to_i) unless hash.blank? - hash[:id] ||= hash['Id'] - hash[:number] ||= hash['Number'] + hash[:id] ||= hash["Id"] + hash[:number] ||= hash["Number"] hash end end end