├── .editorconfig ├── .github ├── CODE_OF_CONDUCT.md ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature-request.yml │ └── issue.yml ├── SECURITY.md ├── dependabot.yml └── workflows │ └── main.yml ├── .gitignore ├── .pre-commit-config.yaml ├── CHANGELOG.rst ├── HISTORY.rst ├── LICENSE ├── MANIFEST.in ├── README.rst ├── pyproject.toml ├── requirements ├── compile.py ├── py310.txt ├── py311.txt ├── py312.txt ├── py38.txt ├── py39.txt └── requirements.in ├── src └── pytest_is_running │ ├── __init__.py │ ├── plugin.py │ └── py.typed ├── tests ├── __init__.py └── test_pytest_is_running.py └── tox.ini /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | charset = utf-8 11 | end_of_line = lf 12 | 13 | [*.py] 14 | indent_size = 4 15 | 16 | [Makefile] 17 | indent_style = tab 18 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | This project follows [Django's Code of Conduct](https://www.djangoproject.com/conduct/). 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Request an enhancement or new feature. 3 | body: 4 | - type: textarea 5 | id: description 6 | attributes: 7 | label: Description 8 | description: Please describe your feature request with appropriate detail. 9 | validations: 10 | required: true 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/issue.yml: -------------------------------------------------------------------------------- 1 | name: Issue 2 | description: File an issue 3 | body: 4 | - type: input 5 | id: python_version 6 | attributes: 7 | label: Python Version 8 | description: Which version of Python were you using? 9 | placeholder: 3.9.0 10 | validations: 11 | required: false 12 | - type: input 13 | id: pytest_version 14 | attributes: 15 | label: pytest Version 16 | description: Which version of pytest were you using? 17 | placeholder: 6.2.4 18 | validations: 19 | required: false 20 | - type: input 21 | id: package_version 22 | attributes: 23 | label: Package Version 24 | description: Which version of this package were you using? If not the latest version, please check this issue has not since been resolved. 25 | placeholder: 1.0.0 26 | validations: 27 | required: false 28 | - type: textarea 29 | id: description 30 | attributes: 31 | label: Description 32 | description: Please describe your issue. 33 | validations: 34 | required: true 35 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | Please report security issues directly over email to me@adamj.eu 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | concurrency: 10 | group: ${{ github.head_ref || github.run_id }} 11 | cancel-in-progress: true 12 | 13 | jobs: 14 | tests: 15 | name: Python ${{ matrix.python-version }} 16 | runs-on: ubuntu-22.04 17 | 18 | strategy: 19 | matrix: 20 | python-version: 21 | - 3.8 22 | - 3.9 23 | - '3.10' 24 | - '3.11' 25 | - '3.12' 26 | 27 | steps: 28 | - uses: actions/checkout@v4 29 | 30 | - uses: actions/setup-python@v5 31 | with: 32 | python-version: ${{ matrix.python-version }} 33 | allow-prereleases: true 34 | cache: pip 35 | cache-dependency-path: 'requirements/*.txt' 36 | 37 | - name: Install dependencies 38 | run: | 39 | python -m pip install --upgrade pip setuptools wheel 40 | python -m pip install --upgrade 'tox>=4.0.0rc3' 41 | 42 | - name: Run tox targets for ${{ matrix.python-version }} 43 | run: tox run -f py$(echo ${{ matrix.python-version }} | tr -d .) 44 | 45 | - name: Upload coverage data 46 | uses: actions/upload-artifact@v3 47 | with: 48 | name: coverage-data 49 | path: '.coverage.*' 50 | 51 | coverage: 52 | name: Coverage 53 | runs-on: ubuntu-22.04 54 | needs: tests 55 | steps: 56 | - uses: actions/checkout@v4 57 | 58 | - uses: actions/setup-python@v5 59 | with: 60 | python-version: '3.11' 61 | 62 | - name: Install dependencies 63 | run: python -m pip install --upgrade coverage[toml] 64 | 65 | - name: Download data 66 | uses: actions/download-artifact@v3 67 | with: 68 | name: coverage-data 69 | 70 | - name: Combine coverage and fail if it's <100% 71 | run: | 72 | python -m coverage combine 73 | python -m coverage html --skip-covered --skip-empty 74 | python -m coverage report --fail-under=100 75 | 76 | - name: Upload HTML report 77 | if: ${{ failure() }} 78 | uses: actions/upload-artifact@v3 79 | with: 80 | name: html-report 81 | path: htmlcov 82 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.egg-info/ 2 | *.pyc 3 | /.coverage 4 | /.coverage.* 5 | /.tox 6 | /build/ 7 | /dist/ 8 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_language_version: 2 | python: python3.11 3 | 4 | repos: 5 | - repo: https://github.com/pre-commit/pre-commit-hooks 6 | rev: v4.5.0 7 | hooks: 8 | - id: check-added-large-files 9 | - id: check-case-conflict 10 | - id: check-json 11 | - id: check-merge-conflict 12 | - id: check-symlinks 13 | - id: check-toml 14 | - id: end-of-file-fixer 15 | - id: trailing-whitespace 16 | - repo: https://github.com/tox-dev/pyproject-fmt 17 | rev: 1.5.3 18 | hooks: 19 | - id: pyproject-fmt 20 | - repo: https://github.com/tox-dev/tox-ini-fmt 21 | rev: 1.3.1 22 | hooks: 23 | - id: tox-ini-fmt 24 | - repo: https://github.com/rstcheck/rstcheck 25 | rev: v6.2.0 26 | hooks: 27 | - id: rstcheck 28 | additional_dependencies: 29 | - tomli==2.0.1 30 | - repo: https://github.com/asottile/pyupgrade 31 | rev: v3.15.0 32 | hooks: 33 | - id: pyupgrade 34 | args: [--py38-plus] 35 | - repo: https://github.com/psf/black-pre-commit-mirror 36 | rev: 23.12.1 37 | hooks: 38 | - id: black 39 | - repo: https://github.com/adamchainz/blacken-docs 40 | rev: 1.16.0 41 | hooks: 42 | - id: blacken-docs 43 | additional_dependencies: 44 | - black==23.1.0 45 | - repo: https://github.com/asottile/reorder-python-imports 46 | rev: v3.12.0 47 | hooks: 48 | - id: reorder-python-imports 49 | args: 50 | - --py38-plus 51 | - --application-directories 52 | - .:example:src 53 | - --add-import 54 | - 'from __future__ import annotations' 55 | - repo: https://github.com/PyCQA/flake8 56 | rev: 6.1.0 57 | hooks: 58 | - id: flake8 59 | additional_dependencies: 60 | - flake8-bugbear 61 | - flake8-comprehensions 62 | - flake8-tidy-imports 63 | - repo: https://github.com/pre-commit/mirrors-mypy 64 | rev: v1.8.0 65 | hooks: 66 | - id: mypy 67 | additional_dependencies: 68 | - pytest==7.4.2 69 | -------------------------------------------------------------------------------- /CHANGELOG.rst: -------------------------------------------------------------------------------- 1 | ========= 2 | Changelog 3 | ========= 4 | 5 | 1.5.1 (2024-01-02) 6 | ------------------ 7 | 8 | * Mark as unmaintained. 9 | 10 | 1.5.0 (2023-07-10) 11 | ------------------ 12 | 13 | * Drop Python 3.7 support. 14 | 15 | 1.4.0 (2023-06-16) 16 | ------------------ 17 | 18 | * Support Python 3.12. 19 | 20 | 1.3.0 (2022-08-19) 21 | ------------------ 22 | 23 | * Remove dependency on pytest. 24 | 25 | Thanks to Luke Plant for the report in `Issue #54 `__. 26 | 27 | 1.2.0 (2022-05-11) 28 | ------------------ 29 | 30 | * Support Python 3.11. 31 | 32 | 1.1.0 (2022-01-10) 33 | ------------------ 34 | 35 | * Drop Python 3.6 support. 36 | 37 | 1.0.0 (2021-12-06) 38 | ------------------ 39 | 40 | * Initial release. 41 | -------------------------------------------------------------------------------- /HISTORY.rst: -------------------------------------------------------------------------------- 1 | See https://github.com/adamchainz/pytest-is-running/blob/main/CHANGELOG.rst 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Adam Johnson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | prune tests 2 | include CHANGELOG.rst 3 | include LICENSE 4 | include pyproject.toml 5 | include README.rst 6 | include src/*/py.typed 7 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ================= 2 | pytest-is-running 3 | ================= 4 | 5 | .. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/pytest-is-running/main.yml?branch=main&style=for-the-badge 6 | :target: https://github.com/adamchainz/pytest-is-running/actions?workflow=CI 7 | 8 | .. image:: https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge 9 | :target: https://github.com/adamchainz/pytest-is-running/actions?workflow=CI 10 | 11 | .. image:: https://img.shields.io/pypi/v/pytest-is-running.svg?style=for-the-badge 12 | :target: https://pypi.org/project/pytest-is-running/ 13 | 14 | .. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge 15 | :target: https://github.com/psf/black 16 | 17 | .. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge 18 | :target: https://github.com/pre-commit/pre-commit 19 | :alt: pre-commit 20 | 21 | pytest plugin providing a function to check if pytest is running. 22 | 23 | Unmaintained (2024-01-02) 24 | ========================= 25 | 26 | I stopped maintaining this package as it doesn’t provide much value over checking whether pytest has been imported: 27 | 28 | .. code-block:: python 29 | 30 | import sys 31 | 32 | if "pytest" in sys.modules: 33 | ... 34 | 35 | In every project I’ve seen, pytest is only imported when running. 36 | 37 | ---- 38 | 39 | **Working on a Django project?** 40 | Check out my book `Boost Your Django DX `__ which covers many ways to improve your development experience. 41 | I created pytest-is-running whilst working on the book! 42 | 43 | ---- 44 | 45 | Installation 46 | ============ 47 | 48 | Install with: 49 | 50 | .. code-block:: bash 51 | 52 | python -m pip install pytest-is-running 53 | 54 | Python 3.8 to 3.12 supported. 55 | 56 | Usage 57 | ===== 58 | 59 | pytest will automatically find the plugin and use it when you run ``pytest``. 60 | You can check if pytest is running with the ``is_running()`` function: 61 | 62 | .. code-block:: python 63 | 64 | import pytest_is_running 65 | 66 | 67 | if pytest_is_running.is_running(): 68 | ... 69 | 70 | The package avoids importing pytest if it is not running, so that you don’t incur that overhead in non-test paths. 71 | 72 | The package registers its plugin hooks as early as possible in pytest’s process, so it should be loaded before any of your non-test modules. 73 | 74 | Rationale 75 | ========= 76 | 77 | This plugin is an alternative to re-implementing `the pattern in the pytest documentation `__. 78 | As a plugin, it is loaded earlier than ``conftest.py`` or any other code in your project. 79 | This makes it a more robust way of checking whether pytest is currently running. 80 | 81 | Upstream `issue #9502 `__ discusses adding a feature to pytest. 82 | It also covers an alternative which is often “good enough” - a simple check if pytest has been imported with: 83 | 84 | .. code-block:: python 85 | 86 | "pytest" in sys.modules 87 | 88 | This won’t be strictly accurate if you happen to import pytest outside of your test run, but that is not very common. 89 | You may prefer to using this simpler technique instead of this plugin. 90 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | build-backend = "setuptools.build_meta" 3 | requires = [ 4 | "setuptools", 5 | ] 6 | 7 | [project] 8 | name = "pytest-is-running" 9 | version = "1.5.1" 10 | description = "pytest plugin providing a function to check if pytest is running." 11 | readme = {file = "README.rst", content-type = "text/x-rst"} 12 | keywords = [ 13 | "pytest", 14 | ] 15 | license = {text = "MIT"} 16 | authors = [{name = "Adam Johnson", email = "me@adamj.eu"}] 17 | requires-python = ">=3.8" 18 | classifiers = [ 19 | "Development Status :: 7 - Inactive", 20 | "Framework :: Pytest", 21 | "Intended Audience :: Developers", 22 | "License :: OSI Approved :: MIT License", 23 | "Natural Language :: English", 24 | "Programming Language :: Python :: 3 :: Only", 25 | "Programming Language :: Python :: 3.8", 26 | "Programming Language :: Python :: 3.9", 27 | "Programming Language :: Python :: 3.10", 28 | "Programming Language :: Python :: 3.11", 29 | "Programming Language :: Python :: 3.12", 30 | "Typing :: Typed", 31 | ] 32 | [project.urls] 33 | Changelog = "https://github.com/adamchainz/pytest-is-running/blob/main/CHANGELOG.rst" 34 | Funding = "https://adamj.eu/books/" 35 | Repository = "https://github.com/adamchainz/pytest-is-running" 36 | [project.entry-points.pytest11] 37 | is_running = "pytest_is_running.plugin" 38 | 39 | [tool.black] 40 | target-version = ['py38'] 41 | 42 | [tool.pytest.ini_options] 43 | addopts = """\ 44 | --strict-config 45 | --strict-markers 46 | """ 47 | 48 | [tool.coverage.run] 49 | branch = true 50 | parallel = true 51 | source = [ 52 | "pytest_is_running", 53 | "tests", 54 | ] 55 | 56 | [tool.coverage.paths] 57 | source = [ 58 | "src", 59 | ".tox/**/site-packages", 60 | ] 61 | 62 | [tool.coverage.report] 63 | show_missing = true 64 | 65 | [tool.mypy] 66 | mypy_path = "src/" 67 | namespace_packages = false 68 | show_error_codes = true 69 | strict = true 70 | warn_unreachable = true 71 | 72 | [[tool.mypy.overrides]] 73 | module = "tests.*" 74 | allow_untyped_defs = true 75 | 76 | [tool.rstcheck] 77 | report_level = "ERROR" 78 | -------------------------------------------------------------------------------- /requirements/compile.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from __future__ import annotations 3 | 4 | import os 5 | import subprocess 6 | import sys 7 | from pathlib import Path 8 | 9 | if __name__ == "__main__": 10 | os.chdir(Path(__file__).parent) 11 | os.environ["CUSTOM_COMPILE_COMMAND"] = "requirements/compile.py" 12 | os.environ["PIP_REQUIRE_VIRTUALENV"] = "0" 13 | common_args = [ 14 | "-m", 15 | "piptools", 16 | "compile", 17 | "--generate-hashes", 18 | "--allow-unsafe", 19 | ] + sys.argv[1:] 20 | subprocess.run( 21 | ["python3.8", *common_args, "-o", "py38.txt"], 22 | check=True, 23 | capture_output=True, 24 | ) 25 | subprocess.run( 26 | ["python3.9", *common_args, "-o", "py39.txt"], 27 | check=True, 28 | capture_output=True, 29 | ) 30 | subprocess.run( 31 | ["python3.10", *common_args, "-o", "py310.txt"], 32 | check=True, 33 | capture_output=True, 34 | ) 35 | subprocess.run( 36 | ["python3.11", *common_args, "-o", "py311.txt"], 37 | check=True, 38 | capture_output=True, 39 | ) 40 | subprocess.run( 41 | ["python3.12", *common_args, "-o", "py312.txt"], 42 | check=True, 43 | capture_output=True, 44 | ) 45 | -------------------------------------------------------------------------------- /requirements/py310.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.10 3 | # by the following command: 4 | # 5 | # requirements/compile.py 6 | # 7 | coverage[toml]==7.4.0 \ 8 | --hash=sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca \ 9 | --hash=sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471 \ 10 | --hash=sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a \ 11 | --hash=sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058 \ 12 | --hash=sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85 \ 13 | --hash=sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143 \ 14 | --hash=sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446 \ 15 | --hash=sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590 \ 16 | --hash=sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a \ 17 | --hash=sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105 \ 18 | --hash=sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9 \ 19 | --hash=sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a \ 20 | --hash=sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac \ 21 | --hash=sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25 \ 22 | --hash=sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2 \ 23 | --hash=sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450 \ 24 | --hash=sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932 \ 25 | --hash=sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba \ 26 | --hash=sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137 \ 27 | --hash=sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae \ 28 | --hash=sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614 \ 29 | --hash=sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70 \ 30 | --hash=sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e \ 31 | --hash=sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505 \ 32 | --hash=sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870 \ 33 | --hash=sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc \ 34 | --hash=sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451 \ 35 | --hash=sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7 \ 36 | --hash=sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e \ 37 | --hash=sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566 \ 38 | --hash=sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5 \ 39 | --hash=sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26 \ 40 | --hash=sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2 \ 41 | --hash=sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42 \ 42 | --hash=sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555 \ 43 | --hash=sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43 \ 44 | --hash=sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed \ 45 | --hash=sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa \ 46 | --hash=sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516 \ 47 | --hash=sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952 \ 48 | --hash=sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd \ 49 | --hash=sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09 \ 50 | --hash=sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c \ 51 | --hash=sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f \ 52 | --hash=sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6 \ 53 | --hash=sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1 \ 54 | --hash=sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0 \ 55 | --hash=sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e \ 56 | --hash=sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9 \ 57 | --hash=sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9 \ 58 | --hash=sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e \ 59 | --hash=sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06 60 | # via -r requirements.in 61 | exceptiongroup==1.2.0 \ 62 | --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ 63 | --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 64 | # via pytest 65 | iniconfig==2.0.0 \ 66 | --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ 67 | --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 68 | # via pytest 69 | packaging==23.2 \ 70 | --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ 71 | --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 72 | # via pytest 73 | pluggy==1.3.0 \ 74 | --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ 75 | --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 76 | # via pytest 77 | pytest==7.4.3 \ 78 | --hash=sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac \ 79 | --hash=sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5 80 | # via 81 | # -r requirements.in 82 | # pytest-randomly 83 | pytest-randomly==3.15.0 \ 84 | --hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \ 85 | --hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047 86 | # via -r requirements.in 87 | tomli==2.0.1 \ 88 | --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ 89 | --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f 90 | # via 91 | # coverage 92 | # pytest 93 | -------------------------------------------------------------------------------- /requirements/py311.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.11 3 | # by the following command: 4 | # 5 | # requirements/compile.py 6 | # 7 | coverage[toml]==7.4.0 \ 8 | --hash=sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca \ 9 | --hash=sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471 \ 10 | --hash=sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a \ 11 | --hash=sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058 \ 12 | --hash=sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85 \ 13 | --hash=sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143 \ 14 | --hash=sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446 \ 15 | --hash=sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590 \ 16 | --hash=sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a \ 17 | --hash=sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105 \ 18 | --hash=sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9 \ 19 | --hash=sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a \ 20 | --hash=sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac \ 21 | --hash=sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25 \ 22 | --hash=sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2 \ 23 | --hash=sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450 \ 24 | --hash=sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932 \ 25 | --hash=sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba \ 26 | --hash=sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137 \ 27 | --hash=sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae \ 28 | --hash=sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614 \ 29 | --hash=sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70 \ 30 | --hash=sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e \ 31 | --hash=sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505 \ 32 | --hash=sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870 \ 33 | --hash=sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc \ 34 | --hash=sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451 \ 35 | --hash=sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7 \ 36 | --hash=sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e \ 37 | --hash=sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566 \ 38 | --hash=sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5 \ 39 | --hash=sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26 \ 40 | --hash=sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2 \ 41 | --hash=sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42 \ 42 | --hash=sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555 \ 43 | --hash=sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43 \ 44 | --hash=sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed \ 45 | --hash=sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa \ 46 | --hash=sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516 \ 47 | --hash=sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952 \ 48 | --hash=sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd \ 49 | --hash=sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09 \ 50 | --hash=sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c \ 51 | --hash=sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f \ 52 | --hash=sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6 \ 53 | --hash=sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1 \ 54 | --hash=sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0 \ 55 | --hash=sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e \ 56 | --hash=sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9 \ 57 | --hash=sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9 \ 58 | --hash=sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e \ 59 | --hash=sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06 60 | # via -r requirements.in 61 | iniconfig==2.0.0 \ 62 | --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ 63 | --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 64 | # via pytest 65 | packaging==23.2 \ 66 | --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ 67 | --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 68 | # via pytest 69 | pluggy==1.3.0 \ 70 | --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ 71 | --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 72 | # via pytest 73 | pytest==7.4.3 \ 74 | --hash=sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac \ 75 | --hash=sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5 76 | # via 77 | # -r requirements.in 78 | # pytest-randomly 79 | pytest-randomly==3.15.0 \ 80 | --hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \ 81 | --hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047 82 | # via -r requirements.in 83 | -------------------------------------------------------------------------------- /requirements/py312.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.12 3 | # by the following command: 4 | # 5 | # requirements/compile.py 6 | # 7 | coverage[toml]==7.4.0 \ 8 | --hash=sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca \ 9 | --hash=sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471 \ 10 | --hash=sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a \ 11 | --hash=sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058 \ 12 | --hash=sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85 \ 13 | --hash=sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143 \ 14 | --hash=sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446 \ 15 | --hash=sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590 \ 16 | --hash=sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a \ 17 | --hash=sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105 \ 18 | --hash=sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9 \ 19 | --hash=sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a \ 20 | --hash=sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac \ 21 | --hash=sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25 \ 22 | --hash=sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2 \ 23 | --hash=sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450 \ 24 | --hash=sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932 \ 25 | --hash=sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba \ 26 | --hash=sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137 \ 27 | --hash=sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae \ 28 | --hash=sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614 \ 29 | --hash=sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70 \ 30 | --hash=sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e \ 31 | --hash=sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505 \ 32 | --hash=sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870 \ 33 | --hash=sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc \ 34 | --hash=sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451 \ 35 | --hash=sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7 \ 36 | --hash=sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e \ 37 | --hash=sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566 \ 38 | --hash=sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5 \ 39 | --hash=sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26 \ 40 | --hash=sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2 \ 41 | --hash=sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42 \ 42 | --hash=sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555 \ 43 | --hash=sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43 \ 44 | --hash=sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed \ 45 | --hash=sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa \ 46 | --hash=sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516 \ 47 | --hash=sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952 \ 48 | --hash=sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd \ 49 | --hash=sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09 \ 50 | --hash=sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c \ 51 | --hash=sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f \ 52 | --hash=sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6 \ 53 | --hash=sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1 \ 54 | --hash=sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0 \ 55 | --hash=sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e \ 56 | --hash=sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9 \ 57 | --hash=sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9 \ 58 | --hash=sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e \ 59 | --hash=sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06 60 | # via -r requirements.in 61 | iniconfig==2.0.0 \ 62 | --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ 63 | --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 64 | # via pytest 65 | packaging==23.2 \ 66 | --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ 67 | --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 68 | # via pytest 69 | pluggy==1.3.0 \ 70 | --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ 71 | --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 72 | # via pytest 73 | pytest==7.4.3 \ 74 | --hash=sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac \ 75 | --hash=sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5 76 | # via 77 | # -r requirements.in 78 | # pytest-randomly 79 | pytest-randomly==3.15.0 \ 80 | --hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \ 81 | --hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047 82 | # via -r requirements.in 83 | -------------------------------------------------------------------------------- /requirements/py38.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.8 3 | # by the following command: 4 | # 5 | # requirements/compile.py 6 | # 7 | coverage[toml]==7.4.0 \ 8 | --hash=sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca \ 9 | --hash=sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471 \ 10 | --hash=sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a \ 11 | --hash=sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058 \ 12 | --hash=sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85 \ 13 | --hash=sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143 \ 14 | --hash=sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446 \ 15 | --hash=sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590 \ 16 | --hash=sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a \ 17 | --hash=sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105 \ 18 | --hash=sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9 \ 19 | --hash=sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a \ 20 | --hash=sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac \ 21 | --hash=sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25 \ 22 | --hash=sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2 \ 23 | --hash=sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450 \ 24 | --hash=sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932 \ 25 | --hash=sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba \ 26 | --hash=sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137 \ 27 | --hash=sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae \ 28 | --hash=sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614 \ 29 | --hash=sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70 \ 30 | --hash=sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e \ 31 | --hash=sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505 \ 32 | --hash=sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870 \ 33 | --hash=sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc \ 34 | --hash=sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451 \ 35 | --hash=sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7 \ 36 | --hash=sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e \ 37 | --hash=sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566 \ 38 | --hash=sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5 \ 39 | --hash=sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26 \ 40 | --hash=sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2 \ 41 | --hash=sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42 \ 42 | --hash=sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555 \ 43 | --hash=sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43 \ 44 | --hash=sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed \ 45 | --hash=sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa \ 46 | --hash=sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516 \ 47 | --hash=sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952 \ 48 | --hash=sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd \ 49 | --hash=sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09 \ 50 | --hash=sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c \ 51 | --hash=sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f \ 52 | --hash=sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6 \ 53 | --hash=sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1 \ 54 | --hash=sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0 \ 55 | --hash=sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e \ 56 | --hash=sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9 \ 57 | --hash=sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9 \ 58 | --hash=sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e \ 59 | --hash=sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06 60 | # via -r requirements.in 61 | exceptiongroup==1.2.0 \ 62 | --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ 63 | --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 64 | # via pytest 65 | importlib-metadata==7.0.1 \ 66 | --hash=sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e \ 67 | --hash=sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc 68 | # via pytest-randomly 69 | iniconfig==2.0.0 \ 70 | --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ 71 | --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 72 | # via pytest 73 | packaging==23.2 \ 74 | --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ 75 | --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 76 | # via pytest 77 | pluggy==1.3.0 \ 78 | --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ 79 | --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 80 | # via pytest 81 | pytest==7.4.3 \ 82 | --hash=sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac \ 83 | --hash=sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5 84 | # via 85 | # -r requirements.in 86 | # pytest-randomly 87 | pytest-randomly==3.15.0 \ 88 | --hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \ 89 | --hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047 90 | # via -r requirements.in 91 | tomli==2.0.1 \ 92 | --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ 93 | --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f 94 | # via 95 | # coverage 96 | # pytest 97 | zipp==3.17.0 \ 98 | --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ 99 | --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 100 | # via importlib-metadata 101 | -------------------------------------------------------------------------------- /requirements/py39.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile with Python 3.9 3 | # by the following command: 4 | # 5 | # requirements/compile.py 6 | # 7 | coverage[toml]==7.4.0 \ 8 | --hash=sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca \ 9 | --hash=sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471 \ 10 | --hash=sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a \ 11 | --hash=sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058 \ 12 | --hash=sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85 \ 13 | --hash=sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143 \ 14 | --hash=sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446 \ 15 | --hash=sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590 \ 16 | --hash=sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a \ 17 | --hash=sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105 \ 18 | --hash=sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9 \ 19 | --hash=sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a \ 20 | --hash=sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac \ 21 | --hash=sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25 \ 22 | --hash=sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2 \ 23 | --hash=sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450 \ 24 | --hash=sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932 \ 25 | --hash=sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba \ 26 | --hash=sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137 \ 27 | --hash=sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae \ 28 | --hash=sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614 \ 29 | --hash=sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70 \ 30 | --hash=sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e \ 31 | --hash=sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505 \ 32 | --hash=sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870 \ 33 | --hash=sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc \ 34 | --hash=sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451 \ 35 | --hash=sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7 \ 36 | --hash=sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e \ 37 | --hash=sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566 \ 38 | --hash=sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5 \ 39 | --hash=sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26 \ 40 | --hash=sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2 \ 41 | --hash=sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42 \ 42 | --hash=sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555 \ 43 | --hash=sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43 \ 44 | --hash=sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed \ 45 | --hash=sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa \ 46 | --hash=sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516 \ 47 | --hash=sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952 \ 48 | --hash=sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd \ 49 | --hash=sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09 \ 50 | --hash=sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c \ 51 | --hash=sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f \ 52 | --hash=sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6 \ 53 | --hash=sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1 \ 54 | --hash=sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0 \ 55 | --hash=sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e \ 56 | --hash=sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9 \ 57 | --hash=sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9 \ 58 | --hash=sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e \ 59 | --hash=sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06 60 | # via -r requirements.in 61 | exceptiongroup==1.2.0 \ 62 | --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ 63 | --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 64 | # via pytest 65 | importlib-metadata==7.0.1 \ 66 | --hash=sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e \ 67 | --hash=sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc 68 | # via pytest-randomly 69 | iniconfig==2.0.0 \ 70 | --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ 71 | --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 72 | # via pytest 73 | packaging==23.2 \ 74 | --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ 75 | --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 76 | # via pytest 77 | pluggy==1.3.0 \ 78 | --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ 79 | --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 80 | # via pytest 81 | pytest==7.4.3 \ 82 | --hash=sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac \ 83 | --hash=sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5 84 | # via 85 | # -r requirements.in 86 | # pytest-randomly 87 | pytest-randomly==3.15.0 \ 88 | --hash=sha256:0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 \ 89 | --hash=sha256:b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047 90 | # via -r requirements.in 91 | tomli==2.0.1 \ 92 | --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ 93 | --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f 94 | # via 95 | # coverage 96 | # pytest 97 | zipp==3.17.0 \ 98 | --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ 99 | --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 100 | # via importlib-metadata 101 | -------------------------------------------------------------------------------- /requirements/requirements.in: -------------------------------------------------------------------------------- 1 | coverage[toml] 2 | pytest 3 | pytest-randomly 4 | -------------------------------------------------------------------------------- /src/pytest_is_running/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | _is_running = False 4 | 5 | 6 | def is_running() -> bool: 7 | return _is_running 8 | -------------------------------------------------------------------------------- /src/pytest_is_running/plugin.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import pytest 4 | 5 | import pytest_is_running 6 | 7 | 8 | @pytest.hookimpl(tryfirst=True) 9 | def pytest_load_initial_conftests() -> None: 10 | pytest_is_running._is_running = True 11 | 12 | 13 | def pytest_unconfigure() -> None: 14 | pytest_is_running._is_running = False 15 | -------------------------------------------------------------------------------- /src/pytest_is_running/py.typed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adamchainz/pytest-is-running/b88daec02fb75298411f18ed1bd4c2034df60266/src/pytest_is_running/py.typed -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adamchainz/pytest-is-running/b88daec02fb75298411f18ed1bd4c2034df60266/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_pytest_is_running.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import os 4 | import subprocess 5 | import sys 6 | from pathlib import Path 7 | from textwrap import dedent 8 | 9 | import pytest 10 | 11 | import pytest_is_running # noqa: F401 12 | 13 | # To prevent CoverageWarning in the main process: 14 | 15 | 16 | @pytest.fixture() 17 | def our_tmp_path(tmp_path): 18 | (tmp_path / "sitecustomize.py").write_text( 19 | dedent( 20 | """\ 21 | import coverage 22 | coverage.process_startup() 23 | """ 24 | ) 25 | ) 26 | yield tmp_path 27 | 28 | 29 | PYPROJECT_PATH = Path(__file__).resolve().parent.parent / "pyproject.toml" 30 | 31 | 32 | def run_and_check(command: list[str], cwd: Path) -> None: 33 | env = dict( 34 | os.environ, PYTHONPATH=str(cwd), COVERAGE_PROCESS_START=str(PYPROJECT_PATH) 35 | ) 36 | subprocess.run( 37 | [sys.executable] + command, 38 | check=True, 39 | env=env, 40 | ) 41 | 42 | 43 | def test_not_running(our_tmp_path): 44 | example = our_tmp_path / "example.py" 45 | example.write_text( 46 | dedent( 47 | """\ 48 | import pytest_is_running 49 | assert not pytest_is_running.is_running() 50 | """ 51 | ) 52 | ) 53 | 54 | run_and_check([str(example)], cwd=our_tmp_path) 55 | 56 | 57 | def test_running(our_tmp_path): 58 | example = our_tmp_path / "example.py" 59 | example.write_text( 60 | dedent( 61 | """\ 62 | import pytest_is_running 63 | assert pytest_is_running.is_running() 64 | 65 | def test_one(): 66 | assert pytest_is_running.is_running() 67 | """ 68 | ) 69 | ) 70 | 71 | run_and_check(["-m", "pytest", str(example)], cwd=our_tmp_path) 72 | 73 | 74 | def test_running_plugin_ignored(our_tmp_path): 75 | example = our_tmp_path / "example.py" 76 | example.write_text( 77 | dedent( 78 | """\ 79 | import pytest_is_running 80 | 81 | def test_one(): 82 | assert not pytest_is_running.is_running() 83 | """ 84 | ) 85 | ) 86 | 87 | run_and_check( 88 | ["-m", "pytest", "-p", "no:is_running", str(example)], cwd=our_tmp_path 89 | ) 90 | 91 | 92 | def test_running_wrapper(our_tmp_path): 93 | example = our_tmp_path / "example.py" 94 | example.write_text( 95 | dedent( 96 | """\ 97 | import pytest_is_running 98 | assert pytest_is_running.is_running() 99 | 100 | def test_one(): 101 | assert pytest_is_running.is_running() 102 | """ 103 | ) 104 | ) 105 | wrapper = our_tmp_path / "wrapper.py" 106 | wrapper.write_text( 107 | dedent( 108 | """\ 109 | import pytest 110 | import pytest_is_running 111 | 112 | if __name__ == "__main__": 113 | assert not pytest_is_running.is_running() 114 | pytest.main(["example.py"]) 115 | assert not pytest_is_running.is_running() 116 | """ 117 | ) 118 | ) 119 | 120 | run_and_check([str(wrapper)], cwd=our_tmp_path) 121 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | requires = 3 | tox>=4.2 4 | env_list = 5 | py{312, 311, 310, 39, 38} 6 | 7 | [testenv] 8 | package = wheel 9 | deps = 10 | -r requirements/{envname}.txt 11 | set_env = 12 | PYTHONDEVMODE = 1 13 | commands = 14 | python \ 15 | -W error::ResourceWarning \ 16 | -W error::DeprecationWarning \ 17 | -W error::PendingDeprecationWarning \ 18 | -m coverage run \ 19 | -m pytest -p no:is_running {posargs:tests} 20 | 21 | [flake8] 22 | max-line-length = 88 23 | extend-ignore = E203 24 | --------------------------------------------------------------------------------