From 7271fbe960a5333f4a0190d086516934b78c77df Mon Sep 17 00:00:00 2001 From: Amir Golparvar <amir.golparvar@physik.hu-berlin.de> Date: Wed, 8 Jun 2022 14:45:03 +0000 Subject: [PATCH] Resolve "Datetime parsing issues" --- nomad/metainfo/metainfo.py | 5 ++++- tests/metainfo/test_quantities.py | 13 +++++++++++-- tests/processing/test_edit_metadata.py | 6 +++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index f0c0383aa6..1f1db98788 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -29,7 +29,7 @@ import pint import pint.unit import pint.quantity import aniso8601 -from datetime import datetime +from datetime import datetime, date import pytz import docstring_parser import jmespath @@ -835,6 +835,9 @@ class _Datetime(DataType): elif isinstance(value, pint.Quantity): value = datetime.fromtimestamp(value.magnitude) + elif not isinstance(value, datetime) and isinstance(value, date): + value = datetime.combine(value, datetime.min.time()) + if not isinstance(value, datetime): raise TypeError('%s is not a datetime.' % value) diff --git a/tests/metainfo/test_quantities.py b/tests/metainfo/test_quantities.py index 931536f10a..bede3bb904 100644 --- a/tests/metainfo/test_quantities.py +++ b/tests/metainfo/test_quantities.py @@ -35,6 +35,7 @@ from nomad.metainfo import MSection, Quantity, Unit, units, JSON, Dimension, Dat pytest.param(Dimension, 'quantity', id='Dimension-quantity'), pytest.param(Datetime, datetime.datetime.now(datetime.timezone.utc), id='Datetime'), pytest.param(Datetime, datetime.datetime.now(pytz.timezone('America/Los_Angeles')), id='Datetime'), + pytest.param(Datetime, datetime.date.today(), id='Date'), pytest.param(Capitalized, 'Hello', id='Capitalize'), pytest.param(Bytes, b'hello', id='Bytes') ]) @@ -45,12 +46,20 @@ def test_basic_types(def_type, value): section = TestSectionA() assert section.quantity is None section.quantity = value + if not isinstance(value, datetime.datetime) and isinstance(value, datetime.date): + assert section.quantity == datetime.datetime.combine(value, datetime.datetime.min.time()).replace( + tzinfo=pytz.utc) + else: + assert section.quantity == value - assert section.quantity == value section_serialized = section.m_to_dict() json.dumps(section_serialized) section = TestSectionA.m_from_dict(section_serialized) - assert section.quantity == value + if not isinstance(value, datetime.datetime) and isinstance(value, datetime.date): + assert section.quantity == datetime.datetime.combine(value, datetime.datetime.min.time()).replace( + tzinfo=pytz.utc) + else: + assert section.quantity == value class TestSectionB(MSection): quantity = Quantity(type=def_type, default=value) diff --git a/tests/processing/test_edit_metadata.py b/tests/processing/test_edit_metadata.py index afadeaf352..011e5257b3 100644 --- a/tests/processing/test_edit_metadata.py +++ b/tests/processing/test_edit_metadata.py @@ -46,9 +46,9 @@ all_coauthor_entry_metadata = { all_admin_metadata = dict( # Every attribute which only admins can set - upload_create_time='2021-05-04T11:00:00', - entry_create_time='2021-05-04T11:00:00', - publish_time='2021-05-04T11:00:00', + upload_create_time='2021-05-04T00:00:00', + entry_create_time='2021-05-04T00:00:00', + publish_time='2021-05-04T00:00:00', license='a license', main_author='lhofstadter') -- GitLab