Skip to content

Commit 7c22b6d

Browse files
committed
Update state diagram to Mermaid, consolidate scheduling into refresh()
- Replace ASCII diagram with Mermaid stateDiagram - Remove separate schedule() and set_priority() methods - refresh() now handles scheduling via scheduled_time and priority params - Clarify complete() can delete or keep job based on settings
1 parent 1f56102 commit 7c22b6d

File tree

1 file changed

+45
-33
lines changed

1 file changed

+45
-33
lines changed

docs/src/design/autopopulate-2.0-spec.md

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -132,35 +132,30 @@ FilteredImage.jobs.refresh() # Refresh job queue
132132
|--------|-------------|
133133
| `pending` | Job is queued and ready to be processed |
134134
| `reserved` | Job is currently being processed by a worker |
135-
| `success` | Job completed successfully |
135+
| `success` | Job completed successfully (optional, depends on settings) |
136136
| `error` | Job failed with an error |
137137
| `ignore` | Job should be skipped (manually set, not part of automatic transitions) |
138138

139139
### Status Transitions
140140

141-
Automatic transitions during `populate()`:
142-
143-
```
144-
┌─────────┐ ┌──────────┐ ┌───────────┐ ┌───────────┐
145-
│ (none) │───▶│ pending │───▶│ reserved │───▶│ success │
146-
└─────────┘ └──────────┘ └───────────┘ └───────────┘
147-
refresh() reserve() complete()
148-
149-
│ error()
150-
151-
┌───────────┐
152-
│ error │
153-
└───────────┘
154-
155-
│ delete
156-
157-
┌───────────┐ ┌──────────┐
158-
│ (none) │───▶│ pending │
159-
└───────────┘ └──────────┘
160-
refresh()
141+
```mermaid
142+
stateDiagram-v2
143+
[*] --> pending : refresh()
144+
pending --> reserved : reserve()
145+
reserved --> [*] : complete()\n[if not keeping completed]
146+
reserved --> success : complete()\n[if keeping completed]
147+
reserved --> error : error()
148+
error --> [*] : delete()
149+
success --> [*] : delete()
150+
ignore --> [*] : delete()
161151
```
162152

163-
**Resetting jobs:** To reset a job (error or otherwise), simply delete it from the jobs table. The next `refresh()` will re-add it as `pending` if the key is still in `key_source`.
153+
**Transition methods:**
154+
- `refresh()` — Adds new jobs as `pending` (from `key_source - target - jobs`)
155+
- `reserve()` — Marks a pending job as `reserved` before calling `make()`
156+
- `complete()` — Marks reserved job as `success`, or deletes it (based on `jobs.keep_completed` setting)
157+
- `error()` — Marks reserved job as `error` with message and stack trace
158+
- `delete()` — Removes job entry, returning it to `(none)` state
164159

165160
**Manual status control:**
166161
- `ignore` is set manually via `jobs.ignore(key)` and is not part of automatic transitions
@@ -180,7 +175,13 @@ class JobsTable(Table):
180175
"""Dynamically generated based on parent table's primary key."""
181176
...
182177

183-
def refresh(self, *restrictions, stale_timeout: float = None) -> dict:
178+
def refresh(
179+
self,
180+
*restrictions,
181+
scheduled_time: datetime = None,
182+
priority: int = None,
183+
stale_timeout: float = None
184+
) -> dict:
184185
"""
185186
Refresh the jobs queue: add new jobs and remove stale ones.
186187
@@ -191,6 +192,10 @@ class JobsTable(Table):
191192
192193
Args:
193194
restrictions: Conditions to filter key_source
195+
scheduled_time: When new jobs should become available for processing.
196+
Default: now (jobs are immediately available).
197+
Use future times to schedule jobs for later processing.
198+
priority: Priority for new jobs (higher = processed first). Default: 0
194199
stale_timeout: Seconds after which pending jobs are checked for staleness.
195200
Jobs older than this are removed if their key is no longer
196201
in key_source. Default from config: jobs.stale_timeout (3600s)
@@ -342,17 +347,24 @@ MyTable.jobs.progress() # Returns detailed status breakdown
342347

343348
### Priority and Scheduling
344349

345-
```python
346-
# Set priority for specific jobs (higher = processed first)
347-
MyTable.jobs.set_priority(restriction, priority=10)
350+
Priority and scheduling are handled via `refresh()` parameters:
348351

349-
# Schedule jobs for future processing
352+
```python
350353
from datetime import datetime, timedelta
354+
355+
# Add jobs with high priority (higher = processed first)
356+
MyTable.jobs.refresh(priority=10)
357+
358+
# Schedule jobs for future processing (2 hours from now)
351359
future_time = datetime.now() + timedelta(hours=2)
352-
MyTable.jobs.schedule(restriction, scheduled_time=future_time)
360+
MyTable.jobs.refresh(scheduled_time=future_time)
361+
362+
# Combine: high-priority jobs scheduled for tonight
363+
tonight = datetime.now().replace(hour=22, minute=0, second=0)
364+
MyTable.jobs.refresh(priority=100, scheduled_time=tonight)
353365

354-
# Insert with priority during refresh
355-
MyTable.jobs.refresh(priority=5) # All new jobs get priority=5
366+
# Add jobs for specific subjects with priority
367+
MyTable.jobs.refresh(Subject & 'priority="urgent"', priority=50)
356368
```
357369

358370
## Implementation Details
@@ -513,9 +525,9 @@ print(FilteredImage.jobs.progress())
513525
### Priority-Based Processing
514526

515527
```python
516-
# Mark urgent jobs as high priority
528+
# Add urgent jobs with high priority
517529
urgent_subjects = Subject & 'priority="urgent"'
518-
FilteredImage.jobs.set_priority(urgent_subjects, priority=100)
530+
FilteredImage.jobs.refresh(urgent_subjects, priority=100)
519531

520532
# Workers will process high-priority jobs first
521533
FilteredImage.populate(reserve_jobs=True)
@@ -528,7 +540,7 @@ FilteredImage.populate(reserve_jobs=True)
528540
from datetime import datetime, timedelta
529541

530542
tonight = datetime.now().replace(hour=22, minute=0, second=0)
531-
FilteredImage.jobs.schedule('subject_id > 100', scheduled_time=tonight)
543+
FilteredImage.jobs.refresh('subject_id > 100', scheduled_time=tonight)
532544

533545
# Only jobs scheduled for now or earlier will be processed
534546
FilteredImage.populate(reserve_jobs=True)

0 commit comments

Comments
 (0)