Skip to content

Commit

Permalink
Fixed bugs and added first last to time aggregation
Browse files Browse the repository at this point in the history
  • Loading branch information
oddaspa committed Sep 16, 2024
1 parent 062e367 commit 54ddbe7
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Changes are grouped as follows
### Added

- Added group parameter in experimental client.
- Added `first` and `last` as possible time aggregations.

## Fixed

Expand Down
2 changes: 0 additions & 2 deletions src/pyclarify/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1041,7 +1041,6 @@ def evaluate(
firstDayOfWeek: Optional[IntWeekDays] = None,
origin: Optional[Union[str, datetime]] = None,
items: List[Union[Dict, ItemAggregation]] = [],
groups: List[Union[Dict, GroupAggregation]] = [],
calculations: List[Union[Dict, Calculation]] = [],
series: List[str] = [],
gte: Union[datetime, str] = None,
Expand Down Expand Up @@ -1213,7 +1212,6 @@ def evaluate(
)
params = {
"items": items,
"groups": groups,
"calculations": calculations,
"data": data_query,
"include": include,
Expand Down
52 changes: 47 additions & 5 deletions src/pyclarify/experimental.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Union
from pydantic.json import timedelta_isoformat
import pyclarify
from pyclarify.__utils__.time import time_to_string
from pyclarify.fields.constraints import ApiMethod, IntWeekDays, ResourceID, IntegrationID, TimeZone
from pyclarify.fields.error import Error
from pyclarify.query.filter import DataFilter, Filter
from pyclarify.query.query import DataQuery, ResourceQuery
from pyclarify.views.dataframe import DataFrameParams, InsertParams
from pyclarify.views.generics import Request, Response
from pyclarify.views.evaluate import Calculation, GroupAggregation, ItemAggregation
from pyclarify.views.evaluate import Calculation, ExperimentalEvaluateParams, GroupAggregation, ItemAggregation
from pyclarify.views.items import PublishSignalsParams, SelectItemsParams
from pyclarify.views.signals import SaveSignalsParams, SelectSignalsParams
from .client import Client
from pydantic import validate_arguments
from pydantic import BaseModel, ConfigDict, model_validator, validate_arguments
from enum import Enum


Expand All @@ -24,8 +29,45 @@ class ExperimentalApiMethod(str, Enum):
disconnect_signals = "admin.disconnectSignals"


class ExperimentalRequest(Request):
method: ExperimentalApiMethod
class JSONRPCRequest(BaseModel):
jsonrpc: str = "2.0"
method: ExperimentalApiMethod = ApiMethod.select_items
id: Union[str,int] = "1"
params: Union[
dict,
InsertParams,
SaveSignalsParams,
SelectItemsParams,
SelectSignalsParams,
PublishSignalsParams,
DataFrameParams,
ExperimentalEvaluateParams] = {}
# TODO[pydantic]: The following keys are deprecated: `json_encoders`.
# Check https://docs.pydantic.dev/dev-v2/migration/#changes-to-config for more information.
model_config = ConfigDict(json_encoders={timedelta: timedelta_isoformat, datetime: time_to_string})


class ExperimentalRequest(JSONRPCRequest):
method: ApiMethod

@model_validator(mode='after')
@classmethod
def use_correct_params_based_on_method(cls, values):
if values.method == ApiMethod.insert:
values.params = InsertParams(**values.params)
elif values.method == ApiMethod.save_signals:
values.params = SaveSignalsParams(**values.params)
elif values.method == ApiMethod.select_items:
values.params = SelectItemsParams(**values.params)
elif values.method == ApiMethod.select_signals:
values.params = SelectSignalsParams(**values.params)
elif values.method == ApiMethod.publish_signals:
values.params = PublishSignalsParams(**values.params)
elif values.method == ApiMethod.data_frame:
values.params = DataFrameParams(**values.params)
elif values.method == ApiMethod.evaluate:
values.params = ExperimentalEvaluateParams(**values.params)
return values


class ExperimentalResponse(Response):
Expand Down Expand Up @@ -175,7 +217,7 @@ def evaluate(
params['groups'] = groups


request_data = Request(method=ApiMethod.evaluate, params=params)
request_data = ExperimentalRequest(method=ApiMethod.evaluate, params=params)
self.update_headers(
{"Authorization": f"Bearer {self.authentication.get_token()}"}
)
Expand Down
2 changes: 2 additions & 0 deletions src/pyclarify/fields/constraints.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ class TimeAggregationMethod(Enum):
state_seconds = "state-seconds"
state_percent = "state-percent"
state_rate = "state-rate"
first = "first"
last = "last"
# deprecated names for the same three methods as above
state_histogram_seconds = "state-seconds"
state_histogram_percent = "state-percent"
Expand Down
12 changes: 12 additions & 0 deletions src/pyclarify/views/evaluate.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,18 @@ class EvaluateParams(BaseModel):
:meta private:
"""

items: Optional[List[ItemAggregation]] = []
calculations: List[Calculation]
data: DataQuery
include: List
format: Optional[SelectionFormat] = SelectionFormat(dataAsArray=False)


class ExperimentalEvaluateParams(BaseModel):
"""
:meta private:
"""

items: Optional[List[ItemAggregation]] = []
groups: Optional[List[GroupAggregation]] = []
calculations: List[Calculation]
Expand Down

0 comments on commit 54ddbe7

Please sign in to comment.