pytest-dag 3.0.0__tar.gz

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,44 @@
1
+ Copyright (c) 2026 SLR Software Solutions Inc. All rights reserved.
2
+
3
+ PYTEST-DAG PROPRIETARY SOFTWARE LICENSE
4
+
5
+ 1. GRANT OF USE
6
+ Subject to the terms of this License, the copyright holder grants you
7
+ a non-exclusive, non-transferable, revocable right to install and use
8
+ this software ("pytest-dag") solely in its unmodified, distributed form
9
+ for your own internal testing and development purposes.
10
+
11
+ 2. RESTRICTIONS
12
+ You may NOT, under any circumstances:
13
+ a) Modify, adapt, translate, or create derivative works of this software,
14
+ in whole or in part, whether for internal or external use;
15
+ b) Redistribute, sublicense, sell, rent, lease, or otherwise transfer
16
+ this software or any portion of it to any third party;
17
+ c) Remove, alter, or obscure any copyright, trademark, or proprietary
18
+ notice contained in this software;
19
+ d) Use this software to build a competing product or service;
20
+ e) Reverse-engineer the software beyond what is permitted by applicable law.
21
+
22
+ 3. NO IMPLIED RIGHTS
23
+ No rights are granted except those expressly stated in Section 1.
24
+ All other rights are reserved by the copyright holder.
25
+
26
+ 4. TERMINATION
27
+ This License is effective until terminated. Your rights under this
28
+ License will terminate automatically without notice if you fail to
29
+ comply with any of its terms. Upon termination you must destroy all
30
+ copies of the software in your possession.
31
+
32
+ 5. DISCLAIMER OF WARRANTIES
33
+ THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS
34
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
35
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
36
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES,
37
+ OR OTHER LIABILITY ARISING FROM THE USE OF THIS SOFTWARE.
38
+
39
+ 6. GOVERNING LAW
40
+ This License shall be governed by the laws of the jurisdiction in which
41
+ the copyright holder resides, without regard to conflict-of-law principles.
42
+
43
+ For licensing inquiries, commercial use, or enterprise plans:
44
+ support@slrsoft.ca
@@ -0,0 +1,224 @@
1
+ Metadata-Version: 2.4
2
+ Name: pytest-dag
3
+ Version: 3.0.0
4
+ Summary: A pytest plugin that enforces test execution order via a dependency DAG
5
+ Author-email: "SLR Software Solutions Inc." <support@slrsoft.ca>
6
+ License-Expression: LicenseRef-Proprietary
7
+ Project-URL: Homepage, https://github.com/SLR-Software-Solutions-Inc/pytest-dag
8
+ Project-URL: Bug Tracker, https://github.com/SLR-Software-Solutions-Inc/pytest-dag/issues
9
+ Keywords: pytest,testing,dag,dependencies,ordering,plugin
10
+ Classifier: Framework :: Pytest
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Topic :: Software Development :: Testing
19
+ Classifier: Intended Audience :: Developers
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: pytest>=7.0
24
+ Requires-Dist: pyyaml>=6.0
25
+ Requires-Dist: cryptography>=42.0.0
26
+ Dynamic: license-file
27
+
28
+ # pytest-dag
29
+
30
+ <p align="center">
31
+ <img src="assets/branding/pytest-dag-logo.svg" alt="pytest-dag logo" width="88">
32
+ </p>
33
+
34
+ ![pytest-dag banner](assets/branding/pytest-dag-banner.svg)
35
+
36
+ [![Docs status](https://readthedocs.org/projects/pytest-dag/badge/?version=latest)](https://pytest-dag.readthedocs.io/en/latest/)
37
+
38
+ Documentation: https://pytest-dag.readthedocs.io/en/latest/
39
+
40
+ `pytest-dag` is a pytest plugin for dependency-aware test execution.
41
+
42
+ It lets tests declare dependencies, builds a DAG, runs tests in topological
43
+ order, and skips downstream tests when required dependencies fail.
44
+
45
+ ## Installation
46
+
47
+ ```bash
48
+ pip install pytest-dag
49
+ ```
50
+
51
+ ## Quick Start
52
+
53
+ ```python
54
+ import pytest
55
+
56
+ def test_a():
57
+ assert True
58
+
59
+ @pytest.mark.dag(depends=["test_a"])
60
+ def test_b():
61
+ assert True
62
+
63
+ @pytest.mark.dag(depends=["test_b"])
64
+ def test_c():
65
+ assert True
66
+
67
+ @pytest.mark.dag(depends=["test_b"])
68
+ def test_d():
69
+ assert True
70
+ ```
71
+
72
+ Expected run order:
73
+
74
+ `test_a -> test_b -> (test_c, test_d)`
75
+
76
+ If `test_a` fails, dependent tests are skipped with a clear reason:
77
+
78
+ ```text
79
+ SKIPPED pytest-dag: blocked by test_file.py::test_a (FAILED)
80
+ ```
81
+
82
+ ## Marker Syntax
83
+
84
+ ```python
85
+ # Single dependency (string)
86
+ @pytest.mark.dag(depends="test_login")
87
+ def test_profile():
88
+ ...
89
+
90
+ # Multiple dependencies (list)
91
+ @pytest.mark.dag(depends=["test_login", "test_db_connect"])
92
+ def test_dashboard():
93
+ ...
94
+
95
+ # Cross-file dependency (full nodeid)
96
+ @pytest.mark.dag(depends=["tests/auth/test_auth.py::test_login"])
97
+ def test_profile():
98
+ ...
99
+ ```
100
+
101
+ ## YAML DAG
102
+
103
+ For larger suites, you can define dependencies in YAML instead of (or in
104
+ addition to) markers.
105
+
106
+ `pyproject.toml`:
107
+
108
+ ```toml
109
+ [tool.pytest.ini_options]
110
+ dag_file = "tests/dag.yaml"
111
+ ```
112
+
113
+ `tests/dag.yaml`:
114
+
115
+ ```yaml
116
+ nodes:
117
+ - id: tests/test_flow.py::test_a
118
+ - id: tests/test_flow.py::test_b
119
+ depends: [tests/test_flow.py::test_a]
120
+ - id: tests/test_flow.py::test_c
121
+ depends: [tests/test_flow.py::test_b]
122
+ ```
123
+
124
+ Marker dependencies and YAML dependencies are unioned.
125
+
126
+ ## CLI Options
127
+
128
+ | Option | Default | Description |
129
+ | ---------------------------------- | ------- | ----------------------------------------------------------------- |
130
+ | `--dag-strict` / `--no-dag-strict` | strict | Missing dependency -> error (strict) or skip (lenient) |
131
+ | `--dag-block-on OUTCOMES` | `fail` | Outcomes that block dependents: `fail`, `skip`, `xfail`, `error` |
132
+ | `--dag-dump` | off | Print DAG order and edges after collection |
133
+ | `--pytest-dag-license-key` | unset | Provide license key directly |
134
+ | `--pytest-dag-license-key-file` | unset | Read license key from file |
135
+
136
+ Examples:
137
+
138
+ ```bash
139
+ # Cascade skipping (skip dependents when a dependency fails or is skipped)
140
+ pytest --dag-block-on fail,skip
141
+
142
+ # Missing deps become skips instead of collection errors
143
+ pytest --no-dag-strict
144
+
145
+ # Print computed graph for debugging
146
+ pytest --dag-dump
147
+ ```
148
+
149
+ ## License Setup
150
+
151
+ `pytest-dag` may require a license key depending on current license policy.
152
+
153
+ Provide a license key using one of:
154
+
155
+ - Environment variable: `PYTEST_DAG_LICENSE_KEY`
156
+ - CLI value: `--pytest-dag-license-key`
157
+ - Key file: `--pytest-dag-license-key-file`
158
+
159
+ Examples:
160
+
161
+ ```bash
162
+ export PYTEST_DAG_LICENSE_KEY=pd-XXXX-XXXX-XXXX-XXXX
163
+ python -m pytest -v -rs
164
+ ```
165
+
166
+ ```bash
167
+ pytest --pytest-dag-license-key-file /path/to/key.txt -v -rs
168
+ ```
169
+
170
+ Purchase or renew:
171
+
172
+ - `https://pytest-dag.slrsoft.ca/licenses/purchase`
173
+
174
+ Support:
175
+
176
+ - `support@slrsoft.ca`
177
+
178
+ ## Viewing Skip Reasons
179
+
180
+ Use `-v -rs` to see exact skip reasons:
181
+
182
+ ```bash
183
+ pytest -v -rs
184
+ ```
185
+
186
+ Example summary:
187
+
188
+ ```text
189
+ SKIPPED [2] pytest-dag: blocked by test_demo.py::test_login (FAILED)
190
+ SKIPPED [1] test_demo.py:104: feature not yet implemented
191
+ ```
192
+
193
+ ## pytest-xdist Compatibility
194
+
195
+ `pytest-dag` is not compatible with `pytest-xdist` parallel execution (`-n`).
196
+ To preserve DAG correctness, the plugin automatically disables xdist when it is
197
+ active and prints a warning.
198
+
199
+ If xdist is installed but `-n` is not passed, nothing is changed.
200
+
201
+ ## Troubleshooting
202
+
203
+ ### `plugins: ... dag-0.1.0` (not `pytest-dag-0.1.0`)
204
+
205
+ This is normal. Pytest shortens plugin names in output by dropping the
206
+ `pytest-` prefix.
207
+
208
+ ### Plugin not loading in a virtualenv
209
+
210
+ If `which pytest` points to a global executable after activating a venv, use:
211
+
212
+ ```bash
213
+ python -m pytest ...
214
+ ```
215
+
216
+ This guarantees the venv interpreter and installed plugin are used.
217
+
218
+ ## License
219
+
220
+ Proprietary. Copyright (c) 2026 SLR Software Solutions Inc.
221
+
222
+ See the license terms in the repository `LICENSE` file.
223
+
224
+ Licensing inquiries: `support@slrsoft.ca`
@@ -0,0 +1,197 @@
1
+ # pytest-dag
2
+
3
+ <p align="center">
4
+ <img src="assets/branding/pytest-dag-logo.svg" alt="pytest-dag logo" width="88">
5
+ </p>
6
+
7
+ ![pytest-dag banner](assets/branding/pytest-dag-banner.svg)
8
+
9
+ [![Docs status](https://readthedocs.org/projects/pytest-dag/badge/?version=latest)](https://pytest-dag.readthedocs.io/en/latest/)
10
+
11
+ Documentation: https://pytest-dag.readthedocs.io/en/latest/
12
+
13
+ `pytest-dag` is a pytest plugin for dependency-aware test execution.
14
+
15
+ It lets tests declare dependencies, builds a DAG, runs tests in topological
16
+ order, and skips downstream tests when required dependencies fail.
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ pip install pytest-dag
22
+ ```
23
+
24
+ ## Quick Start
25
+
26
+ ```python
27
+ import pytest
28
+
29
+ def test_a():
30
+ assert True
31
+
32
+ @pytest.mark.dag(depends=["test_a"])
33
+ def test_b():
34
+ assert True
35
+
36
+ @pytest.mark.dag(depends=["test_b"])
37
+ def test_c():
38
+ assert True
39
+
40
+ @pytest.mark.dag(depends=["test_b"])
41
+ def test_d():
42
+ assert True
43
+ ```
44
+
45
+ Expected run order:
46
+
47
+ `test_a -> test_b -> (test_c, test_d)`
48
+
49
+ If `test_a` fails, dependent tests are skipped with a clear reason:
50
+
51
+ ```text
52
+ SKIPPED pytest-dag: blocked by test_file.py::test_a (FAILED)
53
+ ```
54
+
55
+ ## Marker Syntax
56
+
57
+ ```python
58
+ # Single dependency (string)
59
+ @pytest.mark.dag(depends="test_login")
60
+ def test_profile():
61
+ ...
62
+
63
+ # Multiple dependencies (list)
64
+ @pytest.mark.dag(depends=["test_login", "test_db_connect"])
65
+ def test_dashboard():
66
+ ...
67
+
68
+ # Cross-file dependency (full nodeid)
69
+ @pytest.mark.dag(depends=["tests/auth/test_auth.py::test_login"])
70
+ def test_profile():
71
+ ...
72
+ ```
73
+
74
+ ## YAML DAG
75
+
76
+ For larger suites, you can define dependencies in YAML instead of (or in
77
+ addition to) markers.
78
+
79
+ `pyproject.toml`:
80
+
81
+ ```toml
82
+ [tool.pytest.ini_options]
83
+ dag_file = "tests/dag.yaml"
84
+ ```
85
+
86
+ `tests/dag.yaml`:
87
+
88
+ ```yaml
89
+ nodes:
90
+ - id: tests/test_flow.py::test_a
91
+ - id: tests/test_flow.py::test_b
92
+ depends: [tests/test_flow.py::test_a]
93
+ - id: tests/test_flow.py::test_c
94
+ depends: [tests/test_flow.py::test_b]
95
+ ```
96
+
97
+ Marker dependencies and YAML dependencies are unioned.
98
+
99
+ ## CLI Options
100
+
101
+ | Option | Default | Description |
102
+ | ---------------------------------- | ------- | ----------------------------------------------------------------- |
103
+ | `--dag-strict` / `--no-dag-strict` | strict | Missing dependency -> error (strict) or skip (lenient) |
104
+ | `--dag-block-on OUTCOMES` | `fail` | Outcomes that block dependents: `fail`, `skip`, `xfail`, `error` |
105
+ | `--dag-dump` | off | Print DAG order and edges after collection |
106
+ | `--pytest-dag-license-key` | unset | Provide license key directly |
107
+ | `--pytest-dag-license-key-file` | unset | Read license key from file |
108
+
109
+ Examples:
110
+
111
+ ```bash
112
+ # Cascade skipping (skip dependents when a dependency fails or is skipped)
113
+ pytest --dag-block-on fail,skip
114
+
115
+ # Missing deps become skips instead of collection errors
116
+ pytest --no-dag-strict
117
+
118
+ # Print computed graph for debugging
119
+ pytest --dag-dump
120
+ ```
121
+
122
+ ## License Setup
123
+
124
+ `pytest-dag` may require a license key depending on current license policy.
125
+
126
+ Provide a license key using one of:
127
+
128
+ - Environment variable: `PYTEST_DAG_LICENSE_KEY`
129
+ - CLI value: `--pytest-dag-license-key`
130
+ - Key file: `--pytest-dag-license-key-file`
131
+
132
+ Examples:
133
+
134
+ ```bash
135
+ export PYTEST_DAG_LICENSE_KEY=pd-XXXX-XXXX-XXXX-XXXX
136
+ python -m pytest -v -rs
137
+ ```
138
+
139
+ ```bash
140
+ pytest --pytest-dag-license-key-file /path/to/key.txt -v -rs
141
+ ```
142
+
143
+ Purchase or renew:
144
+
145
+ - `https://pytest-dag.slrsoft.ca/licenses/purchase`
146
+
147
+ Support:
148
+
149
+ - `support@slrsoft.ca`
150
+
151
+ ## Viewing Skip Reasons
152
+
153
+ Use `-v -rs` to see exact skip reasons:
154
+
155
+ ```bash
156
+ pytest -v -rs
157
+ ```
158
+
159
+ Example summary:
160
+
161
+ ```text
162
+ SKIPPED [2] pytest-dag: blocked by test_demo.py::test_login (FAILED)
163
+ SKIPPED [1] test_demo.py:104: feature not yet implemented
164
+ ```
165
+
166
+ ## pytest-xdist Compatibility
167
+
168
+ `pytest-dag` is not compatible with `pytest-xdist` parallel execution (`-n`).
169
+ To preserve DAG correctness, the plugin automatically disables xdist when it is
170
+ active and prints a warning.
171
+
172
+ If xdist is installed but `-n` is not passed, nothing is changed.
173
+
174
+ ## Troubleshooting
175
+
176
+ ### `plugins: ... dag-0.1.0` (not `pytest-dag-0.1.0`)
177
+
178
+ This is normal. Pytest shortens plugin names in output by dropping the
179
+ `pytest-` prefix.
180
+
181
+ ### Plugin not loading in a virtualenv
182
+
183
+ If `which pytest` points to a global executable after activating a venv, use:
184
+
185
+ ```bash
186
+ python -m pytest ...
187
+ ```
188
+
189
+ This guarantees the venv interpreter and installed plugin are used.
190
+
191
+ ## License
192
+
193
+ Proprietary. Copyright (c) 2026 SLR Software Solutions Inc.
194
+
195
+ See the license terms in the repository `LICENSE` file.
196
+
197
+ Licensing inquiries: `support@slrsoft.ca`
@@ -0,0 +1,44 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "pytest-dag"
7
+ version = "3.0.0"
8
+ description = "A pytest plugin that enforces test execution order via a dependency DAG"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = "LicenseRef-Proprietary"
12
+ license-files = ["LICENSE"]
13
+ authors = [
14
+ { name = "SLR Software Solutions Inc.", email = "support@slrsoft.ca" },
15
+ ]
16
+ keywords = ["pytest", "testing", "dag", "dependencies", "ordering", "plugin"]
17
+ classifiers = [
18
+ "Framework :: Pytest",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.9",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Operating System :: OS Independent",
26
+ "Topic :: Software Development :: Testing",
27
+ "Intended Audience :: Developers",
28
+ ]
29
+ dependencies = ["pytest>=7.0", "pyyaml>=6.0", "cryptography>=42.0.0"]
30
+
31
+ [project.urls]
32
+ Homepage = "https://github.com/SLR-Software-Solutions-Inc/pytest-dag"
33
+ "Bug Tracker" = "https://github.com/SLR-Software-Solutions-Inc/pytest-dag/issues"
34
+
35
+ [project.entry-points."pytest11"]
36
+ pytest-dag = "pytest_dag.plugin"
37
+
38
+ [tool.setuptools.packages.find]
39
+ include = ["pytest_dag*"]
40
+
41
+ [tool.pytest.ini_options]
42
+ # Disable the plugin for the plugin's own test suite bootstrapping.
43
+ # Tests enable it explicitly via conftest.
44
+ addopts = "-p no:pytest-dag"
@@ -0,0 +1,3 @@
1
+ """pytest-dag: dependency-driven test ordering and skip propagation."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,4 @@
1
+ """Build-injected official licensing configuration."""
2
+
3
+ OFFICIAL_LICENSE_ENDPOINT = 'https://pytest-dag.slrsoft.ca'
4
+ OFFICIAL_SIGNING_PUBLIC_KEY_PEM = '-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAjY/lRvFw6SFsmerr8q6So+B8mWoMvHXjgYIzI7zeU7E=\n-----END PUBLIC KEY-----'