summaryrefslogtreecommitdiff
path: root/src/apscheduler/structures.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/apscheduler/structures.py')
-rw-r--r--src/apscheduler/structures.py115
1 files changed, 61 insertions, 54 deletions
diff --git a/src/apscheduler/structures.py b/src/apscheduler/structures.py
index cffffc7..7f6457d 100644
--- a/src/apscheduler/structures.py
+++ b/src/apscheduler/structures.py
@@ -5,10 +5,10 @@ from functools import partial
from typing import Any, Callable, Optional
from uuid import UUID, uuid4
-import attr
+import attrs
import tenacity.stop
import tenacity.wait
-from attr.validators import instance_of
+from attrs.validators import instance_of
from . import abc
from .converters import as_enum, as_timedelta
@@ -16,16 +16,23 @@ from .enums import CoalescePolicy, JobOutcome
from .marshalling import callable_from_ref, callable_to_ref
-@attr.define(kw_only=True)
+def serialize(inst, field, value):
+ if isinstance(value, frozenset):
+ return list(value)
+
+ return value
+
+
+@attrs.define(kw_only=True)
class Task:
id: str
- func: Callable = attr.field(eq=False, order=False)
- max_running_jobs: Optional[int] = attr.field(eq=False, order=False, default=None)
- misfire_grace_time: Optional[timedelta] = attr.field(eq=False, order=False, default=None)
+ func: Callable = attrs.field(eq=False, order=False)
+ max_running_jobs: Optional[int] = attrs.field(eq=False, order=False, default=None)
+ misfire_grace_time: Optional[timedelta] = attrs.field(eq=False, order=False, default=None)
state: Any = None
def marshal(self, serializer: abc.Serializer) -> dict[str, Any]:
- marshalled = attr.asdict(self)
+ marshalled = attrs.asdict(self, value_serializer=serialize)
marshalled['func'] = callable_to_ref(self.func)
marshalled['state'] = serializer.serialize(self.state) if self.state else None
return marshalled
@@ -39,27 +46,27 @@ class Task:
return cls(**marshalled)
-@attr.define(kw_only=True)
+@attrs.define(kw_only=True)
class Schedule:
id: str
- task_id: str = attr.field(eq=False, order=False)
- trigger: abc.Trigger = attr.field(eq=False, order=False)
- args: tuple = attr.field(eq=False, order=False, converter=tuple, default=())
- kwargs: dict[str, Any] = attr.field(eq=False, order=False, converter=dict, default=())
- coalesce: CoalescePolicy = attr.field(eq=False, order=False, default=CoalescePolicy.latest,
- converter=as_enum(CoalescePolicy))
- misfire_grace_time: Optional[timedelta] = attr.field(eq=False, order=False, default=None,
- converter=as_timedelta)
- max_jitter: Optional[timedelta] = attr.field(eq=False, order=False, converter=as_timedelta,
- default=None)
- tags: frozenset[str] = attr.field(eq=False, order=False, converter=frozenset, default=())
- next_fire_time: Optional[datetime] = attr.field(eq=False, order=False, default=None)
- last_fire_time: Optional[datetime] = attr.field(eq=False, order=False, default=None)
- acquired_by: Optional[str] = attr.field(eq=False, order=False, default=None)
- acquired_until: Optional[datetime] = attr.field(eq=False, order=False, default=None)
+ task_id: str = attrs.field(eq=False, order=False)
+ trigger: abc.Trigger = attrs.field(eq=False, order=False)
+ args: tuple = attrs.field(eq=False, order=False, converter=tuple, default=())
+ kwargs: dict[str, Any] = attrs.field(eq=False, order=False, converter=dict, default=())
+ coalesce: CoalescePolicy = attrs.field(eq=False, order=False, default=CoalescePolicy.latest,
+ converter=as_enum(CoalescePolicy))
+ misfire_grace_time: Optional[timedelta] = attrs.field(eq=False, order=False, default=None,
+ converter=as_timedelta)
+ max_jitter: Optional[timedelta] = attrs.field(eq=False, order=False, converter=as_timedelta,
+ default=None)
+ tags: frozenset[str] = attrs.field(eq=False, order=False, converter=frozenset, default=())
+ next_fire_time: Optional[datetime] = attrs.field(eq=False, order=False, default=None)
+ last_fire_time: Optional[datetime] = attrs.field(eq=False, order=False, default=None)
+ acquired_by: Optional[str] = attrs.field(eq=False, order=False, default=None)
+ acquired_until: Optional[datetime] = attrs.field(eq=False, order=False, default=None)
def marshal(self, serializer: abc.Serializer) -> dict[str, Any]:
- marshalled = attr.asdict(self)
+ marshalled = attrs.asdict(self, value_serializer=serialize)
marshalled['trigger'] = serializer.serialize(self.trigger)
marshalled['args'] = serializer.serialize(self.args)
marshalled['kwargs'] = serializer.serialize(self.kwargs)
@@ -84,23 +91,23 @@ class Schedule:
return None
-@attr.define(kw_only=True)
+@attrs.define(kw_only=True)
class Job:
- id: UUID = attr.field(factory=uuid4)
- task_id: str = attr.field(eq=False, order=False)
- args: tuple = attr.field(eq=False, order=False, converter=tuple, default=())
- kwargs: dict[str, Any] = attr.field(eq=False, order=False, converter=dict, default=())
- schedule_id: Optional[str] = attr.field(eq=False, order=False, default=None)
- scheduled_fire_time: Optional[datetime] = attr.field(eq=False, order=False, default=None)
- jitter: timedelta = attr.field(eq=False, order=False, converter=as_timedelta,
- factory=timedelta)
- start_deadline: Optional[datetime] = attr.field(eq=False, order=False, default=None)
- tags: frozenset[str] = attr.field(eq=False, order=False, converter=frozenset, default=())
- created_at: datetime = attr.field(eq=False, order=False,
- factory=partial(datetime.now, timezone.utc))
- started_at: Optional[datetime] = attr.field(eq=False, order=False, default=None)
- acquired_by: Optional[str] = attr.field(eq=False, order=False, default=None)
- acquired_until: Optional[datetime] = attr.field(eq=False, order=False, default=None)
+ id: UUID = attrs.field(factory=uuid4)
+ task_id: str = attrs.field(eq=False, order=False)
+ args: tuple = attrs.field(eq=False, order=False, converter=tuple, default=())
+ kwargs: dict[str, Any] = attrs.field(eq=False, order=False, converter=dict, default=())
+ schedule_id: Optional[str] = attrs.field(eq=False, order=False, default=None)
+ scheduled_fire_time: Optional[datetime] = attrs.field(eq=False, order=False, default=None)
+ jitter: timedelta = attrs.field(eq=False, order=False, converter=as_timedelta,
+ factory=timedelta)
+ start_deadline: Optional[datetime] = attrs.field(eq=False, order=False, default=None)
+ tags: frozenset[str] = attrs.field(eq=False, order=False, converter=frozenset, default=())
+ created_at: datetime = attrs.field(eq=False, order=False,
+ factory=partial(datetime.now, timezone.utc))
+ started_at: Optional[datetime] = attrs.field(eq=False, order=False, default=None)
+ acquired_by: Optional[str] = attrs.field(eq=False, order=False, default=None)
+ acquired_until: Optional[datetime] = attrs.field(eq=False, order=False, default=None)
@property
def original_scheduled_time(self) -> Optional[datetime]:
@@ -111,7 +118,7 @@ class Job:
return self.scheduled_fire_time - self.jitter
def marshal(self, serializer: abc.Serializer) -> dict[str, Any]:
- marshalled = attr.asdict(self)
+ marshalled = attrs.asdict(self, value_serializer=serialize)
marshalled['args'] = serializer.serialize(self.args)
marshalled['kwargs'] = serializer.serialize(self.kwargs)
if not self.acquired_by:
@@ -127,7 +134,7 @@ class Job:
return cls(**marshalled)
-@attr.define(kw_only=True)
+@attrs.define(kw_only=True)
class JobInfo:
job_id: UUID
task_id: str
@@ -144,17 +151,17 @@ class JobInfo:
start_deadline=job.start_deadline, tags=job.tags)
-@attr.define(kw_only=True, frozen=True)
+@attrs.define(kw_only=True, frozen=True)
class JobResult:
job_id: UUID
- outcome: JobOutcome = attr.field(eq=False, order=False, converter=as_enum(JobOutcome))
- finished_at: datetime = attr.field(eq=False, order=False,
- factory=partial(datetime.now, timezone.utc))
- exception: Optional[BaseException] = attr.field(eq=False, order=False, default=None)
- return_value: Any = attr.field(eq=False, order=False, default=None)
+ outcome: JobOutcome = attrs.field(eq=False, order=False, converter=as_enum(JobOutcome))
+ finished_at: datetime = attrs.field(eq=False, order=False,
+ factory=partial(datetime.now, timezone.utc))
+ exception: Optional[BaseException] = attrs.field(eq=False, order=False, default=None)
+ return_value: Any = attrs.field(eq=False, order=False, default=None)
def marshal(self, serializer: abc.Serializer) -> dict[str, Any]:
- marshalled = attr.asdict(self)
+ marshalled = attrs.asdict(self, value_serializer=serialize)
if self.outcome is JobOutcome.error:
marshalled['exception'] = serializer.serialize(self.exception)
else:
@@ -177,12 +184,12 @@ class JobResult:
return cls(**marshalled)
-@attr.define(kw_only=True, frozen=True)
+@attrs.define(kw_only=True, frozen=True)
class RetrySettings:
- stop: tenacity.stop.stop_base = attr.field(validator=instance_of(tenacity.stop.stop_base),
- default=tenacity.stop_after_delay(60))
- wait: tenacity.wait.wait_base = attr.field(validator=instance_of(tenacity.wait.wait_base),
- default=tenacity.wait_exponential(min=0.5, max=20))
+ stop: tenacity.stop.stop_base = attrs.field(validator=instance_of(tenacity.stop.stop_base),
+ default=tenacity.stop_after_delay(60))
+ wait: tenacity.wait.wait_base = attrs.field(validator=instance_of(tenacity.wait.wait_base),
+ default=tenacity.wait_exponential(min=0.5, max=20))
@classmethod
def fail_immediately(cls) -> RetrySettings: