From d14fa841da3a3a897f9bd7fa624c797dd4dd101d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 19 Jan 2022 08:19:39 -0300 Subject: [PATCH 01/10] pykson: JsonObjectMeta: Run __get_fields for each base class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #15 Signed-off-by: Patrick José Pereira --- pykson/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pykson/__init__.py b/pykson/__init__.py index 6df16e9..70b5bfe 100644 --- a/pykson/__init__.py +++ b/pykson/__init__.py @@ -623,9 +623,7 @@ def __get_fields(cls) -> List[Field]: fields_list.append(field) for base in cls.__bases__: base_type_dicts = base.__dict__ # type(self).__dict__ - for n, field in base_type_dicts.items(): - if isinstance(field, Field): - fields_list.append(field) + fields_list += JsonObjectMeta.__get_fields(base) return fields_list @staticmethod From 6cb145b37dd754dc83558f7ce5ac23eb7ec57ac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 19 Jan 2022 08:26:31 -0300 Subject: [PATCH 02/10] Add test file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- test_pykson.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 test_pykson.py diff --git a/test_pykson.py b/test_pykson.py new file mode 100644 index 0000000..2ec6ce5 --- /dev/null +++ b/test_pykson.py @@ -0,0 +1,20 @@ +import pykson + +class Class1(pykson.JsonObject): + variable_1 = pykson.IntegerField(default_value=1) + +class Class2(Class1): + variable_2 = pykson.IntegerField(default_value=2) + +class Class3(Class2): + variable_3 = pykson.IntegerField(default_value=3) + +class Class4(Class3): + variable_4 = pykson.IntegerField(default_value=4) + +def test_multiple_inheritance(): + class4 = Class4() + assert class4.variable_1 == 1 + assert class4.variable_2 == 2 + assert class4.variable_3 == 3 + assert class4.variable_4 == 4 \ No newline at end of file From b94721869eb50bde04f0256031ac95597d9225e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Wed, 19 Jan 2022 08:26:44 -0300 Subject: [PATCH 03/10] ci: Add github action with pytest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- .github/workflows/pytest.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/pytest.yml diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml new file mode 100644 index 0000000..277f51e --- /dev/null +++ b/.github/workflows/pytest.yml @@ -0,0 +1,15 @@ +name: Test + +on: [push, pull_request] + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-latest + + steps: + - name: Run pytest + uses: cclauss/GitHub-Action-for-pytest@0.5.0 \ No newline at end of file From d246115f618c3f710d7d77552077855c3352f12a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Tue, 18 Jan 2022 08:22:11 -0300 Subject: [PATCH 04/10] pykson: Add default_value for ObjectField MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- pykson/__init__.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pykson/__init__.py b/pykson/__init__.py index 70b5bfe..79a78f6 100644 --- a/pykson/__init__.py +++ b/pykson/__init__.py @@ -733,8 +733,17 @@ def __set__(self, instance, value, test: bool = False): raise TypeError(instance, self.name, self.item_type, value) super().__set__(instance, value, test) - def __init__(self, item_type: Type[T], serialized_name: Optional[str] = None, null: bool = True): - super(ObjectField, self).__init__(field_type=FieldType.LIST, serialized_name=serialized_name, null=null) + def __init__(self, + item_type: Type[T], + serialized_name: Optional[str] = None, + null: bool = True, + default_value: Optional[Any] = None): + super(ObjectField, self).__init__( + field_type=FieldType.LIST, + serialized_name=serialized_name, + null=null, + default_value=default_value) + assert default_value is None or isinstance(default_value, JsonObject) self.item_type = item_type From aae0c17dcf03fed4368aa728221a91e94da8c016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Mon, 17 Jan 2022 16:34:30 -0300 Subject: [PATCH 05/10] pykson: Defines __str__ for JsonObject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- pykson/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pykson/__init__.py b/pykson/__init__.py index 79a78f6..39ec7d5 100644 --- a/pykson/__init__.py +++ b/pykson/__init__.py @@ -723,6 +723,8 @@ def __init__(self, accept_unknown: bool = False, extra_attributes: Optional[List # Empty init will be replaced by meta class super(JsonObject, self).__init__() + def __str__(self): + return json.dumps(json.loads(Pykson().to_json(self)), indent=2, sort_keys=True) T = TypeVar('T', bound=JsonObject) From 84b2e7660c22c4c9ed4b49ba49d8f69a0c678345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Fri, 9 Sep 2022 09:46:41 -0300 Subject: [PATCH 06/10] pykson: Check if attribute is a JsonObject and load it as attribute type and not as a dict MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- pykson/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pykson/__init__.py b/pykson/__init__.py index 39ec7d5..89d2f04 100644 --- a/pykson/__init__.py +++ b/pykson/__init__.py @@ -731,6 +731,9 @@ def __str__(self): class ObjectField(Field): def __set__(self, instance, value, test: bool = False): + if isinstance(value, dict) and issubclass(self.item_type, JsonObject): + super().__set__(instance, Pykson().from_json(value, self.item_type), test) + return if value is not None and not isinstance(value, self.item_type): raise TypeError(instance, self.name, self.item_type, value) super().__set__(instance, value, test) From c4f5ba87bef69a6bc733b8201ef6c15f05f755d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Mon, 12 Sep 2022 10:01:59 -0300 Subject: [PATCH 07/10] pykson: Check if attribute is a JsonObject for ObjectListField MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- pykson/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pykson/__init__.py b/pykson/__init__.py index 89d2f04..078ef97 100644 --- a/pykson/__init__.py +++ b/pykson/__init__.py @@ -763,6 +763,9 @@ def __set__(self, instance, value, test: bool = False): value = [] for item in value: assert item is not None, "Null item passed to ObjectListField" + if not isinstance(item, self.item_type) and isinstance(item, dict) and issubclass(self.item_type, JsonObject): + super(ObjectListField, self).__set__(instance, Pykson().from_json(value, self.item_type), test) + return assert isinstance(item, self.item_type), "ObjectListField items must be of " + str( self.item_type) + ", found " + str(type(item)) super(ObjectListField, self).__set__(instance, value, test) From baf6b94314aa1ba402070994da0ff608400a33ff Mon Sep 17 00:00:00 2001 From: Willian Galvani Date: Mon, 5 Dec 2022 13:52:44 -0300 Subject: [PATCH 08/10] pykson: always output a indentend/good looking json --- pykson/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pykson/__init__.py b/pykson/__init__.py index 078ef97..f7e52e8 100644 --- a/pykson/__init__.py +++ b/pykson/__init__.py @@ -1077,7 +1077,9 @@ def _to_json(self, item: Union[T, List[T]], serialized_keys_based: bool = True) final_dict[field_key] = field_value return final_dict - def to_json(self, item: Union[T, List[T]]) -> str: + def to_json(self, item: Union[T, List[T]], indent: bool = True) -> str: + if indent: + return json.dumps(self._to_json(item), indent=2, sort_keys=True) return json.dumps(self._to_json(item)) def to_dict_or_list(self, item: Union[T, List[T]]) -> Union[Dict[str, Any], List[Dict[str, Any]]]: From 3dbdebf672e145ec12c82f0c74ba2e807b1c67e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Mon, 12 Sep 2022 10:40:07 -0300 Subject: [PATCH 09/10] setup: Update to the latest version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 862aec4..440192e 100644 --- a/setup.py +++ b/setup.py @@ -7,9 +7,9 @@ required = f.read().splitlines() setuptools.setup(name='pykson', - version='0.9.9.8.7', - author='Sina Rezaei', - author_email='sinarezaei1991@gmail.com', + version='1.0.1', + author='Sina Rezaei, Patrick J. Pereira', + author_email='sinarezaei1991@gmail.com, patrickelectric@gmail.com', long_description_content_type="text/markdown", long_description=long_description, description='Pykson: A JSON Serializer/Deserializer for Python', From fcab71c1eadd6c6b730ca21a5eecb3bf9c374507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Jos=C3=A9=20Pereira?= Date: Thu, 8 Dec 2022 13:46:04 -0300 Subject: [PATCH 10/10] setup: Update to 1.0.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick José Pereira --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 440192e..5be6d6d 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ required = f.read().splitlines() setuptools.setup(name='pykson', - version='1.0.1', + version='1.0.2', author='Sina Rezaei, Patrick J. Pereira', author_email='sinarezaei1991@gmail.com, patrickelectric@gmail.com', long_description_content_type="text/markdown",