From b97be04225559e996265c6733a87fea9961b9c26 Mon Sep 17 00:00:00 2001 From: Emilio Reyes Date: Mon, 9 Feb 2026 23:30:02 +0000 Subject: [PATCH] build: relocate runner module and update Docker image Signed-off-by: Emilio Reyes --- .coverage | Bin 53248 -> 0 bytes Dockerfile | 9 +- badges/coverage.svg | 21 -- examples/{ => tdrun}/state.json | 0 examples/test_dag2.py | 439 ------------------------- examples/test_dag3.py | 178 ---------- pyproject.toml | 2 +- thread_order/__init__.py | 2 +- thread_order/cli/__init__.py | 0 thread_order/{runner.py => cli/app.py} | 0 10 files changed, 8 insertions(+), 643 deletions(-) delete mode 100644 .coverage delete mode 100644 badges/coverage.svg rename examples/{ => tdrun}/state.json (100%) delete mode 100644 examples/test_dag2.py delete mode 100644 examples/test_dag3.py create mode 100644 thread_order/cli/__init__.py rename thread_order/{runner.py => cli/app.py} (100%) diff --git a/.coverage b/.coverage deleted file mode 100644 index 5cd74da401de98ed527e6e35ccb036ba356700d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeI4Uu+!39mjWX?{4oLJ7WmZ)wL53AaJbM=UQo1{zYj>tuzEF{0WGsZ1(QP_QKt+ zv%8l#pvZE91mdAjNbrEvN~l!jp*;1aNV&eCN~A9pF9;;ee*qD8iwaid_>SM~AKzVk zhj^o0zhmG2nfcA^@AsMC%-i8R}`g>egpK2gH9XC zc!$<%%XYWTJ|+L;nF02w(w}}zVW$Ru$|n2g`v1M-rT#mzkL&}nAwkTVjGGS8B7wi9D*W|W7f%z@5!wNfDD zk5?-TvT`U#cwpb@ma|)4--(R<-gVQVE}QnYRcDM`)@YckYFlTjVyp5ecr)ijV215X zaA^d2z->FyxjT2M3VEei^v;y&)X6Zbz7y;lRQbjukAzF}=0fw>*^AbHl^x#cbe4QEf#lz0HNNWQC+jB_-5$+(R~ zDP+#1p3WT}?q*ITXG}*MnPokx=XUQ_m%|nz`z85HwHYB}noZ!kf#CbAzhL_Fe7o*4 zniL;PrE_=h?xwg@!I+lI^wWchK;>t(fPRHKefiVcRF*MKm5+<_lV{B`^(G6ZBbw!FLISUxsy zda@Vt#(2ST%EGk6v4L_N^XQnC#{(Uc>_jLdAEQR;Q4_tc%(&1fRrXkM`S}H6B1^59rLeinN@*$a z+`QOUTsRv2+Vq8QRRotJfii((oijaNbOj|wV`-om5u3kWtFV~gP)gi~hSrRaY2W2L zvWksqxsRQBZk#p2+_q-(Fs!DxSZgtY(t@c1P}lL5C8!X009sH0T2KI5C8!X0D;~k zps5K}m-GJwdtYIzv_Jp>5C8!X009sH0T2KI5C8!X009vAQ4;7+XnR=vSjf)?Rc&}E zdIsQ^`RN1sY59X=ckCiN&F*0%6oCK&AOHd&00JNY0w4eaAOHd&00O;1 zU^JsCGxQCVl9=-6>B9gegFe+G+^MoNN8b*j4-o9tHRVVL0r_zOnSM)JQ;v5?m+#(} zs^vh2r!?hgBqKcEoAPNHyzn1O3@0_^;5G@%wtT6A)>(x)*IbyV^qUi!a;$?2h9L_u z3=$bpHRaH@^5X*J{r}9)YYO{_U1BEt8~gpvYwRG~(;HO`D?k7QKmY_l00ck)1V8`; zKmY_lKvB3hqjs1(Z_WQRquP;90`dG`zg0WlDZO?6pT1c;8q0K^|EET@gWDyd`G2yD z3i0$^yG1(|XKuZQ(K7!}jA)0lUFZM!{vTQb2!H?xfB*=900@8p2!H?xfB*>eGy#ns z3>c92|5Zl!|F8A5tuPJ*KmY_l00ck)1V8`;KmY_l00jPT3253tHhBM^B^CBLdxyRN z@EY^kt?VZhfdB#^00JNY0w4eaAOHd&00JNY0zF3H#!OPp-kzzyTsx5&B-@#7PJ zo_b^D!k=DqW)HmZ`K0~IKk8o_^;7qa|6%d1o2r+eyUTdv%91*$@Iy=c?@UqIeyaY~ zQ&%?EDXjf{qfuXK)Ef1TmCf2pqp?DN_09E_T4QzNz0G%P7uMD&qF&$BcP1(8-sI)g zZ`Ri@T)mnb(rEwZT7K=#RK0fUUsv4^uGDMKzwpp~m(+m-C55*_IB`o`ur@BHN#wc!1K_NKx%*nilU>{GVF-e&)#2m}xS0T2KI5C8!X009sH z0T2KI5CDPyK>}%-?yH$hu+sHll}-n%R4P~{lfg>Uf>k1sqzeMU{eMMX^gsXs5C8!X z009sH0T2KI5C8!X009u_SpxF@Kj!~ETfHz01V8`;KmY_l00ck)1V8`;KmY^+0`mQT f%>UsGAOHd&00JNY0w4eaAOHd&00JP;+XTJ^&#ivL diff --git a/Dockerfile b/Dockerfile index a761e6b..fe4c88f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,13 @@ ARG PYTHON_VERSION=3.12 FROM python:${PYTHON_VERSION}-slim -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONPATH=/code/examples:$PYTHONPATH -ENV PYTHONUNBUFFERED=1 + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH=/code/examples:$PYTHONPATH \ + PYTHONUNBUFFERED=1 + WORKDIR /code COPY . /code/ + RUN apt-get update && \ apt-get install -y --no-install-recommends make && \ rm -rf /var/lib/apt/lists/* diff --git a/badges/coverage.svg b/badges/coverage.svg deleted file mode 100644 index c149003..0000000 --- a/badges/coverage.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - coverage - coverage - 90% - 90% - - diff --git a/examples/state.json b/examples/tdrun/state.json similarity index 100% rename from examples/state.json rename to examples/tdrun/state.json diff --git a/examples/test_dag2.py b/examples/test_dag2.py deleted file mode 100644 index fa12a68..0000000 --- a/examples/test_dag2.py +++ /dev/null @@ -1,439 +0,0 @@ -import time -import random -from faker import Faker -from thread_order import mark, configure_logging, ThreadProxyLogger - -logger = ThreadProxyLogger() - - -def setup_state(state): - state.update({ - 'faker': Faker() - }) - -def run(name, state, deps=None, fail=False): - with state['_state_lock']: - last_name = state['faker'].last_name() - sleep = random.uniform(.8, 6.0) - logger.debug(f'{name} "{last_name}" running - sleeping {sleep:.2f}s') - time.sleep(sleep) - if fail: - assert False, 'Intentional Failure' - else: - results = [] - for dep in (deps or []): - dep_result = state.get(dep, '--no-result--') - results.append(f'{name}.{dep_result}') - if not results: - results.append(name) - state[name] = '|'.join(results) - - -# Layer 1 - 20 root tests - -@mark(tags='layer1') -def test_01_01(state): return run('test_01_01', state) - - -@mark(tags='layer1') -def test_01_02(state): return run('test_01_02', state) - - -@mark(tags='layer1') -def test_01_03(state): return run('test_01_03', state) - - -@mark(tags='layer1') -def test_01_04(state): return run('test_01_04', state) - - -@mark(tags='layer1') -def test_01_05(state): return run('test_01_05', state) - - -@mark(tags='layer1') -def test_01_06(state): return run('test_01_06', state) - - -@mark(tags='layer1') -def test_01_07(state): return run('test_01_07', state) - - -@mark(tags='layer1') -def test_01_08(state): return run('test_01_08', state) - - -@mark(tags='layer1') -def test_01_09(state): return run('test_01_09', state) - - -@mark(tags='layer1') -def test_01_10(state): return run('test_01_10', state) - - -@mark(tags='layer1') -def test_01_11(state): return run('test_01_11', state) - - -@mark(tags='layer1') -def test_01_12(state): return run('test_01_12', state) - - -@mark(tags='layer1') -def test_01_13(state): return run('test_01_13', state) - - -@mark(tags='layer1') -def test_01_14(state): return run('test_01_14', state) - - -@mark(tags='layer1') -def test_01_15(state): return run('test_01_15', state) - - -@mark(tags='layer1') -def test_01_16(state): return run('test_01_16', state) - - -@mark(tags='layer1') -def test_01_17(state): return run('test_01_17', state) - - -@mark(tags='layer1') -def test_01_18(state): return run('test_01_18', state) - - -@mark(tags='layer1') -def test_01_19(state): return run('test_01_19', state) - - -@mark(tags='layer1') -def test_01_20(state): return run('test_01_20', state) - - -# Layer 2 - 20 tests, depending on layer 1 - -@mark(after=['test_01_01'], tags='layer2') -def test_02_01(state): return run('test_02_01', state, deps=['test_01_01'], fail=False) - - -@mark(after=['test_01_02', 'test_01_01'], tags='layer2') -def test_02_02(state): return run('test_02_02', state, deps=['test_01_02', 'test_01_01'], fail=False) - - -@mark(after=['test_01_03', 'test_01_02', 'test_01_04'], tags='layer2') -def test_02_03(state): return run('test_02_03', state, deps=['test_01_03', 'test_01_02', 'test_01_04'], fail=True) - - -@mark(after=['test_01_04', 'test_01_03'], tags='layer2') -def test_02_04(state): return run('test_02_04', state, deps=['test_01_04', 'test_01_03'], fail=False) - - -@mark(after=['test_01_05', 'test_01_04'], tags='layer2') -def test_02_05(state): return run('test_02_05', state, deps=['test_01_05', 'test_01_04'], fail=False) - - -@mark(after=['test_01_06', 'test_01_05', 'test_01_07'], tags='layer2') -def test_02_06(state): return run('test_02_06', state, deps=['test_01_06', 'test_01_05', 'test_01_07'], fail=False) - - -@mark(after=['test_01_07', 'test_01_06'], tags='layer2') -def test_02_07(state): return run('test_02_07', state, deps=['test_01_07', 'test_01_06'], fail=True) - - -@mark(after=['test_01_08', 'test_01_07'], tags='layer2') -def test_02_08(state): return run('test_02_08', state, deps=['test_01_08', 'test_01_07'], fail=False) - - -@mark(after=['test_01_09', 'test_01_08', 'test_01_10'], tags='layer2') -def test_02_09(state): return run('test_02_09', state, deps=['test_01_09', 'test_01_08', 'test_01_10'], fail=False) - - -@mark(after=['test_01_10', 'test_01_09'], tags='layer2') -def test_02_10(state): return run('test_02_10', state, deps=['test_01_10', 'test_01_09'], fail=False) - - -@mark(after=['test_01_11', 'test_01_10'], tags='layer2') -def test_02_11(state): return run('test_02_11', state, deps=['test_01_11', 'test_01_10'], fail=True) - - -@mark(after=['test_01_12', 'test_01_11', 'test_01_13'], tags='layer2') -def test_02_12(state): return run('test_02_12', state, deps=['test_01_12', 'test_01_11', 'test_01_13'], fail=False) - - -@mark(after=['test_01_13', 'test_01_12'], tags='layer2') -def test_02_13(state): return run('test_02_13', state, deps=['test_01_13', 'test_01_12'], fail=False) - - -@mark(after=['test_01_14', 'test_01_13'], tags='layer2') -def test_02_14(state): return run('test_02_14', state, deps=['test_01_14', 'test_01_13'], fail=False) - - -@mark(after=['test_01_15', 'test_01_14', 'test_01_16'], tags='layer2') -def test_02_15(state): return run('test_02_15', state, deps=['test_01_15', 'test_01_14', 'test_01_16'], fail=True) - - -@mark(after=['test_01_16', 'test_01_15'], tags='layer2') -def test_02_16(state): return run('test_02_16', state, deps=['test_01_16', 'test_01_15'], fail=False) - - -@mark(after=['test_01_17', 'test_01_16'], tags='layer2') -def test_02_17(state): return run('test_02_17', state, deps=['test_01_17', 'test_01_16'], fail=False) - - -@mark(after=['test_01_18', 'test_01_17', 'test_01_19'], tags='layer2') -def test_02_18(state): return run('test_02_18', state, deps=['test_01_18', 'test_01_17', 'test_01_19'], fail=False) - - -@mark(after=['test_01_19', 'test_01_18'], tags='layer2') -def test_02_19(state): return run('test_02_19', state, deps=['test_01_19', 'test_01_18'], fail=True) - - -@mark(after=['test_01_20', 'test_01_19'], tags='layer2') -def test_02_20(state): return run('test_02_20', state, deps=['test_01_20', 'test_01_19'], fail=False) - - -# Layer 3 - 20 tests, depending on layer 2 - -@mark(after=['test_02_01'], tags='layer3') -def test_03_01(state): return run('test_03_01', state, deps=['test_02_01'], fail=False) - - -@mark(after=['test_02_02', 'test_02_01'], tags='layer3') -def test_03_02(state): return run('test_03_02', state, deps=['test_02_02', 'test_02_01'], fail=False) - - -@mark(after=['test_02_03', 'test_02_02', 'test_02_04'], tags='layer3') -def test_03_03(state): return run('test_03_03', state, deps=['test_02_03', 'test_02_02', 'test_02_04'], fail=True) - - -@mark(after=['test_02_04', 'test_02_03'], tags='layer3') -def test_03_04(state): return run('test_03_04', state, deps=['test_02_04', 'test_02_03'], fail=False) - - -@mark(after=['test_02_05', 'test_02_04'], tags='layer3') -def test_03_05(state): return run('test_03_05', state, deps=['test_02_05', 'test_02_04'], fail=False) - - -@mark(after=['test_02_06', 'test_02_05', 'test_02_07'], tags='layer3') -def test_03_06(state): return run('test_03_06', state, deps=['test_02_06', 'test_02_05', 'test_02_07'], fail=False) - - -@mark(after=['test_02_07', 'test_02_06'], tags='layer3') -def test_03_07(state): return run('test_03_07', state, deps=['test_02_07', 'test_02_06'], fail=True) - - -@mark(after=['test_02_08', 'test_02_07'], tags='layer3') -def test_03_08(state): return run('test_03_08', state, deps=['test_02_08', 'test_02_07'], fail=False) - - -@mark(after=['test_02_09', 'test_02_08', 'test_02_10'], tags='layer3') -def test_03_09(state): return run('test_03_09', state, deps=['test_02_09', 'test_02_08', 'test_02_10'], fail=False) - - -@mark(after=['test_02_10', 'test_02_09'], tags='layer3') -def test_03_10(state): return run('test_03_10', state, deps=['test_02_10', 'test_02_09'], fail=False) - - -@mark(after=['test_02_11', 'test_02_10'], tags='layer3') -def test_03_11(state): return run('test_03_11', state, deps=['test_02_11', 'test_02_10'], fail=True) - - -@mark(after=['test_02_12', 'test_02_11', 'test_02_13'], tags='layer3') -def test_03_12(state): return run('test_03_12', state, deps=['test_02_12', 'test_02_11', 'test_02_13'], fail=False) - - -@mark(after=['test_02_13', 'test_02_12'], tags='layer3') -def test_03_13(state): return run('test_03_13', state, deps=['test_02_13', 'test_02_12'], fail=False) - - -@mark(after=['test_02_14', 'test_02_13'], tags='layer3') -def test_03_14(state): return run('test_03_14', state, deps=['test_02_14', 'test_02_13'], fail=False) - - -@mark(after=['test_02_15', 'test_02_14', 'test_02_16'], tags='layer3') -def test_03_15(state): return run('test_03_15', state, deps=['test_02_15', 'test_02_14', 'test_02_16'], fail=True) - - -@mark(after=['test_02_16', 'test_02_15'], tags='layer3') -def test_03_16(state): return run('test_03_16', state, deps=['test_02_16', 'test_02_15'], fail=False) - - -@mark(after=['test_02_17', 'test_02_16'], tags='layer3') -def test_03_17(state): return run('test_03_17', state, deps=['test_02_17', 'test_02_16'], fail=False) - - -@mark(after=['test_02_18', 'test_02_17', 'test_02_19'], tags='layer3') -def test_03_18(state): return run('test_03_18', state, deps=['test_02_18', 'test_02_17', 'test_02_19'], fail=False) - - -@mark(after=['test_02_19', 'test_02_18'], tags='layer3') -def test_03_19(state): return run('test_03_19', state, deps=['test_02_19', 'test_02_18'], fail=True) - - -@mark(after=['test_02_20', 'test_02_19'], tags='layer3') -def test_03_20(state): return run('test_03_20', state, deps=['test_02_20', 'test_02_19'], fail=False) - - -# Layer 4 - 20 tests, depending on layer 3 - -@mark(after=['test_03_01'], tags='layer4') -def test_04_01(state): return run('test_04_01', state, deps=['test_03_01'], fail=False) - - -@mark(after=['test_03_02', 'test_03_01'], tags='layer4') -def test_04_02(state): return run('test_04_02', state, deps=['test_03_02', 'test_03_01'], fail=False) - - -@mark(after=['test_03_03', 'test_03_02', 'test_03_04'], tags='layer4') -def test_04_03(state): return run('test_04_03', state, deps=['test_03_03', 'test_03_02', 'test_03_04'], fail=True) - - -@mark(after=['test_03_04', 'test_03_03'], tags='layer4') -def test_04_04(state): return run('test_04_04', state, deps=['test_03_04', 'test_03_03'], fail=False) - - -@mark(after=['test_03_05', 'test_03_04'], tags='layer4') -def test_04_05(state): return run('test_04_05', state, deps=['test_03_05', 'test_03_04'], fail=False) - - -@mark(after=['test_03_06', 'test_03_05', 'test_03_07'], tags='layer4') -def test_04_06(state): return run('test_04_06', state, deps=['test_03_06', 'test_03_05', 'test_03_07'], fail=False) - - -@mark(after=['test_03_07', 'test_03_06'], tags='layer4') -def test_04_07(state): return run('test_04_07', state, deps=['test_03_07', 'test_03_06'], fail=True) - - -@mark(after=['test_03_08', 'test_03_07'], tags='layer4') -def test_04_08(state): return run('test_04_08', state, deps=['test_03_08', 'test_03_07'], fail=False) - - -@mark(after=['test_03_09', 'test_03_08', 'test_03_10'], tags='layer4') -def test_04_09(state): return run('test_04_09', state, deps=['test_03_09', 'test_03_08', 'test_03_10'], fail=False) - - -@mark(after=['test_03_10', 'test_03_09'], tags='layer4') -def test_04_10(state): return run('test_04_10', state, deps=['test_03_10', 'test_03_09'], fail=False) - - -@mark(after=['test_03_11', 'test_03_10'], tags='layer4') -def test_04_11(state): return run('test_04_11', state, deps=['test_03_11', 'test_03_10'], fail=True) - - -@mark(after=['test_03_12', 'test_03_11', 'test_03_13'], tags='layer4') -def test_04_12(state): return run('test_04_12', state, deps=['test_03_12', 'test_03_11', 'test_03_13'], fail=False) - - -@mark(after=['test_03_13', 'test_03_12'], tags='layer4') -def test_04_13(state): return run('test_04_13', state, deps=['test_03_13', 'test_03_12'], fail=False) - - -@mark(after=['test_03_14', 'test_03_13'], tags='layer4') -def test_04_14(state): return run('test_04_14', state, deps=['test_03_14', 'test_03_13'], fail=False) - - -@mark(after=['test_03_15', 'test_03_14', 'test_03_16'], tags='layer4') -def test_04_15(state): return run('test_04_15', state, deps=['test_03_15', 'test_03_14', 'test_03_16'], fail=True) - - -@mark(after=['test_03_16', 'test_03_15'], tags='layer4') -def test_04_16(state): return run('test_04_16', state, deps=['test_03_16', 'test_03_15'], fail=False) - - -@mark(after=['test_03_17', 'test_03_16'], tags='layer4') -def test_04_17(state): return run('test_04_17', state, deps=['test_03_17', 'test_03_16'], fail=False) - - -@mark(after=['test_03_18', 'test_03_17', 'test_03_19'], tags='layer4') -def test_04_18(state): return run('test_04_18', state, deps=['test_03_18', 'test_03_17', 'test_03_19'], fail=False) - - -@mark(after=['test_03_19', 'test_03_18'], tags='layer4') -def test_04_19(state): return run('test_04_19', state, deps=['test_03_19', 'test_03_18'], fail=True) - - -@mark(after=['test_03_20', 'test_03_19'], tags='layer4') -def test_04_20(state): return run('test_04_20', state, deps=['test_03_20', 'test_03_19'], fail=False) - - -# Layer 5 - 20 tests, depending on layer 4 - -@mark(after=['test_04_01'], tags='layer5') -def test_05_01(state): return run('test_05_01', state, deps=['test_04_01'], fail=False) - - -@mark(after=['test_04_02', 'test_04_01'], tags='layer5') -def test_05_02(state): return run('test_05_02', state, deps=['test_04_02', 'test_04_01'], fail=False) - - -@mark(after=['test_04_03', 'test_04_02', 'test_04_04'], tags='layer5') -def test_05_03(state): return run('test_05_03', state, deps=['test_04_03', 'test_04_02', 'test_04_04'], fail=False) - - -@mark(after=['test_04_04', 'test_04_03'], tags='layer5') -def test_05_04(state): return run('test_05_04', state, deps=['test_04_04', 'test_04_03'], fail=False) - - -@mark(after=['test_04_05', 'test_04_04'], tags='layer5') -def test_05_05(state): return run('test_05_05', state, deps=['test_04_05', 'test_04_04'], fail=False) - - -@mark(after=['test_04_06', 'test_04_05', 'test_04_07'], tags='layer5') -def test_05_06(state): return run('test_05_06', state, deps=['test_04_06', 'test_04_05', 'test_04_07'], fail=False) - - -@mark(after=['test_04_07', 'test_04_06'], tags='layer5') -def test_05_07(state): return run('test_05_07', state, deps=['test_04_07', 'test_04_06'], fail=False) - - -@mark(after=['test_04_08', 'test_04_07'], tags='layer5') -def test_05_08(state): return run('test_05_08', state, deps=['test_04_08', 'test_04_07'], fail=False) - - -@mark(after=['test_04_09', 'test_04_08', 'test_04_10'], tags='layer5') -def test_05_09(state): return run('test_05_09', state, deps=['test_04_09', 'test_04_08', 'test_04_10'], fail=False) - - -@mark(after=['test_04_10', 'test_04_09'], tags='layer5') -def test_05_10(state): return run('test_05_10', state, deps=['test_04_10', 'test_04_09'], fail=False) - - -@mark(after=['test_04_11', 'test_04_10'], tags='layer5') -def test_05_11(state): return run('test_05_11', state, deps=['test_04_11', 'test_04_10'], fail=False) - - -@mark(after=['test_04_12', 'test_04_11', 'test_04_13'], tags='layer5') -def test_05_12(state): return run('test_05_12', state, deps=['test_04_12', 'test_04_11', 'test_04_13'], fail=False) - - -@mark(after=['test_04_13', 'test_04_12'], tags='layer5') -def test_05_13(state): return run('test_05_13', state, deps=['test_04_13', 'test_04_12'], fail=False) - - -@mark(after=['test_04_14', 'test_04_13'], tags='layer5') -def test_05_14(state): return run('test_05_14', state, deps=['test_04_14', 'test_04_13'], fail=False) - - -@mark(after=['test_04_15', 'test_04_14', 'test_04_16'], tags='layer5') -def test_05_15(state): return run('test_05_15', state, deps=['test_04_15', 'test_04_14', 'test_04_16'], fail=False) - - -@mark(after=['test_04_16', 'test_04_15'], tags='layer5') -def test_05_16(state): return run('test_05_16', state, deps=['test_04_16', 'test_04_15'], fail=False) - - -@mark(after=['test_04_17', 'test_04_16'], tags='layer5') -def test_05_17(state): return run('test_05_17', state, deps=['test_04_17', 'test_04_16'], fail=False) - - -@mark(after=['test_04_18', 'test_04_17', 'test_04_19'], tags='layer5') -def test_05_18(state): return run('test_05_18', state, deps=['test_04_18', 'test_04_17', 'test_04_19'], fail=False) - - -@mark(after=['test_04_19', 'test_04_18'], tags='layer5') -def test_05_19(state): return run('test_05_19', state, deps=['test_04_19', 'test_04_18'], fail=False) - - -@mark(after=['test_04_20', 'test_04_19'], tags='layer5') -def test_05_20(state): return run('test_05_20', state, deps=['test_04_20', 'test_04_19'], fail=False) diff --git a/examples/test_dag3.py b/examples/test_dag3.py deleted file mode 100644 index 6ddaae9..0000000 --- a/examples/test_dag3.py +++ /dev/null @@ -1,178 +0,0 @@ -import time -import random -from faker import Faker -from thread_order import dmark, configure_logging, ThreadProxyLogger - -logger = ThreadProxyLogger() - -def setup_state(state): - state.update({ - "faker": Faker(), - }) - -def run(name, state, deps=None, fail=False): - # Example of safe shared-state usage (faker + lock) - with state["_state_lock"]: - last_name = state["faker"].last_name() - sleep = random.uniform(1, 4) - logger.debug(f'{name} "{last_name}" running - sleeping {sleep:.2f}s') - time.sleep(sleep) - - if fail: - assert False, "Intentional Failure" - - results = [] - for dep in (deps or []): - dep_result = state.get(dep, "--no-result--") - results.append(f"{name}.{dep_result}") - if not results: - results.append(name) - - state[name] = "|".join(results) - -# --------------------------------------------------------------------------- -# Layer 1 (7 tests) -# - test_01_03 has 7 children (layer2) -# - test_01_04 has 3 children (layer2) -# - test_01_07 has 1 child (layer2) -# --------------------------------------------------------------------------- -@dmark(with_state=True, tags="layer1") -def test_01_01(state): return run("test_01_01", state) - -@dmark(with_state=True, tags="layer1") -def test_01_02(state): return run("test_01_02", state) - -# parent of 7 children in layer2 -@dmark(with_state=True, tags="layer1") -def test_01_03(state): return run("test_01_03", state) - -# parent of 3 children in layer2 -@dmark(with_state=True, tags="layer1") -def test_01_04(state): return run("test_01_04", state) - -@dmark(with_state=True, tags="layer1") -def test_01_05(state): return run("test_01_05", state) - -@dmark(with_state=True, tags="layer1") -def test_01_06(state): return run("test_01_06", state) - -# parent of 1 child in layer2 -@dmark(with_state=True, tags="layer1") -def test_01_07(state): return run("test_01_07", state) - -# --------------------------------------------------------------------------- -# Layer 2 (11 tests total) -# - children of test_01_03: 02_01, 02_02, 02_03, 02_04, 02_05, 02_06, 02_07 -# - children of test_01_04: 02_08, 02_09, 02_10 -# - child of test_01_07: 02_11 -# -# Additional fan-out from layer2: -# - test_02_07 has 4 children (layer3) -# - test_02_10 has 1 child (layer3) -# - test_02_11 has 1 child (layer3) -# --------------------------------------------------------------------------- -@dmark(with_state=True, after=["test_01_03"], tags="layer2") -def test_02_01(state): return run("test_02_01", state, deps=["test_01_03"]) - -@dmark(with_state=True, after=["test_01_03"], tags="layer2") -def test_02_02(state): return run("test_02_02", state, deps=["test_01_03"]) - -@dmark(with_state=True, after=["test_01_03"], tags="layer2") -def test_02_03(state): return run("test_02_03", state, deps=["test_01_03"]) - -@dmark(with_state=True, after=["test_01_03"], tags="layer2") -def test_02_04(state): return run("test_02_04", state, deps=["test_01_03"]) - -@dmark(with_state=True, after=["test_01_03"], tags="layer2") -def test_02_05(state): return run("test_02_05", state, deps=["test_01_03"]) - -@dmark(with_state=True, after=["test_01_03"], tags="layer2") -def test_02_06(state): return run("test_02_06", state, deps=["test_01_03"]) - -# parent of 4 children in layer3 -@dmark(with_state=True, after=["test_01_03"], tags="layer2") -def test_02_07(state): return run("test_02_07", state, deps=["test_01_03"]) - -@dmark(with_state=True, after=["test_01_04"], tags="layer2") -def test_02_08(state): return run("test_02_08", state, deps=["test_01_04"]) - -@dmark(with_state=True, after=["test_01_04"], tags="layer2") -def test_02_09(state): return run("test_02_09", state, deps=["test_01_04"]) - -# parent of 1 child in layer3 -@dmark(with_state=True, after=["test_01_04"], tags="layer2") -def test_02_10(state): return run("test_02_10", state, deps=["test_01_04"]) - -# parent of 1 child in layer3 -@dmark(with_state=True, after=["test_01_07"], tags="layer2") -def test_02_11(state): return run("test_02_11", state, deps=["test_01_07"]) - -# --------------------------------------------------------------------------- -# Layer 3 (6 tests) -# - children of test_02_07: 03_01, 03_02, 03_03, 03_04 -# - child of test_02_10: 03_05 -# - child of test_02_11: 03_06 -# -# Additional fan-out from layer3: -# - test_03_04 has 4 children (layer4) -# - test_03_06 has 1 child (layer4) -# --------------------------------------------------------------------------- -@dmark(with_state=True, after=["test_02_07"], tags="layer3") -def test_03_01(state): return run("test_03_01", state, deps=["test_02_07"]) - -@dmark(with_state=True, after=["test_02_07"], tags="layer3") -def test_03_02(state): return run("test_03_02", state, deps=["test_02_07"]) - -@dmark(with_state=True, after=["test_02_07"], tags="layer3") -def test_03_03(state): return run("test_03_03", state, deps=["test_02_07"]) - -# parent of 4 children in layer4 -@dmark(with_state=True, after=["test_02_07"], tags="layer3") -def test_03_04(state): return run("test_03_04", state, deps=["test_02_07"]) - -@dmark(with_state=True, after=["test_02_10"], tags="layer3") -def test_03_05(state): return run("test_03_05", state, deps=["test_02_10"]) - -# parent of 1 child in layer4 -@dmark(with_state=True, after=["test_02_11"], tags="layer3") -def test_03_06(state): return run("test_03_06", state, deps=["test_02_11"]) - -# --------------------------------------------------------------------------- -# Layer 4 (5 tests) -# - children of test_03_04: 04_01, 04_02, 04_03, 04_04 -# - child of test_03_06: 04_05 -# -# Additional fan-out from layer4: -# - test_04_04 has 4 children (layer5) -# --------------------------------------------------------------------------- -@dmark(with_state=True, after=["test_03_04"], tags="layer4") -def test_04_01(state): return run("test_04_01", state, deps=["test_03_04"]) - -@dmark(with_state=True, after=["test_03_04"], tags="layer4") -def test_04_02(state): return run("test_04_02", state, deps=["test_03_04"]) - -@dmark(with_state=True, after=["test_03_04"], tags="layer4") -def test_04_03(state): return run("test_04_03", state, deps=["test_03_04"]) - -# parent of 4 children in layer5 -@dmark(with_state=True, after=["test_03_04"], tags="layer4") -def test_04_04(state): return run("test_04_04", state, deps=["test_03_04"]) - -@dmark(with_state=True, after=["test_03_06"], tags="layer4") -def test_04_05(state): return run("test_04_05", state, deps=["test_03_06"]) - -# --------------------------------------------------------------------------- -# Layer 5 (4 tests) -# - children of test_04_04: 05_01, 05_02, 05_03, 05_04 -# --------------------------------------------------------------------------- -@dmark(with_state=True, after=["test_04_04"], tags="layer5") -def test_05_01(state): return run("test_05_01", state, deps=["test_04_04"]) - -@dmark(with_state=True, after=["test_04_04"], tags="layer5") -def test_05_02(state): return run("test_05_02", state, deps=["test_04_04"]) - -@dmark(with_state=True, after=["test_04_04"], tags="layer5") -def test_05_03(state): return run("test_05_03", state, deps=["test_04_04"]) - -@dmark(with_state=True, after=["test_04_04"], tags="layer5") -def test_05_04(state): return run("test_05_04", state, deps=["test_04_04"]) diff --git a/pyproject.toml b/pyproject.toml index 53750d5..09e5ffc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ include = ["thread_order*"] "Homepage" = "https://github.com/soda480/thread-order" [project.scripts] -tdrun = "thread_order.runner:main" +tdrun = "thread_order.cli.app:main" tdrun-ui = "thread_order.ui.app:main" [project.optional-dependencies] diff --git a/thread_order/__init__.py b/thread_order/__init__.py index 9f41946..9b53d6a 100644 --- a/thread_order/__init__.py +++ b/thread_order/__init__.py @@ -53,7 +53,7 @@ def __getattr__(name): try: __version__ = _metadata.version(__name__) except _metadata.PackageNotFoundError: - __version__ = '1.2.3' + __version__ = '1.2.4' if getenv('DEV'): __version__ = f'{__version__}+dev' diff --git a/thread_order/cli/__init__.py b/thread_order/cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/thread_order/runner.py b/thread_order/cli/app.py similarity index 100% rename from thread_order/runner.py rename to thread_order/cli/app.py