From 9163079ad4924a5e71f6de8491a347d3dc757959 Mon Sep 17 00:00:00 2001 From: Reto Schneider Date: Wed, 26 Jan 2022 18:01:06 +0100 Subject: [PATCH 1/2] model: fix default Edm.DateTimeOffset value (#195) Default value was broken in several ways: - Month 0 does not exist - Day 0 does not exist - Year 0 can not be handled by Python datetime --- CHANGELOG.md | 2 ++ pyodata/v2/model.py | 2 +- tests/test_service_v2.py | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60b31c60..bcf53dc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Fixed - Fix Increased robustness when schema with empty properties is returned +- Use valid default value for Edm.DateTimeOffset - Reto Schneider ## [1.8.0] diff --git a/pyodata/v2/model.py b/pyodata/v2/model.py index 3a3e1540..1f724912 100644 --- a/pyodata/v2/model.py +++ b/pyodata/v2/model.py @@ -200,7 +200,7 @@ def _build_types(): Types.register_type(Typ('Edm.String', '\'\'', EdmStringTypTraits())) Types.register_type(Typ('Edm.Time', 'time\'PT00H00M\'')) Types.register_type( - Typ('Edm.DateTimeOffset', 'datetimeoffset\'0000-00-00T00:00:00Z\'', EdmDateTimeOffsetTypTraits())) + Typ('Edm.DateTimeOffset', 'datetimeoffset\'1753-01-01T00:00:00Z\'', EdmDateTimeOffsetTypTraits())) @staticmethod def register_type(typ): diff --git a/tests/test_service_v2.py b/tests/test_service_v2.py index 191a0316..5ee92f6a 100644 --- a/tests/test_service_v2.py +++ b/tests/test_service_v2.py @@ -2379,7 +2379,9 @@ def test_parsing_of_datetime_before_unix_time(service): ('/Date(981173106000+0001)/', datetime.datetime(2001, 2, 3, 4, 5, 6, tzinfo=datetime.timezone(datetime.timedelta(minutes=1)))), ('/Date(981173106000-0001)/', datetime.datetime(2001, 2, 3, 4, 5, 6, - tzinfo=datetime.timezone(-datetime.timedelta(minutes=1))))]) + tzinfo=datetime.timezone(-datetime.timedelta(minutes=1)))), + (None, datetime.datetime(1753, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)), +]) def test_parsing_of_datetimeoffset(service, json_input, expected): """Test DateTimeOffset handling.""" From a264bac381649bbb365a608c4111a19b595d7d61 Mon Sep 17 00:00:00 2001 From: Reto Schneider Date: Fri, 28 Jan 2022 19:19:40 +0100 Subject: [PATCH 2/2] model: adjust default Edm.DateTime value (#79) This makes it easier, more likely, to spot dates fixed-up by pyodata. The new value aligns with Edm.DateTimeOffset. --- CHANGELOG.md | 3 +++ pyodata/v2/model.py | 2 +- tests/test_service_v2.py | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcf53dc5..05d576e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Fix Increased robustness when schema with empty properties is returned - Use valid default value for Edm.DateTimeOffset - Reto Schneider +### Changed +- Adjusted Edm.DateTime default value to January 1, 1753 A.D - Reto Schneider + ## [1.8.0] ### Fixed diff --git a/pyodata/v2/model.py b/pyodata/v2/model.py index 1f724912..3c5195f3 100644 --- a/pyodata/v2/model.py +++ b/pyodata/v2/model.py @@ -186,7 +186,7 @@ def _build_types(): Types.register_type(Typ('Edm.Binary', 'binary\'\'', EdmBinaryTypTraits('(?:binary|X)'))) Types.register_type(Typ('Edm.Boolean', 'false', EdmBooleanTypTraits())) Types.register_type(Typ('Edm.Byte', '0')) - Types.register_type(Typ('Edm.DateTime', 'datetime\'2000-01-01T00:00\'', EdmDateTimeTypTraits())) + Types.register_type(Typ('Edm.DateTime', 'datetime\'1753-01-01T00:00\'', EdmDateTimeTypTraits())) Types.register_type(Typ('Edm.Decimal', '0.0M')) Types.register_type(Typ('Edm.Double', '0.0d', EdmFPNumTypTraits.edm_double())) Types.register_type(Typ('Edm.Single', '0.0f', EdmFPNumTypTraits.edm_single())) diff --git a/tests/test_service_v2.py b/tests/test_service_v2.py index 5ee92f6a..a5925ee9 100644 --- a/tests/test_service_v2.py +++ b/tests/test_service_v2.py @@ -2345,6 +2345,28 @@ def test_create_entity_with_naive_datetime(service): assert str(e_info.value).startswith('Emd.DateTime accepts only UTC') +@responses.activate +def test_null_datetime(service): + """Test default value of DateTime. Default value gets inserted when a property is null""" + + responses.add( + responses.GET, + f"{service.url}/TemperatureMeasurements", + headers={'Content-type': 'application/json'}, + json={'d': { + 'results': [ + { + 'Date': None, + } + ] + }}, + status=200) + + result = service.entity_sets.TemperatureMeasurements.get_entities().execute() + + assert result[0].Date == datetime.datetime(1753, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc) + + @responses.activate def test_parsing_of_datetime_before_unix_time(service): """Test DateTime handling of time before 1970"""