From 2e982481cd77b9e50456ad761998ad101fb28493 Mon Sep 17 00:00:00 2001 From: Evgeniy Kirov Date: Fri, 17 Nov 2023 00:33:13 +0100 Subject: [PATCH] fix AttributeError 'dict' object has no attribute 'dict' --- HISTORY.md | 7 +++++++ pyproject.toml | 2 +- pyuploadcare/__init__.py | 2 +- pyuploadcare/api/api.py | 11 ++++++++--- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 5a381895..a3851629 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -6,6 +6,13 @@ 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). +## [4.2.1](https://github.com/uploadcare/pyuploadcare/compare/v4.2.0...v4.2.1) - 2023-11-17 + +### Fixed + +- For `AddonsAPI`: + - In version 4.2.0, passing a Python dictionary as `params` to the `execute` method would cause an `AttributeError`. Now, you can use either an `AddonExecutionParams` instance or a `dict`. + ## [4.2.0](https://github.com/uploadcare/pyuploadcare/compare/v4.1.3...v4.2.0) - 2023-11-16 Summary of this update: diff --git a/pyproject.toml b/pyproject.toml index 221d0f34..84d9dd51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pyuploadcare" -version = "4.2.0" +version = "4.2.1" description = "Python library for Uploadcare.com" authors = ["Uploadcare Inc "] readme = "README.md" diff --git a/pyuploadcare/__init__.py b/pyuploadcare/__init__.py index 4afbe5ab..f68382cc 100644 --- a/pyuploadcare/__init__.py +++ b/pyuploadcare/__init__.py @@ -1,5 +1,5 @@ # isort: skip_file -__version__ = "4.2.0" +__version__ = "4.2.1" from pyuploadcare.resources.file import File # noqa: F401 from pyuploadcare.resources.file_group import FileGroup # noqa: F401 diff --git a/pyuploadcare/api/api.py b/pyuploadcare/api/api.py index 9bec52ea..73f7333a 100644 --- a/pyuploadcare/api/api.py +++ b/pyuploadcare/api/api.py @@ -522,11 +522,16 @@ class AddonsAPI(API): def _get_request_data( self, file_uuid: Union[UUID, str], - params: Optional[AddonExecutionParams] = None, + params: Optional[Union[AddonExecutionParams, dict]] = None, ) -> dict: cleaned_params = {} if params: - cleaned_params = params.dict(exclude_unset=True, exclude_none=True) + if isinstance(params, AddonExecutionParams): + cleaned_params = params.dict( + exclude_unset=True, exclude_none=True + ) + else: + cleaned_params = params execution_request_data = self.request_type.parse_obj( dict(target=str(file_uuid), params=cleaned_params) ) @@ -538,7 +543,7 @@ def execute( self, file_uuid: Union[UUID, str], addon_name: Union[AddonLabels, str], - params: Optional[AddonExecutionParams] = None, + params: Optional[Union[AddonExecutionParams, dict]] = None, ) -> responses.AddonExecuteResponse: if isinstance(addon_name, AddonLabels): addon_name = addon_name.value