From e48bef6315058b5918ba8731bb1a84a99cf7a905 Mon Sep 17 00:00:00 2001 From: Manasa Venkatakrishnan Date: Wed, 6 Nov 2024 05:16:17 -0800 Subject: [PATCH 1/4] Handling datetime in client to_dict() --- .../src/cryoet_data_portal/_gql_base.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py index aa8a2a326..5f0841d02 100644 --- a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py +++ b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py @@ -1,5 +1,5 @@ import functools -from datetime import datetime +from datetime import date, datetime from importlib import import_module from typing import Any, Dict, Iterable, Optional @@ -211,9 +211,14 @@ def __init__(self, client: Client, **kwargs): value = getattr(self, k).convert(kwargs.get(strcase.to_lower_camel(k))) setattr(self, k, value) + def _serialize(self, value): + if isinstance(value, (datetime, date)): + return value.isoformat() + return value + def to_dict(self) -> Dict[str, Any]: """Return a dictionary representation of this object's attributes""" - return {k: getattr(self, k) for k in self._get_scalar_fields()} + return {k: self._serialize(getattr(self, k)) for k in self._get_scalar_fields()} @classmethod @functools.lru_cache(maxsize=32) From 5a02e28fb0d76562e813e9f35bedd7fdeab18ddc Mon Sep 17 00:00:00 2001 From: Manasa Venkatakrishnan Date: Wed, 6 Nov 2024 09:03:41 -0800 Subject: [PATCH 2/4] Updating json gen --- .../cryoet_data_portal/src/cryoet_data_portal/_gql_base.py | 6 +++++- docs/cryoet_data_portal_docsite_quick_start.md | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py index 5f0841d02..2c275742f 100644 --- a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py +++ b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py @@ -218,7 +218,11 @@ def _serialize(self, value): def to_dict(self) -> Dict[str, Any]: """Return a dictionary representation of this object's attributes""" - return {k: self._serialize(getattr(self, k)) for k in self._get_scalar_fields()} + return {k: getattr(self, k) for k in self._get_scalar_fields()} + + def to_json_dict(self) -> Dict[str, Any]: + """Return a JSON encoder friendly representation of this object's attributes""" + return {key: self._serialize(val) for key, val in self.to_dict().items()} @classmethod @functools.lru_cache(maxsize=32) diff --git a/docs/cryoet_data_portal_docsite_quick_start.md b/docs/cryoet_data_portal_docsite_quick_start.md index 73595a1d3..5b7a64606 100644 --- a/docs/cryoet_data_portal_docsite_quick_start.md +++ b/docs/cryoet_data_portal_docsite_quick_start.md @@ -156,7 +156,7 @@ for tomo in tomos: print(tomo.name) # Print the tomogram metadata as a json string - print(json.dumps(tomo.to_dict(), indent=4)) + print(json.dumps(tomo.to_json_dict(), indent=4)) # Download a tomogram in the MRC format (uncomment to actually download files) # tomo.download_mrcfile() From 12a1361c5a8a5ef4ac94676581d768682ee34efb Mon Sep 17 00:00:00 2001 From: Manasa Venkatakrishnan Date: Wed, 6 Nov 2024 09:16:40 -0800 Subject: [PATCH 3/4] Printing json generation --- .../src/cryoet_data_portal/_gql_base.py | 9 ++++++--- docs/cryoet_data_portal_docsite_quick_start.md | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py index 2c275742f..2189e6463 100644 --- a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py +++ b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py @@ -1,4 +1,6 @@ import functools +import json +import logging from datetime import date, datetime from importlib import import_module from typing import Any, Dict, Iterable, Optional @@ -220,9 +222,10 @@ def to_dict(self) -> Dict[str, Any]: """Return a dictionary representation of this object's attributes""" return {k: getattr(self, k) for k in self._get_scalar_fields()} - def to_json_dict(self) -> Dict[str, Any]: - """Return a JSON encoder friendly representation of this object's attributes""" - return {key: self._serialize(val) for key, val in self.to_dict().items()} + def print_json(self) -> None: + """Prints a JSON representation of this object's scalar attributes""" + obj = {key: self._serialize(val) for key, val in self.to_dict().items()} + logging.info(json.dumps(obj, indent=2)) @classmethod @functools.lru_cache(maxsize=32) diff --git a/docs/cryoet_data_portal_docsite_quick_start.md b/docs/cryoet_data_portal_docsite_quick_start.md index 5b7a64606..d39c35a61 100644 --- a/docs/cryoet_data_portal_docsite_quick_start.md +++ b/docs/cryoet_data_portal_docsite_quick_start.md @@ -156,7 +156,7 @@ for tomo in tomos: print(tomo.name) # Print the tomogram metadata as a json string - print(json.dumps(tomo.to_json_dict(), indent=4)) + tomo.print_json() # Download a tomogram in the MRC format (uncomment to actually download files) # tomo.download_mrcfile() From 25b4a1b5fbc237a9944bbf3a53e5fcde5e05a5f9 Mon Sep 17 00:00:00 2001 From: Manasa Venkatakrishnan Date: Wed, 6 Nov 2024 09:42:54 -0800 Subject: [PATCH 4/4] Adding default method for handling datetime --- .../src/cryoet_data_portal/_gql_base.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py index 2189e6463..0ab58d193 100644 --- a/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py +++ b/client/python/cryoet_data_portal/src/cryoet_data_portal/_gql_base.py @@ -213,19 +213,20 @@ def __init__(self, client: Client, **kwargs): value = getattr(self, k).convert(kwargs.get(strcase.to_lower_camel(k))) setattr(self, k, value) - def _serialize(self, value): - if isinstance(value, (datetime, date)): - return value.isoformat() - return value - def to_dict(self) -> Dict[str, Any]: """Return a dictionary representation of this object's attributes""" return {k: getattr(self, k) for k in self._get_scalar_fields()} + def _serialize_datetime(self, value): + if isinstance(value, (datetime, date)): + return value.isoformat() + raise TypeError("Unknown type") + def print_json(self) -> None: """Prints a JSON representation of this object's scalar attributes""" - obj = {key: self._serialize(val) for key, val in self.to_dict().items()} - logging.info(json.dumps(obj, indent=2)) + logging.info( + json.dumps(self.to_dict(), indent=2, default=self._serialize_datetime), + ) @classmethod @functools.lru_cache(maxsize=32)