55import sys
66from typing import TYPE_CHECKING , Any
77
8+ from singer_sdk import StreamSchema
9+
810from .base import (
911 OPENAPI_SCHEMA ,
1012 MeltanoCloudStream ,
11- _DataComponentSchema ,
12- _DataStoreSchema ,
13- _PipelineSchema ,
14- _WorkspaceChildSchema ,
15- _WorkspaceSchema ,
13+ DataComponentSchema ,
14+ DataStoreSchema ,
15+ PipelineSchema ,
16+ PipelineJobSchema ,
17+ WorkspaceChildSchema ,
18+ WorkspaceSchema ,
1619)
1720
1821if sys .version_info >= (3 , 12 ):
@@ -41,13 +44,14 @@ def __init__(self, *args: Any, workspace_ids: list[str], **kwargs: Any) -> None:
4144 def partitions (self ) -> list [dict ]:
4245 return self ._partitions
4346
47+
4448class WorkspacesStream (_ByWorkspaceStream ):
4549 """Fetches individual workspaces by ID."""
4650
4751 name = "workspaces"
4852 path = "/workspaces/{workspaceId}"
4953 records_jsonpath = "$"
50- schema = _WorkspaceSchema (OPENAPI_SCHEMA , key = "WorkspaceResource" )
54+ schema = WorkspaceSchema (OPENAPI_SCHEMA , key = "WorkspaceResource" )
5155
5256 @override
5357 def post_process (self , row : dict , context : Context | None = None ) -> dict | None :
@@ -62,21 +66,39 @@ class PipelinesStream(_ByWorkspaceStream):
6266 name = "pipelines"
6367 path = "/workspaces/{workspaceId}/pipelines"
6468 records_jsonpath = "$._embedded.pipelines[*]"
65- schema = _PipelineSchema (OPENAPI_SCHEMA , key = "PipelineResource" )
69+ schema = PipelineSchema (OPENAPI_SCHEMA , key = "PipelineResource" )
6670
6771 @override
6872 def post_process (self , row : dict , context : Context | None = None ) -> dict | None :
6973 row .pop ("properties" , None )
7074 return super ().post_process (row , context )
7175
76+ def get_child_context (self , record : dict , context : Context | None = None ) -> Context :
77+ """Get child context for a pipeline record."""
78+ return {
79+ "pipelineId" : record ["id" ],
80+ "workspaceId" : context ["workspaceId" ] if context else None ,
81+ }
82+
83+
84+ class PipelineJobsStream (_ByWorkspaceStream ):
85+ """Jobs stream."""
86+
87+ name = "pipeline_jobs"
88+ path = "/pipelines/{pipelineId}/jobs"
89+ records_jsonpath = "$._embedded.jobs[*]"
90+ schema = PipelineJobSchema (OPENAPI_SCHEMA , key = "JobResource" )
91+
92+ parent_stream_type = PipelinesStream
93+
7294
7395class DatasetsStream (_ByWorkspaceStream ):
7496 """Datasets stream."""
7597
7698 name = "datasets"
7799 path = "/workspaces/{workspaceId}/datasets"
78100 records_jsonpath = "$._embedded.datasets[*]"
79- schema = _WorkspaceChildSchema (OPENAPI_SCHEMA , key = "DatasetResource" )
101+ schema = WorkspaceChildSchema (OPENAPI_SCHEMA , key = "DatasetResource" )
80102
81103
82104class JobsStream (_ByWorkspaceStream ):
@@ -85,7 +107,7 @@ class JobsStream(_ByWorkspaceStream):
85107 name = "jobs"
86108 path = "/workspaces/{workspaceId}/jobs"
87109 records_jsonpath = "$._embedded.jobs[*]"
88- schema = _WorkspaceChildSchema (OPENAPI_SCHEMA , key = "JobResource" )
110+ schema = WorkspaceChildSchema (OPENAPI_SCHEMA , key = "JobResource" )
89111
90112
91113class ChannelsStream (_ByWorkspaceStream ):
@@ -94,7 +116,7 @@ class ChannelsStream(_ByWorkspaceStream):
94116 name = "channels"
95117 path = "/workspaces/{workspaceId}/channels"
96118 records_jsonpath = "$._embedded.channels[*]"
97- schema = _WorkspaceChildSchema (OPENAPI_SCHEMA , key = "ChannelResource" )
119+ schema = WorkspaceChildSchema (OPENAPI_SCHEMA , key = "ChannelResource" )
98120
99121
100122class DataStoresStream (_ByWorkspaceStream ):
@@ -103,7 +125,7 @@ class DataStoresStream(_ByWorkspaceStream):
103125 name = "datastores"
104126 path = "/workspaces/{workspaceId}/datastores"
105127 records_jsonpath = "$._embedded.datastores[*]"
106- schema = _DataStoreSchema (OPENAPI_SCHEMA , key = "DataStoreResource" )
128+ schema = DataStoreSchema (OPENAPI_SCHEMA , key = "DataStoreResource" )
107129
108130 @override
109131 def post_process (self , row : dict , context : Context | None = None ) -> dict | None :
@@ -118,7 +140,7 @@ class DataComponentsStream(_ByWorkspaceStream):
118140 name = "datacomponents"
119141 path = "/workspaces/{workspaceId}/datacomponents"
120142 records_jsonpath = "$._embedded.datacomponents[*]"
121- schema = _DataComponentSchema (OPENAPI_SCHEMA , key = "DataComponentResource" )
143+ schema = DataComponentSchema (OPENAPI_SCHEMA , key = "DataComponentResource" )
122144
123145 @override
124146 def post_process (self , row : dict , context : Context | None = None ) -> dict | None :
0 commit comments