diff --git a/CHANGELOG.md b/CHANGELOG.md index bd4926d..24cdf0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ## [Unreleased] -* no unreleased changes * +* Adds option to format value to Time * ## 11.3.1/ 2025-09-02 ### Enhancement diff --git a/lib/ndr_import/mapper.rb b/lib/ndr_import/mapper.rb index 347c499..5c2a289 100644 --- a/lib/ndr_import/mapper.rb +++ b/lib/ndr_import/mapper.rb @@ -28,6 +28,7 @@ module Strings RAWTEXT_NAME = 'rawtext_name'.freeze REPLACE = 'replace'.freeze STANDARD_MAPPING = 'standard_mapping'.freeze + TIME = 'time'.freeze UNPACK_PATTERN = 'unpack_pattern'.freeze VALIDATES = 'validates'.freeze ZIP_ORDER = 'zip_order'.freeze @@ -203,12 +204,15 @@ def field_zippable?(field_mapping, data_field) def mapped_value(original_value, field_mapping) if field_mapping.include?(Strings::FORMAT) + return nil if original_value.blank? + + expected_format = field_mapping[Strings::FORMAT] begin - return original_value.blank? ? nil : original_value.to_date(field_mapping[Strings::FORMAT]) + return Time.strptime(original_value, expected_format) if field_mapping[Strings::TIME] + + original_value.to_date(expected_format) rescue ArgumentError => e - e2 = ArgumentError.new("#{e} value #{original_value.inspect}") - e2.set_backtrace(e.backtrace) - raise e2 + raise ArgumentError, "#{e.message} value #{original_value.inspect}", e.backtrace end elsif field_mapping.include?(Strings::CLEAN) return nil if original_value.blank? diff --git a/test/mapper_test.rb b/test/mapper_test.rb index 9fb1fcf..59316fd 100644 --- a/test/mapper_test.rb +++ b/test/mapper_test.rb @@ -345,6 +345,14 @@ def setup - field: field_two YML + time_format_mapping = YAML.safe_load <<-YML + - column: time_field + mappings: + - field: time_field + format: "%Y-%m-%dT%H:%M:%S%:z" + time: true + YML + test 'map should return a number' do assert_equal '1', TestMapper.new.mapped_value('A', map_mapping) end @@ -749,4 +757,18 @@ def setup } assert_equal expected_mapped_line, mapped_line end + + test 'should format time' do + expected_value = Time.new(2025, 6, 1, 10, 15, 36, '+01:00') + actual_value = TestMapper.new.mapped_line(['2025-06-01T10:15:36+01:00'], time_format_mapping)['time_field'] + assert_equal expected_value, actual_value + end + + test 'should raise an error with invalid time format' do + exception = assert_raise(ArgumentError) do + TestMapper.new.mapped_line(['2025-06-01T10:15:36'], time_format_mapping) + end + + assert exception.message.starts_with? 'invalid date or strptime format' + end end