Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[build-system]
requires = [
"setuptools>=57",
"setuptools>=61",
"wheel"
]
build-backend = "setuptools.build_meta"
build-backend = "setuptools.build_meta"
15 changes: 11 additions & 4 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
2 changes: 1 addition & 1 deletion src/pyclarify/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@
)
import pyclarify.query

__version__ = "0.6.7"
__version__ = "0.6.8"
__API_version__ = "1.1"
45 changes: 26 additions & 19 deletions src/pyclarify/views/generics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
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"
Expand Down Expand Up @@ -156,37 +163,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:
Expand Down