rtest


Namertest JSON
Version 0.0.18 PyPI version JSON
download
home_pageNone
SummaryPython test runner built in Rust
upload_time2025-07-08 19:27:09
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT
keywords testing pytest rust performance
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # rtest

[![PyPI version](https://badge.fury.io/py/rtest.svg)](https://badge.fury.io/py/rtest)
[![Python](https://img.shields.io/pypi/pyversions/rtest.svg)](https://pypi.org/project/rtest/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

A high-performance Python test runner built with Rust, designed as a drop-in replacement for [`pytest`](https://pytest.org) with enhanced collection resilience and built-in parallelization.

> **⚠️ Development Status**: This project is in early development (v0.0.x). While functional, expect breaking changes and evolving features as we work toward stability.

## Features

### Resilient Test Collection
Unlike [`pytest`](https://pytest.org) which stops execution when collection errors occur, `rtest` continues running tests even when some files fail to collect:

**`pytest` stops when collection fails:**
```bash
collected 22 items / 3 errors
!!!!!!!!!!!!!!!!!!!!! Interrupted: 3 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!
============================== 1 warning, 3 errors in 0.97s ==============================
# No tests run - you're stuck
```

**`rtest` keeps going:**
```bash
collected 22 items / 3 errors
!!!!!!!!!!!!!!!!!! Warning: 3 errors during collection !!!!!!!!!!!!!!!!!!!!!
================================== test session starts ===================================
# Your 22 working tests run while you fix the 3 broken files
```

### Built-in Parallelization
`rtest` includes parallel test execution out of the box, without requiring additional plugins like [`pytest-xdist`](https://github.com/pytest-dev/pytest-xdist). Simply use the `-n` flag to run tests across multiple processes:

```bash
# Run tests in parallel (recommended for large test suites)
rtest -n 4                    # Use 4 processes
rtest -n auto                 # Auto-detect CPU cores
rtest --maxprocesses 8        # Limit maximum processes
```

#### Distribution Modes

Control how tests are distributed across workers with the `--dist` flag:

- **`--dist load`** (default): Round-robin distribution of individual tests
- **`--dist loadscope`**: Group tests by module/class scope for fixture reuse
- **`--dist loadfile`**: Group tests by file to keep related tests together  
- **`--dist worksteal`**: Optimized distribution for variable test execution times
- **`--dist no`**: Sequential execution (no parallelization)

```bash
# Examples
rtest -n auto --dist loadfile      # Group by file across all CPU cores
rtest -n 4 --dist worksteal        # Work-steal optimized distribution
rtest --dist no                    # Sequential execution for debugging
```

**Note**: The `loadgroup` distribution mode from pytest-xdist is not yet supported. xdist_group mark parsing is planned for future releases.

### Current Implementation
The current implementation focuses on enhanced test collection and parallelization, with test execution delegated to [`pytest`](https://pytest.org) for maximum compatibility.

## Performance

*Benchmarks performed using [hyperfine](https://github.com/sharkdp/hyperfine) with 20 runs, 3 warmup runs per measurement, on an M4 Macbook Pro with 14 cores and 48GB RAM.* **More sophisticated benchmarks will be implemented in the future.**

### Against the [`flask`](https://github.com/pallets/flask) Repository

#### Test Collection Performance
```
hyperfine --command-name pytest --command-name rtest "uv run pytest --collect-only" "uv run rtest --collect-only" --warmup 3 --runs 20
Benchmark 1: pytest
  Time (mean ± σ):     229.9 ms ±   2.6 ms    [User: 184.5 ms, System: 37.4 ms]
  Range (min … max):   226.0 ms … 235.4 ms    20 runs
 
Benchmark 2: rtest
  Time (mean ± σ):      35.8 ms ±   1.2 ms    [User: 18.1 ms, System: 10.7 ms]
  Range (min … max):    34.2 ms …  40.3 ms    20 runs
 
Summary
  rtest ran
    6.41 ± 0.23 times faster than pytest
```

#### Test Execution Performance  
```
hyperfine --command-name pytest --command-name rtest "uv run pytest -n auto" "uv run rtest -n auto" --warmup 3 --runs 20
Benchmark 1: pytest
  Time (mean ± σ):      1.156 s ±  0.021 s    [User: 5.314 s, System: 1.044 s]
  Range (min … max):    1.128 s …  1.205 s    20 runs
 
Benchmark 2: rtest
  Time (mean ± σ):     605.4 ms ±  36.2 ms    [User: 4768.0 ms, System: 954.3 ms]
  Range (min … max):   566.0 ms … 700.1 ms    20 runs
 
Summary
  rtest ran
    1.91 ± 0.12 times faster than pytest
```

### Against the [`pydantic`](https://github.com/pydantic/pydantic) Repository

#### Test Collection Performance
```
hyperfine --command-name pytest --command-name rtest "uv run pytest --collect-only" "uv run rtest --collect-only" --warmup 3 --runs 20
Benchmark 1: pytest
  Time (mean ± σ):      2.777 s ±  0.031 s    [User: 2.598 s, System: 0.147 s]
  Range (min … max):    2.731 s …  2.864 s    20 runs
 
Benchmark 2: rtest
  Time (mean ± σ):      61.2 ms ±   1.1 ms    [User: 40.1 ms, System: 14.4 ms]
  Range (min … max):    60.1 ms …  64.2 ms    20 runs
 
Summary
  rtest ran
   45.39 ± 0.95 times faster than pytest
```

#### Test Execution Performance  

```
hyperfine --command-name pytest --command-name rtest "uv run pytest -n auto" "uv run rtest -n auto" --warmup 3 --runs 20 --ignore-failure
Benchmark 1: pytest
  Time (mean ± σ):      5.239 s ±  0.223 s    [User: 48.686 s, System: 4.160 s]
  Range (min … max):    4.964 s …  5.712 s    20 runs
 
  Warning: Ignoring non-zero exit code.
 
Benchmark 2: rtest
  Time (mean ± σ):      3.209 s ±  0.238 s    [User: 21.003 s, System: 5.131 s]
  Range (min … max):    2.935 s …  3.680 s    20 runs
 
  Warning: Ignoring non-zero exit code.
 
Summary
  rtest ran
    1.63 ± 0.14 times faster than pytest
```
*Note: `--ignore-failure` is passed at the moment because there are failures when running both `pytest` and `rtest` against the [`pydantic`](https://github.com/pydantic/pydantic) repository for reason not yet investigated.*

## Quick Start

### Installation

```bash
pip install rtest
```

*Requires Python 3.9+*

### Basic Usage

```bash
# Drop-in replacement for pytest
rtest

# That's it! All your existing pytest workflows work
rtest tests/
rtest tests/test_auth.py -v
rtest -- -k "test_user" --tb=short
```

## Advanced Usage

### Environment Configuration
```bash
# Set environment variables for your tests
rtest -e DEBUG=1 -e DATABASE_URL=sqlite://test.db

# Useful for testing different configurations
rtest -e ENVIRONMENT=staging -- tests/integration/
```

### Collection and Discovery
```bash
# See what tests would run without executing them
rtest --collect-only

# Mix `rtest` options with any pytest arguments
rtest -n 4 -- -v --tb=short -k "not slow"
```

### Python API
```python
from rtest import run_tests

# Programmatic test execution
run_tests()

# With custom pytest arguments
run_tests(pytest_args=["tests/unit/", "-v", "--tb=short"])

# Suitable for CI/CD pipelines and automation
result = run_tests(pytest_args=["--junitxml=results.xml"])
```

### Command Reference

| Option | Description |
|--------|-------------|
| `-n, --numprocesses N` | Run tests in N parallel processes |
| `--maxprocesses N` | Maximum number of worker processes |
| `-e, --env KEY=VALUE` | Set environment variables (can be repeated) |
| `--dist MODE` | Distribution mode for parallel execution (default: load) |
| `--collect-only` | Show what tests would run without executing them |
| `--help` | Show all available options |
| `--version` | Show `rtest` version |

**Pro tip**: Use `--` to separate `rtest` options from [`pytest`](https://pytest.org) arguments:
```bash
rtest -n 4 -e DEBUG=1 -- -v -k "integration" --tb=short
```

## Known Limitations

### Parametrized Test Discovery
`rtest` currently discovers only the base function names for parametrized tests (created with `@pytest.mark.parametrize`), rather than expanding them into individual test items during collection. For example:

```python
@pytest.mark.parametrize("value", [1, 2, 3])
def test_example(value):
    assert value > 0
```

**pytest collection shows:**
```
test_example[1]
test_example[2] 
test_example[3]
```

**rtest collection shows:**
```
test_example
```

However, when `rtest` executes tests using pytest as the executor, passing the base function name (`test_example`) to pytest results in identical behavior - pytest automatically runs all parametrized variants. This means test execution is functionally equivalent between the tools, but collection counts may differ.

## Contributing

We welcome contributions! Check out our [Contributing Guide](CONTRIBUTING.rst) for details on:

- Reporting bugs
- Suggesting features  
- Development setup
- Documentation improvements

## License

MIT - see [LICENSE](LICENSE) file for details.

---

## Acknowledgments

This project takes inspiration from [Astral](https://astral.sh) and leverages their excellent Rust crates:
- [`ruff_python_ast`](https://github.com/astral-sh/ruff/tree/main/crates/ruff_python_ast) - Python AST utilities
- [`ruff_python_parser`](https://github.com/astral-sh/ruff/tree/main/crates/ruff_python_parser) - Python parser implementation

**Built with Rust for the Python community**


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "rtest",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "testing, pytest, rust, performance",
    "author": null,
    "author_email": "Hugh Han <hughhan1@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/32/9c/c632d4c71e222cd5e03b77375d3cd140fa932daa3de30f5d8d87e6beb06c/rtest-0.0.18.tar.gz",
    "platform": null,
    "description": "# rtest\n\n[![PyPI version](https://badge.fury.io/py/rtest.svg)](https://badge.fury.io/py/rtest)\n[![Python](https://img.shields.io/pypi/pyversions/rtest.svg)](https://pypi.org/project/rtest/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA high-performance Python test runner built with Rust, designed as a drop-in replacement for [`pytest`](https://pytest.org) with enhanced collection resilience and built-in parallelization.\n\n> **\u26a0\ufe0f Development Status**: This project is in early development (v0.0.x). While functional, expect breaking changes and evolving features as we work toward stability.\n\n## Features\n\n### Resilient Test Collection\nUnlike [`pytest`](https://pytest.org) which stops execution when collection errors occur, `rtest` continues running tests even when some files fail to collect:\n\n**`pytest` stops when collection fails:**\n```bash\ncollected 22 items / 3 errors\n!!!!!!!!!!!!!!!!!!!!! Interrupted: 3 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!\n============================== 1 warning, 3 errors in 0.97s ==============================\n# No tests run - you're stuck\n```\n\n**`rtest` keeps going:**\n```bash\ncollected 22 items / 3 errors\n!!!!!!!!!!!!!!!!!! Warning: 3 errors during collection !!!!!!!!!!!!!!!!!!!!!\n================================== test session starts ===================================\n# Your 22 working tests run while you fix the 3 broken files\n```\n\n### Built-in Parallelization\n`rtest` includes parallel test execution out of the box, without requiring additional plugins like [`pytest-xdist`](https://github.com/pytest-dev/pytest-xdist). Simply use the `-n` flag to run tests across multiple processes:\n\n```bash\n# Run tests in parallel (recommended for large test suites)\nrtest -n 4                    # Use 4 processes\nrtest -n auto                 # Auto-detect CPU cores\nrtest --maxprocesses 8        # Limit maximum processes\n```\n\n#### Distribution Modes\n\nControl how tests are distributed across workers with the `--dist` flag:\n\n- **`--dist load`** (default): Round-robin distribution of individual tests\n- **`--dist loadscope`**: Group tests by module/class scope for fixture reuse\n- **`--dist loadfile`**: Group tests by file to keep related tests together  \n- **`--dist worksteal`**: Optimized distribution for variable test execution times\n- **`--dist no`**: Sequential execution (no parallelization)\n\n```bash\n# Examples\nrtest -n auto --dist loadfile      # Group by file across all CPU cores\nrtest -n 4 --dist worksteal        # Work-steal optimized distribution\nrtest --dist no                    # Sequential execution for debugging\n```\n\n**Note**: The `loadgroup` distribution mode from pytest-xdist is not yet supported. xdist_group mark parsing is planned for future releases.\n\n### Current Implementation\nThe current implementation focuses on enhanced test collection and parallelization, with test execution delegated to [`pytest`](https://pytest.org) for maximum compatibility.\n\n## Performance\n\n*Benchmarks performed using [hyperfine](https://github.com/sharkdp/hyperfine) with 20 runs, 3 warmup runs per measurement, on an M4 Macbook Pro with 14 cores and 48GB RAM.* **More sophisticated benchmarks will be implemented in the future.**\n\n### Against the [`flask`](https://github.com/pallets/flask) Repository\n\n#### Test Collection Performance\n```\nhyperfine --command-name pytest --command-name rtest \"uv run pytest --collect-only\" \"uv run rtest --collect-only\" --warmup 3 --runs 20\nBenchmark 1: pytest\n  Time (mean \u00b1 \u03c3):     229.9 ms \u00b1   2.6 ms    [User: 184.5 ms, System: 37.4 ms]\n  Range (min \u2026 max):   226.0 ms \u2026 235.4 ms    20 runs\n \nBenchmark 2: rtest\n  Time (mean \u00b1 \u03c3):      35.8 ms \u00b1   1.2 ms    [User: 18.1 ms, System: 10.7 ms]\n  Range (min \u2026 max):    34.2 ms \u2026  40.3 ms    20 runs\n \nSummary\n  rtest ran\n    6.41 \u00b1 0.23 times faster than pytest\n```\n\n#### Test Execution Performance  \n```\nhyperfine --command-name pytest --command-name rtest \"uv run pytest -n auto\" \"uv run rtest -n auto\" --warmup 3 --runs 20\nBenchmark 1: pytest\n  Time (mean \u00b1 \u03c3):      1.156 s \u00b1  0.021 s    [User: 5.314 s, System: 1.044 s]\n  Range (min \u2026 max):    1.128 s \u2026  1.205 s    20 runs\n \nBenchmark 2: rtest\n  Time (mean \u00b1 \u03c3):     605.4 ms \u00b1  36.2 ms    [User: 4768.0 ms, System: 954.3 ms]\n  Range (min \u2026 max):   566.0 ms \u2026 700.1 ms    20 runs\n \nSummary\n  rtest ran\n    1.91 \u00b1 0.12 times faster than pytest\n```\n\n### Against the [`pydantic`](https://github.com/pydantic/pydantic) Repository\n\n#### Test Collection Performance\n```\nhyperfine --command-name pytest --command-name rtest \"uv run pytest --collect-only\" \"uv run rtest --collect-only\" --warmup 3 --runs 20\nBenchmark 1: pytest\n  Time (mean \u00b1 \u03c3):      2.777 s \u00b1  0.031 s    [User: 2.598 s, System: 0.147 s]\n  Range (min \u2026 max):    2.731 s \u2026  2.864 s    20 runs\n \nBenchmark 2: rtest\n  Time (mean \u00b1 \u03c3):      61.2 ms \u00b1   1.1 ms    [User: 40.1 ms, System: 14.4 ms]\n  Range (min \u2026 max):    60.1 ms \u2026  64.2 ms    20 runs\n \nSummary\n  rtest ran\n   45.39 \u00b1 0.95 times faster than pytest\n```\n\n#### Test Execution Performance  \n\n```\nhyperfine --command-name pytest --command-name rtest \"uv run pytest -n auto\" \"uv run rtest -n auto\" --warmup 3 --runs 20 --ignore-failure\nBenchmark 1: pytest\n  Time (mean \u00b1 \u03c3):      5.239 s \u00b1  0.223 s    [User: 48.686 s, System: 4.160 s]\n  Range (min \u2026 max):    4.964 s \u2026  5.712 s    20 runs\n \n  Warning: Ignoring non-zero exit code.\n \nBenchmark 2: rtest\n  Time (mean \u00b1 \u03c3):      3.209 s \u00b1  0.238 s    [User: 21.003 s, System: 5.131 s]\n  Range (min \u2026 max):    2.935 s \u2026  3.680 s    20 runs\n \n  Warning: Ignoring non-zero exit code.\n \nSummary\n  rtest ran\n    1.63 \u00b1 0.14 times faster than pytest\n```\n*Note: `--ignore-failure` is passed at the moment because there are failures when running both `pytest` and `rtest` against the [`pydantic`](https://github.com/pydantic/pydantic) repository for reason not yet investigated.*\n\n## Quick Start\n\n### Installation\n\n```bash\npip install rtest\n```\n\n*Requires Python 3.9+*\n\n### Basic Usage\n\n```bash\n# Drop-in replacement for pytest\nrtest\n\n# That's it! All your existing pytest workflows work\nrtest tests/\nrtest tests/test_auth.py -v\nrtest -- -k \"test_user\" --tb=short\n```\n\n## Advanced Usage\n\n### Environment Configuration\n```bash\n# Set environment variables for your tests\nrtest -e DEBUG=1 -e DATABASE_URL=sqlite://test.db\n\n# Useful for testing different configurations\nrtest -e ENVIRONMENT=staging -- tests/integration/\n```\n\n### Collection and Discovery\n```bash\n# See what tests would run without executing them\nrtest --collect-only\n\n# Mix `rtest` options with any pytest arguments\nrtest -n 4 -- -v --tb=short -k \"not slow\"\n```\n\n### Python API\n```python\nfrom rtest import run_tests\n\n# Programmatic test execution\nrun_tests()\n\n# With custom pytest arguments\nrun_tests(pytest_args=[\"tests/unit/\", \"-v\", \"--tb=short\"])\n\n# Suitable for CI/CD pipelines and automation\nresult = run_tests(pytest_args=[\"--junitxml=results.xml\"])\n```\n\n### Command Reference\n\n| Option | Description |\n|--------|-------------|\n| `-n, --numprocesses N` | Run tests in N parallel processes |\n| `--maxprocesses N` | Maximum number of worker processes |\n| `-e, --env KEY=VALUE` | Set environment variables (can be repeated) |\n| `--dist MODE` | Distribution mode for parallel execution (default: load) |\n| `--collect-only` | Show what tests would run without executing them |\n| `--help` | Show all available options |\n| `--version` | Show `rtest` version |\n\n**Pro tip**: Use `--` to separate `rtest` options from [`pytest`](https://pytest.org) arguments:\n```bash\nrtest -n 4 -e DEBUG=1 -- -v -k \"integration\" --tb=short\n```\n\n## Known Limitations\n\n### Parametrized Test Discovery\n`rtest` currently discovers only the base function names for parametrized tests (created with `@pytest.mark.parametrize`), rather than expanding them into individual test items during collection. For example:\n\n```python\n@pytest.mark.parametrize(\"value\", [1, 2, 3])\ndef test_example(value):\n    assert value > 0\n```\n\n**pytest collection shows:**\n```\ntest_example[1]\ntest_example[2] \ntest_example[3]\n```\n\n**rtest collection shows:**\n```\ntest_example\n```\n\nHowever, when `rtest` executes tests using pytest as the executor, passing the base function name (`test_example`) to pytest results in identical behavior - pytest automatically runs all parametrized variants. This means test execution is functionally equivalent between the tools, but collection counts may differ.\n\n## Contributing\n\nWe welcome contributions! Check out our [Contributing Guide](CONTRIBUTING.rst) for details on:\n\n- Reporting bugs\n- Suggesting features  \n- Development setup\n- Documentation improvements\n\n## License\n\nMIT - see [LICENSE](LICENSE) file for details.\n\n---\n\n## Acknowledgments\n\nThis project takes inspiration from [Astral](https://astral.sh) and leverages their excellent Rust crates:\n- [`ruff_python_ast`](https://github.com/astral-sh/ruff/tree/main/crates/ruff_python_ast) - Python AST utilities\n- [`ruff_python_parser`](https://github.com/astral-sh/ruff/tree/main/crates/ruff_python_parser) - Python parser implementation\n\n**Built with Rust for the Python community**\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python test runner built in Rust",
    "version": "0.0.18",
    "project_urls": null,
    "split_keywords": [
        "testing",
        " pytest",
        " rust",
        " performance"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e2360fa1467f15888244433f5292ca7eb68461aa8d77903d1dc1e1d2bc71155e",
                "md5": "66ae8c5e5ba7173027426828c006626b",
                "sha256": "539192993f3e18e8895686f29195e30db1078652086eeda18917383a80efde7f"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "66ae8c5e5ba7173027426828c006626b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1492497,
            "upload_time": "2025-07-08T19:26:31",
            "upload_time_iso_8601": "2025-07-08T19:26:31.435211Z",
            "url": "https://files.pythonhosted.org/packages/e2/36/0fa1467f15888244433f5292ca7eb68461aa8d77903d1dc1e1d2bc71155e/rtest-0.0.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3715cc7d280c17f7a4f673ed525aa5eabe30b5409a59fd28c0a6d724c510ba24",
                "md5": "369d61a6658592f706152e5faa3e4976",
                "sha256": "9915b0df194712cc9a884dd5dedd2515d2651f66f75b516c68af8198f4997437"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp310-cp310-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "369d61a6658592f706152e5faa3e4976",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1457338,
            "upload_time": "2025-07-08T19:26:33",
            "upload_time_iso_8601": "2025-07-08T19:26:33.651256Z",
            "url": "https://files.pythonhosted.org/packages/37/15/cc7d280c17f7a4f673ed525aa5eabe30b5409a59fd28c0a6d724c510ba24/rtest-0.0.18-cp310-cp310-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "887b9d1f85e641cd0e518eea76a335acdaab9594b12b76065103621c4fb21dba",
                "md5": "311e0c8522788273e0ac2c31ea55f732",
                "sha256": "a69fa218b7459c1673f28cffa4522a2084c809f3795791bfd0df37963146ffc0"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "311e0c8522788273e0ac2c31ea55f732",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 1300819,
            "upload_time": "2025-07-08T19:26:35",
            "upload_time_iso_8601": "2025-07-08T19:26:35.088256Z",
            "url": "https://files.pythonhosted.org/packages/88/7b/9d1f85e641cd0e518eea76a335acdaab9594b12b76065103621c4fb21dba/rtest-0.0.18-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d16a943a7136881469155509e4309179c555c12afa3c667f7f0edac9849c6984",
                "md5": "926acbc43b10cd341cd2c3fc79ebdd04",
                "sha256": "f7cb8fc9c02923678a9fc7b7e5bb17e4392197f5a4fcec991adc03d741e20974"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp311-cp311-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "926acbc43b10cd341cd2c3fc79ebdd04",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1410785,
            "upload_time": "2025-07-08T19:26:36",
            "upload_time_iso_8601": "2025-07-08T19:26:36.216428Z",
            "url": "https://files.pythonhosted.org/packages/d1/6a/943a7136881469155509e4309179c555c12afa3c667f7f0edac9849c6984/rtest-0.0.18-cp311-cp311-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e02790ef7c68b617c86ad1902a28ee159a2e709b8f579b4668c748ab8ea2c35f",
                "md5": "392990dc2389d60099827c1deebed354",
                "sha256": "aa49b57a59649cef957e748991508717f20bce5231e8323501bb61692229b73e"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "392990dc2389d60099827c1deebed354",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1373084,
            "upload_time": "2025-07-08T19:26:37",
            "upload_time_iso_8601": "2025-07-08T19:26:37.853381Z",
            "url": "https://files.pythonhosted.org/packages/e0/27/90ef7c68b617c86ad1902a28ee159a2e709b8f579b4668c748ab8ea2c35f/rtest-0.0.18-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4b3332af6e6ec2b22574a8176f096dcdb3fcd8859677194d95c492f49a109afd",
                "md5": "093cf799316f5fe18cc6c7f02c99b009",
                "sha256": "de99aa3d7a91c47b62ebbbd6bca508a49d0f84eef6d4dd0a2d6de0bcca82db65"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "093cf799316f5fe18cc6c7f02c99b009",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1492289,
            "upload_time": "2025-07-08T19:26:38",
            "upload_time_iso_8601": "2025-07-08T19:26:38.960724Z",
            "url": "https://files.pythonhosted.org/packages/4b/33/32af6e6ec2b22574a8176f096dcdb3fcd8859677194d95c492f49a109afd/rtest-0.0.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "196e3adf19cabe12fd00855de9b1f5d4bc71541e849c7e457f02aefb48a56e05",
                "md5": "db7badba0151ca872a62d64ff18b1309",
                "sha256": "3a4525c0067e1554657535b6d93b64f25ea8b6558f515e2a083861f3795ed68c"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp311-cp311-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "db7badba0151ca872a62d64ff18b1309",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1456667,
            "upload_time": "2025-07-08T19:26:40",
            "upload_time_iso_8601": "2025-07-08T19:26:40.223442Z",
            "url": "https://files.pythonhosted.org/packages/19/6e/3adf19cabe12fd00855de9b1f5d4bc71541e849c7e457f02aefb48a56e05/rtest-0.0.18-cp311-cp311-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a6a915ecf588d76eacc2bdb89c90de83b459593147c98766bca6242e50218c7e",
                "md5": "e612f12dd3c529c49295d5f1056e6a1e",
                "sha256": "23f34d11420b4b3696f0228eb30aa612543f2215a60c1a553fdbef02ba0bf49c"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e612f12dd3c529c49295d5f1056e6a1e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 1300883,
            "upload_time": "2025-07-08T19:26:41",
            "upload_time_iso_8601": "2025-07-08T19:26:41.779501Z",
            "url": "https://files.pythonhosted.org/packages/a6/a9/15ecf588d76eacc2bdb89c90de83b459593147c98766bca6242e50218c7e/rtest-0.0.18-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c464bbfb9d59e2c60577e931554ae7debf60d8c52849a7d92911fb2af4bed1e4",
                "md5": "5c1fb7cef5a5f40239ad0ced66e46b2d",
                "sha256": "6c997419728e62a5edc80ed4f8fb4c768bee2480dd1803c34040b7ff42fdaac7"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp312-cp312-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5c1fb7cef5a5f40239ad0ced66e46b2d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1407782,
            "upload_time": "2025-07-08T19:26:43",
            "upload_time_iso_8601": "2025-07-08T19:26:43.084522Z",
            "url": "https://files.pythonhosted.org/packages/c4/64/bbfb9d59e2c60577e931554ae7debf60d8c52849a7d92911fb2af4bed1e4/rtest-0.0.18-cp312-cp312-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ecb8bbde95c19721a42d58b6c381ec406016f33899cdb9751e833d1e62adaedf",
                "md5": "c5b1966d1101f20bf2de27a6da5171d2",
                "sha256": "4e6594bae7c03fcd41b59167c9590e128d5133970e0adacc69d9eccbc96fe14a"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c5b1966d1101f20bf2de27a6da5171d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1369811,
            "upload_time": "2025-07-08T19:26:44",
            "upload_time_iso_8601": "2025-07-08T19:26:44.595730Z",
            "url": "https://files.pythonhosted.org/packages/ec/b8/bbde95c19721a42d58b6c381ec406016f33899cdb9751e833d1e62adaedf/rtest-0.0.18-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "badf1312dfd0ba8852194de70bd5bd2fcdffb9597ba8c8a41cc9a2f9985ef158",
                "md5": "cc2afb22d758e81becd1f0d424c66ede",
                "sha256": "de4c73f5a9d1fa93d1a2553c47a23c4ac0c66343a4c1dfe2487bb446b6b08186"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cc2afb22d758e81becd1f0d424c66ede",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1490815,
            "upload_time": "2025-07-08T19:26:46",
            "upload_time_iso_8601": "2025-07-08T19:26:46.102788Z",
            "url": "https://files.pythonhosted.org/packages/ba/df/1312dfd0ba8852194de70bd5bd2fcdffb9597ba8c8a41cc9a2f9985ef158/rtest-0.0.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8e931ae2a6dc1a84efb58999a77ed256e9d488163a1f0a20773cce2ab2b27613",
                "md5": "046a1cd6a00b18f67445e1da096804e0",
                "sha256": "68a31c376d067889545f8651afae6efa8c41ccf3a3856627274e0248f1df8c30"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp312-cp312-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "046a1cd6a00b18f67445e1da096804e0",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1455509,
            "upload_time": "2025-07-08T19:26:47",
            "upload_time_iso_8601": "2025-07-08T19:26:47.462581Z",
            "url": "https://files.pythonhosted.org/packages/8e/93/1ae2a6dc1a84efb58999a77ed256e9d488163a1f0a20773cce2ab2b27613/rtest-0.0.18-cp312-cp312-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6a6afab0131f57eab3fc6ce8ceaad822976019a0a1c6cb2b6d663ae1532f5fa5",
                "md5": "e9b823b538c9cb4dfa76a73d63fbc043",
                "sha256": "c4fdf3be7c08a237a696f6b6be4994ce063cff099d4dacd38700fb27cbb56fa7"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e9b823b538c9cb4dfa76a73d63fbc043",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 1300538,
            "upload_time": "2025-07-08T19:26:48",
            "upload_time_iso_8601": "2025-07-08T19:26:48.949243Z",
            "url": "https://files.pythonhosted.org/packages/6a/6a/fab0131f57eab3fc6ce8ceaad822976019a0a1c6cb2b6d663ae1532f5fa5/rtest-0.0.18-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f197485c3fb65ff78c61e287786b7cc83405d37187f19ea8d4fded2c33807ad4",
                "md5": "b898899b25ec8f9f715beb875ceddcbf",
                "sha256": "b857ee4109927aabbd6bb614985faa6b2fec6559fd5438baf94a760c336acce2"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp313-cp313-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b898899b25ec8f9f715beb875ceddcbf",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1407790,
            "upload_time": "2025-07-08T19:26:50",
            "upload_time_iso_8601": "2025-07-08T19:26:50.214677Z",
            "url": "https://files.pythonhosted.org/packages/f1/97/485c3fb65ff78c61e287786b7cc83405d37187f19ea8d4fded2c33807ad4/rtest-0.0.18-cp313-cp313-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a2f7658580f4493b9f7ffe8854ff1437042b22a2fb319cb80b0137af316028be",
                "md5": "9b932aa2b701fa157bbc4eda60e4ce6b",
                "sha256": "b23608cd24ca87abe8b099e4a45438c4f635c9fa10069bc2a7139662ec49dd66"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "9b932aa2b701fa157bbc4eda60e4ce6b",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1369876,
            "upload_time": "2025-07-08T19:26:51",
            "upload_time_iso_8601": "2025-07-08T19:26:51.766621Z",
            "url": "https://files.pythonhosted.org/packages/a2/f7/658580f4493b9f7ffe8854ff1437042b22a2fb319cb80b0137af316028be/rtest-0.0.18-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0261ff10e660bd6e172ac65b59f3abdcf4318e3ced5cc6313ff34056d6968f30",
                "md5": "89d2ceea53981af520124fd2ba8e3cbb",
                "sha256": "ed6bfd03ed8fd646cbd92019d9185179f4a0925108eb4c5d0de07281092e79bf"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "89d2ceea53981af520124fd2ba8e3cbb",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1490568,
            "upload_time": "2025-07-08T19:26:52",
            "upload_time_iso_8601": "2025-07-08T19:26:52.834896Z",
            "url": "https://files.pythonhosted.org/packages/02/61/ff10e660bd6e172ac65b59f3abdcf4318e3ced5cc6313ff34056d6968f30/rtest-0.0.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ce51904944bf30e76d24d62e627f77bbcf6abf7769bc2ff787204298adabba5c",
                "md5": "8c92c52265a2cef50c466279fa63763c",
                "sha256": "0e6c1f3b2fb0a2d12f2d0dfc4197d4d48014bd5645af41a29a349b3f43a4cd10"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp313-cp313-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "8c92c52265a2cef50c466279fa63763c",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1455776,
            "upload_time": "2025-07-08T19:26:53",
            "upload_time_iso_8601": "2025-07-08T19:26:53.887922Z",
            "url": "https://files.pythonhosted.org/packages/ce/51/904944bf30e76d24d62e627f77bbcf6abf7769bc2ff787204298adabba5c/rtest-0.0.18-cp313-cp313-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cb40a0173370f2b08cc27093c1d58346e64d39e670d2e1c79f7791b9b1e1486d",
                "md5": "179b0a0d51c42d4364b2f3d37c6dd283",
                "sha256": "37659a3f01fb213861a32133c765b94cf782474d9c49e29020e72c8bad4c8c9d"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp313-cp313t-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "179b0a0d51c42d4364b2f3d37c6dd283",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1455603,
            "upload_time": "2025-07-08T19:26:57",
            "upload_time_iso_8601": "2025-07-08T19:26:57.271094Z",
            "url": "https://files.pythonhosted.org/packages/cb/40/a0173370f2b08cc27093c1d58346e64d39e670d2e1c79f7791b9b1e1486d/rtest-0.0.18-cp313-cp313t-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ada795e8be0aabbb3f53aad8a1fb330dc42d0f93e92ba698e6a7236d0c9604f8",
                "md5": "3de792aae191b8b4211e48c7a0a2e59a",
                "sha256": "ccf541d37edad10322daaee31d37215bca7ecc2dfc72b394791a832069fc914d"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3de792aae191b8b4211e48c7a0a2e59a",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.9",
            "size": 1300573,
            "upload_time": "2025-07-08T19:26:56",
            "upload_time_iso_8601": "2025-07-08T19:26:56.040516Z",
            "url": "https://files.pythonhosted.org/packages/ad/a7/95e8be0aabbb3f53aad8a1fb330dc42d0f93e92ba698e6a7236d0c9604f8/rtest-0.0.18-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5b77a10d6d67e38af1ceee3ed9e31dc7862f965370fbd799a5f49fdd0ce74e60",
                "md5": "f7f64377b8c343903839b6d5ac911cf0",
                "sha256": "6fa960e211b76ff2eeb8366e7fdbb96768a749a2f2e42261e939eeb25fb82b41"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f7f64377b8c343903839b6d5ac911cf0",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.9",
            "size": 1490960,
            "upload_time": "2025-07-08T19:26:58",
            "upload_time_iso_8601": "2025-07-08T19:26:58.531030Z",
            "url": "https://files.pythonhosted.org/packages/5b/77/a10d6d67e38af1ceee3ed9e31dc7862f965370fbd799a5f49fdd0ce74e60/rtest-0.0.18-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "eaef3eb39b7a0896926edc81672dec8f9a03feb517cd30a83dd77bedf562dcad",
                "md5": "a49e72664a22b571cc049abbc084e1fd",
                "sha256": "f7486a53a43933c4f56fe1ad6d48a2d7d35aed1ed1baccfd9cc2842f75b7903a"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a49e72664a22b571cc049abbc084e1fd",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1492888,
            "upload_time": "2025-07-08T19:26:59",
            "upload_time_iso_8601": "2025-07-08T19:26:59.575339Z",
            "url": "https://files.pythonhosted.org/packages/ea/ef/3eb39b7a0896926edc81672dec8f9a03feb517cd30a83dd77bedf562dcad/rtest-0.0.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f82444bfaee0ff6a9839aadd3eefa7f3f9335883947cb43533c41163a57187f6",
                "md5": "2230cc6dac5838f62d02a2c51f750743",
                "sha256": "75fe7b106583c9a6a3597042025061f8e810c531e3d000be5c693131d969dfd8"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp39-cp39-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "2230cc6dac5838f62d02a2c51f750743",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1457293,
            "upload_time": "2025-07-08T19:27:00",
            "upload_time_iso_8601": "2025-07-08T19:27:00.853066Z",
            "url": "https://files.pythonhosted.org/packages/f8/24/44bfaee0ff6a9839aadd3eefa7f3f9335883947cb43533c41163a57187f6/rtest-0.0.18-cp39-cp39-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f5763c35eef9d7872c40194f756b938cfe04a65081d5300b42012aeb66136064",
                "md5": "35371edff85d57410a27b11b20d5a9cd",
                "sha256": "29916834a35da4ac49be4103c7adcc5565271348c3e53ce41225db93c7f515b6"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "35371edff85d57410a27b11b20d5a9cd",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 1300946,
            "upload_time": "2025-07-08T19:27:01",
            "upload_time_iso_8601": "2025-07-08T19:27:01.918235Z",
            "url": "https://files.pythonhosted.org/packages/f5/76/3c35eef9d7872c40194f756b938cfe04a65081d5300b42012aeb66136064/rtest-0.0.18-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3f3e4faa45d57e3603f071e6afc5e3f1aed33354805a66adcf65b03f57a45068",
                "md5": "d4bb0f3435eb21c7d4495fb0abe27dd5",
                "sha256": "c380c0c94c73c74c7f8bde1588119b69276c262a81546e6157125b63f522c178"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d4bb0f3435eb21c7d4495fb0abe27dd5",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.9",
            "size": 1493230,
            "upload_time": "2025-07-08T19:27:03",
            "upload_time_iso_8601": "2025-07-08T19:27:03.034036Z",
            "url": "https://files.pythonhosted.org/packages/3f/3e/4faa45d57e3603f071e6afc5e3f1aed33354805a66adcf65b03f57a45068/rtest-0.0.18-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a6a59768ad6f2b175a3f2e85a91c096830b96f075eb7edb62ec93ce1902f9673",
                "md5": "b7edfb60b8c9f8ed75bf8f317bc8a9e2",
                "sha256": "04693b26c26fe71ed58408683bba43693df50c7a1ee25a5004b6b0e1c1b1987a"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b7edfb60b8c9f8ed75bf8f317bc8a9e2",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.9",
            "size": 1457307,
            "upload_time": "2025-07-08T19:27:04",
            "upload_time_iso_8601": "2025-07-08T19:27:04.377671Z",
            "url": "https://files.pythonhosted.org/packages/a6/a5/9768ad6f2b175a3f2e85a91c096830b96f075eb7edb62ec93ce1902f9673/rtest-0.0.18-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7391ee8a2372aa4fbb9f0212bce3c7144b7a3c5eaf6500734c3b3d6d3fde2c99",
                "md5": "e94640b4c6a14d7e9985186826f63ca3",
                "sha256": "e6120acbbc30d2e7d2fe6661e0d6cf23cf8227add7ac84e498f11fe0e883a046"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e94640b4c6a14d7e9985186826f63ca3",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.9",
            "size": 1492751,
            "upload_time": "2025-07-08T19:27:05",
            "upload_time_iso_8601": "2025-07-08T19:27:05.483829Z",
            "url": "https://files.pythonhosted.org/packages/73/91/ee8a2372aa4fbb9f0212bce3c7144b7a3c5eaf6500734c3b3d6d3fde2c99/rtest-0.0.18-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "83a6a279bbb60b897ef17dea2be54465a5a0ddffc37db2bfcad1569fd8b9a9a8",
                "md5": "d504b68c316e86a370baec007e31c94d",
                "sha256": "1cd131e3fc36fa8df0eb2cee44d891fec1176bf542fb0614dc05ee14806c014f"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "d504b68c316e86a370baec007e31c94d",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.9",
            "size": 1457316,
            "upload_time": "2025-07-08T19:27:06",
            "upload_time_iso_8601": "2025-07-08T19:27:06.457854Z",
            "url": "https://files.pythonhosted.org/packages/83/a6/a279bbb60b897ef17dea2be54465a5a0ddffc37db2bfcad1569fd8b9a9a8/rtest-0.0.18-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "95e11aebc4b5df6da7b61e06c88e904dba85336476df839e92ca2cca33978d04",
                "md5": "142ae8a4ec9f950df2ef29b18b0ec647",
                "sha256": "7d53e185a50046f963cc9f9f5b4a6877d45ba64ca75208d31569d4c6066b9767"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18-pp39-pypy39_pp73-manylinux_2_34_aarch64.whl",
            "has_sig": false,
            "md5_digest": "142ae8a4ec9f950df2ef29b18b0ec647",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.9",
            "size": 1457451,
            "upload_time": "2025-07-08T19:27:07",
            "upload_time_iso_8601": "2025-07-08T19:27:07.577337Z",
            "url": "https://files.pythonhosted.org/packages/95/e1/1aebc4b5df6da7b61e06c88e904dba85336476df839e92ca2cca33978d04/rtest-0.0.18-pp39-pypy39_pp73-manylinux_2_34_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "329cc632d4c71e222cd5e03b77375d3cd140fa932daa3de30f5d8d87e6beb06c",
                "md5": "e55ab8cc32dc7c3e9a8c0f101e367529",
                "sha256": "18ce98d1fd585665d39b055f1b460e412e34d95ca89d784fd5a8db48a931033e"
            },
            "downloads": -1,
            "filename": "rtest-0.0.18.tar.gz",
            "has_sig": false,
            "md5_digest": "e55ab8cc32dc7c3e9a8c0f101e367529",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 803729,
            "upload_time": "2025-07-08T19:27:09",
            "upload_time_iso_8601": "2025-07-08T19:27:09.025851Z",
            "url": "https://files.pythonhosted.org/packages/32/9c/c632d4c71e222cd5e03b77375d3cd140fa932daa3de30f5d8d87e6beb06c/rtest-0.0.18.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-08 19:27:09",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "rtest"
}
        
Elapsed time: 0.46505s