From be81711879f821ff2add82eda819c14992e5182f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 06:59:19 +0000 Subject: [PATCH 01/27] chore(deps-dev): bump zipp from 3.20.0 to 3.20.1 Bumps [zipp](https://github.com/jaraco/zipp) from 3.20.0 to 3.20.1. - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.20.0...v3.20.1) --- updated-dependencies: - dependency-name: zipp dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index cdaf078..9d78472 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -62,7 +62,7 @@ wrapt==1.16.0 yapf==0.40.2 -zipp==3.20.0 ; python_version >= '3.8' +zipp==3.20.1 ; python_version >= '3.8' colorama==0.4.6 From 7295611637240f9fcc98ea38e90a699846278af8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 06:04:50 +0000 Subject: [PATCH 02/27] chore(deps-dev): bump certifi from 2024.7.4 to 2024.8.30 Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.7.4 to 2024.8.30. - [Commits](https://github.com/certifi/python-certifi/compare/2024.07.04...2024.08.30) --- updated-dependencies: - dependency-name: certifi dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 9d78472..e775cb0 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ astroid==3.2.4 -certifi==2024.7.4 +certifi==2024.8.30 charset-normalizer==3.3.2 From 7e40315d15fcd265d7cc9026d65ecabbdaeba3ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 07:02:53 +0000 Subject: [PATCH 03/27] chore(deps-dev): bump pylint from 3.2.6 to 3.2.7 in the pylint group Bumps the pylint group with 1 update: [pylint](https://github.com/pylint-dev/pylint). Updates `pylint` from 3.2.6 to 3.2.7 - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.2.6...v3.2.7) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:development update-type: version-update:semver-patch dependency-group: pylint ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index e775cb0..79b2f3f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -38,7 +38,7 @@ platformdirs==4.2.2 pluggy==1.5.0 -pylint==3.2.6 +pylint==3.2.7 pytest==8.3.2 From 9dd420ec8e8f675453a883dd51d03bb88e4980d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 06:19:31 +0000 Subject: [PATCH 04/27] chore(deps-dev): bump types-python-dateutil Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.9.0.20240821 to 2.9.0.20240906. - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-python-dateutil dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 79b2f3f..b8286d6 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -52,7 +52,7 @@ tomli==2.0.1 tomlkit==0.13.2 -types-python-dateutil==2.9.0.20240821 +types-python-dateutil==2.9.0.20240906 typing-extensions==4.12.2 From 5d60ea96d5d55eaf3778d5adcf99465aa7fa025b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 06:14:47 +0000 Subject: [PATCH 05/27] chore(deps-dev): bump platformdirs from 4.2.2 to 4.3.2 Bumps [platformdirs](https://github.com/platformdirs/platformdirs) from 4.2.2 to 4.3.2. - [Release notes](https://github.com/platformdirs/platformdirs/releases) - [Changelog](https://github.com/tox-dev/platformdirs/blob/main/CHANGES.rst) - [Commits](https://github.com/platformdirs/platformdirs/compare/4.2.2...4.3.2) --- updated-dependencies: - dependency-name: platformdirs dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index b8286d6..d0fb738 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -34,7 +34,7 @@ mypy-extensions==1.0.0 packaging==24.1 -platformdirs==4.2.2 +platformdirs==4.3.2 pluggy==1.5.0 From 6714ba8b3c48d70d7610801e6ed3077a3298949e Mon Sep 17 00:00:00 2001 From: shemogumbe Date: Tue, 10 Sep 2024 12:47:07 +0300 Subject: [PATCH 06/27] remove is four digit number check --- kiota_serialization_json/json_parse_node.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/kiota_serialization_json/json_parse_node.py b/kiota_serialization_json/json_parse_node.py index ac3252e..ad7b09c 100644 --- a/kiota_serialization_json/json_parse_node.py +++ b/kiota_serialization_json/json_parse_node.py @@ -293,10 +293,6 @@ def _assign_field_values(self, item: U) -> None: deserialize but the model doesn't support additional data" ) - def __is_four_digit_number(self, value: str) -> bool: - pattern = r'^\d{4}$' - return bool(re.match(pattern, value)) - def try_get_anything(self, value: Any) -> Any: if isinstance(value, (int, float, bool)) or value is None: return value @@ -306,8 +302,6 @@ def try_get_anything(self, value: Any) -> Any: return dict(map(lambda x: (x[0], self.try_get_anything(x[1])), value.items())) if isinstance(value, str): try: - if self.__is_four_digit_number(value): - return value datetime_obj = pendulum.parse(value) if isinstance(datetime_obj, pendulum.Duration): From 6544b52d3e78e28db6c7036c65423906fd8e22c5 Mon Sep 17 00:00:00 2001 From: shemogumbe Date: Tue, 10 Sep 2024 12:50:54 +0300 Subject: [PATCH 07/27] add check for isdidgit --- kiota_serialization_json/json_parse_node.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kiota_serialization_json/json_parse_node.py b/kiota_serialization_json/json_parse_node.py index ad7b09c..937ccd3 100644 --- a/kiota_serialization_json/json_parse_node.py +++ b/kiota_serialization_json/json_parse_node.py @@ -302,7 +302,8 @@ def try_get_anything(self, value: Any) -> Any: return dict(map(lambda x: (x[0], self.try_get_anything(x[1])), value.items())) if isinstance(value, str): try: - + if value.isdigit(): + return value datetime_obj = pendulum.parse(value) if isinstance(datetime_obj, pendulum.Duration): return datetime_obj.as_timedelta() From 083a173f5a0f4a7998bbe9feea0c98fc68856c10 Mon Sep 17 00:00:00 2001 From: shemogumbe Date: Tue, 10 Sep 2024 13:00:26 +0300 Subject: [PATCH 08/27] add unit tests --- tests/unit/test_json_parse_node.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/unit/test_json_parse_node.py b/tests/unit/test_json_parse_node.py index 7bec942..cf1e003 100644 --- a/tests/unit/test_json_parse_node.py +++ b/tests/unit/test_json_parse_node.py @@ -141,6 +141,25 @@ def test_get_anythin_does_not_convert_numeric_chars_to_datetime(): assert result == "1212" +def test_get_anythin_does_not_convert_any_length_numeric_chars_to_datetime(): + parse_node = JsonParseNode("1212") + result1 = parse_node.try_get_anything("1212") + parse_node_two = JsonParseNode("-PT15M") + result2 = parse_node_two.try_get_anything("-PT15M") + parse_node_three = JsonParseNode("20081008") + result3 = parse_node_three.try_get_anything("20081008") + parse_node_four = JsonParseNode("1011317") + result4 = parse_node_four.try_get_anything("1011317") + assert isinstance(result1, str) + assert result1 == "1212" + assert isinstance(result2, str) + assert result2 == "-PT15M" + assert isinstance(result3, str) + assert result3 == "20081008" + assert isinstance(result4, str) + assert result4 == "1011317" + + def test_get_anythin_does_convert_date_string_to_datetime(): parse_node = JsonParseNode("2023-10-05T14:48:00.000Z") result = parse_node.try_get_anything("2023-10-05T14:48:00.000Z") From 7683982134e981ff5b45027c8d37d148cd0de869 Mon Sep 17 00:00:00 2001 From: shemogumbe Date: Tue, 10 Sep 2024 13:03:49 +0300 Subject: [PATCH 09/27] update version and changelog --- CHANGELOG.md | 8 ++++++++ kiota_serialization_json/_version.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb6a78f..6186cbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.2] - 2024-09-10 + +### Added + +- Fixed numeric strings from being parsed as Datetime objects to being parsed as strings. +-Only parse to Datetime objects that conform to ISO 8601 format. + + ## [1.3.1] - 2024-08-23 diff --git a/kiota_serialization_json/_version.py b/kiota_serialization_json/_version.py index d045b44..b84f08f 100644 --- a/kiota_serialization_json/_version.py +++ b/kiota_serialization_json/_version.py @@ -1 +1 @@ -VERSION: str = '1.3.1' +VERSION: str = '1.3.2' From 7bf86b3e29ff7c380c3e3e03f5b204f00c25bb7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 06:34:51 +0000 Subject: [PATCH 10/27] chore(deps-dev): bump pytest from 8.3.2 to 8.3.3 Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.3.2 to 8.3.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.3.2...8.3.3) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index d0fb738..7d0509a 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -40,7 +40,7 @@ pluggy==1.5.0 pylint==3.2.7 -pytest==8.3.2 +pytest==8.3.3 pytest-cov==5.0.0 From 00bbf44f285c949e4ba3eafbd43c53d184c28321 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Sep 2024 06:25:55 +0000 Subject: [PATCH 11/27] chore(deps-dev): bump urllib3 from 2.2.2 to 2.2.3 Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.2.2 to 2.2.3. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.2.2...2.2.3) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 7d0509a..e7b4b90 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -56,7 +56,7 @@ types-python-dateutil==2.9.0.20240906 typing-extensions==4.12.2 -urllib3==2.2.2 +urllib3==2.2.3 wrapt==1.16.0 From cc6e1ef8c0ffb1250e3d2ae64b6c37d6b34a462d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 06:45:54 +0000 Subject: [PATCH 12/27] chore(deps-dev): bump platformdirs from 4.3.2 to 4.3.3 Bumps [platformdirs](https://github.com/tox-dev/platformdirs) from 4.3.2 to 4.3.3. - [Release notes](https://github.com/tox-dev/platformdirs/releases) - [Changelog](https://github.com/tox-dev/platformdirs/blob/main/CHANGES.rst) - [Commits](https://github.com/tox-dev/platformdirs/compare/4.3.2...4.3.3) --- updated-dependencies: - dependency-name: platformdirs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index e7b4b90..6bc0fe2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -34,7 +34,7 @@ mypy-extensions==1.0.0 packaging==24.1 -platformdirs==4.3.2 +platformdirs==4.3.3 pluggy==1.5.0 From d48be23f5e5b905db6f6c18e65cdbf6b023c48a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 06:45:58 +0000 Subject: [PATCH 13/27] chore(deps-dev): bump zipp from 3.20.1 to 3.20.2 Bumps [zipp](https://github.com/jaraco/zipp) from 3.20.1 to 3.20.2. - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.20.1...v3.20.2) --- updated-dependencies: - dependency-name: zipp dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index e7b4b90..c37468e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -62,7 +62,7 @@ wrapt==1.16.0 yapf==0.40.2 -zipp==3.20.1 ; python_version >= '3.8' +zipp==3.20.2 ; python_version >= '3.8' colorama==0.4.6 From d05a0bfd645f0ba649a7060f35bd572bc67107d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 06:46:01 +0000 Subject: [PATCH 14/27] chore(deps-dev): bump idna from 3.8 to 3.10 Bumps [idna](https://github.com/kjd/idna) from 3.8 to 3.10. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.8...v3.10) --- updated-dependencies: - dependency-name: idna dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index e7b4b90..e208c2b 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -16,7 +16,7 @@ flit==3.9.0 flit-core==3.9.0 -idna==3.8 +idna==3.10 importlib-metadata==6.8.0 ; python_version >= '3.8' From f5d213116ade52372e8756169a2ab1fc14198fa2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 06:40:11 +0000 Subject: [PATCH 15/27] chore(deps-dev): bump platformdirs from 4.3.3 to 4.3.6 Bumps [platformdirs](https://github.com/tox-dev/platformdirs) from 4.3.3 to 4.3.6. - [Release notes](https://github.com/tox-dev/platformdirs/releases) - [Changelog](https://github.com/tox-dev/platformdirs/blob/main/CHANGES.rst) - [Commits](https://github.com/tox-dev/platformdirs/compare/4.3.3...4.3.6) --- updated-dependencies: - dependency-name: platformdirs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 68a40dd..27852f2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -34,7 +34,7 @@ mypy-extensions==1.0.0 packaging==24.1 -platformdirs==4.3.3 +platformdirs==4.3.6 pluggy==1.5.0 From 3278fe8619bc63ddfc9d6808c4555ec3c9b53a6c Mon Sep 17 00:00:00 2001 From: eranavrahami Date: Tue, 24 Sep 2024 18:04:38 +0300 Subject: [PATCH 16/27] fix serialization of pendulum.DateTime objects in JsonSerializationWriter --- .../json_serialization_writer.py | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/kiota_serialization_json/json_serialization_writer.py b/kiota_serialization_json/json_serialization_writer.py index b0a0926..48d90a7 100644 --- a/kiota_serialization_json/json_serialization_writer.py +++ b/kiota_serialization_json/json_serialization_writer.py @@ -16,7 +16,6 @@ class JsonSerializationWriter(SerializationWriter): - PROPERTY_SEPARATOR: str = ',' def __init__(self) -> None: @@ -24,7 +23,7 @@ def __init__(self) -> None: self.value: Any = None self._on_start_object_serialization: Optional[Callable[[Parsable, SerializationWriter], - None]] = None + None]] = None self._on_before_object_serialization: Optional[Callable[[Parsable], None]] = None self._on_after_object_serialization: Optional[Callable[[Parsable], None]] = None @@ -192,7 +191,7 @@ def write_time_value(self, key: Optional[str], value: Optional[time]) -> None: raise ValueError("Invalid time string value found") def write_collection_of_primitive_values( - self, key: Optional[str], values: Optional[List[T]] + self, key: Optional[str], values: Optional[List[T]] ) -> None: """Writes the specified collection of primitive values to the stream with an optional given key. @@ -213,7 +212,7 @@ def write_collection_of_primitive_values( self.value = result def write_collection_of_object_values( - self, key: Optional[str], values: Optional[List[U]] + self, key: Optional[str], values: Optional[List[U]] ) -> None: """Writes the specified collection of model objects to the stream with an optional given key. @@ -234,7 +233,7 @@ def write_collection_of_object_values( self.value = obj_list def write_collection_of_enum_values( - self, key: Optional[str], values: Optional[List[Enum]] + self, key: Optional[str], values: Optional[List[Enum]] ) -> None: """Writes the specified collection of enum values to the stream with an optional given key. Args: @@ -254,7 +253,7 @@ def write_collection_of_enum_values( self.value = result def __write_collection_of_dict_values( - self, key: Optional[str], values: Optional[List[Dict[str, Any]]] + self, key: Optional[str], values: Optional[List[Dict[str, Any]]] ) -> None: """Writes the specified collection of dictionary values to the stream with an optional given key. @@ -291,7 +290,7 @@ def write_bytes_value(self, key: Optional[str], value: bytes) -> None: self.value = base64_string def write_object_value( - self, key: Optional[str], value: Optional[U], *additional_values_to_merge: U + self, key: Optional[str], value: Optional[U], *additional_values_to_merge: U ) -> None: """Writes the specified model object to the stream with an optional given key. Args: @@ -424,7 +423,7 @@ def on_after_object_serialization(self, value: Optional[Callable[[Parsable], Non @property def on_start_object_serialization( - self + self ) -> Optional[Callable[[Parsable, SerializationWriter], None]]: """Gets the callback called right after the serialization process starts. Returns: @@ -435,7 +434,7 @@ def on_start_object_serialization( @on_start_object_serialization.setter def on_start_object_serialization( - self, value: Optional[Callable[[Parsable, SerializationWriter], None]] + self, value: Optional[Callable[[Parsable, SerializationWriter], None]] ) -> None: """Sets the callback called right after the serialization process starts. Args: @@ -458,16 +457,13 @@ def write_non_parsable_object_value(self, key: Optional[str], value: T) -> None: def write_any_value(self, key: Optional[str], value: Any) -> Any: """Writes the specified value to the stream with an optional given key. + Args: key (Optional[str]): The key to be used for the written value. May be null. - value Any): The value to be written. + value (Any): The value to be written. """ - value_type = type(value) if value is None: self.write_null_value(key) - elif value_type in PRIMITIVE_TYPES: - method = getattr(self, f'write_{value_type.__name__.lower()}_value') - method(key, value) elif isinstance(value, Parsable): self.write_object_value(key, value) elif isinstance(value, list): @@ -475,24 +471,28 @@ def write_any_value(self, key: Optional[str], value: Any) -> Any: self.write_collection_of_object_values(key, value) elif all(isinstance(x, Enum) for x in value): self.write_collection_of_enum_values(key, value) - elif all((type(x) in PRIMITIVE_TYPES) for x in value): + elif all(any(isinstance(x, primitive_type) for primitive_type in PRIMITIVE_TYPES) for x in value): self.write_collection_of_primitive_values(key, value) elif all(isinstance(x, dict) for x in value): self.__write_collection_of_dict_values(key, value) else: raise TypeError( - f"Encountered an unknown collection type during serialization \ - {value_type} with key {key}" + f"Encountered an unknown collection type during serialization {type(value)} with key {key}" ) elif isinstance(value, dict): self.__write_dict_value(key, value) - elif hasattr(value, '__dict__'): - self.write_non_parsable_object_value(key, value) else: - raise TypeError( - f"Encountered an unknown type during serialization {value_type} \ - with key {key}" - ) + for primitive_type in PRIMITIVE_TYPES: + if isinstance(value, primitive_type): + method = getattr(self, f"write_{primitive_type.__name__.lower()}_value") + method(key, value) + return + if hasattr(value, "__dict__"): + self.write_non_parsable_object_value(key, value) + else: + raise TypeError( + f"Encountered an unknown type during serialization {type(value)} with key {key}" + ) def _serialize_value(self, temp_writer: JsonSerializationWriter, value: U): if on_before := self.on_before_object_serialization: From 7599c1fee5b6c9787cd8c2a281312caa5c21c78e Mon Sep 17 00:00:00 2001 From: eranavrahami Date: Tue, 24 Sep 2024 19:06:30 +0300 Subject: [PATCH 17/27] add pendulum testcase to test_write_additional_data_value --- tests/unit/test_json_serialization_writer.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_json_serialization_writer.py b/tests/unit/test_json_serialization_writer.py index 02ce3f6..36261b9 100644 --- a/tests/unit/test_json_serialization_writer.py +++ b/tests/unit/test_json_serialization_writer.py @@ -255,6 +255,7 @@ def test_write_additional_data_value(user_1, user_2): "manager": user_1, "approvers": [user_1, user_2], "created_at": date(2022, 1, 27), + "updated_at": pendulum.DateTime(2024, 9, 24), "data": { "groups": [{ "friends": [user_2] @@ -271,5 +272,7 @@ def test_write_additional_data_value(user_1, user_2): '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, '\ '"approvers": [{"id": "8f841f30-e6e3-439a-a812-ebd369559c36", '\ '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, '\ - '{"display_name": "John Doe", "age": 32}], "created_at": "2022-01-27", '\ - '"data": {"groups": [{"friends": [{"display_name": "John Doe", "age": 32}]}]}}' + '{"display_name": "John Doe", "age": 32}], '\ + '"created_at": "2022-01-27", '\ + '"updated_at": "2024-09-24T00:00:00", '\ + '"data": {"groups": [{"friends": [{"display_name": "John Doe", "age": 32}]}]}}' From dc563deee6055e762fe172fee4e40ead5e49a0b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 06:17:33 +0000 Subject: [PATCH 18/27] chore(deps-dev): bump dill from 0.3.8 to 0.3.9 Bumps [dill](https://github.com/uqfoundation/dill) from 0.3.8 to 0.3.9. - [Release notes](https://github.com/uqfoundation/dill/releases) - [Commits](https://github.com/uqfoundation/dill/compare/0.3.8...0.3.9) --- updated-dependencies: - dependency-name: dill dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 27852f2..0b154e0 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -8,7 +8,7 @@ charset-normalizer==3.3.2 coverage[toml]==7.6.1 -dill==0.3.8 +dill==0.3.9 docutils==0.20.1 From 0187bd080d1e112717716f2fcdea24d5f57f459c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 06:33:42 +0000 Subject: [PATCH 19/27] chore(deps-dev): bump types-python-dateutil Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.9.0.20240906 to 2.9.0.20241003. - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-python-dateutil dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 0b154e0..ff7ae58 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -52,7 +52,7 @@ tomli==2.0.1 tomlkit==0.13.2 -types-python-dateutil==2.9.0.20240906 +types-python-dateutil==2.9.0.20241003 typing-extensions==4.12.2 From 41b274fccdee404f450a7b8ac68cd5fe109bde01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 06:33:45 +0000 Subject: [PATCH 20/27] chore(deps-dev): bump tomli from 2.0.1 to 2.0.2 Bumps [tomli](https://github.com/hukkin/tomli) from 2.0.1 to 2.0.2. - [Changelog](https://github.com/hukkin/tomli/blob/master/CHANGELOG.md) - [Commits](https://github.com/hukkin/tomli/compare/2.0.1...2.0.2) --- updated-dependencies: - dependency-name: tomli dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 0b154e0..4e43d39 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -48,7 +48,7 @@ requests==2.32.3 toml==0.10.2 -tomli==2.0.1 +tomli==2.0.2 tomlkit==0.13.2 From 27fa1932ccbe013a4d5b9878c21690ab0fe4e4fc Mon Sep 17 00:00:00 2001 From: eranavrahami Date: Thu, 3 Oct 2024 18:33:52 +0300 Subject: [PATCH 21/27] bump version and update changelog.md --- CHANGELOG.md | 25 ++++++++++++++++++------- kiota_serialization_json/_version.py | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6186cbb..4bd64b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,17 +2,21 @@ All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.3.2] - 2024-09-10 +## [1.3.3] - 2024-10-03 -### Added +### Fixed -- Fixed numeric strings from being parsed as Datetime objects to being parsed as strings. --Only parse to Datetime objects that conform to ISO 8601 format. +- Fixed an issue where `pendulum.DateTime` objects were not properly serialized by `JsonSerializationWriter`. Now, `pendulum.DateTime` objects are correctly recognized as subclasses of `datetime.datetime` and serialized accordingly. + +## [1.3.2] - 2024-09-10 +### Added +- Fixed numeric strings from being parsed as Datetime objects to being parsed as strings. +- Only parse to Datetime objects that conform to ISO 8601 format. ## [1.3.1] - 2024-08-23 @@ -20,7 +24,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed 4-digit numeric strings from being parsed as Datetime objects to being parsed as strings. - ## [1.3.0] - 2024-07-26 ### Added @@ -37,6 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Enhanced error handling: Enabled silent failure when an enum key is not available ## [1.1.0] - 2024-02-29 @@ -44,6 +48,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Support objects and collections when writing additional data. ## [1.0.1] - 2023-12-16 @@ -51,6 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Bump pendulum to v3.0.0b1 for python 3.12 support. ## [1.0.0] - 2023-10-31 @@ -58,6 +64,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - GA release ## [0.4.2] - 2023-10-11 @@ -65,6 +72,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Switched from python-dateutil to pendulum for parsing datetime types. ## [0.4.1] - 2023-09-21 @@ -72,6 +80,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Allow passing of valid strings as values for datetime and UUID fields. ## [0.4.0] - 2023-07-27 @@ -79,6 +88,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Enabled backing store support ## [0.3.7] - 2023-07-04 @@ -86,6 +96,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Fixes the key assignment to the writer in write_bytes_value. ## [0.3.6] - 2023-06-27 @@ -93,6 +104,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + - Fixed a bug with loading json response in method to get root parse node. ## [0.3.5] - 2023-06-14 @@ -153,4 +165,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Fixed a bug with deserializing 'None' string values in enums. - diff --git a/kiota_serialization_json/_version.py b/kiota_serialization_json/_version.py index b84f08f..9ca2418 100644 --- a/kiota_serialization_json/_version.py +++ b/kiota_serialization_json/_version.py @@ -1 +1 @@ -VERSION: str = '1.3.2' +VERSION: str = '1.3.3' From 6ab9150cb64b74b3361ba7c7911dec4ec467319c Mon Sep 17 00:00:00 2001 From: eranavrahami Date: Thu, 3 Oct 2024 18:51:55 +0300 Subject: [PATCH 22/27] reformat --- .../json_serialization_writer.py | 37 ++++---- tests/unit/test_json_serialization_writer.py | 88 +++++++++++++------ 2 files changed, 79 insertions(+), 46 deletions(-) diff --git a/kiota_serialization_json/json_serialization_writer.py b/kiota_serialization_json/json_serialization_writer.py index 48d90a7..a585822 100644 --- a/kiota_serialization_json/json_serialization_writer.py +++ b/kiota_serialization_json/json_serialization_writer.py @@ -23,7 +23,7 @@ def __init__(self) -> None: self.value: Any = None self._on_start_object_serialization: Optional[Callable[[Parsable, SerializationWriter], - None]] = None + None]] = None self._on_before_object_serialization: Optional[Callable[[Parsable], None]] = None self._on_after_object_serialization: Optional[Callable[[Parsable], None]] = None @@ -79,7 +79,7 @@ def write_uuid_value(self, key: Optional[str], value: Optional[UUID]) -> None: """Writes the specified uuid value to the stream with an optional given key. Args: key (Optional[str]): The key to be used for the written value. May be null. - value (Optional[UUId]): The uuid value to be written. + value (Optional[UUID]): The uuid value to be written. """ if isinstance(value, UUID): if key: @@ -106,9 +106,9 @@ def write_datetime_value(self, key: Optional[str], value: Optional[datetime]) -> """ if isinstance(value, datetime): if key: - self.writer[key] = str(value.isoformat()) + self.writer[key] = value.isoformat() else: - self.value = str(value.isoformat()) + self.value = value.isoformat() elif isinstance(value, str): try: pendulum.parse(value) @@ -238,7 +238,7 @@ def write_collection_of_enum_values( """Writes the specified collection of enum values to the stream with an optional given key. Args: key (Optional[str]): The key to be used for the written value. May be null. - values Optional[List[Enum]): The enum values to be written. + values (Optional[List[Enum]]): The enum values to be written. """ if isinstance(values, list): result = [] @@ -359,7 +359,7 @@ def __write_dict_value(self, key: Optional[str], value: Dict[str, Any]) -> None: def write_additional_data_value(self, value: Dict[str, Any]) -> None: """Writes the specified additional data to the stream. Args: - value (Dict[str, Any]): he additional data to be written. + value (Dict[str, Any]): The additional data to be written. """ if isinstance(value, dict): for key, val in value.items(): @@ -389,17 +389,17 @@ def get_serialized_content(self) -> bytes: def on_before_object_serialization(self) -> Optional[Callable[[Parsable], None]]: """Gets the callback called before the object gets serialized. Returns: - Optional[Callable[[Parsable], None]]:the callback called before the object + Optional[Callable[[Parsable], None]]: The callback called before the object gets serialized. """ return self._on_before_object_serialization @on_before_object_serialization.setter def on_before_object_serialization(self, value: Optional[Callable[[Parsable], None]]) -> None: - """Sets the callback called before the objects gets serialized. + """Sets the callback called before the objects get serialized. Args: - value (Optional[Callable[[Parsable], None]]): the callback called before the objects - gets serialized. + value (Optional[Callable[[Parsable], None]]): The callback called before the objects + get serialized. """ self._on_before_object_serialization = value @@ -407,17 +407,17 @@ def on_before_object_serialization(self, value: Optional[Callable[[Parsable], No def on_after_object_serialization(self) -> Optional[Callable[[Parsable], None]]: """Gets the callback called after the object gets serialized. Returns: - Optional[Optional[Callable[[Parsable], None]]]: the callback called after the object + Optional[Callable[[Parsable], None]]: The callback called after the object gets serialized. """ return self._on_after_object_serialization @on_after_object_serialization.setter def on_after_object_serialization(self, value: Optional[Callable[[Parsable], None]]) -> None: - """Sets the callback called after the objects gets serialized. + """Sets the callback called after the objects get serialized. Args: - value (Optional[Callable[[Parsable], None]]): the callback called after the objects - gets serialized. + value (Optional[Callable[[Parsable], None]]): The callback called after the objects + get serialized. """ self._on_after_object_serialization = value @@ -427,7 +427,7 @@ def on_start_object_serialization( ) -> Optional[Callable[[Parsable, SerializationWriter], None]]: """Gets the callback called right after the serialization process starts. Returns: - Optional[Callable[[Parsable, SerializationWriter], None]]: the callback called + Optional[Callable[[Parsable, SerializationWriter], None]]: The callback called right after the serialization process starts. """ return self._on_start_object_serialization @@ -438,7 +438,7 @@ def on_start_object_serialization( ) -> None: """Sets the callback called right after the serialization process starts. Args: - value (Optional[Callable[[Parsable, SerializationWriter], None]]): the callback + value (Optional[Callable[[Parsable, SerializationWriter], None]]): The callback called right after the serialization process starts. """ self._on_start_object_serialization = value @@ -471,7 +471,10 @@ def write_any_value(self, key: Optional[str], value: Any) -> Any: self.write_collection_of_object_values(key, value) elif all(isinstance(x, Enum) for x in value): self.write_collection_of_enum_values(key, value) - elif all(any(isinstance(x, primitive_type) for primitive_type in PRIMITIVE_TYPES) for x in value): + elif all( + any(isinstance(x, primitive_type) for primitive_type in PRIMITIVE_TYPES) + for x in value + ): self.write_collection_of_primitive_values(key, value) elif all(isinstance(x, dict) for x in value): self.__write_collection_of_dict_values(key, value) diff --git a/tests/unit/test_json_serialization_writer.py b/tests/unit/test_json_serialization_writer.py index 36261b9..202a9c1 100644 --- a/tests/unit/test_json_serialization_writer.py +++ b/tests/unit/test_json_serialization_writer.py @@ -2,7 +2,6 @@ from uuid import UUID import pytest - import pendulum from kiota_serialization_json.json_serialization_writer import JsonSerializationWriter @@ -72,20 +71,23 @@ def test_write_uuid_value(): content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"id": "8f841f30-e6e3-439a-a812-ebd369559c36"}' - + + def test_write_uuid_value_with_valid_string(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_uuid_value("id", "8f841f30-e6e3-439a-a812-ebd369559c36") content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"id": "8f841f30-e6e3-439a-a812-ebd369559c36"}' - + + def test_write_uuid_value_with_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_uuid_value("id", "invalid-uuid-string") assert "Invalid UUID string value found for property id" in str(excinfo.value) - + + def test_write_datetime_value(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_datetime_value( @@ -94,7 +96,8 @@ def test_write_datetime_value(): content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"updatedAt": "2022-01-27T12:59:45.596117+00:00"}' - + + def test_write_datetime_value_valid_string(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_datetime_value( @@ -103,8 +106,9 @@ def test_write_datetime_value_valid_string(): content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"updatedAt": "2022-01-27T12:59:45.596117+00:00"}' - -def test_write_datetime_value_valid_string(): + + +def test_write_datetime_value_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_datetime_value( @@ -112,16 +116,21 @@ def test_write_datetime_value_valid_string(): ) assert "Invalid datetime string value found for property updatedAt" in str(excinfo.value) + def test_write_timedelta_value(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_timedelta_value( "diff", - (pendulum.parse('2022-01-27T12:59:45.596117') - pendulum.parse('2022-01-27T10:59:45.596117')).as_timedelta() + ( + pendulum.parse('2022-01-27T12:59:45.596117') - + pendulum.parse('2022-01-27T10:59:45.596117') + ).as_timedelta() ) content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"diff": "2:00:00"}' - + + def test_write_timedelta_value_valid_string(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_timedelta_value( @@ -131,7 +140,8 @@ def test_write_timedelta_value_valid_string(): content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"diff": "2:00:00"}' - + + def test_write_timedelta_value_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() @@ -140,7 +150,7 @@ def test_write_timedelta_value_invalid_string(): "invalid-timedelta-string" ) assert "Invalid timedelta string value found for property diff" in str(excinfo.value) - + def test_write_date_value(): json_serialization_writer = JsonSerializationWriter() @@ -149,19 +159,22 @@ def test_write_date_value(): content_string = content.decode('utf-8') assert content_string == '{"birthday": "2000-09-04"}' + def test_write_date_value_valid_string(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_date_value("birthday", "2000-09-04") content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"birthday": "2000-09-04"}' - + + def test_write_date_value_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_date_value("birthday", "invalid-date-string") assert "Invalid date string value found for property birthday" in str(excinfo.value) + def test_write_time_value(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_time_value( @@ -172,6 +185,7 @@ def test_write_time_value(): content_string = content.decode('utf-8') assert content_string == '{"time": "12:59:45.596117"}' + def test_write_time_value_valid_string(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_time_value( @@ -181,7 +195,8 @@ def test_write_time_value_valid_string(): content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"time": "12:59:45.596117"}' - + + def test_write_time_value_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() @@ -191,6 +206,7 @@ def test_write_time_value_invalid_string(): ) assert "Invalid time string value found for property time" in str(excinfo.value) + def test_write_collection_of_primitive_values(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_collection_of_primitive_values( @@ -206,9 +222,14 @@ def test_write_collection_of_object_values(user_1, user_2): json_serialization_writer.write_collection_of_object_values("users", [user_1, user_2]) content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') - assert content_string == '{"users": [{"id": "8f841f30-e6e3-439a-a812-ebd369559c36", '\ - '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, '\ - '{"display_name": "John Doe", "age": 32}]}' + expected = ( + '{"users": [' + '{"id": "8f841f30-e6e3-439a-a812-ebd369559c36", ' + '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, ' + '{"display_name": "John Doe", "age": 32}' + ']}' + ) + assert content_string == expected def test_write_collection_of_enum_values(): @@ -226,8 +247,13 @@ def test_write_object_value(user_1): json_serialization_writer.write_object_value("user1", user_1) content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') - assert content_string == '{"user1": {"id": "8f841f30-e6e3-439a-a812-ebd369559c36", '\ - '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}}' + expected = ( + '{"user1": {' + '"id": "8f841f30-e6e3-439a-a812-ebd369559c36", ' + '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true' + '}}' + ) + assert content_string == expected def test_write_enum_value(): @@ -265,14 +291,18 @@ def test_write_additional_data_value(user_1, user_2): ) content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') - assert content_string == '{"@odata.context": '\ - '"https://graph.microsoft.com/v1.0/$metadata#users/$entity", '\ - '"businessPhones": ["+1 205 555 0108"], '\ - '"manager": {"id": "8f841f30-e6e3-439a-a812-ebd369559c36", '\ - '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, '\ - '"approvers": [{"id": "8f841f30-e6e3-439a-a812-ebd369559c36", '\ - '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, '\ - '{"display_name": "John Doe", "age": 32}], '\ - '"created_at": "2022-01-27", '\ - '"updated_at": "2024-09-24T00:00:00", '\ - '"data": {"groups": [{"friends": [{"display_name": "John Doe", "age": 32}]}]}}' + expected = ( + '{"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", ' + '"businessPhones": ["+1 205 555 0108"], ' + '"manager": {"id": "8f841f30-e6e3-439a-a812-ebd369559c36", ' + '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, ' + '"approvers": [' + '{"id": "8f841f30-e6e3-439a-a812-ebd369559c36", ' + '"updated_at": "2022-01-27T12:59:45.596117+00:00", "is_active": true}, ' + '{"display_name": "John Doe", "age": 32}' + '], ' + '"created_at": "2022-01-27", ' + '"updated_at": "2024-09-24T00:00:00", ' + '"data": {"groups": [{"friends": [{"display_name": "John Doe", "age": 32}]}]}}' + ) + assert content_string == expected From 4cdba4dab613338da0aba7e253fb7384f393de1f Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 3 Oct 2024 11:55:11 -0400 Subject: [PATCH 23/27] chore: linting --- .../json_serialization_writer.py | 14 ++++----- tests/unit/test_json_parse_node_factory.py | 2 +- tests/unit/test_json_serialization_writer.py | 31 +++++-------------- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/kiota_serialization_json/json_serialization_writer.py b/kiota_serialization_json/json_serialization_writer.py index a585822..efeb4f7 100644 --- a/kiota_serialization_json/json_serialization_writer.py +++ b/kiota_serialization_json/json_serialization_writer.py @@ -191,7 +191,7 @@ def write_time_value(self, key: Optional[str], value: Optional[time]) -> None: raise ValueError("Invalid time string value found") def write_collection_of_primitive_values( - self, key: Optional[str], values: Optional[List[T]] + self, key: Optional[str], values: Optional[List[T]] ) -> None: """Writes the specified collection of primitive values to the stream with an optional given key. @@ -212,7 +212,7 @@ def write_collection_of_primitive_values( self.value = result def write_collection_of_object_values( - self, key: Optional[str], values: Optional[List[U]] + self, key: Optional[str], values: Optional[List[U]] ) -> None: """Writes the specified collection of model objects to the stream with an optional given key. @@ -233,7 +233,7 @@ def write_collection_of_object_values( self.value = obj_list def write_collection_of_enum_values( - self, key: Optional[str], values: Optional[List[Enum]] + self, key: Optional[str], values: Optional[List[Enum]] ) -> None: """Writes the specified collection of enum values to the stream with an optional given key. Args: @@ -253,7 +253,7 @@ def write_collection_of_enum_values( self.value = result def __write_collection_of_dict_values( - self, key: Optional[str], values: Optional[List[Dict[str, Any]]] + self, key: Optional[str], values: Optional[List[Dict[str, Any]]] ) -> None: """Writes the specified collection of dictionary values to the stream with an optional given key. @@ -290,7 +290,7 @@ def write_bytes_value(self, key: Optional[str], value: bytes) -> None: self.value = base64_string def write_object_value( - self, key: Optional[str], value: Optional[U], *additional_values_to_merge: U + self, key: Optional[str], value: Optional[U], *additional_values_to_merge: U ) -> None: """Writes the specified model object to the stream with an optional given key. Args: @@ -423,7 +423,7 @@ def on_after_object_serialization(self, value: Optional[Callable[[Parsable], Non @property def on_start_object_serialization( - self + self ) -> Optional[Callable[[Parsable, SerializationWriter], None]]: """Gets the callback called right after the serialization process starts. Returns: @@ -434,7 +434,7 @@ def on_start_object_serialization( @on_start_object_serialization.setter def on_start_object_serialization( - self, value: Optional[Callable[[Parsable, SerializationWriter], None]] + self, value: Optional[Callable[[Parsable, SerializationWriter], None]] ) -> None: """Sets the callback called right after the serialization process starts. Args: diff --git a/tests/unit/test_json_parse_node_factory.py b/tests/unit/test_json_parse_node_factory.py index 174875a..2975f37 100644 --- a/tests/unit/test_json_parse_node_factory.py +++ b/tests/unit/test_json_parse_node_factory.py @@ -18,7 +18,7 @@ def test_get_root_parse_node(sample_json_string): assert isinstance(root, JsonParseNode) assert root._json_node == json.loads(sample_json_string) - + def test_get_root_parse_node_no_content_type(sample_json_string): with pytest.raises(Exception) as e_info: factory = JsonParseNodeFactory() diff --git a/tests/unit/test_json_serialization_writer.py b/tests/unit/test_json_serialization_writer.py index 202a9c1..adf2e14 100644 --- a/tests/unit/test_json_serialization_writer.py +++ b/tests/unit/test_json_serialization_writer.py @@ -100,9 +100,7 @@ def test_write_datetime_value(): def test_write_datetime_value_valid_string(): json_serialization_writer = JsonSerializationWriter() - json_serialization_writer.write_datetime_value( - "updatedAt", "2022-01-27T12:59:45.596117" - ) + json_serialization_writer.write_datetime_value("updatedAt", "2022-01-27T12:59:45.596117") content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"updatedAt": "2022-01-27T12:59:45.596117+00:00"}' @@ -111,17 +109,14 @@ def test_write_datetime_value_valid_string(): def test_write_datetime_value_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() - json_serialization_writer.write_datetime_value( - "updatedAt", "invalid-datetime-string" - ) + json_serialization_writer.write_datetime_value("updatedAt", "invalid-datetime-string") assert "Invalid datetime string value found for property updatedAt" in str(excinfo.value) def test_write_timedelta_value(): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_timedelta_value( - "diff", - ( + "diff", ( pendulum.parse('2022-01-27T12:59:45.596117') - pendulum.parse('2022-01-27T10:59:45.596117') ).as_timedelta() @@ -133,10 +128,7 @@ def test_write_timedelta_value(): def test_write_timedelta_value_valid_string(): json_serialization_writer = JsonSerializationWriter() - json_serialization_writer.write_timedelta_value( - "diff", - "2:00:00" - ) + json_serialization_writer.write_timedelta_value("diff", "2:00:00") content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"diff": "2:00:00"}' @@ -145,10 +137,7 @@ def test_write_timedelta_value_valid_string(): def test_write_timedelta_value_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() - json_serialization_writer.write_timedelta_value( - "diff", - "invalid-timedelta-string" - ) + json_serialization_writer.write_timedelta_value("diff", "invalid-timedelta-string") assert "Invalid timedelta string value found for property diff" in str(excinfo.value) @@ -188,10 +177,7 @@ def test_write_time_value(): def test_write_time_value_valid_string(): json_serialization_writer = JsonSerializationWriter() - json_serialization_writer.write_time_value( - "time", - "12:59:45.596117" - ) + json_serialization_writer.write_time_value("time", "12:59:45.596117") content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') assert content_string == '{"time": "12:59:45.596117"}' @@ -200,10 +186,7 @@ def test_write_time_value_valid_string(): def test_write_time_value_invalid_string(): with pytest.raises(ValueError) as excinfo: json_serialization_writer = JsonSerializationWriter() - json_serialization_writer.write_time_value( - "time", - "invalid-time-string" - ) + json_serialization_writer.write_time_value("time", "invalid-time-string") assert "Invalid time string value found for property time" in str(excinfo.value) From 08d26bbe75d8829ad628dd6b981eb5bcf1df6a60 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 3 Oct 2024 11:59:34 -0400 Subject: [PATCH 24/27] chore: more linting Signed-off-by: Vincent Biret --- kiota_serialization_json/json_serialization_writer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kiota_serialization_json/json_serialization_writer.py b/kiota_serialization_json/json_serialization_writer.py index efeb4f7..534e937 100644 --- a/kiota_serialization_json/json_serialization_writer.py +++ b/kiota_serialization_json/json_serialization_writer.py @@ -480,7 +480,8 @@ def write_any_value(self, key: Optional[str], value: Any) -> Any: self.__write_collection_of_dict_values(key, value) else: raise TypeError( - f"Encountered an unknown collection type during serialization {type(value)} with key {key}" + f"Encountered an unknown collection type during serialization {type(value)} \ + with key {key}" ) elif isinstance(value, dict): self.__write_dict_value(key, value) From 61c3e3964091a800fec4cefab5630cfe88ed6b17 Mon Sep 17 00:00:00 2001 From: eranavrahami Date: Thu, 3 Oct 2024 19:18:04 +0300 Subject: [PATCH 25/27] fix test_write_datetime_value_valid_string --- tests/unit/test_json_serialization_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_json_serialization_writer.py b/tests/unit/test_json_serialization_writer.py index adf2e14..462b92b 100644 --- a/tests/unit/test_json_serialization_writer.py +++ b/tests/unit/test_json_serialization_writer.py @@ -103,7 +103,7 @@ def test_write_datetime_value_valid_string(): json_serialization_writer.write_datetime_value("updatedAt", "2022-01-27T12:59:45.596117") content = json_serialization_writer.get_serialized_content() content_string = content.decode('utf-8') - assert content_string == '{"updatedAt": "2022-01-27T12:59:45.596117+00:00"}' + assert content_string == '{"updatedAt": "2022-01-27T12:59:45.596117"}' def test_write_datetime_value_invalid_string(): From 5207a8fcb7775a3b31f006c2575d99c61c9c4499 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 06:08:53 +0000 Subject: [PATCH 26/27] chore(deps-dev): bump charset-normalizer from 3.3.2 to 3.4.0 Bumps [charset-normalizer](https://github.com/Ousret/charset_normalizer) from 3.3.2 to 3.4.0. - [Release notes](https://github.com/Ousret/charset_normalizer/releases) - [Changelog](https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md) - [Commits](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) --- updated-dependencies: - dependency-name: charset-normalizer dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index e6a2d91..dd01a37 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,7 +4,7 @@ astroid==3.2.4 certifi==2024.8.30 -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 coverage[toml]==7.6.1 From fa83158e9290f1456df7fe77612924703efd2c89 Mon Sep 17 00:00:00 2001 From: Andrew Omondi Date: Mon, 14 Oct 2024 18:11:09 +0300 Subject: [PATCH 27/27] chore: update readme for archive --- README.md | 39 +-------------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/README.md b/README.md index 46c8d17..5b81f69 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,3 @@ # Microsoft Kiota Serialization library for JSON -[![PyPI version](https://badge.fury.io/py/microsoft-kiota-serialization-json.svg)](https://badge.fury.io/py/microsoft-kiota-serialization-json) -[![CI Actions Status](https://github.com/microsoft/kiota-serialization-json-python/actions/workflows/build_publish.yml/badge.svg?branch=main)](https://github.com/microsoft/kiota-serialization-json-python/actions) -[![Downloads](https://pepy.tech/badge/microsoft-kiota-serialization-json)](https://pepy.tech/project/microsoft-kiota-serialization-json) -The Microsoft Kiota Serialization Library for JSON is a python implementation to serialize/deserialize JSON. - -A [Kiota](https://github.com/microsoft/kiota) generated project will need a reference to a json serialization package to handle json payloads from an API endpoint. - -Read more about Kiota [here](https://github.com/microsoft/kiota/blob/main/README.md). - -## Using the Microsoft Kiota Serialization JSON library - -In order to use this library, install the package by running: - -```cmd -pip install microsoft-kiota-serialization-json -``` - -## Contributing - -This project welcomes contributions and suggestions. Most contributions require you to agree to a -Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. - -When you submit a pull request, a CLA bot will automatically determine whether you need to provide -a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions -provided by the bot. You will only need to do this once across all repos using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or -contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - -## Trademarks - -This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft -trademarks or logos is subject to and must follow -[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). -Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. -Any use of third-party trademarks or logos are subject to those third-party's policies. +This repository has been archived and source migrated. You can contribute and file issues in the [Kiota Python](https://github.com/microsoft/kiota-python) repository.