Skip to content

Commit

Permalink
Support Python 3.6 and 3.10 again by removing dataclass-property
Browse files Browse the repository at this point in the history
  • Loading branch information
amotl committed Nov 20, 2021
1 parent 1d6b765 commit 806e4d9
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 46 deletions.
59 changes: 20 additions & 39 deletions grafanimate/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,9 @@
from enum import Enum
from typing import Generator, List, Optional, Union

from dataclass_property import dataclass
from dateutil.rrule import rrule

from grafanimate.timeutil import (
RecurrenceInfo,
Timerange,
convert_input_timestamp,
get_freq_delta,
)
from grafanimate.timeutil import Timerange, convert_input_timestamp, get_freq_delta

logger = logging.getLogger(__name__)

Expand All @@ -31,48 +25,35 @@ class AnimationFrame:
timerange: Timerange


@dataclass
class AnimationSequence:
every: str
index: Optional[int] = 0
mode: Optional[SequencingMode] = SequencingMode.WINDOW
recurrence: Optional[RecurrenceInfo] = None

def __post_init__(self):
def __init__(
self,
start: Union[datetime, int, str],
stop: Union[datetime, int, str],
every: str,
mode: Optional[SequencingMode] = SequencingMode.WINDOW,
):

# Convert start/stop timestamps, resolving relative timestamps.
now = datetime.now(tz=timezone.utc)
self._start = convert_input_timestamp(self.__start, relative_to=now)
if isinstance(self.__stop, str) and self.__stop.startswith("start"):
stop = self.__stop.replace("start", "")
self._stop = convert_input_timestamp(stop, relative_to=self._start)
self.start = convert_input_timestamp(start, relative_to=now)
if isinstance(stop, str) and stop.startswith("start"):
_stop = stop.replace("start", "")
self.stop = convert_input_timestamp(_stop, relative_to=self.start)
else:
self._stop = convert_input_timestamp(self.__stop, relative_to=now)

# Sanity checks.
if self._start > self._stop:
message = "Timestamp start={} is after stop={}".format(self._start, self._stop)
raise ValueError(message)
self.stop = convert_input_timestamp(stop, relative_to=now)

# Analyze `every` parameter and converge into `RecurrenceInfo`.
# From `every` (interval designator), compute frequency, interval and delta.
self.recurrence = get_freq_delta(self.every)
self.recurrence = get_freq_delta(every)

@property
def start(self) -> datetime:
return self._start
self.mode = mode
self.index = None

@property
def stop(self) -> datetime:
return self._stop

@start.setter
def start(self, value: Union[datetime, str]):
self.__start = value

@stop.setter
def stop(self, value: Union[datetime, str]):
self.__stop = value
# Sanity checks.
if self.start > self.stop:
message = f"Timestamp start={self.start.isoformat()} is after stop={self.stop.isoformat()}"
raise ValueError(message)

def get_frames(self) -> Generator[AnimationFrame, None, None]:

Expand Down
4 changes: 3 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"tqdm>=4,<5",
"unidecode>=1,<2",
"furl>=2,<3",
"dataclass-property>=1,<2",
"dataclasses>=0.8,<1; python_version=='3.6'",
# Grafana control and animation
"where>=1,<2",
"marionette_driver>=3,<4",
Expand All @@ -38,9 +38,11 @@
classifiers=[
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"License :: OSI Approved :: GNU Affero General Public License v3",
"License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)",
"Development Status :: 4 - Beta",
Expand Down
6 changes: 0 additions & 6 deletions tests/test_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ def test_sequence_datetime():

assert seq.start == datetime(2021, 11, 14, 2, 0, 0)
assert seq.stop == datetime(2021, 11, 14, 2, 16, 36)
assert seq.every == "5min"
assert seq.mode == SequencingMode.WINDOW

assert seq.recurrence.every == "5min"
Expand All @@ -44,7 +43,6 @@ def test_sequence_isodate():

assert seq.start == datetime(2021, 11, 15, 2, 12, 5, tzinfo=tzutc())
assert seq.stop == datetime(2021, 11, 15, 2, 37, 36, tzinfo=tzutc())
assert seq.every == "3min"
assert seq.mode == SequencingMode.CUMULATIVE

assert seq.recurrence.every == "3min"
Expand Down Expand Up @@ -76,7 +74,6 @@ def test_sequence_epoch():

assert seq.start == datetime(2021, 11, 16, 19, 30, 11, tzinfo=timezone.utc)
assert seq.stop == datetime(2021, 11, 16, 19, 45, 11, tzinfo=timezone.utc)
assert seq.every == "4m5s"
assert seq.mode == SequencingMode.CUMULATIVE

assert seq.recurrence.every == "4m5s"
Expand All @@ -103,7 +100,6 @@ def test_sequence_relative_to_now():

assert seq.start == datetime(2021, 11, 19, 20, 4, 17, tzinfo=tzutc())
assert seq.stop == datetime(2021, 11, 19, 21, 4, 17, tzinfo=tzutc())
assert seq.every == "8m"

assert seq.recurrence.every == "8m"
assert seq.recurrence.frequency == MINUTELY
Expand Down Expand Up @@ -132,7 +128,6 @@ def test_sequence_relative_to_start():

assert seq.start == datetime(2021, 11, 5, 20, 34, 17, tzinfo=tzutc())
assert seq.stop == datetime(2021, 11, 12, 20, 34, 17, tzinfo=tzutc())
assert seq.every == "1d"

assert seq.recurrence.every == "1d"
assert seq.recurrence.frequency == DAILY
Expand Down Expand Up @@ -161,7 +156,6 @@ def test_sequence_relative_with_now():

assert seq.start == datetime(2021, 11, 12, 20, 34, 17, tzinfo=tzutc())
assert seq.stop == datetime(2021, 11, 19, 20, 34, 17, tzinfo=tzutc())
assert seq.every == "1d"

assert seq.recurrence.every == "1d"
assert seq.recurrence.frequency == DAILY
Expand Down

0 comments on commit 806e4d9

Please sign in to comment.