EAScheduler 0.2.2__tar.gz → 0.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {eascheduler-0.2.2/src/EAScheduler.egg-info → eascheduler-0.2.4}/PKG-INFO +13 -5
- {eascheduler-0.2.2 → eascheduler-0.2.4}/requirements_setup.txt +3 -3
- {eascheduler-0.2.2 → eascheduler-0.2.4/src/EAScheduler.egg-info}/PKG-INFO +13 -5
- eascheduler-0.2.4/src/EAScheduler.egg-info/requires.txt +4 -0
- eascheduler-0.2.4/src/eascheduler/__version__.py +1 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/builder/filters.py +8 -1
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/builder/helper.py +5 -3
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/jobs/base.py +4 -1
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/prod_sun.py +1 -1
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/prod_time.py +3 -1
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/schedulers/async_scheduler.py +1 -1
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/task_managers/parallel.py +1 -1
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/task_managers/sequential.py +1 -1
- eascheduler-0.2.2/src/EAScheduler.egg-info/requires.txt +0 -4
- eascheduler-0.2.2/src/eascheduler/__version__.py +0 -1
- {eascheduler-0.2.2 → eascheduler-0.2.4}/LICENSE +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/MANIFEST.in +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/setup.cfg +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/setup.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/EAScheduler.egg-info/SOURCES.txt +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/EAScheduler.egg-info/dependency_links.txt +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/EAScheduler.egg-info/top_level.txt +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/builder/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/builder/jobs.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/builder/triggers.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/builder/utils.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/const.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/default.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/errors/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/errors/errors.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/errors/handler.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/executor/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/executor/base.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/helpers/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/helpers/dst_param.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/helpers/helpers.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/helpers/time_replace.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_control/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_control/base.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_control/job_countdown.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_control/job_datetime.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_control/job_onetime.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_stores/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_stores/base.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/job_stores/memory.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/jobs/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/jobs/event_handler.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/jobs/job_countdown.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/jobs/job_datetime.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/jobs/job_onetime.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/base.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/prod_filter.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/prod_filter_holiday.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/prod_group.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/prod_interval.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/producers/prod_operation.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/py.typed +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/schedulers/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/schedulers/base.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/task_managers/__init__.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/src/eascheduler/task_managers/base.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/tests/test_const.py +0 -0
- {eascheduler-0.2.2 → eascheduler-0.2.4}/tests/test_default.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: EAScheduler
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Easy async scheduling with a nice interface
|
|
5
5
|
Home-page: https://github.com/spacemanspiff2007/eascheduler
|
|
6
6
|
Author: spaceman_spiff
|
|
@@ -19,16 +19,17 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
|
19
19
|
Requires-Python: >=3.10
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: whenever==0.
|
|
22
|
+
Requires-Dist: whenever==0.7.3
|
|
23
23
|
Requires-Dist: astral==3.2
|
|
24
|
-
Requires-Dist: holidays==0.
|
|
25
|
-
Requires-Dist: typing_extensions
|
|
24
|
+
Requires-Dist: holidays==0.70
|
|
25
|
+
Requires-Dist: typing_extensions
|
|
26
26
|
Dynamic: author
|
|
27
27
|
Dynamic: classifier
|
|
28
28
|
Dynamic: description
|
|
29
29
|
Dynamic: description-content-type
|
|
30
30
|
Dynamic: home-page
|
|
31
31
|
Dynamic: keywords
|
|
32
|
+
Dynamic: license-file
|
|
32
33
|
Dynamic: project-url
|
|
33
34
|
Dynamic: requires-dist
|
|
34
35
|
Dynamic: requires-python
|
|
@@ -136,6 +137,13 @@ scheduler.at(
|
|
|
136
137
|
````
|
|
137
138
|
|
|
138
139
|
## Changelog
|
|
140
|
+
#### 0.2.4 (2025-04-16)
|
|
141
|
+
- Instand for execution can be specified directly as `Instant`
|
|
142
|
+
- Updated dependencies
|
|
143
|
+
|
|
144
|
+
#### 0.2.3 (2025-03-26)
|
|
145
|
+
- Updated dependencies
|
|
146
|
+
|
|
139
147
|
#### 0.2.2 (2025-01-07)
|
|
140
148
|
- Ensured that all trigger builders are imputable and can be composed without side effects
|
|
141
149
|
- Updated dependencies
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: EAScheduler
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Easy async scheduling with a nice interface
|
|
5
5
|
Home-page: https://github.com/spacemanspiff2007/eascheduler
|
|
6
6
|
Author: spaceman_spiff
|
|
@@ -19,16 +19,17 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
|
19
19
|
Requires-Python: >=3.10
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENSE
|
|
22
|
-
Requires-Dist: whenever==0.
|
|
22
|
+
Requires-Dist: whenever==0.7.3
|
|
23
23
|
Requires-Dist: astral==3.2
|
|
24
|
-
Requires-Dist: holidays==0.
|
|
25
|
-
Requires-Dist: typing_extensions
|
|
24
|
+
Requires-Dist: holidays==0.70
|
|
25
|
+
Requires-Dist: typing_extensions
|
|
26
26
|
Dynamic: author
|
|
27
27
|
Dynamic: classifier
|
|
28
28
|
Dynamic: description
|
|
29
29
|
Dynamic: description-content-type
|
|
30
30
|
Dynamic: home-page
|
|
31
31
|
Dynamic: keywords
|
|
32
|
+
Dynamic: license-file
|
|
32
33
|
Dynamic: project-url
|
|
33
34
|
Dynamic: requires-dist
|
|
34
35
|
Dynamic: requires-python
|
|
@@ -136,6 +137,13 @@ scheduler.at(
|
|
|
136
137
|
````
|
|
137
138
|
|
|
138
139
|
## Changelog
|
|
140
|
+
#### 0.2.4 (2025-04-16)
|
|
141
|
+
- Instand for execution can be specified directly as `Instant`
|
|
142
|
+
- Updated dependencies
|
|
143
|
+
|
|
144
|
+
#### 0.2.3 (2025-03-26)
|
|
145
|
+
- Updated dependencies
|
|
146
|
+
|
|
139
147
|
#### 0.2.2 (2025-01-07)
|
|
140
148
|
- Ensured that all trigger builders are imputable and can be composed without side effects
|
|
141
149
|
- Updated dependencies
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '0.2.4'
|
|
@@ -58,8 +58,15 @@ class FilterBuilder:
|
|
|
58
58
|
@staticmethod
|
|
59
59
|
def time(lower: HINT_TIME | None = None, upper: HINT_TIME | None = None) -> FilterObject:
|
|
60
60
|
"""Restrict the trigger instant to a time range"""
|
|
61
|
+
|
|
62
|
+
if lower is None and upper is None:
|
|
63
|
+
msg = 'At least one of lower or upper must be provided'
|
|
64
|
+
raise ValueError(msg)
|
|
65
|
+
|
|
66
|
+
time_lower = get_time(lower) if lower is not None else None
|
|
67
|
+
time_upper = get_time(upper) if upper is not None else None
|
|
61
68
|
return FilterObject(
|
|
62
|
-
TimeProducerFilter(
|
|
69
|
+
TimeProducerFilter(time_lower, time_upper)
|
|
63
70
|
)
|
|
64
71
|
|
|
65
72
|
@staticmethod
|
|
@@ -16,7 +16,7 @@ from eascheduler.helpers import HINT_CLOCK_BACKWARD, HINT_CLOCK_FORWARD, TimeRep
|
|
|
16
16
|
HINT_TIME: TypeAlias = dt_time | Time | str
|
|
17
17
|
HINT_TIMEDELTA: TypeAlias = dt_timedelta | TimeDelta | int | float | str
|
|
18
18
|
HINT_POS_TIMEDELTA: TypeAlias = HINT_TIMEDELTA
|
|
19
|
-
HINT_INSTANT: TypeAlias = dt_datetime | None | str | HINT_TIME | HINT_TIMEDELTA | SystemDateTime
|
|
19
|
+
HINT_INSTANT: TypeAlias = dt_datetime | None | str | HINT_TIME | HINT_TIMEDELTA | SystemDateTime | Instant
|
|
20
20
|
HINT_NAME_OR_NR: TypeAlias = int | str | Iterable[int | str]
|
|
21
21
|
HINT_DATE: TypeAlias = dt_date | dt_datetime | str | None | Date | SystemDateTime | Instant
|
|
22
22
|
|
|
@@ -98,11 +98,13 @@ def get_instant(value: HINT_INSTANT) -> Instant:
|
|
|
98
98
|
value.second, nanosecond=value.microsecond * 1_000).instant()
|
|
99
99
|
case SystemDateTime():
|
|
100
100
|
return value.instant()
|
|
101
|
+
case Instant():
|
|
102
|
+
return value
|
|
101
103
|
|
|
102
104
|
# ------------------------------------------------------------------------------------------------------------------
|
|
103
105
|
# timedelta
|
|
104
106
|
try:
|
|
105
|
-
timedelta = get_timedelta(value)
|
|
107
|
+
timedelta = get_timedelta(value) # type: ignore[arg-type]
|
|
106
108
|
except (ValueError, TypeError):
|
|
107
109
|
pass
|
|
108
110
|
else:
|
|
@@ -111,7 +113,7 @@ def get_instant(value: HINT_INSTANT) -> Instant:
|
|
|
111
113
|
# ------------------------------------------------------------------------------------------------------------------
|
|
112
114
|
# time
|
|
113
115
|
try:
|
|
114
|
-
time = get_time(value)
|
|
116
|
+
time = get_time(value) # type: ignore[arg-type]
|
|
115
117
|
except (ValueError, TypeError):
|
|
116
118
|
pass
|
|
117
119
|
else:
|
|
@@ -116,7 +116,10 @@ class JobBase(Generic[IdType]):
|
|
|
116
116
|
self.update_next()
|
|
117
117
|
return self.status
|
|
118
118
|
|
|
119
|
-
def __lt__(self, other_job:
|
|
119
|
+
def __lt__(self, other_job: JobBase) -> bool:
|
|
120
|
+
if not isinstance(other_job, JobBase):
|
|
121
|
+
return NotImplemented
|
|
122
|
+
|
|
120
123
|
if (other := other_job.next_run) is None:
|
|
121
124
|
return True
|
|
122
125
|
if (this := self.next_run) is None:
|
|
@@ -55,7 +55,7 @@ def set_location(latitude: float | str, longitude: float | str, elevation: float
|
|
|
55
55
|
OBSERVER = Observer(latitude, longitude, elevation)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
SUN_CACHE: Final = OrderedDict()
|
|
58
|
+
SUN_CACHE: Final[OrderedDict[tuple[Hashable, ...], Instant]] = OrderedDict()
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
class SunProducer(DateTimeProducerBase):
|
|
@@ -9,7 +9,7 @@ from eascheduler.producers.base import DateTimeProducerBase, not_infinite_loop
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
if TYPE_CHECKING:
|
|
12
|
-
from whenever import Instant
|
|
12
|
+
from whenever import Instant, SystemDateTime
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class TimeProducer(DateTimeProducerBase):
|
|
@@ -27,6 +27,8 @@ class TimeProducer(DateTimeProducerBase):
|
|
|
27
27
|
@override
|
|
28
28
|
def get_next(self, dt: Instant) -> Instant: # type: ignore[return]
|
|
29
29
|
|
|
30
|
+
local_dts: tuple[SystemDateTime, ...]
|
|
31
|
+
|
|
30
32
|
date = dt.to_system_tz().date()
|
|
31
33
|
for _ in not_infinite_loop(): # noqa: RET503
|
|
32
34
|
try:
|
|
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class AsyncScheduler(SchedulerBase):
|
|
22
|
-
__slots__ = ('
|
|
22
|
+
__slots__ = ('_enabled', '_loop', 'jobs', 'timer')
|
|
23
23
|
|
|
24
24
|
def __init__(self, event_loop: asyncio.AbstractEventLoop | None = None, *, enabled: bool = True) -> None:
|
|
25
25
|
self._loop: Final = event_loop if event_loop is not None else asyncio.get_running_loop()
|
|
@@ -48,7 +48,7 @@ class ParallelTaskManager(TaskManagerBase):
|
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
class LimitingParallelTaskManager(TaskManagerBase):
|
|
51
|
-
__slots__ = ('
|
|
51
|
+
__slots__ = ('action', 'parallel', 'tasks')
|
|
52
52
|
|
|
53
53
|
def __init__(self, parallel: int, action: HINT_PARALLEL_TASK_POLICY = POLICY_SKIP) -> None:
|
|
54
54
|
"""
|
|
@@ -79,7 +79,7 @@ class SequentialTaskManager(SequentialTaskManagerBase):
|
|
|
79
79
|
|
|
80
80
|
|
|
81
81
|
class LimitingSequentialTaskManager(SequentialTaskManager):
|
|
82
|
-
__slots__ = ('
|
|
82
|
+
__slots__ = ('action', 'max_queue')
|
|
83
83
|
|
|
84
84
|
def __init__(self, max_queue: int, action: HINT_SEQUENTIAL_TASK_POLICY = POLICY_SKIP) -> None:
|
|
85
85
|
"""
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = '0.2.2'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|