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.
- pytest_dag-3.0.0/LICENSE +44 -0
- pytest_dag-3.0.0/PKG-INFO +224 -0
- pytest_dag-3.0.0/README.md +197 -0
- pytest_dag-3.0.0/pyproject.toml +44 -0
- pytest_dag-3.0.0/pytest_dag/__init__.py +3 -0
- pytest_dag-3.0.0/pytest_dag/_build_config.py +4 -0
- pytest_dag-3.0.0/pytest_dag/_pytest_dag_core.py +683 -0
- pytest_dag-3.0.0/pytest_dag/config.py +136 -0
- pytest_dag-3.0.0/pytest_dag/graph.py +349 -0
- pytest_dag-3.0.0/pytest_dag/migrate.py +584 -0
- pytest_dag-3.0.0/pytest_dag/plugin.py +525 -0
- pytest_dag-3.0.0/pytest_dag.egg-info/PKG-INFO +224 -0
- pytest_dag-3.0.0/pytest_dag.egg-info/SOURCES.txt +18 -0
- pytest_dag-3.0.0/pytest_dag.egg-info/dependency_links.txt +1 -0
- pytest_dag-3.0.0/pytest_dag.egg-info/entry_points.txt +2 -0
- pytest_dag-3.0.0/pytest_dag.egg-info/requires.txt +3 -0
- pytest_dag-3.0.0/pytest_dag.egg-info/top_level.txt +1 -0
- pytest_dag-3.0.0/setup.cfg +4 -0
- pytest_dag-3.0.0/tests/test_core_direct.py +581 -0
- pytest_dag-3.0.0/tests/test_plugin.py +1770 -0
pytest_dag-3.0.0/LICENSE
ADDED
|
@@ -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
|
+

|
|
35
|
+
|
|
36
|
+
[](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
|
+

|
|
8
|
+
|
|
9
|
+
[](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"
|