lib/gtin/gtin.rb in salsify-gtin-0.2.0 vs lib/gtin/gtin.rb in salsify-gtin-0.2.1
- old
+ new
@@ -29,21 +29,27 @@
def zero_pad(gtin)
gtin.rjust(14, '0')
end
def standardize(id_type, value, validate_checksum: true)
- fail_on_invalid_checksum(id_type, value) if validate_checksum
converter = get_converter(id_type, value.length)
+ if converter.nil?
+ raise GtinValidationError.new("#{id_type} standardization failed: no gtin converter for value with length #{value.length}")
+ end
+
+ fail_on_invalid_checksum(id_type, value) if validate_checksum
+
send(converter.standardizer, value)
end
def get_converter(id_type, value_length)
CONVERTER_MAP.each do |(type_matcher, length), converter|
return converter if type_matcher.match?(id_type) && value_length == length
end
- raise GtinValidationError.new("No gtin converter found for #{id_type} with length #{value_length}")
+ # rubocop warns about this, but it's needed because #each returns its owner
+ return nil
end
def standardize_gtin(gtin)
gtin
end
@@ -74,15 +80,21 @@
unchecked + compute_checksum_gtin(unchecked)
end
def valid_checksum?(id_type, identifier)
converter = get_converter(id_type, identifier.length)
+ return false if converter.nil?
+
expected_checksum = send(converter.checksum_computer, identifier[0..-2])
identifier[-1] == expected_checksum
end
def fail_on_invalid_checksum(id_type, identifier)
converter = get_converter(id_type, identifier.length)
+ if converter.nil?
+ raise GtinValidationError.new("Invalid checksum: gtin converter not found for #{id_type} with length #{value.length}")
+ end
+
expected_checksum = send(converter.checksum_computer, identifier[0..-2])
actual_checksum = identifier[-1]
return if actual_checksum == expected_checksum
raise GtinValidationError.new("#{id_type} #{identifier} has invalid checksum #{actual_checksum} -- expected #{expected_checksum}")