fairchild 0.0.3__py3-none-any.whl → 0.0.4__py3-none-any.whl

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.
@@ -0,0 +1,59 @@
1
+ -- Initial Fairchild schema
2
+
3
+ CREATE TABLE IF NOT EXISTS fairchild_jobs (
4
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
5
+
6
+ -- Task identification
7
+ task_name VARCHAR(255) NOT NULL,
8
+ queue VARCHAR(255) NOT NULL DEFAULT 'default',
9
+ args JSONB NOT NULL DEFAULT '{}',
10
+
11
+ -- Workflow membership
12
+ workflow_id UUID,
13
+ workflow_name VARCHAR(255),
14
+ job_key VARCHAR(255),
15
+ deps VARCHAR(255)[] DEFAULT '{}',
16
+
17
+ -- State
18
+ state VARCHAR(50) NOT NULL DEFAULT 'available',
19
+
20
+ -- Scheduling & priority
21
+ priority SMALLINT NOT NULL DEFAULT 5,
22
+ scheduled_at TIMESTAMPTZ NOT NULL DEFAULT now(),
23
+
24
+ -- Execution
25
+ attempted_at TIMESTAMPTZ,
26
+ completed_at TIMESTAMPTZ,
27
+ attempt INTEGER NOT NULL DEFAULT 0,
28
+ max_attempts INTEGER NOT NULL DEFAULT 3,
29
+
30
+ -- Results & errors
31
+ recorded JSONB,
32
+ errors JSONB DEFAULT '[]',
33
+
34
+ -- Metadata
35
+ tags VARCHAR(255)[] DEFAULT '{}',
36
+ meta JSONB DEFAULT '{}',
37
+
38
+ inserted_at TIMESTAMPTZ NOT NULL DEFAULT now(),
39
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
40
+ );
41
+
42
+ -- Index for fetching available jobs from a queue
43
+ CREATE INDEX IF NOT EXISTS idx_fairchild_jobs_fetchable
44
+ ON fairchild_jobs (queue, state, priority, scheduled_at)
45
+ WHERE state = 'available';
46
+
47
+ -- Index for workflow lookups
48
+ CREATE INDEX IF NOT EXISTS idx_fairchild_jobs_workflow
49
+ ON fairchild_jobs (workflow_id, job_key)
50
+ WHERE workflow_id IS NOT NULL;
51
+
52
+ -- Index for finding jobs by state
53
+ CREATE INDEX IF NOT EXISTS idx_fairchild_jobs_state
54
+ ON fairchild_jobs (state);
55
+
56
+ -- Index for scheduled jobs that need to become available
57
+ CREATE INDEX IF NOT EXISTS idx_fairchild_jobs_scheduled
58
+ ON fairchild_jobs (scheduled_at)
59
+ WHERE state = 'scheduled';
@@ -0,0 +1,8 @@
1
+ -- Add parent_id column for spawned tasks (parent-child job relationships)
2
+
3
+ ALTER TABLE fairchild_jobs
4
+ ADD COLUMN IF NOT EXISTS parent_id UUID REFERENCES fairchild_jobs(id);
5
+
6
+ CREATE INDEX IF NOT EXISTS idx_fairchild_jobs_parent
7
+ ON fairchild_jobs (parent_id)
8
+ WHERE parent_id IS NOT NULL;
@@ -0,0 +1,9 @@
1
+ -- Remove workflow columns (replaced by parent-child job relationships)
2
+
3
+ -- Drop the workflow index first
4
+ DROP INDEX IF EXISTS idx_fairchild_jobs_workflow;
5
+
6
+ -- Remove workflow columns
7
+ ALTER TABLE fairchild_jobs DROP COLUMN IF EXISTS workflow_id;
8
+ ALTER TABLE fairchild_jobs DROP COLUMN IF EXISTS workflow_name;
9
+ ALTER TABLE fairchild_jobs DROP COLUMN IF EXISTS job_key;
@@ -0,0 +1,16 @@
1
+ -- Workers table to track active workers
2
+ CREATE TABLE IF NOT EXISTS fairchild_workers (
3
+ id UUID PRIMARY KEY,
4
+ hostname TEXT NOT NULL,
5
+ pid INTEGER NOT NULL,
6
+ queues JSONB NOT NULL DEFAULT '{}', -- {"queue_name": num_slots, ...}
7
+ active_jobs INTEGER NOT NULL DEFAULT 0,
8
+ state TEXT NOT NULL DEFAULT 'running', -- running, paused, stopped
9
+ started_at TIMESTAMPTZ NOT NULL DEFAULT now(),
10
+ last_heartbeat_at TIMESTAMPTZ NOT NULL DEFAULT now(),
11
+ paused_at TIMESTAMPTZ,
12
+ metadata JSONB DEFAULT '{}'
13
+ );
14
+
15
+ CREATE INDEX IF NOT EXISTS idx_fairchild_workers_state ON fairchild_workers(state);
16
+ CREATE INDEX IF NOT EXISTS idx_fairchild_workers_heartbeat ON fairchild_workers(last_heartbeat_at);
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fairchild
3
- Version: 0.0.3
3
+ Version: 0.0.4
4
4
  Summary: Workflow scheduling with PostgreSQL
5
5
  Requires-Python: >=3.13
6
6
  Description-Content-Type: text/markdown
@@ -10,11 +10,15 @@ fairchild/ui.py,sha256=q7Bj60PAulMtt5KM3UvkFqpGJuKvc4P8Vv3RN5tIirs,17806
10
10
  fairchild/worker.py,sha256=cZzHLuE7CF9bTLy_59zUeZHQs_p7z2VUMJfcMZTjWLs,17045
11
11
  fairchild/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  fairchild/db/migrations.py,sha256=tL5UPqllCipYC-XcEH_4ZfaRZLtJKaPACp70ZusvEvg,2174
13
+ fairchild/db/migrations/001_initial.sql,sha256=FFObm3bIHdASd3d7lXzuAzWsmkCm3OAO2F63pw6HcMs,1711
14
+ fairchild/db/migrations/002_add_parent_id.sql,sha256=ftDT053BaMnXX42aDxTtHnRnAgNKzIaUd1Fz_sO6LyQ,295
15
+ fairchild/db/migrations/003_remove_workflows.sql,sha256=6svXO2nM7JiO-QHXfzIJCd6DeOSZ0AFQDsuQgPPv4IY,368
16
+ fairchild/db/migrations/004_add_workers.sql,sha256=SOvHykAinr_O9gDf7kllEUZ57pw-USoHUsYLCfQumMI,714
13
17
  fairchild/templates/dashboard.html,sha256=Ng0q9iXGdDSo74ltABUupzjbKhqpofC8S3Zw7wXUmLA,50041
14
18
  fairchild/templates/job.html,sha256=Pg7hd5p8dU5XJeCW9SryvDbvcErY1AMrxYm0z8hldnA,38042
15
- fairchild-0.0.3.dist-info/licenses/LICENSE,sha256=ad6qehkQLI1ax2pV6ocs7YePX06CPLBs3SThRbNC0q0,1068
16
- fairchild-0.0.3.dist-info/METADATA,sha256=LIrxS7WuzJ7RXlGgSorihZjp4Q73G15nzSPeWwY14jI,11006
17
- fairchild-0.0.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
18
- fairchild-0.0.3.dist-info/entry_points.txt,sha256=urOgjfuYex5__jBX91srCX8T5GgHvYZDPpWYkuA7z90,49
19
- fairchild-0.0.3.dist-info/top_level.txt,sha256=_2zkPnqS4i3JjLMpxRPDrBS0a04KBXZiD1NHFv7CO4U,10
20
- fairchild-0.0.3.dist-info/RECORD,,
19
+ fairchild-0.0.4.dist-info/licenses/LICENSE,sha256=ad6qehkQLI1ax2pV6ocs7YePX06CPLBs3SThRbNC0q0,1068
20
+ fairchild-0.0.4.dist-info/METADATA,sha256=RKftba_0moODAJNOAQiwVeYtC6HmXJuKGerN4VyHZDE,11006
21
+ fairchild-0.0.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
22
+ fairchild-0.0.4.dist-info/entry_points.txt,sha256=urOgjfuYex5__jBX91srCX8T5GgHvYZDPpWYkuA7z90,49
23
+ fairchild-0.0.4.dist-info/top_level.txt,sha256=_2zkPnqS4i3JjLMpxRPDrBS0a04KBXZiD1NHFv7CO4U,10
24
+ fairchild-0.0.4.dist-info/RECORD,,