ddeutil-workflow 0.0.7__py3-none-any.whl → 0.0.8__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.
- ddeutil/workflow/__about__.py +1 -1
- ddeutil/workflow/app.py +4 -0
- ddeutil/workflow/exceptions.py +1 -4
- ddeutil/workflow/log.py +49 -0
- ddeutil/workflow/pipeline.py +327 -167
- ddeutil/workflow/stage.py +191 -97
- ddeutil/workflow/utils.py +94 -16
- {ddeutil_workflow-0.0.7.dist-info → ddeutil_workflow-0.0.8.dist-info}/METADATA +17 -92
- ddeutil_workflow-0.0.8.dist-info/RECORD +20 -0
- ddeutil_workflow-0.0.7.dist-info/RECORD +0 -20
- {ddeutil_workflow-0.0.7.dist-info → ddeutil_workflow-0.0.8.dist-info}/LICENSE +0 -0
- {ddeutil_workflow-0.0.7.dist-info → ddeutil_workflow-0.0.8.dist-info}/WHEEL +0 -0
- {ddeutil_workflow-0.0.7.dist-info → ddeutil_workflow-0.0.8.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ddeutil-workflow
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.8
|
4
4
|
Summary: Data Developer & Engineer Workflow Utility Objects
|
5
5
|
Author-email: ddeutils <korawich.anu@gmail.com>
|
6
6
|
License: MIT
|
@@ -79,13 +79,10 @@ pip install ddeutil-workflow
|
|
79
79
|
This project need `ddeutil-io` extension namespace packages. If you want to install
|
80
80
|
this package with application add-ons, you should add `app` in installation;
|
81
81
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
```shell
|
87
|
-
pip install ddeutil-workflow[api]
|
88
|
-
```
|
82
|
+
| Usecase | Install Optional |
|
83
|
+
|--------------------|---------------------------|
|
84
|
+
| Scheduler Service | `ddeutil-workflow[app]` |
|
85
|
+
| FastAPI Server | `ddeutil-workflow[api]` |
|
89
86
|
|
90
87
|
## Getting Started
|
91
88
|
|
@@ -168,11 +165,12 @@ use-case.
|
|
168
165
|
> I recommend you to use `task` stage for all actions that you want to do with
|
169
166
|
> pipeline object.
|
170
167
|
|
171
|
-
### Python & Bash
|
172
|
-
|
173
168
|
```yaml
|
174
169
|
run_py_local:
|
175
170
|
type: pipeline.Pipeline
|
171
|
+
on:
|
172
|
+
- cronjob: '* * * * *'
|
173
|
+
timezone: "Asia/Bangkok"
|
176
174
|
params:
|
177
175
|
author-run: str
|
178
176
|
run-date: datetime
|
@@ -182,12 +180,11 @@ run_py_local:
|
|
182
180
|
- name: "Printing Information"
|
183
181
|
id: define-func
|
184
182
|
run: |
|
185
|
-
x = '${{ params.
|
186
|
-
print(f'Hello {x}')
|
183
|
+
x = '${{ params.run-date | fmt("%Y%m%d") }}'
|
184
|
+
print(f'Hello at {x}')
|
187
185
|
|
188
186
|
def echo(name: str):
|
189
187
|
print(f'Hello {name}')
|
190
|
-
|
191
188
|
- name: "Run Sequence and use var from Above"
|
192
189
|
vars:
|
193
190
|
x: ${{ params.author-run }}
|
@@ -195,7 +192,6 @@ run_py_local:
|
|
195
192
|
print(f'Receive x from above with {x}')
|
196
193
|
# Change x value
|
197
194
|
x: int = 1
|
198
|
-
|
199
195
|
- name: "Call Function"
|
200
196
|
vars:
|
201
197
|
echo: ${{ stages.define-func.outputs.echo }}
|
@@ -210,93 +206,23 @@ run_py_local:
|
|
210
206
|
```
|
211
207
|
|
212
208
|
```python
|
209
|
+
from datetime import datetime
|
213
210
|
from ddeutil.workflow.pipeline import Pipeline
|
214
211
|
|
215
|
-
pipe = Pipeline.from_loader(name='run_py_local', externals={})
|
216
|
-
pipe.execute(params={
|
212
|
+
pipe: Pipeline = Pipeline.from_loader(name='run_py_local', externals={})
|
213
|
+
pipe.execute(params={
|
214
|
+
'author-run': 'Local Workflow',
|
215
|
+
'run-date': datetime(2024, 1, 1),
|
216
|
+
})
|
217
217
|
```
|
218
218
|
|
219
219
|
```shell
|
220
|
-
> Hello
|
220
|
+
> Hello at 20240101
|
221
221
|
> Receive x from above with Local Workflow
|
222
222
|
> Hello Caller
|
223
223
|
> Hello World from Shell
|
224
224
|
```
|
225
225
|
|
226
|
-
### Hook (Extract & Load)
|
227
|
-
|
228
|
-
```yaml
|
229
|
-
pipe_el_pg_to_lake:
|
230
|
-
type: pipeline.Pipeline
|
231
|
-
params:
|
232
|
-
run-date: datetime
|
233
|
-
author-email: str
|
234
|
-
jobs:
|
235
|
-
extract-load:
|
236
|
-
stages:
|
237
|
-
- name: "Extract Load from Postgres to Lake"
|
238
|
-
id: extract-load
|
239
|
-
uses: tasks/postgres-to-delta@polars
|
240
|
-
with:
|
241
|
-
source:
|
242
|
-
conn: conn_postgres_url
|
243
|
-
query: |
|
244
|
-
select * from ${{ params.name }}
|
245
|
-
where update_date = '${{ params.datetime }}'
|
246
|
-
sink:
|
247
|
-
conn: conn_az_lake
|
248
|
-
endpoint: "/${{ params.name }}"
|
249
|
-
```
|
250
|
-
|
251
|
-
Implement hook:
|
252
|
-
|
253
|
-
```python
|
254
|
-
from ddeutil.workflow.utils import tag
|
255
|
-
|
256
|
-
@tag('polars', alias='postgres-to-delta')
|
257
|
-
def postgres_to_delta(source, sink):
|
258
|
-
return {
|
259
|
-
"source": source, "sink": sink
|
260
|
-
}
|
261
|
-
```
|
262
|
-
|
263
|
-
### Hook (Transform)
|
264
|
-
|
265
|
-
```yaml
|
266
|
-
pipeline_hook_mssql_proc:
|
267
|
-
type: pipeline.Pipeline
|
268
|
-
params:
|
269
|
-
run_date: datetime
|
270
|
-
sp_name: str
|
271
|
-
source_name: str
|
272
|
-
target_name: str
|
273
|
-
jobs:
|
274
|
-
transform:
|
275
|
-
stages:
|
276
|
-
- name: "Transform Data in MS SQL Server"
|
277
|
-
id: transform
|
278
|
-
uses: tasks/mssql-proc@odbc
|
279
|
-
with:
|
280
|
-
exec: ${{ params.sp_name }}
|
281
|
-
params:
|
282
|
-
run_mode: "T"
|
283
|
-
run_date: ${{ params.run_date }}
|
284
|
-
source: ${{ params.source_name }}
|
285
|
-
target: ${{ params.target_name }}
|
286
|
-
```
|
287
|
-
|
288
|
-
Implement hook:
|
289
|
-
|
290
|
-
```python
|
291
|
-
from ddeutil.workflow.utils import tag
|
292
|
-
|
293
|
-
@tag('odbc', alias='mssql-proc')
|
294
|
-
def odbc_mssql_procedure(_exec: str, params: dict):
|
295
|
-
return {
|
296
|
-
"exec": _exec, "params": params
|
297
|
-
}
|
298
|
-
```
|
299
|
-
|
300
226
|
## Configuration
|
301
227
|
|
302
228
|
```bash
|
@@ -306,7 +232,6 @@ export WORKFLOW_CORE_REGISTRY_FILTER=ddeutil.workflow.utils
|
|
306
232
|
export WORKFLOW_CORE_PATH_CONF=conf
|
307
233
|
export WORKFLOW_CORE_TIMEZONE=Asia/Bangkok
|
308
234
|
export WORKFLOW_CORE_DEFAULT_STAGE_ID=true
|
309
|
-
|
310
235
|
export WORKFLOW_CORE_MAX_PIPELINE_POKING=4
|
311
236
|
export WORKFLOW_CORE_MAX_JOB_PARALLEL=2
|
312
237
|
```
|
@@ -0,0 +1,20 @@
|
|
1
|
+
ddeutil/workflow/__about__.py,sha256=FA15NQYpQvn7SrHupxQQQ9Ad5ZzEXOvwDS5UyB1h1bo,27
|
2
|
+
ddeutil/workflow/__init__.py,sha256=4PEL3RdHmUowK0Dz-tK7fO0wvFX4u9CLd0Up7b3lrAQ,760
|
3
|
+
ddeutil/workflow/__types.py,sha256=SYMoxbENQX8uPsiCZkjtpHAqqHOh8rUrarAFicAJd0E,1773
|
4
|
+
ddeutil/workflow/api.py,sha256=d2Mmv9jTtN3FITIy-2mivyAKdBOGZxtkNWRMPbCLlFI,3341
|
5
|
+
ddeutil/workflow/app.py,sha256=BuYhOoSJCHiSoj3xb2I5QoxaHrD3bKdmoJua3bKBetc,1165
|
6
|
+
ddeutil/workflow/exceptions.py,sha256=zuCcsfJ1hFivubXz6lXCpGYXk07d_PkRaUD5ew3_LC0,632
|
7
|
+
ddeutil/workflow/loader.py,sha256=_ZD-XP5P7VbUeqItrUVPaKIZu6dMUZ2aywbCbReW1hQ,2778
|
8
|
+
ddeutil/workflow/log.py,sha256=N2TyjcuAoH0YTvzJCHTO037IHgVkLA986Xhtz1LSgE4,1742
|
9
|
+
ddeutil/workflow/on.py,sha256=YoEqDbzJUwqOA3JRltbvlYr0rNTtxdmb7cWMxl8U19k,6717
|
10
|
+
ddeutil/workflow/pipeline.py,sha256=VC6VDxycUdGKn13V42RZxAlCFySYb2HIZGq_ku5Kp5k,30844
|
11
|
+
ddeutil/workflow/repeat.py,sha256=sNoRfbOR4cYm_edrSvlVy9N8Dk_osLIq9FC5GMZz32M,4621
|
12
|
+
ddeutil/workflow/route.py,sha256=Ck_O1xJwI-vKkMJr37El0-1PGKlwKF8__DDNWVQrf0A,2079
|
13
|
+
ddeutil/workflow/scheduler.py,sha256=FqmkvWCqwJ4eRf8aDn5Ce4FcNWqmcvu2aTTfL34lfgs,22184
|
14
|
+
ddeutil/workflow/stage.py,sha256=tbxENx_-2BQ6peXKM_s6RQ1oGzTlXcZ4yDpP1Hufkdk,18095
|
15
|
+
ddeutil/workflow/utils.py,sha256=seyU81JXfb2zz6QbJvVEb2Wn4qt8f-FBA6QFC97xY5k,21240
|
16
|
+
ddeutil_workflow-0.0.8.dist-info/LICENSE,sha256=nGFZ1QEhhhWeMHf9n99_fdt4vQaXS29xWKxt-OcLywk,1085
|
17
|
+
ddeutil_workflow-0.0.8.dist-info/METADATA,sha256=9i7Jk3CZlBpNkmFFjD247opgYA6Mc8AT6CtZjcvamYI,8314
|
18
|
+
ddeutil_workflow-0.0.8.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
|
19
|
+
ddeutil_workflow-0.0.8.dist-info/top_level.txt,sha256=m9M6XeSWDwt_yMsmH6gcOjHZVK5O0-vgtNBuncHjzW4,8
|
20
|
+
ddeutil_workflow-0.0.8.dist-info/RECORD,,
|
@@ -1,20 +0,0 @@
|
|
1
|
-
ddeutil/workflow/__about__.py,sha256=b23XabBwtuoPOLmS_Hj_gSA4LZ0fRfAkACM6c3szVoc,27
|
2
|
-
ddeutil/workflow/__init__.py,sha256=4PEL3RdHmUowK0Dz-tK7fO0wvFX4u9CLd0Up7b3lrAQ,760
|
3
|
-
ddeutil/workflow/__types.py,sha256=SYMoxbENQX8uPsiCZkjtpHAqqHOh8rUrarAFicAJd0E,1773
|
4
|
-
ddeutil/workflow/api.py,sha256=d2Mmv9jTtN3FITIy-2mivyAKdBOGZxtkNWRMPbCLlFI,3341
|
5
|
-
ddeutil/workflow/app.py,sha256=GbdwvUkE8lO2Ze4pZ0-J-7p9mcZAaORfjkHwW_oZIP0,1076
|
6
|
-
ddeutil/workflow/exceptions.py,sha256=BH7COn_3uz3z7oJBZOQGiuo8osBFgeXL8HYymnjCOPQ,671
|
7
|
-
ddeutil/workflow/loader.py,sha256=_ZD-XP5P7VbUeqItrUVPaKIZu6dMUZ2aywbCbReW1hQ,2778
|
8
|
-
ddeutil/workflow/log.py,sha256=_GJEdJr7bqpcQDxZjrqHd-hkiW3NKFaVoR6voE6Ty0o,952
|
9
|
-
ddeutil/workflow/on.py,sha256=YoEqDbzJUwqOA3JRltbvlYr0rNTtxdmb7cWMxl8U19k,6717
|
10
|
-
ddeutil/workflow/pipeline.py,sha256=dKF09TFS_v5TCD-5o8tp1UhB5sGuWIQu4zl_UFtlIC0,25951
|
11
|
-
ddeutil/workflow/repeat.py,sha256=sNoRfbOR4cYm_edrSvlVy9N8Dk_osLIq9FC5GMZz32M,4621
|
12
|
-
ddeutil/workflow/route.py,sha256=Ck_O1xJwI-vKkMJr37El0-1PGKlwKF8__DDNWVQrf0A,2079
|
13
|
-
ddeutil/workflow/scheduler.py,sha256=FqmkvWCqwJ4eRf8aDn5Ce4FcNWqmcvu2aTTfL34lfgs,22184
|
14
|
-
ddeutil/workflow/stage.py,sha256=z05bKk2QFQDXjidSnQYCVOdceSpSO13sHXE0B1UH6XA,14978
|
15
|
-
ddeutil/workflow/utils.py,sha256=pDM2jaYVP-USH0pLd_XmHOguxVPGVzZ76hOh1AZdINU,18495
|
16
|
-
ddeutil_workflow-0.0.7.dist-info/LICENSE,sha256=nGFZ1QEhhhWeMHf9n99_fdt4vQaXS29xWKxt-OcLywk,1085
|
17
|
-
ddeutil_workflow-0.0.7.dist-info/METADATA,sha256=ba2nH57cpHB2P4ldQCRT8ZWDj3r1OPx9a1dgcB0a2Ws,9702
|
18
|
-
ddeutil_workflow-0.0.7.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
|
19
|
-
ddeutil_workflow-0.0.7.dist-info/top_level.txt,sha256=m9M6XeSWDwt_yMsmH6gcOjHZVK5O0-vgtNBuncHjzW4,8
|
20
|
-
ddeutil_workflow-0.0.7.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|