From 397d1e3b8f02724f5d7c834592c4e07ef02ae7e2 Mon Sep 17 00:00:00 2001 From: Odd Gunnar Aspaas Date: Thu, 16 Oct 2025 15:02:38 +0200 Subject: [PATCH 1/4] update setup and generics validator --- docs/source/conf.py | 2 +- pyproject.toml | 4 ++-- setup.cfg | 15 +++++++++++---- src/pyclarify/views/generics.py | 28 ++++++++++++++-------------- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 0406afb5..5ee0bb05 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -26,7 +26,7 @@ project = "PyClarify" copyright = f"{datetime.now().year}, Clarify" -author = "Alexia Artemis Baikas, Eliezer de Souza da Silva, Odd Gunnar Aspaas" +author = "Odd Gunnar Aspaas" # The full version, including alpha/beta/rc tags release = pyclarify.__version__ diff --git a/pyproject.toml b/pyproject.toml index d59cf725..8aad0d8d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [build-system] requires = [ - "setuptools>=57", + "setuptools>=61", "wheel" ] -build-backend = "setuptools.build_meta" \ No newline at end of file +build-backend = "setuptools.build_meta" diff --git a/setup.cfg b/setup.cfg index d26e8250..af193679 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,9 +1,9 @@ [metadata] name = pyclarify version = attr: pyclarify.__version__ -author = Alexia Artemis Baikas, Eliezer de Souza da Silva, Odd Gunnar Aspaas -author_email = alexia@clarify.io, eliezer@clarify.io, odd.gunnar@clarify.io - +author = Odd Gunnar Aspaas +author_email = odd.gunnar@clarify.io +license = MIT description = Python SDK for reading and writing signals to Clarify. long_description = file: README.md long_description_content_type = text/markdown @@ -19,10 +19,17 @@ classifiers = package_dir = = src packages = find: -python_requires = >=3.8 +python_requires = >=3.10 install_requires = requests pydantic~=2.0 +include_package_data = True [options.packages.find] where = src + +[options.extras_require] +dev = + pytest + black + mypy diff --git a/src/pyclarify/views/generics.py b/src/pyclarify/views/generics.py index 62a7357e..5e87535a 100644 --- a/src/pyclarify/views/generics.py +++ b/src/pyclarify/views/generics.py @@ -18,7 +18,7 @@ from pydantic.json import timedelta_isoformat from pyclarify.__utils__.time import time_to_string from pyclarify.__utils__.exceptions import TypeError -from typing import List, Dict, Union, Optional +from typing import List, Dict, Union, Optional, Self from pyclarify.fields.constraints import ApiMethod, IntegrationID from pyclarify.fields.error import Error from pyclarify.fields.resource import SelectionMeta @@ -156,37 +156,37 @@ class Response(GenericResponse): method: Optional[ApiMethod] = None @model_validator(mode='after') - def use_correct_response_based_on_method(cls, values): + def use_correct_response_based_on_method(self) -> Self: #TODO: Not happy with this resolution flow - result = values.result - method = values.method - error = values.error + result = self.result + method = self.method + error = self.error if result: if method == ApiMethod.insert: if not isinstance(result, InsertResponse): - values.result = InsertResponse(**result.model_dump()) + self.result = InsertResponse(**result.model_dump()) elif method == ApiMethod.save_signals: if not isinstance(result, SaveSignalsResponse): - values.result = SaveSignalsResponse(**result.model_dump()) + self.result = SaveSignalsResponse(**result.model_dump()) elif method == ApiMethod.data_frame or method == ApiMethod.evaluate: if not isinstance(result, DataSelection): - values.result = DataSelection(**result.model_dump()) + self.result = DataSelection(**result.model_dump()) elif method == ApiMethod.select_items: if not isinstance(result, ItemSelection): - values.result = ItemSelection(**result.model_dump()) + self.result = ItemSelection(**result.model_dump()) elif method == ApiMethod.select_signals: if not isinstance(result, SignalSelection): - values.result = SignalSelection(**result.model_dump()) + self.result = SignalSelection(**result.model_dump()) elif method == ApiMethod.publish_signals: if not isinstance(result, PublishSignalsResponse): - values.result = PublishSignalsResponse(**result.model_dump()) + self.result = PublishSignalsResponse(**result.model_dump()) else: # If has no method signature, assume its a valid object type - return values + return self elif error: pass #TODO: Possible error state - values.method = None # no need anymore for declaring method - return values + self.method = None # no need anymore for declaring method + return self def __add__(self, other): try: From fdf17af90ce4399c46e45b75439cd0d8ff90e68d Mon Sep 17 00:00:00 2001 From: Odd Gunnar Aspaas Date: Thu, 16 Oct 2025 15:03:26 +0200 Subject: [PATCH 2/4] bump version --- src/pyclarify/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyclarify/__init__.py b/src/pyclarify/__init__.py index d0ae4eff..be4b19e1 100644 --- a/src/pyclarify/__init__.py +++ b/src/pyclarify/__init__.py @@ -25,5 +25,5 @@ ) import pyclarify.query -__version__ = "0.6.7" +__version__ = "0.6.8" __API_version__ = "1.1" From a99c423bc4f3bc0c010c17a787ed23bbb5259838 Mon Sep 17 00:00:00 2001 From: Odd Gunnar Aspaas Date: Thu, 16 Oct 2025 15:08:10 +0200 Subject: [PATCH 3/4] remove deprecated python versions --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index caad112f..1af55cd5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v2 From 5b6a0fbf19c8935895041a337ccc39f0660f20fd Mon Sep 17 00:00:00 2001 From: Odd Gunnar Aspaas Date: Thu, 16 Oct 2025 15:14:57 +0200 Subject: [PATCH 4/4] backwards compatible typing --- src/pyclarify/views/generics.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/pyclarify/views/generics.py b/src/pyclarify/views/generics.py index 5e87535a..58ce6932 100644 --- a/src/pyclarify/views/generics.py +++ b/src/pyclarify/views/generics.py @@ -14,30 +14,37 @@ from datetime import datetime, timedelta -from pydantic import ConfigDict, BaseModel, validate_arguments, model_validator +from pydantic import ConfigDict, BaseModel, model_validator from pydantic.json import timedelta_isoformat +from typing import List, Union, Optional + from pyclarify.__utils__.time import time_to_string from pyclarify.__utils__.exceptions import TypeError -from typing import List, Dict, Union, Optional, Self from pyclarify.fields.constraints import ApiMethod, IntegrationID from pyclarify.fields.error import Error from pyclarify.fields.resource import SelectionMeta from pyclarify.views.evaluate import EvaluateParams -from .dataframe import InsertParams, InsertResponse, DataFrameParams -from .dataframe import DataFrame -from .items import ( +from pyclarify.views.dataframe import InsertParams, InsertResponse, DataFrameParams +from pyclarify.views.dataframe import DataFrame +from pyclarify.views.items import ( SelectItemsParams, PublishSignalsParams, PublishSignalsResponse, ItemSelectView, ) -from .signals import ( +from pyclarify.views.signals import ( SelectSignalsParams, SaveSignalsParams, SaveSignalsResponse, SignalSelectView, ) +try: + from typing import Self # Python 3.11+ +except ImportError: + from typing_extensions import Self # Python 3.10 and earlier + + class JSONRPCRequest(BaseModel): jsonrpc: str = "2.0"