From 610b1140ba776619c1007f9fb00a72cf1d96e18d Mon Sep 17 00:00:00 2001 From: ollietulloch Date: Fri, 10 Oct 2025 08:36:00 +0100 Subject: [PATCH 1/4] Allow values to be formatted as Time --- lib/ndr_import/mapper.rb | 14 ++++++++++---- test/mapper_test.rb | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/ndr_import/mapper.rb b/lib/ndr_import/mapper.rb index 347c499..666a161 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,17 @@ 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]) + if field_mapping[Strings::TIME] + return Time.strptime(original_value, expected_format) + else + return original_value.to_date(expected_format) + end 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..5b4b47e 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) + 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 From 9b8facc5893e83cc8a9e00f5b66503d04c2519e1 Mon Sep 17 00:00:00 2001 From: ollietulloch Date: Fri, 10 Oct 2025 08:42:19 +0100 Subject: [PATCH 2/4] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From f5d73cb77c75aba1a978991a2924498b50606fc5 Mon Sep 17 00:00:00 2001 From: ollietulloch Date: Fri, 10 Oct 2025 09:04:14 +0100 Subject: [PATCH 3/4] Force BST offset in tests --- test/mapper_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/mapper_test.rb b/test/mapper_test.rb index 5b4b47e..59316fd 100644 --- a/test/mapper_test.rb +++ b/test/mapper_test.rb @@ -759,7 +759,7 @@ def setup end test 'should format time' do - expected_value = Time.new(2025, 6, 1, 10, 15, 36) + 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 From dfe29a6e383e153b1a34595c5dedd4e55c05c176 Mon Sep 17 00:00:00 2001 From: ollietulloch Date: Fri, 10 Oct 2025 09:27:03 +0100 Subject: [PATCH 4/4] # Boyscouting --- lib/ndr_import/mapper.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/ndr_import/mapper.rb b/lib/ndr_import/mapper.rb index 666a161..5c2a289 100644 --- a/lib/ndr_import/mapper.rb +++ b/lib/ndr_import/mapper.rb @@ -208,11 +208,9 @@ def mapped_value(original_value, field_mapping) expected_format = field_mapping[Strings::FORMAT] begin - if field_mapping[Strings::TIME] - return Time.strptime(original_value, expected_format) - else - return original_value.to_date(expected_format) - end + return Time.strptime(original_value, expected_format) if field_mapping[Strings::TIME] + + original_value.to_date(expected_format) rescue ArgumentError => e raise ArgumentError, "#{e.message} value #{original_value.inspect}", e.backtrace end