From 0bbd28b707c36178179ca7614d2d6c218f6743ac Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 7 Oct 2025 18:31:28 +0200 Subject: [PATCH 01/20] add docs --- .gitignore | 2 + README.md | 9 +- docs/README.md | 77 ++ docs/development/ci-cd.md | 346 +++++ docs/development/contributing.md | 298 +++++ docs/development/testing.md | 424 +++++++ docs/examples/pipeline-input-examples.md | 579 +++++++++ docs/examples/plugin-examples.md | 848 +++++++++++++ docs/getting-started/installation.md | 160 +++ docs/getting-started/overview.md | 65 + docs/getting-started/quick-start.md | 259 ++++ docs/index.md | 58 + docs/schemas/pipeline-input.md | 465 +++++++ docs/schemas/plugin.md | 483 +++++++ mkdocs.yml | 78 ++ pyproject.toml | 20 + uv.lock | 1473 ++++++++++++++++++++++ 17 files changed, 5642 insertions(+), 2 deletions(-) create mode 100644 docs/README.md create mode 100644 docs/development/ci-cd.md create mode 100644 docs/development/contributing.md create mode 100644 docs/development/testing.md create mode 100644 docs/examples/pipeline-input-examples.md create mode 100644 docs/examples/plugin-examples.md create mode 100644 docs/getting-started/installation.md create mode 100644 docs/getting-started/overview.md create mode 100644 docs/getting-started/quick-start.md create mode 100644 docs/index.md create mode 100644 docs/schemas/pipeline-input.md create mode 100644 docs/schemas/plugin.md create mode 100644 mkdocs.yml create mode 100644 pyproject.toml create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore index 5509140..6e2b7a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ *.DS_Store +.cache +site diff --git a/README.md b/README.md index 14a18ef..a10672c 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,16 @@ pre-commit install To run Prettier on all files, run the following command: +### Building Documentation + +Serve documentation locally: + ```bash -pre-commit run --all-files +uv sync --extra docs +uv run mkdocs serve ``` -This is done automatically when committing. +Then open `http://127.0.0.1:8000` in your browser. ### Testing schemas diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..792adbb --- /dev/null +++ b/docs/README.md @@ -0,0 +1,77 @@ +# Documentation + +This directory contains the MkDocs documentation for Nextflow Schemas. + +## Building Documentation + +### Install Dependencies + +Using uv: + +```bash +uv sync --extra docs +``` + +### Serve Locally + +Start the development server: + +```bash +uv run mkdocs serve +``` + +Then open your browser to `http://127.0.0.1:8000` + +### Build Static Site + +Generate static HTML: + +```bash +uv run mkdocs build +``` + +Output will be in the `site/` directory. + +## Deploy to GitHub Pages + +```bash +uv run mkdocs gh-deploy +``` + +## Documentation Structure + +``` +docs/ +├── index.md # Home page +├── getting-started/ +│ ├── overview.md # Overview of the project +│ ├── installation.md # Installation instructions +│ └── quick-start.md # Quick start guide +├── schemas/ +│ ├── pipeline-input.md # Pipeline input schema reference +│ └── plugin.md # Plugin schema reference +├── development/ +│ ├── contributing.md # Contributing guidelines +│ ├── testing.md # Testing guide +│ └── ci-cd.md # CI/CD documentation +└── examples/ + ├── pipeline-input-examples.md # Pipeline examples + └── plugin-examples.md # Plugin examples +``` + +## Writing Documentation + +- Use GitHub-flavored Markdown +- Code blocks should specify language for syntax highlighting +- Use admonitions for notes, warnings, tips: + + ```markdown + !!! note + This is a note + + !!! warning + This is a warning + ``` + +- Cross-reference other pages with relative links +- Include practical examples where possible diff --git a/docs/development/ci-cd.md b/docs/development/ci-cd.md new file mode 100644 index 0000000..7b72d9d --- /dev/null +++ b/docs/development/ci-cd.md @@ -0,0 +1,346 @@ +# CI/CD + +This document describes the continuous integration and deployment setup for the Nextflow Schemas repository. + +## Overview + +The repository uses GitHub Actions to automatically validate schemas and test cases on every push and pull request. + +## Workflows + +### Schema Validation Workflow + +**File**: `.github/workflows/test.yml` + +**Triggers**: + +- Push to any branch that modifies: + - `*.json` files + - `validate.sh` script + - The workflow file itself +- Pull requests with the same file changes + +**Jobs**: + +#### Test Job + +**Runs on**: `ubuntu-latest` + +**Steps**: + +1. **Checkout code** + + ```yaml + - uses: actions/checkout@v4 + ``` + +2. **Set up Python** + + ```yaml + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + ``` + +3. **Install dependencies** + + ```bash + pip install check-jsonschema + ``` + +4. **Run validation** + ```bash + ./validate.sh + ``` + +### Expected Behavior + +#### ✅ Success Criteria + +The workflow passes when: + +- All schema files are valid JSON Schema Draft 2020-12 +- All `valid_*.json` test files pass validation +- All `invalid_*.json` test files fail validation +- No syntax errors in scripts + +#### ❌ Failure Scenarios + +The workflow fails if: + +- Schema files contain errors +- Test files don't match naming expectations +- Script execution errors occur +- `valid_*` files fail validation +- `invalid_*` files pass validation + +## Validation Script + +### Script Overview + +The `validate.sh` script: + +1. Validates each schema against JSON Schema Draft 2020-12 +2. Validates test cases against their respective schemas +3. Checks that test naming matches expectations +4. Returns exit code 0 on success, 1 on failure + +### Script Logic + +```bash +#!/bin/bash + +for folder in pipeline-input plugin ; do + # Validate schema itself + check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema "$folder/schema.json" + + # Validate test cases + for spec in $folder/tests/*.json ; do + if check-jsonschema --schemafile "$folder/schema.json" "$spec"; then + # Should start with "valid*" + if [[ $(basename "$spec") != invalid* ]]; then + echo "✓ Valid" + else + # Failed: invalid* file passed validation + failed=1 + fi + else + # Should start with "invalid*" + if [[ $(basename "$spec") == invalid* ]]; then + echo "✓ Invalid" + else + # Failed: valid* file failed validation + failed=1 + fi + fi + done +done + +exit $failed +``` + +## Docker Validation + +### Docker Script + +**File**: `validate-docker.sh` + +Provides containerized validation for consistent environments: + +```bash +./validate-docker.sh +``` + +**Benefits**: + +- No local dependencies required +- Consistent validation environment +- Easy to reproduce CI results locally + +### Implementation + +```bash +#!/bin/bash + +docker run --rm -v "$(pwd):/workspace" -w /workspace python:3 bash -c " + pip install check-jsonschema && ./validate.sh +" +``` + +## Status Checks + +### Required Checks + +Pull requests must pass: + +- ✅ Schema validation +- ✅ Test case validation +- ✅ Naming convention checks + +### Branch Protection + +Recommended settings for `main` branch: + +- Require status checks before merging +- Require `test` workflow to pass +- Require up-to-date branches + +## Local Validation + +### Before Pushing + +Always validate locally: + +```bash +# Standard validation +./validate.sh + +# Docker validation (matches CI) +./validate-docker.sh +``` + +### Pre-commit Hooks + +Install pre-commit hooks to catch issues early: + +```bash +uv pip install pre-commit +pre-commit install +``` + +Hooks will: + +- Format JSON with Prettier +- Validate syntax +- Check for common issues + +## Debugging CI Failures + +### View Logs + +1. Go to the Actions tab in GitHub +2. Click on the failed workflow run +3. Expand the failed job +4. Review the validation output + +### Reproduce Locally + +Use Docker to match CI environment: + +```bash +./validate-docker.sh +``` + +### Common Issues + +#### Schema Validation Errors + +**Problem**: Schema file doesn't conform to JSON Schema Draft 2020-12 + +**Solution**: Check schema syntax against the specification + +```bash +check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema pipeline-input/schema.json +``` + +#### Test Case Failures + +**Problem**: `valid_*` file fails or `invalid_*` file passes + +**Solution**: + +1. Verify the test case is correct +2. Check if naming matches content +3. Validate manually to see error details + +```bash +check-jsonschema --schemafile pipeline-input/schema.json --verbose pipeline-input/tests/problematic_test.json +``` + +#### Permission Errors + +**Problem**: Script not executable + +**Solution**: Make scripts executable + +```bash +chmod +x validate.sh validate-docker.sh +``` + +#### JSON Syntax Errors + +**Problem**: Malformed JSON + +**Solution**: Validate JSON syntax + +```bash +python -m json.tool test.json +``` + +## Deployment + +### Documentation Deployment + +To deploy documentation (when set up): + +```bash +# Build documentation +uv run mkdocs build + +# Deploy to GitHub Pages +uv run mkdocs gh-deploy +``` + +### Release Process + +1. Update version numbers if applicable +2. Tag the release: + ```bash + git tag -a v1.0.0 -m "Release version 1.0.0" + git push origin v1.0.0 + ``` +3. Create GitHub release from tag +4. CI will automatically validate the release + +## Performance Optimization + +### Caching + +GitHub Actions caches Python dependencies: + +```yaml +- uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml') }} +``` + +### Parallel Testing + +Tests run in parallel when possible: + +- Schema validation runs concurrently +- Test cases are validated in batch + +## Monitoring + +### Workflow Status Badge + +Add to README.md: + +```markdown +![CI](https://github.com/nextflow-io/schemas/workflows/test/badge.svg) +``` + +### Notifications + +Configure notifications in GitHub settings: + +- Email on workflow failures +- Slack/Discord webhooks (optional) + +## Best Practices + +1. **Run tests locally** before pushing +2. **Keep workflows simple** and focused +3. **Cache dependencies** to speed up CI +4. **Use Docker validation** to match CI environment +5. **Monitor workflow status** regularly +6. **Update dependencies** periodically + +## Future Enhancements + +Potential improvements: + +- [ ] Add schema linting checks +- [ ] Performance benchmarking +- [ ] Automated release notes generation +- [ ] Coverage reporting +- [ ] Multi-version Python testing +- [ ] Automated documentation deployment + +## See Also + +- [Testing Guide](testing.md) +- [Contributing Guidelines](contributing.md) +- [GitHub Actions Documentation](https://docs.github.com/en/actions) diff --git a/docs/development/contributing.md b/docs/development/contributing.md new file mode 100644 index 0000000..d7bc554 --- /dev/null +++ b/docs/development/contributing.md @@ -0,0 +1,298 @@ +# Contributing Guidelines + +Thank you for your interest in contributing to Nextflow Schemas! This guide will help you get started. + +## Getting Started + +### Prerequisites + +- Git +- Python 3.8+ +- [uv](https://github.com/astral-sh/uv) package manager +- Docker (optional, for containerized validation) + +### Fork and Clone + +1. Fork the repository on GitHub +2. Clone your fork locally: + +```bash +git clone https://github.com/YOUR-USERNAME/schemas.git +cd schemas +``` + +3. Add the upstream repository: + +```bash +git remote add upstream https://github.com/nextflow-io/schemas.git +``` + +### Install Dependencies + +```bash +# Install all dependencies including dev tools +uv sync + +# Install pre-commit hooks +uv pip install pre-commit +pre-commit install +``` + +## Development Workflow + +### 1. Create a Branch + +Create a feature branch for your changes: + +```bash +git checkout -b feature/my-new-feature +``` + +Use descriptive branch names: + +- `feature/add-new-format` - New features +- `fix/validation-error` - Bug fixes +- `docs/update-examples` - Documentation updates + +### 2. Make Changes + +#### Modifying Schemas + +When modifying `pipeline-input/schema.json` or `plugin/schema.json`: + +1. Update the schema file +2. Add test cases (both valid and invalid) +3. Run validation to ensure correctness +4. Update documentation if needed + +#### Adding Test Cases + +Add test files to the appropriate `tests/` directory: + +**Valid test cases** (should pass validation): + +```bash +# Name files with valid_ prefix +touch pipeline-input/tests/valid_my_test.json +``` + +**Invalid test cases** (should fail validation): + +```bash +# Name files with invalid_ prefix +touch pipeline-input/tests/invalid_my_test.json +``` + +The validation script automatically checks: + +- Files starting with `valid_` must pass validation +- Files starting with `invalid_` must fail validation + +### 3. Format Code + +Pre-commit hooks will automatically format JSON files with Prettier: + +```bash +# Run manually on all files +pre-commit run --all-files + +# Or commit to trigger hooks +git commit -m "Your commit message" +``` + +### 4. Validate Changes + +Run the validation script: + +```bash +./validate.sh +``` + +This validates: + +- Schema files against JSON Schema Draft 2020-12 +- All test cases against their respective schemas +- Test case naming conventions + +Expected output: + +``` +Validating pipeline-input/schema.json ... +ok -- validation done, no errors + +Validating test cases... +Testing pipeline-input/tests/valid_schema.json: +ok -- validation done, no errors +✓ Valid + +Testing pipeline-input/tests/invalid_schema.json: +ValidationError: ... +✓ Invalid +``` + +### 5. Run Docker Validation (Optional) + +Test in a clean environment: + +```bash +./validate-docker.sh +``` + +### 6. Update Documentation + +If your changes affect usage: + +1. Update relevant documentation in `docs/` +2. Build docs locally to verify: + +```bash +uv sync --extra docs +uv run mkdocs serve +``` + +3. Check the docs at `http://127.0.0.1:8000` + +### 7. Commit Changes + +Write clear, descriptive commit messages: + +```bash +git add . +git commit -m "Add new format validation for date-time-local + +- Add date-time-local to allowed formats +- Include test cases for valid and invalid inputs +- Update documentation with examples" +``` + +Good commit messages: + +- Use the imperative mood ("Add feature" not "Added feature") +- Keep the first line under 50 characters +- Provide details in the body if needed +- Reference issues if applicable (#123) + +### 8. Push and Create PR + +```bash +git push origin feature/my-new-feature +``` + +Then create a Pull Request on GitHub. + +## Pull Request Guidelines + +### PR Description + +Include in your PR description: + +- **Purpose**: What does this PR do? +- **Changes**: What files/functionality changed? +- **Testing**: How did you test the changes? +- **Breaking Changes**: Any breaking changes? +- **Related Issues**: Link to related issues + +### PR Checklist + +Before submitting: + +- [ ] Code follows existing style and conventions +- [ ] All tests pass (`./validate.sh`) +- [ ] New test cases added for changes +- [ ] Documentation updated if needed +- [ ] Commit messages are clear and descriptive +- [ ] Pre-commit hooks pass +- [ ] No merge conflicts with main branch + +### Review Process + +1. Automated CI checks will run on your PR +2. Maintainers will review your changes +3. Address any feedback or requested changes +4. Once approved, a maintainer will merge your PR + +## Testing Guidelines + +### Writing Good Tests + +**Valid test cases** should: + +- Cover common use cases +- Test edge cases within valid bounds +- Include all required properties +- Use realistic example data + +**Invalid test cases** should: + +- Test each validation rule +- Cover missing required properties +- Test invalid types +- Test constraint violations (min/max, pattern, etc.) + +### Test Naming + +Use descriptive names that indicate what is being tested: + +``` +valid_minimal_schema.json +valid_full_featured_schema.json +valid_with_parameter_groups.json +invalid_missing_required_type.json +invalid_wrong_format.json +invalid_exceeds_maximum.json +``` + +## Code Style + +### JSON Formatting + +- Use 2 spaces for indentation +- Use double quotes for strings +- Include trailing commas where allowed +- Keep arrays/objects readable + +Prettier will enforce these automatically. + +### Schema Conventions + +- Use descriptive property names +- Provide clear descriptions for all properties +- Include examples where helpful +- Document custom keywords + +## Reporting Issues + +### Bug Reports + +Include: + +- Clear description of the issue +- Steps to reproduce +- Expected vs actual behavior +- Schema/test file that demonstrates the issue +- Environment details (OS, Python version, etc.) + +### Feature Requests + +Include: + +- Clear description of the feature +- Use cases and benefits +- Examples of how it would work +- Any alternative solutions considered + +## Getting Help + +- **GitHub Issues**: Ask questions or report problems +- **Discussions**: Discuss ideas or get feedback +- **Nextflow Community**: Join the broader community + +## License + +By contributing, you agree that your contributions will be licensed under the same license as the project. + +## Recognition + +Contributors will be recognized in the project's release notes and GitHub contributors page. + +Thank you for contributing to Nextflow Schemas! 🎉 diff --git a/docs/development/testing.md b/docs/development/testing.md new file mode 100644 index 0000000..497e22b --- /dev/null +++ b/docs/development/testing.md @@ -0,0 +1,424 @@ +# Testing Guide + +This guide covers testing strategies for Nextflow schemas, including writing test cases, running validations, and interpreting results. + +## Test Organization + +Tests are organized by schema type: + +``` +pipeline-input/tests/ +├── valid_minimal_schema.json +├── valid_full_featured_schema.json +├── invalid_missing_type.json +└── invalid_schema.json + +plugin/tests/ +├── valid_schema.json +└── invalid_schema.json +``` + +## Test Naming Convention + +Test files must follow this naming pattern: + +- **`valid_*.json`** - Files that should pass validation +- **`invalid_*.json`** - Files that should fail validation + +The validation script (`validate.sh`) automatically: + +- Expects `valid_*` files to pass +- Expects `invalid_*` files to fail +- Reports errors if expectations aren't met + +## Running Tests + +### Run All Tests + +```bash +./validate.sh +``` + +This validates: + +1. Schema files against JSON Schema Draft 2020-12 +2. All test cases against their schemas +3. Naming convention compliance + +### Run Tests with Docker + +Use Docker for a clean, isolated environment: + +```bash +./validate-docker.sh +``` + +### Validate a Single File + +Test a specific schema or test file: + +```bash +# Validate a schema file +check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema pipeline-input/schema.json + +# Validate a test case +check-jsonschema --schemafile pipeline-input/schema.json pipeline-input/tests/valid_schema.json +``` + +### Validate Your Own Files + +```bash +# Validate your pipeline schema +check-jsonschema --schemafile pipeline-input/schema.json /path/to/my-pipeline-schema.json + +# Validate your plugin spec +check-jsonschema --schemafile plugin/schema.json /path/to/my-plugin-spec.json +``` + +## Writing Test Cases + +### Valid Test Cases + +Valid test cases should pass validation and cover: + +#### Minimal Valid Case + +Test the absolute minimum required properties: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/minimal-schema.json", + "title": "Minimal Schema", + "description": "Minimal valid schema", + "type": "object" +} +``` + +#### Complete Feature Coverage + +Test all schema features: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/full-schema.json", + "title": "Full Featured Schema", + "description": "Schema with all features", + "type": "object", + "properties": { + "input": { + "type": "string", + "format": "file-path", + "description": "Input file", + "exists": true, + "help_text": "Path to input file", + "fa_icon": "fas fa-file" + }, + "threads": { + "type": "integer", + "minimum": 1, + "maximum": 64, + "default": 4, + "description": "Thread count" + }, + "format": { + "type": "string", + "enum": ["json", "csv", "tsv"], + "default": "json", + "description": "Output format" + } + }, + "$defs": { + "advanced_options": { + "title": "Advanced Options", + "type": "object", + "properties": { + "debug": { + "type": "boolean", + "description": "Enable debug mode", + "default": false + } + } + } + }, + "allOf": [{ "$ref": "#/$defs/advanced_options" }] +} +``` + +#### Edge Cases + +Test boundary conditions: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/edge-case.json", + "title": "Edge Case Schema", + "description": "Testing edge cases", + "type": "object", + "properties": { + "nullable_string": { + "type": ["string", "null"], + "description": "Can be string or null" + }, + "zero_value": { + "type": "integer", + "minimum": 0, + "description": "Can be zero" + }, + "empty_string": { + "type": "string", + "minLength": 0, + "description": "Can be empty" + } + } +} +``` + +### Invalid Test Cases + +Invalid test cases should fail validation and test specific error conditions: + +#### Missing Required Properties + +```json +{ + "title": "Invalid - Missing Required", + "description": "Missing $schema, $id, and type" +} +``` + +#### Wrong Type + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/wrong-type.json", + "title": "Invalid Type", + "description": "Wrong type value", + "type": "array" +} +``` + +#### Invalid Property Definition + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/invalid-prop.json", + "title": "Invalid Property", + "description": "Property missing required fields", + "type": "object", + "properties": { + "bad_param": { + "type": "string" + } + } +} +``` + +#### Constraint Violations + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/invalid-constraint.json", + "title": "Invalid Constraint", + "description": "Testing constraint violations", + "type": "object", + "properties": { + "threads": { + "type": "integer", + "minimum": 10, + "maximum": 5, + "description": "Invalid: min > max" + } + } +} +``` + +#### Invalid Format Usage + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/invalid-format.json", + "title": "Invalid Format", + "description": "Wrong format usage", + "type": "object", + "properties": { + "input": { + "type": "string", + "format": "file-path", + "exists": true, + "description": "Input file" + }, + "bad_exists": { + "type": "integer", + "exists": true, + "description": "Invalid: exists on non-string type" + } + } +} +``` + +## Test Coverage Guidelines + +Ensure comprehensive test coverage: + +### Required Coverage + +- ✅ Minimal valid case +- ✅ All required properties +- ✅ Missing each required property +- ✅ Wrong types for key properties + +### Recommended Coverage + +- ✅ All schema features (if applicable) +- ✅ Parameter groups and `allOf` references +- ✅ Custom keywords (`exists`, `schema`, etc.) +- ✅ Constraint boundaries (min/max values) +- ✅ Format validation +- ✅ Enum validation +- ✅ Pattern matching +- ✅ Dependent requirements + +### Plugin Schema Coverage + +- ✅ Each definition type (ConfigScope, ConfigOption, Function, Operator, Factory) +- ✅ Nested configuration scopes +- ✅ Functions with and without parameters +- ✅ Various parameter types + +## Interpreting Test Results + +### Successful Test Run + +```bash +$ ./validate.sh +Validating pipeline-input/schema.json ... +ok -- validation done, no errors + +Validating test cases... +Testing pipeline-input/tests/valid_schema.json: +ok -- validation done, no errors +✓ Valid + +Testing pipeline-input/tests/invalid_schema.json: +ValidationError: 'type' is a required property +✓ Invalid + +Validating plugin/schema.json ... +ok -- validation done, no errors +... +``` + +All tests passed ✅ + +### Failed Test Run + +```bash +$ ./validate.sh +Validating pipeline-input/schema.json ... +ValidationError: Additional properties are not allowed ('bad_property' was unexpected) +``` + +Schema itself is invalid ❌ + +```bash +Testing pipeline-input/tests/valid_schema.json: +ValidationError: 'description' is a required property +``` + +A supposedly valid test case failed validation ❌ + +```bash +Testing pipeline-input/tests/invalid_schema.json: +ok -- validation done, no errors +``` + +A supposedly invalid test case passed validation ❌ + +## Continuous Integration + +### GitHub Actions + +Tests run automatically on: + +- Push to any branch +- Pull requests +- Changes to `*.json` files +- Changes to `validate.sh` + +### CI Workflow + +The CI workflow: + +1. Checks out the repository +2. Installs Python and `check-jsonschema` +3. Runs `./validate.sh` +4. Reports results + +## Debugging Failed Tests + +### Check Schema Validity + +First, ensure the schema itself is valid: + +```bash +check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema pipeline-input/schema.json +``` + +### Verbose Validation + +Get detailed error messages: + +```bash +check-jsonschema --schemafile pipeline-input/schema.json --verbose pipeline-input/tests/invalid_test.json +``` + +### Test Individual Properties + +Isolate the problem by testing minimal cases: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/test.json", + "title": "Test", + "description": "Isolate problematic property", + "type": "object", + "properties": { + "problematic_param": { + "type": "string", + "description": "Testing this specific parameter" + } + } +} +``` + +### Check JSON Syntax + +Ensure JSON is well-formed: + +```bash +python -m json.tool test.json +``` + +## Best Practices + +1. **Test one thing at a time** - Each invalid test should fail for one specific reason +2. **Use descriptive names** - Make it clear what each test validates +3. **Cover edge cases** - Test boundary conditions and unusual inputs +4. **Keep tests simple** - Avoid unnecessary complexity +5. **Document expectations** - Add comments if the test case isn't obvious +6. **Run tests frequently** - Validate after each change + +## See Also + +- [Contributing Guidelines](contributing.md) +- [CI/CD Documentation](ci-cd.md) +- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) +- [Plugin Schema Reference](../schemas/plugin.md) diff --git a/docs/examples/pipeline-input-examples.md b/docs/examples/pipeline-input-examples.md new file mode 100644 index 0000000..19b5773 --- /dev/null +++ b/docs/examples/pipeline-input-examples.md @@ -0,0 +1,579 @@ +# Pipeline Input Examples + +This page provides practical examples of pipeline input schemas for various use cases. + +## Basic Examples + +### Minimal Schema + +The simplest valid schema with only required properties: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/minimal-schema.json", + "title": "Minimal Pipeline", + "description": "Minimal valid pipeline schema", + "type": "object" +} +``` + +### Simple Parameters + +Basic parameter definitions: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/simple-params.json", + "title": "Simple Parameters", + "description": "Basic parameter types", + "type": "object", + "properties": { + "input": { + "type": "string", + "format": "file-path", + "description": "Input file path" + }, + "output_dir": { + "type": "string", + "format": "directory-path", + "description": "Output directory", + "default": "./results" + }, + "threads": { + "type": "integer", + "minimum": 1, + "maximum": 32, + "default": 4, + "description": "Number of threads" + }, + "verbose": { + "type": "boolean", + "description": "Enable verbose output", + "default": false + } + } +} +``` + +## RNA-Seq Pipeline + +Comprehensive RNA-Seq analysis pipeline schema: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://github.com/my-org/rnaseq-pipeline/schema.json", + "title": "RNA-Seq Pipeline Parameters", + "description": "Parameters for RNA sequencing analysis", + "type": "object", + "$defs": { + "input_output_options": { + "title": "Input/Output Options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define input data and output locations", + "required": ["input", "outdir"], + "properties": { + "input": { + "type": "string", + "format": "file-path", + "exists": true, + "description": "Path to samplesheet CSV", + "help_text": "CSV file with columns: sample,fastq_1,fastq_2,strandedness", + "fa_icon": "fas fa-file-csv" + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "Output directory", + "default": "./results", + "fa_icon": "fas fa-folder-open" + } + } + }, + "reference_genome_options": { + "title": "Reference Genome", + "type": "object", + "fa_icon": "fas fa-dna", + "description": "Reference genome configuration", + "properties": { + "genome": { + "type": "string", + "description": "Reference genome name", + "enum": ["GRCh38", "GRCh37", "GRCm39", "GRCm38"], + "help_text": "Select a built-in reference genome" + }, + "fasta": { + "type": "string", + "format": "file-path", + "description": "Custom reference genome FASTA", + "help_text": "Path to custom reference genome (overrides --genome)" + }, + "gtf": { + "type": "string", + "format": "file-path", + "description": "Custom GTF annotation file", + "help_text": "Gene annotation in GTF format" + } + } + }, + "alignment_options": { + "title": "Alignment Options", + "type": "object", + "fa_icon": "fas fa-align-center", + "description": "Read alignment parameters", + "properties": { + "aligner": { + "type": "string", + "enum": ["star", "hisat2"], + "default": "star", + "description": "RNA-seq aligner to use" + }, + "min_mapping_quality": { + "type": "integer", + "minimum": 0, + "maximum": 60, + "default": 10, + "description": "Minimum mapping quality score", + "help_text": "Reads with mapping quality below this threshold will be filtered" + } + } + }, + "quantification_options": { + "title": "Quantification Options", + "type": "object", + "fa_icon": "fas fa-calculator", + "description": "Gene/transcript quantification settings", + "properties": { + "pseudo_aligner": { + "type": "string", + "enum": ["salmon", "kallisto"], + "default": "salmon", + "description": "Pseudo-aligner for quantification" + }, + "skip_quantification": { + "type": "boolean", + "default": false, + "description": "Skip quantification step" + } + } + }, + "quality_control_options": { + "title": "Quality Control", + "type": "object", + "fa_icon": "fas fa-check-circle", + "description": "Quality control parameters", + "properties": { + "skip_fastqc": { + "type": "boolean", + "default": false, + "description": "Skip FastQC" + }, + "skip_multiqc": { + "type": "boolean", + "default": false, + "description": "Skip MultiQC report generation" + } + } + }, + "resource_options": { + "title": "Resource Options", + "type": "object", + "fa_icon": "fas fa-server", + "description": "Computational resource settings", + "properties": { + "max_cpus": { + "type": "integer", + "minimum": 1, + "default": 16, + "description": "Maximum CPUs per process" + }, + "max_memory": { + "type": "string", + "pattern": "^\\d+\\.(GB|MB)$", + "default": "128.GB", + "description": "Maximum memory per process", + "examples": ["128.GB", "256.GB"] + }, + "max_time": { + "type": "string", + "pattern": "^\\d+\\.(h|d)$", + "default": "240.h", + "description": "Maximum time per process", + "examples": ["240.h", "10.d"] + } + } + } + }, + "allOf": [ + { "$ref": "#/$defs/input_output_options" }, + { "$ref": "#/$defs/reference_genome_options" }, + { "$ref": "#/$defs/alignment_options" }, + { "$ref": "#/$defs/quantification_options" }, + { "$ref": "#/$defs/quality_control_options" }, + { "$ref": "#/$defs/resource_options" } + ] +} +``` + +## Variant Calling Pipeline + +Genomic variant calling pipeline: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://github.com/my-org/variant-calling/schema.json", + "title": "Variant Calling Pipeline", + "description": "Parameters for variant calling from sequencing data", + "type": "object", + "$defs": { + "input_output_options": { + "title": "Input/Output Options", + "type": "object", + "required": ["input", "outdir"], + "properties": { + "input": { + "type": "string", + "format": "file-path-pattern", + "description": "Input FASTQ files", + "help_text": "Path to input files. Use wildcards like: 'data/*.fastq.gz'", + "examples": ["data/*.fastq.gz", "samples/*_R{1,2}.fastq.gz"] + }, + "outdir": { + "type": "string", + "format": "directory-path", + "default": "./results", + "description": "Output directory" + }, + "publish_dir_mode": { + "type": "string", + "enum": ["symlink", "copy", "move"], + "default": "copy", + "description": "Method for publishing files to output directory" + } + } + }, + "reference_options": { + "title": "Reference Options", + "type": "object", + "required": ["reference"], + "properties": { + "reference": { + "type": "string", + "format": "file-path", + "exists": true, + "description": "Reference genome FASTA file" + }, + "known_sites": { + "type": "string", + "format": "file-path", + "description": "Known variant sites VCF for recalibration" + } + } + }, + "variant_calling_options": { + "title": "Variant Calling", + "type": "object", + "properties": { + "caller": { + "type": "string", + "enum": ["gatk", "freebayes", "bcftools"], + "default": "gatk", + "description": "Variant calling tool" + }, + "ploidy": { + "type": "integer", + "minimum": 1, + "maximum": 4, + "default": 2, + "description": "Sample ploidy" + }, + "min_base_quality": { + "type": "integer", + "minimum": 0, + "maximum": 60, + "default": 20, + "description": "Minimum base quality score" + } + } + }, + "filtering_options": { + "title": "Filtering Options", + "type": "object", + "properties": { + "min_depth": { + "type": "integer", + "minimum": 1, + "default": 10, + "description": "Minimum read depth" + }, + "min_quality": { + "type": "number", + "minimum": 0, + "default": 30.0, + "description": "Minimum variant quality score" + }, + "filter_low_qual": { + "type": "boolean", + "default": true, + "description": "Filter low-quality variants" + } + } + } + }, + "allOf": [ + { "$ref": "#/$defs/input_output_options" }, + { "$ref": "#/$defs/reference_options" }, + { "$ref": "#/$defs/variant_calling_options" }, + { "$ref": "#/$defs/filtering_options" } + ], + "dependentRequired": { + "known_sites": ["reference"] + } +} +``` + +## Machine Learning Pipeline + +Data processing and ML pipeline: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://github.com/my-org/ml-pipeline/schema.json", + "title": "Machine Learning Pipeline", + "description": "Parameters for ML model training pipeline", + "type": "object", + "$defs": { + "data_options": { + "title": "Data Options", + "type": "object", + "required": ["training_data"], + "properties": { + "training_data": { + "type": "string", + "format": "file-path", + "exists": true, + "description": "Training dataset" + }, + "validation_data": { + "type": "string", + "format": "file-path", + "description": "Validation dataset (optional)" + }, + "test_data": { + "type": "string", + "format": "file-path", + "description": "Test dataset (optional)" + }, + "data_format": { + "type": "string", + "enum": ["csv", "parquet", "json"], + "default": "csv", + "description": "Input data format" + } + } + }, + "preprocessing_options": { + "title": "Preprocessing", + "type": "object", + "properties": { + "normalize": { + "type": "boolean", + "default": true, + "description": "Normalize features" + }, + "impute_missing": { + "type": "boolean", + "default": true, + "description": "Impute missing values" + }, + "feature_selection": { + "type": "string", + "enum": ["none", "variance", "mutual_info", "rfe"], + "default": "none", + "description": "Feature selection method" + } + } + }, + "model_options": { + "title": "Model Options", + "type": "object", + "properties": { + "model_type": { + "type": "string", + "enum": ["random_forest", "xgboost", "neural_network", "svm"], + "default": "random_forest", + "description": "Model architecture" + }, + "random_seed": { + "type": "integer", + "minimum": 0, + "default": 42, + "description": "Random seed for reproducibility" + }, + "n_estimators": { + "type": "integer", + "minimum": 1, + "default": 100, + "description": "Number of estimators (tree-based models)" + }, + "learning_rate": { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 1, + "default": 0.01, + "description": "Learning rate" + } + } + }, + "training_options": { + "title": "Training Options", + "type": "object", + "properties": { + "epochs": { + "type": "integer", + "minimum": 1, + "default": 100, + "description": "Training epochs" + }, + "batch_size": { + "type": "integer", + "minimum": 1, + "multipleOf": 2, + "default": 32, + "description": "Batch size (power of 2 recommended)" + }, + "early_stopping": { + "type": "boolean", + "default": true, + "description": "Enable early stopping" + }, + "patience": { + "type": "integer", + "minimum": 1, + "default": 10, + "description": "Early stopping patience" + } + } + } + }, + "allOf": [ + { "$ref": "#/$defs/data_options" }, + { "$ref": "#/$defs/preprocessing_options" }, + { "$ref": "#/$defs/model_options" }, + { "$ref": "#/$defs/training_options" } + ] +} +``` + +## Advanced Features + +### Conditional Requirements + +Parameters that depend on other parameters: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/conditional.json", + "title": "Conditional Requirements", + "description": "Parameters with dependencies", + "type": "object", + "properties": { + "use_cache": { + "type": "boolean", + "description": "Enable caching" + }, + "cache_dir": { + "type": "string", + "format": "directory-path", + "description": "Cache directory" + }, + "enable_logging": { + "type": "boolean", + "description": "Enable logging" + }, + "log_file": { + "type": "string", + "format": "file-path", + "description": "Log file path" + } + }, + "dependentRequired": { + "use_cache": ["cache_dir"], + "enable_logging": ["log_file"] + } +} +``` + +### Custom Error Messages + +Helpful error messages for validation failures: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/error-messages.json", + "title": "Custom Error Messages", + "description": "Parameters with custom validation messages", + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "description": "Notification email", + "errorMessage": "Please provide a valid email address for notifications" + }, + "memory": { + "type": "string", + "pattern": "^\\d+\\.(GB|MB)$", + "description": "Memory allocation", + "errorMessage": "Memory must be specified with units, e.g., '8.GB' or '512.MB'" + }, + "threads": { + "type": "integer", + "minimum": 1, + "maximum": 64, + "description": "Thread count", + "errorMessage": "Thread count must be between 1 and 64" + } + } +} +``` + +### Deprecated Parameters + +Marking parameters as deprecated: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/deprecated.json", + "title": "Deprecated Parameters", + "description": "Schema with deprecated options", + "type": "object", + "properties": { + "output_format": { + "type": "string", + "enum": ["json", "yaml", "csv"], + "description": "Output format" + }, + "outfmt": { + "type": "string", + "description": "Legacy output format parameter", + "deprecated": true, + "errorMessage": "The 'outfmt' parameter is deprecated. Please use 'output_format' instead." + } + } +} +``` + +## See Also + +- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) +- [Quick Start Guide](../getting-started/quick-start.md) +- [Testing Guide](../development/testing.md) diff --git a/docs/examples/plugin-examples.md b/docs/examples/plugin-examples.md new file mode 100644 index 0000000..7b4b251 --- /dev/null +++ b/docs/examples/plugin-examples.md @@ -0,0 +1,848 @@ +# Plugin Examples + +This page provides practical examples of plugin schemas for various use cases. + +## Basic Examples + +### Minimal Plugin + +Simplest valid plugin schema: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [] +} +``` + +### Simple Configuration + +Plugin with basic configuration options: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "ConfigScope", + "spec": { + "name": "myPlugin", + "description": "My plugin configuration", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "enabled", + "description": "Enable the plugin", + "type": "Boolean" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "debug", + "description": "Enable debug mode", + "type": "Boolean" + } + } + ] + } + } + ] +} +``` + +**Usage**: + +```groovy +myPlugin { + enabled = true + debug = false +} +``` + +### Simple Function + +Plugin with a single function: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "Function", + "spec": { + "name": "greet", + "description": "Generate a greeting message", + "returnType": "String", + "parameters": [ + { + "name": "name", + "type": "String" + } + ] + } + } + ] +} +``` + +**Usage**: + +```groovy +def message = greet('World') +println message // "Hello, World!" +``` + +## AWS Plugin Example + +Comprehensive AWS integration plugin: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "ConfigScope", + "spec": { + "name": "aws", + "description": "AWS plugin configuration", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "region", + "description": "AWS region", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "profile", + "description": "AWS credentials profile name", + "type": "String" + } + }, + { + "type": "ConfigScope", + "spec": { + "name": "batch", + "description": "AWS Batch configuration", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "cliPath", + "description": "Path to AWS CLI executable", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "jobQueue", + "description": "Default job queue name", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "maxParallelTransfers", + "description": "Maximum parallel file transfers", + "type": "Integer" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "retryMode", + "description": "Retry strategy mode", + "type": "String" + } + } + ] + } + }, + { + "type": "ConfigScope", + "spec": { + "name": "client", + "description": "AWS client configuration", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "maxConnections", + "description": "Maximum HTTP connections", + "type": "Integer" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "connectionTimeout", + "description": "Connection timeout", + "type": "Duration" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "uploadMaxThreads", + "description": "Maximum upload threads", + "type": "Integer" + } + } + ] + } + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "uploadToS3", + "description": "Upload a file to S3 bucket", + "returnType": "String", + "parameters": [ + { + "name": "localPath", + "type": "String" + }, + { + "name": "bucket", + "type": "String" + }, + { + "name": "key", + "type": "String" + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "downloadFromS3", + "description": "Download a file from S3 bucket", + "returnType": "Path", + "parameters": [ + { + "name": "bucket", + "type": "String" + }, + { + "name": "key", + "type": "String" + }, + { + "name": "localPath", + "type": "String" + } + ] + } + } + ] +} +``` + +**Usage**: + +```groovy +aws { + region = 'us-east-1' + profile = 'my-profile' + + batch { + cliPath = '/usr/local/bin/aws' + jobQueue = 'my-queue' + maxParallelTransfers = 4 + retryMode = 'standard' + } + + client { + maxConnections = 20 + connectionTimeout = '30.s' + uploadMaxThreads = 4 + } +} + +// Upload file +uploadToS3('/data/results.txt', 'my-bucket', 'outputs/results.txt') + +// Download file +downloadFromS3('my-bucket', 'inputs/data.txt', '/tmp/data.txt') +``` + +## Database Plugin Example + +Database integration with connection pooling: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "ConfigScope", + "spec": { + "name": "database", + "description": "Database plugin configuration", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "url", + "description": "Database connection URL", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "username", + "description": "Database username", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "password", + "description": "Database password", + "type": "String" + } + }, + { + "type": "ConfigScope", + "spec": { + "name": "pool", + "description": "Connection pool settings", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "minConnections", + "description": "Minimum pool connections", + "type": "Integer" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "maxConnections", + "description": "Maximum pool connections", + "type": "Integer" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "timeout", + "description": "Connection timeout", + "type": "Duration" + } + } + ] + } + } + ] + } + }, + { + "type": "Factory", + "spec": { + "name": "createConnection", + "description": "Create a database connection", + "returnType": "Connection", + "parameters": [] + } + }, + { + "type": "Function", + "spec": { + "name": "executeQuery", + "description": "Execute a SQL query", + "returnType": "List", + "parameters": [ + { + "name": "query", + "type": "String" + }, + { + "name": "params", + "type": "Map" + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "executeUpdate", + "description": "Execute a SQL update statement", + "returnType": "Integer", + "parameters": [ + { + "name": "statement", + "type": "String" + }, + { + "name": "params", + "type": "Map" + } + ] + } + } + ] +} +``` + +**Usage**: + +```groovy +database { + url = 'jdbc:postgresql://localhost:5432/mydb' + username = 'user' + password = 'pass' + + pool { + minConnections = 2 + maxConnections = 10 + timeout = '30.s' + } +} + +// Create connection +def conn = createConnection() + +// Query data +def results = executeQuery( + 'SELECT * FROM samples WHERE status = :status', + [status: 'active'] +) + +// Update data +def affected = executeUpdate( + 'UPDATE samples SET processed = true WHERE id = :id', + [id: 123] +) +``` + +## Channel Operator Plugin + +Custom channel operators: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "Operator", + "spec": { + "name": "customFilter", + "description": "Filter channel items with custom predicate", + "returnType": "DataflowChannel", + "parameters": [ + { + "name": "predicate", + "type": "Closure" + } + ] + } + }, + { + "type": "Operator", + "spec": { + "name": "batchBy", + "description": "Group items into batches by a key function", + "returnType": "DataflowChannel", + "parameters": [ + { + "name": "size", + "type": "Integer" + }, + { + "name": "keyFunc", + "type": "Closure" + } + ] + } + }, + { + "type": "Operator", + "spec": { + "name": "retryOn", + "description": "Retry failed items based on exception type", + "returnType": "DataflowChannel", + "parameters": [ + { + "name": "exceptionClass", + "type": "Class" + }, + { + "name": "maxRetries", + "type": "Integer" + } + ] + } + }, + { + "type": "Operator", + "spec": { + "name": "transformParallel", + "description": "Transform items in parallel with specified concurrency", + "returnType": "DataflowChannel", + "parameters": [ + { + "name": "concurrency", + "type": "Integer" + }, + { + "name": "transformer", + "type": "Closure" + } + ] + } + } + ] +} +``` + +**Usage**: + +```groovy +// Custom filter +Channel + .from(1, 2, 3, 4, 5) + .customFilter { it % 2 == 0 } + .view() // 2, 4 + +// Batch by key +Channel + .from('apple', 'apricot', 'banana', 'blueberry') + .batchBy(2) { it[0] } // Group by first letter + .view() // ['apple', 'apricot'], ['banana', 'blueberry'] + +// Retry on failure +Channel + .from(urls) + .retryOn(IOException, 3) + .view() + +// Parallel transformation +Channel + .from(files) + .transformParallel(4) { file -> + processFile(file) + } + .view() +``` + +## API Client Plugin + +REST API integration: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "ConfigScope", + "spec": { + "name": "apiClient", + "description": "API client configuration", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "baseUrl", + "description": "API base URL", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "apiKey", + "description": "API authentication key", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "timeout", + "description": "Request timeout", + "type": "Duration" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "retries", + "description": "Maximum retry attempts", + "type": "Integer" + } + } + ] + } + }, + { + "type": "Factory", + "spec": { + "name": "createClient", + "description": "Create an API client instance", + "returnType": "ApiClient", + "parameters": [ + { + "name": "config", + "type": "Map" + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "get", + "description": "Perform GET request", + "returnType": "Map", + "parameters": [ + { + "name": "endpoint", + "type": "String" + }, + { + "name": "params", + "type": "Map" + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "post", + "description": "Perform POST request", + "returnType": "Map", + "parameters": [ + { + "name": "endpoint", + "type": "String" + }, + { + "name": "body", + "type": "Map" + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "uploadFile", + "description": "Upload a file via multipart POST", + "returnType": "Map", + "parameters": [ + { + "name": "endpoint", + "type": "String" + }, + { + "name": "filePath", + "type": "String" + }, + { + "name": "metadata", + "type": "Map" + } + ] + } + } + ] +} +``` + +**Usage**: + +```groovy +apiClient { + baseUrl = 'https://api.example.com/v1' + apiKey = secrets.API_KEY + timeout = '60.s' + retries = 3 +} + +// Create client +def client = createClient([ + baseUrl: 'https://custom-api.com', + apiKey: 'custom-key' +]) + +// GET request +def data = get('/samples', [status: 'active', limit: 100]) + +// POST request +def result = post('/samples', [ + name: 'Sample1', + type: 'RNA-seq', + metadata: [organism: 'human'] +]) + +// Upload file +def response = uploadFile( + '/uploads', + '/data/results.csv', + [description: 'Analysis results'] +) +``` + +## Notification Plugin + +Multi-channel notifications: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "ConfigScope", + "spec": { + "name": "notifications", + "description": "Notification plugin configuration", + "children": [ + { + "type": "ConfigScope", + "spec": { + "name": "email", + "description": "Email notification settings", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "enabled", + "description": "Enable email notifications", + "type": "Boolean" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "to", + "description": "Recipient email address", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "from", + "description": "Sender email address", + "type": "String" + } + } + ] + } + }, + { + "type": "ConfigScope", + "spec": { + "name": "slack", + "description": "Slack notification settings", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "enabled", + "description": "Enable Slack notifications", + "type": "Boolean" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "webhook", + "description": "Slack webhook URL", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "channel", + "description": "Slack channel name", + "type": "String" + } + } + ] + } + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "sendNotification", + "description": "Send notification via all enabled channels", + "returnType": "Boolean", + "parameters": [ + { + "name": "message", + "type": "String" + }, + { + "name": "level", + "type": "String" + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "notifyOnComplete", + "description": "Send notification when pipeline completes", + "returnType": "void", + "parameters": [] + } + } + ] +} +``` + +**Usage**: + +```groovy +notifications { + email { + enabled = true + to = 'user@example.com' + from = 'pipeline@example.com' + } + + slack { + enabled = true + webhook = 'https://hooks.slack.com/...' + channel = '#pipeline-notifications' + } +} + +// Send notification +sendNotification('Pipeline started', 'info') +sendNotification('Critical error occurred', 'error') + +// Notify on completion +workflow.onComplete { + notifyOnComplete() +} +``` + +## See Also + +- [Plugin Schema Reference](../schemas/plugin.md) +- [Quick Start Guide](../getting-started/quick-start.md) +- [Testing Guide](../development/testing.md) diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md new file mode 100644 index 0000000..28246d1 --- /dev/null +++ b/docs/getting-started/installation.md @@ -0,0 +1,160 @@ +# Installation + +This guide will help you set up the tools needed to work with Nextflow schemas. + +## Prerequisites + +- Python 3.8 or higher +- [uv](https://github.com/astral-sh/uv) package manager (recommended) +- Docker (optional, for containerized validation) + +## Installing uv + +If you don't have uv installed, install it using: + +```bash +# macOS/Linux +curl -LsSf https://astral.sh/uv/install.sh | sh + +# Windows +powershell -c "irm https://astral.sh/uv/install.ps1 | iex" +``` + +## Installation Methods + +### Option 1: Using uv (Recommended) + +Clone the repository and install dependencies: + +```bash +git clone https://github.com/nextflow-io/schemas.git +cd schemas +uv sync +``` + +This will install all development dependencies including `check-jsonschema` for validation. + +### Option 2: Install Validation Tool Only + +If you only need the validation tool: + +```bash +uv pip install check-jsonschema +``` + +Or using pip: + +```bash +pip install check-jsonschema +``` + +### Option 3: Using Docker + +No local installation required. Just use the provided Docker validation script: + +```bash +./validate-docker.sh +``` + +## Installing Pre-commit Hooks + +To automatically format JSON files on commit: + +```bash +# Install pre-commit +uv pip install pre-commit + +# Set up git hooks +pre-commit install +``` + +Now Prettier will automatically format your JSON files when you commit. + +## Building Documentation + +To build and serve this documentation locally: + +```bash +# Install docs dependencies +uv sync --extra docs + +# Serve documentation locally +uv run mkdocs serve +``` + +Then open your browser to `http://127.0.0.1:8000` + +## Verifying Installation + +Test that everything is working: + +```bash +# Validate schemas +./validate.sh + +# Should output: +# ✅ All schemas are valid +# ✅ All test cases passed +``` + +## Editor Integration + +### VS Code + +Install the [JSON Schema Store](https://marketplace.visualstudio.com/items?itemName=remcohaszing.schemastore) extension for automatic schema validation and autocomplete. + +Add to your workspace settings (`.vscode/settings.json`): + +```json +{ + "json.schemas": [ + { + "fileMatch": ["**/pipeline-input/**/*.json"], + "url": "./pipeline-input/schema.json" + }, + { + "fileMatch": ["**/plugin/**/*.json"], + "url": "./plugin/schema.json" + } + ] +} +``` + +### JetBrains IDEs (IntelliJ, PyCharm, etc.) + +JetBrains IDEs have built-in JSON Schema support. Configure schemas via: + +1. Go to **Settings** → **Languages & Frameworks** → **Schemas and DTDs** → **JSON Schema Mappings** +2. Add mappings for each schema file + +## Troubleshooting + +### Permission Denied on Scripts + +Make validation scripts executable: + +```bash +chmod +x validate.sh validate-docker.sh +``` + +### Python Version Issues + +Ensure you're using Python 3.8+: + +```bash +python --version +``` + +### Docker Issues + +If Docker validation fails, ensure Docker is running: + +```bash +docker ps +``` + +## Next Steps + +- [Quick Start Guide](quick-start.md) +- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) +- [Contributing Guidelines](../development/contributing.md) diff --git a/docs/getting-started/overview.md b/docs/getting-started/overview.md new file mode 100644 index 0000000..0debcd0 --- /dev/null +++ b/docs/getting-started/overview.md @@ -0,0 +1,65 @@ +# Overview + +Nextflow Schemas is a collection of JSON Schema definitions used to validate Nextflow pipeline inputs and plugin specifications. These schemas ensure that your pipeline configurations and plugin definitions follow the correct structure and conventions. + +## What Are JSON Schemas? + +JSON Schema is a vocabulary that allows you to annotate and validate JSON documents. It provides a contract for your JSON data, describing: + +- Required and optional properties +- Data types (string, number, boolean, etc.) +- Value constraints (min/max, patterns, enums) +- Property relationships and dependencies + +## Why Use Nextflow Schemas? + +### Pipeline Input Schema + +The pipeline input schema helps you: + +- **Define parameter specifications** for your Nextflow pipelines +- **Validate user inputs** before pipeline execution +- **Generate documentation** automatically from schema definitions +- **Group parameters** logically for better organization +- **Add custom validation rules** specific to Nextflow workflows + +### Plugin Schema + +The plugin schema enables you to: + +- **Document plugin APIs** including functions and configuration options +- **Validate plugin specifications** during development +- **Generate reference documentation** for plugin users +- **Define configuration scopes** and their nested structure + +## Schema Specifications + +Both schemas follow the **JSON Schema Draft 2020-12** specification and include: + +- Standard JSON Schema keywords (`type`, `enum`, `pattern`, etc.) +- Custom keywords specific to Nextflow requirements +- Comprehensive validation rules +- Support for nested definitions and references + +## Use Cases + +### For Pipeline Developers + +- Validate pipeline parameter schemas during development +- Auto-generate parameter documentation +- Ensure consistent parameter naming and structure +- Validate user-provided input configurations + +### For Plugin Developers + +- Document plugin configuration options +- Define function signatures and return types +- Validate plugin specification files +- Generate API documentation + +## Next Steps + +- [Installation Guide](installation.md) - Set up validation tools +- [Quick Start](quick-start.md) - Create your first schema +- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) +- [Plugin Schema Reference](../schemas/plugin.md) diff --git a/docs/getting-started/quick-start.md b/docs/getting-started/quick-start.md new file mode 100644 index 0000000..8c98e9f --- /dev/null +++ b/docs/getting-started/quick-start.md @@ -0,0 +1,259 @@ +# Quick Start + +Get started with Nextflow schemas in minutes. + +## Creating a Pipeline Input Schema + +Here's a minimal example of a pipeline input schema: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/my-pipeline/schema.json", + "title": "My Pipeline Parameters", + "description": "Input parameters for my Nextflow pipeline", + "type": "object", + "properties": { + "input": { + "type": "string", + "format": "file-path", + "description": "Path to input file", + "help_text": "Provide the path to your input data file" + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "Output directory", + "default": "./results" + } + } +} +``` + +### With Parameter Groups + +Organize parameters into logical groups using `$defs`: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/my-pipeline/schema.json", + "title": "My Pipeline Parameters", + "description": "Input parameters for my Nextflow pipeline", + "type": "object", + "$defs": { + "input_options": { + "title": "Input Options", + "type": "object", + "fa_icon": "fas fa-file-import", + "description": "Parameters for input data", + "properties": { + "input": { + "type": "string", + "format": "file-path", + "description": "Path to input file" + } + } + }, + "output_options": { + "title": "Output Options", + "type": "object", + "fa_icon": "fas fa-folder-open", + "description": "Parameters for output", + "properties": { + "outdir": { + "type": "string", + "format": "directory-path", + "description": "Output directory", + "default": "./results" + } + } + } + }, + "allOf": [ + { "$ref": "#/$defs/input_options" }, + { "$ref": "#/$defs/output_options" } + ] +} +``` + +## Creating a Plugin Schema + +Here's a simple plugin schema example: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "ConfigScope", + "spec": { + "name": "myPlugin", + "description": "Configuration for my plugin", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "enabled", + "description": "Enable the plugin", + "type": "Boolean" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "timeout", + "description": "Timeout in seconds", + "type": "Integer" + } + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "processData", + "description": "Process input data", + "returnType": "Map", + "parameters": [ + { + "name": "data", + "type": "String" + } + ] + } + } + ] +} +``` + +## Validating Your Schema + +### Using the Validation Script + +```bash +# Validate all schemas and tests +./validate.sh +``` + +### Validate a Specific File + +```bash +# Validate against pipeline-input schema +check-jsonschema --schemafile pipeline-input/schema.json my-params.json + +# Validate against plugin schema +check-jsonschema --schemafile plugin/schema.json my-plugin.json +``` + +### Expected Output + +✅ **Success:** + +``` +ok -- validation done, no errors +``` + +❌ **Failure:** + +``` +ValidationError: 'type' is a required property +``` + +## Testing Your Schema + +Add test cases to verify your schema works correctly: + +### Valid Test Case + +Create `tests/valid_example.json`: + +```json +{ + "input": "/path/to/data.txt", + "outdir": "./results" +} +``` + +### Invalid Test Case + +Create `tests/invalid_missing_type.json`: + +```json +{ + "input": 123 +} +``` + +### Run Tests + +```bash +./validate.sh +``` + +The script automatically: + +- Validates files prefixed with `valid_` should pass +- Validates files prefixed with `invalid_` should fail + +## Common Parameter Types + +### File Paths + +```json +{ + "input_file": { + "type": "string", + "format": "file-path", + "description": "Input file", + "exists": true + } +} +``` + +### Numbers with Constraints + +```json +{ + "threads": { + "type": "integer", + "description": "Number of threads", + "minimum": 1, + "maximum": 32, + "default": 4 + } +} +``` + +### Enumerations + +```json +{ + "output_format": { + "type": "string", + "description": "Output format", + "enum": ["json", "csv", "tsv"], + "default": "json" + } +} +``` + +### Boolean Flags + +```json +{ + "skip_qc": { + "type": "boolean", + "description": "Skip quality control steps", + "default": false + } +} +``` + +## Next Steps + +- Learn more about the [Pipeline Input Schema](../schemas/pipeline-input.md) +- Explore the [Plugin Schema](../schemas/plugin.md) +- Check out [detailed examples](../examples/pipeline-input-examples.md) +- Read the [testing guide](../development/testing.md) diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..245925e --- /dev/null +++ b/docs/index.md @@ -0,0 +1,58 @@ +# Nextflow Schemas + +Welcome to the Nextflow Schemas documentation. This repository contains JSON schemas used by Nextflow for validating pipeline inputs and plugin specifications. + +## Overview + +This repository provides two main schemas: + +- **[Pipeline Input Schema](schemas/pipeline-input.md)**: Validates Nextflow pipeline input specifications, including parameter definitions, validation rules, and parameter grouping +- **[Plugin Schema](schemas/plugin.md)**: Validates Nextflow plugin specifications, including configuration scopes and function definitions + +## Key Features + +- ✅ **JSON Schema Draft 2020-12** compliant +- 🔍 **Comprehensive validation** for pipeline inputs and plugins +- 🧪 **Extensive test suite** with valid and invalid examples +- 🤖 **CI/CD integration** for automated validation +- 📚 **Well-documented** with examples and guides + +## Quick Links + +- [Getting Started](getting-started/overview.md) +- [Pipeline Input Schema Reference](schemas/pipeline-input.md) +- [Plugin Schema Reference](schemas/plugin.md) +- [Contributing Guidelines](development/contributing.md) +- [GitHub Repository](https://github.com/nextflow-io/schemas) + +## Installation + +Install the validation tools using uv: + +```bash +uv sync --extra docs +``` + +Or install just the validation dependencies: + +```bash +uv pip install check-jsonschema +``` + +## Quick Validation + +Validate your schema files: + +```bash +# Using the provided script +./validate.sh + +# Or using Docker +./validate-docker.sh +``` + +## Community + +- Report issues on [GitHub Issues](https://github.com/nextflow-io/schemas/issues) +- Join the [Nextflow Community](https://www.nextflow.io/community.html) +- Follow [@nextflow_io](https://twitter.com/nextflow_io) on Twitter diff --git a/docs/schemas/pipeline-input.md b/docs/schemas/pipeline-input.md new file mode 100644 index 0000000..155e847 --- /dev/null +++ b/docs/schemas/pipeline-input.md @@ -0,0 +1,465 @@ +# Pipeline Input Schema Reference + +The pipeline input schema validates Nextflow pipeline parameter specifications. It follows JSON Schema Draft 2020-12 and includes both standard and custom keywords specific to Nextflow. + +## Schema URI + +``` +https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json +``` + +## Top-Level Structure + +### Required Properties + +| Property | Type | Description | +| ------------- | ------ | --------------------------------- | +| `$schema` | string | URI of the JSON Schema standard | +| `$id` | string | Unique identifier for your schema | +| `title` | string | Human-readable title | +| `description` | string | Schema description | +| `type` | string | Must be `"object"` | + +### Optional Properties + +| Property | Type | Description | +| ------------------- | ------ | ---------------------------------- | +| `properties` | object | Direct parameter definitions | +| `$defs` | object | Parameter group definitions | +| `allOf` | array | References to parameter groups | +| `dependentRequired` | object | Conditional parameter requirements | + +## Parameter Definitions + +Each parameter must include: + +- `type` - The parameter data type +- `description` - Human-readable description + +### Standard Keywords + +#### Type Validation + +```json +{ + "type": "string" | "integer" | "number" | "boolean" | "null" +} +``` + +Or multiple types: + +```json +{ + "type": ["string", "null"] +} +``` + +#### Format Validation (String Types) + +Validates string structure: + +| Format | Description | Example | +| ------------------- | ------------------------ | ---------------------- | +| `file-path` | Path to a file | `/data/input.txt` | +| `directory-path` | Path to a directory | `/data/output/` | +| `path` | Generic file system path | `/data/` | +| `file-path-pattern` | Glob pattern | `*.fastq.gz` | +| `date-time` | ISO 8601 datetime | `2024-01-01T12:00:00Z` | +| `date` | ISO 8601 date | `2024-01-01` | +| `time` | ISO 8601 time | `12:00:00` | +| `email` | Email address | `user@example.com` | +| `uri` | URI/URL | `https://example.com` | +| `regex` | Regular expression | `^[A-Z]+$` | + +Example: + +```json +{ + "input": { + "type": "string", + "format": "file-path", + "description": "Input file path" + } +} +``` + +#### Pattern Validation + +Validate strings against regex: + +```json +{ + "sample_id": { + "type": "string", + "pattern": "^[A-Za-z0-9_-]+$", + "description": "Sample identifier" + } +} +``` + +#### String Length Constraints + +```json +{ + "name": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "description": "Sample name" + } +} +``` + +#### Numeric Constraints + +```json +{ + "threads": { + "type": "integer", + "minimum": 1, + "maximum": 128, + "default": 4, + "description": "Number of threads" + }, + "quality_threshold": { + "type": "number", + "exclusiveMinimum": 0.0, + "exclusiveMaximum": 1.0, + "description": "Quality threshold" + }, + "step_size": { + "type": "number", + "multipleOf": 0.5, + "description": "Step size (multiples of 0.5)" + } +} +``` + +#### Enumerations + +Restrict to specific values: + +```json +{ + "aligner": { + "type": "string", + "enum": ["bwa", "bowtie2", "star"], + "default": "bwa", + "description": "Read aligner to use" + } +} +``` + +#### Constant Values + +Parameter with fixed value: + +```json +{ + "version": { + "type": "string", + "const": "1.0.0", + "description": "Schema version" + } +} +``` + +#### Default Values + +```json +{ + "outdir": { + "type": "string", + "default": "./results", + "description": "Output directory" + } +} +``` + +#### Examples + +Provide usage examples: + +```json +{ + "input": { + "type": "string", + "description": "Input file", + "examples": ["/data/sample1.fastq", "/data/sample2.fastq"] + } +} +``` + +#### Deprecation + +Mark parameters as deprecated: + +```json +{ + "old_param": { + "type": "string", + "description": "Legacy parameter", + "deprecated": true, + "errorMessage": "This parameter is deprecated. Use 'new_param' instead." + } +} +``` + +### Custom Nextflow Keywords + +These are NON-STANDARD extensions specific to Nextflow: + +#### `errorMessage` + +Custom validation error message: + +```json +{ + "threads": { + "type": "integer", + "minimum": 1, + "maximum": 64, + "description": "Thread count", + "errorMessage": "Threads must be between 1 and 64" + } +} +``` + +#### `exists` + +Check if file/directory exists (requires appropriate `format`): + +```json +{ + "reference": { + "type": "string", + "format": "file-path", + "exists": true, + "description": "Reference genome (must exist)" + } +} +``` + +#### `schema` + +Validate a file against another schema: + +```json +{ + "samplesheet": { + "type": "string", + "format": "file-path", + "schema": "assets/samplesheet.json", + "description": "Sample sheet (validated against schema)" + } +} +``` + +#### `help_text` + +Extended help documentation: + +```json +{ + "input": { + "type": "string", + "description": "Input file", + "help_text": "Provide a path to your input FASTQ file. The file should be gzip-compressed and follow the naming convention: sample_R1.fastq.gz" + } +} +``` + +#### `fa_icon` + +Font Awesome icon for documentation: + +```json +{ + "input": { + "type": "string", + "fa_icon": "fas fa-file", + "description": "Input file" + } +} +``` + +#### `hidden` + +Hide parameter from help and docs: + +```json +{ + "internal_param": { + "type": "string", + "hidden": true, + "description": "Internal parameter" + } +} +``` + +#### `mimetype` (Deprecated) + +⚠️ **Deprecated**: Use `format` or `pattern` instead. + +```json +{ + "data": { + "type": "string", + "mimetype": "text/csv" + } +} +``` + +## Parameter Groups + +Organize parameters using `$defs` and `allOf`: + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://example.com/schema.json", + "title": "Pipeline Parameters", + "description": "My pipeline parameters", + "type": "object", + "$defs": { + "input_output_options": { + "title": "Input/Output Options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Define where the pipeline should find input data and save output data", + "required": ["input", "outdir"], + "properties": { + "input": { + "type": "string", + "format": "file-path", + "description": "Input samplesheet" + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "Output directory", + "default": "./results" + } + } + }, + "reference_genome_options": { + "title": "Reference Genome", + "type": "object", + "fa_icon": "fas fa-dna", + "description": "Reference genome options", + "properties": { + "genome": { + "type": "string", + "description": "Genome name", + "enum": ["GRCh38", "GRCh37"], + "help_text": "Select the reference genome assembly" + }, + "fasta": { + "type": "string", + "format": "file-path", + "description": "Custom reference FASTA", + "help_text": "Provide a custom reference genome FASTA file" + } + } + } + }, + "allOf": [ + { "$ref": "#/$defs/input_output_options" }, + { "$ref": "#/$defs/reference_genome_options" } + ] +} +``` + +## Dependent Requirements + +Make parameters conditionally required: + +```json +{ + "properties": { + "use_cache": { + "type": "boolean", + "description": "Enable caching" + }, + "cache_dir": { + "type": "string", + "format": "directory-path", + "description": "Cache directory" + } + }, + "dependentRequired": { + "use_cache": ["cache_dir"] + } +} +``` + +When `use_cache` is provided, `cache_dir` becomes required. + +## Complete Example + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", + "$id": "https://raw.githubusercontent.com/my-org/my-pipeline/main/nextflow_schema.json", + "title": "RNA-Seq Pipeline Parameters", + "description": "Parameters for RNA-Seq analysis pipeline", + "type": "object", + "$defs": { + "input_output_options": { + "title": "Input/Output Options", + "type": "object", + "fa_icon": "fas fa-terminal", + "description": "Input and output file paths", + "required": ["input", "outdir"], + "properties": { + "input": { + "type": "string", + "format": "file-path", + "exists": true, + "description": "Input samplesheet", + "help_text": "CSV file with sample information", + "fa_icon": "fas fa-file-csv" + }, + "outdir": { + "type": "string", + "format": "directory-path", + "description": "Output directory", + "default": "./results", + "fa_icon": "fas fa-folder-open" + } + } + }, + "alignment_options": { + "title": "Alignment Options", + "type": "object", + "fa_icon": "fas fa-align-center", + "description": "Parameters for read alignment", + "properties": { + "aligner": { + "type": "string", + "enum": ["star", "hisat2"], + "default": "star", + "description": "Read aligner" + }, + "min_mapping_quality": { + "type": "integer", + "minimum": 0, + "maximum": 60, + "default": 10, + "description": "Minimum mapping quality" + } + } + } + }, + "allOf": [ + { "$ref": "#/$defs/input_output_options" }, + { "$ref": "#/$defs/alignment_options" } + ] +} +``` + +## See Also + +- [Quick Start Guide](../getting-started/quick-start.md) +- [Pipeline Input Examples](../examples/pipeline-input-examples.md) +- [Testing Guide](../development/testing.md) diff --git a/docs/schemas/plugin.md b/docs/schemas/plugin.md new file mode 100644 index 0000000..cb2de55 --- /dev/null +++ b/docs/schemas/plugin.md @@ -0,0 +1,483 @@ +# Plugin Schema Reference + +The plugin schema validates Nextflow plugin specifications, including configuration scopes, configuration options, and function definitions. + +## Schema URI + +``` +https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json +``` + +## Top-Level Structure + +The plugin schema has a single top-level property: + +| Property | Type | Description | +| ------------- | ----- | --------------------------------------------------------- | +| `definitions` | array | Array of definition objects (config scopes and functions) | + +## Definition Types + +Each item in the `definitions` array must be one of: + +- **ConfigScope** - Configuration scope with nested children +- **ConfigOption** - Individual configuration option +- **Factory** - Factory function definition +- **Function** - Standard function definition +- **Operator** - Operator function definition + +## Configuration Scopes + +Configuration scopes define hierarchical configuration structures. + +### Structure + +```json +{ + "type": "ConfigScope", + "spec": { + "name": "string", + "description": "string", + "children": [] + } +} +``` + +### Properties + +| Property | Type | Required | Description | +| ------------------ | ------ | -------- | ------------------------------- | +| `type` | string | Yes | Must be `"ConfigScope"` | +| `spec.name` | string | Yes | Scope name | +| `spec.description` | string | Yes | Scope description | +| `spec.children` | array | Yes | Nested config options or scopes | + +### Example + +```json +{ + "type": "ConfigScope", + "spec": { + "name": "aws", + "description": "AWS plugin configuration", + "children": [ + { + "type": "ConfigScope", + "spec": { + "name": "batch", + "description": "AWS Batch settings", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "cliPath", + "description": "Path to AWS CLI executable", + "type": "String" + } + } + ] + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "region", + "description": "AWS region", + "type": "String" + } + } + ] + } +} +``` + +This creates a configuration structure: + +```groovy +aws { + batch { + cliPath = '/usr/bin/aws' + } + region = 'us-east-1' +} +``` + +## Configuration Options + +Configuration options are individual settings within a scope. + +### Structure + +```json +{ + "type": "ConfigOption", + "spec": { + "name": "string", + "description": "string", + "type": "string" + } +} +``` + +### Properties + +| Property | Type | Required | Description | +| ------------------ | ------ | -------- | ------------------------------------------ | +| `type` | string | Yes | Must be `"ConfigOption"` | +| `spec.name` | string | Yes | Option name | +| `spec.description` | string | Yes | Option description | +| `spec.type` | string | Yes | Data type (String, Integer, Boolean, etc.) | + +### Common Data Types + +- `String` - Text value +- `Integer` - Whole number +- `Boolean` - true/false +- `Duration` - Time duration (e.g., `10.s`, `5.m`) +- `MemoryUnit` - Memory size (e.g., `1.GB`, `512.MB`) +- `Map` - Key-value pairs +- `List` - Array of values + +### Example + +```json +{ + "type": "ConfigOption", + "spec": { + "name": "maxRetries", + "description": "Maximum number of retry attempts", + "type": "Integer" + } +} +``` + +## Functions + +Function definitions document callable functions provided by the plugin. + +### Types of Functions + +#### Function + +Standard function: + +```json +{ + "type": "Function", + "spec": { + "name": "string", + "description": "string", + "returnType": "string", + "parameters": [] + } +} +``` + +#### Factory + +Factory function that creates objects: + +```json +{ + "type": "Factory", + "spec": { + "name": "string", + "description": "string", + "returnType": "string", + "parameters": [] + } +} +``` + +#### Operator + +Channel operator function: + +```json +{ + "type": "Operator", + "spec": { + "name": "string", + "description": "string", + "returnType": "string", + "parameters": [] + } +} +``` + +### Properties + +| Property | Type | Required | Description | +| ------------------ | ------ | -------- | ------------------------------------------ | +| `type` | string | Yes | `"Function"`, `"Factory"`, or `"Operator"` | +| `spec.name` | string | Yes | Function name | +| `spec.description` | string | Yes | Function description | +| `spec.returnType` | string | Yes | Return type | +| `spec.parameters` | array | No | Function parameters | + +### Parameters + +Each parameter object: + +| Property | Type | Required | Description | +| -------- | ------ | -------- | -------------- | +| `name` | string | Yes | Parameter name | +| `type` | string | Yes | Parameter type | + +### Example: Function + +```json +{ + "type": "Function", + "spec": { + "name": "uploadFile", + "description": "Upload a file to S3", + "returnType": "String", + "parameters": [ + { + "name": "localPath", + "type": "String" + }, + { + "name": "bucket", + "type": "String" + }, + { + "name": "key", + "type": "String" + } + ] + } +} +``` + +Usage in Nextflow: + +```groovy +def result = uploadFile('/data/file.txt', 'my-bucket', 'output/file.txt') +``` + +### Example: Operator + +```json +{ + "type": "Operator", + "spec": { + "name": "customFilter", + "description": "Filter channel items with custom logic", + "returnType": "DataflowChannel", + "parameters": [ + { + "name": "closure", + "type": "Closure" + } + ] + } +} +``` + +Usage in Nextflow: + +```groovy +Channel + .from(1, 2, 3, 4, 5) + .customFilter { it > 2 } +``` + +### Example: Factory + +```json +{ + "type": "Factory", + "spec": { + "name": "createClient", + "description": "Create an API client", + "returnType": "ApiClient", + "parameters": [ + { + "name": "config", + "type": "Map" + } + ] + } +} +``` + +Usage in Nextflow: + +```groovy +def client = createClient([ + endpoint: 'https://api.example.com', + apiKey: 'secret' +]) +``` + +## Complete Example + +```json +{ + "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", + "definitions": [ + { + "type": "ConfigScope", + "spec": { + "name": "myPlugin", + "description": "My custom plugin configuration", + "children": [ + { + "type": "ConfigScope", + "spec": { + "name": "server", + "description": "Server connection settings", + "children": [ + { + "type": "ConfigOption", + "spec": { + "name": "endpoint", + "description": "API endpoint URL", + "type": "String" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "timeout", + "description": "Connection timeout", + "type": "Duration" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "retries", + "description": "Maximum retry attempts", + "type": "Integer" + } + } + ] + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "enabled", + "description": "Enable the plugin", + "type": "Boolean" + } + }, + { + "type": "ConfigOption", + "spec": { + "name": "debug", + "description": "Enable debug logging", + "type": "Boolean" + } + } + ] + } + }, + { + "type": "Function", + "spec": { + "name": "processData", + "description": "Process input data and return results", + "returnType": "Map", + "parameters": [ + { + "name": "input", + "type": "String" + }, + { + "name": "options", + "type": "Map" + } + ] + } + }, + { + "type": "Operator", + "spec": { + "name": "transform", + "description": "Transform channel data", + "returnType": "DataflowChannel", + "parameters": [ + { + "name": "mapper", + "type": "Closure" + } + ] + } + }, + { + "type": "Factory", + "spec": { + "name": "createProcessor", + "description": "Create a data processor instance", + "returnType": "DataProcessor", + "parameters": [ + { + "name": "config", + "type": "Map" + } + ] + } + } + ] +} +``` + +### Resulting Configuration + +The above schema allows this configuration: + +```groovy +myPlugin { + enabled = true + debug = false + + server { + endpoint = 'https://api.example.com' + timeout = '30.s' + retries = 3 + } +} +``` + +### Resulting Functions + +And these function calls: + +```groovy +// Function +def result = processData('/path/to/input', [format: 'json']) + +// Operator +Channel + .from('data1', 'data2') + .transform { it.toUpperCase() } + +// Factory +def processor = createProcessor([threads: 4, memory: '8.GB']) +``` + +## Validation + +Validate your plugin schema: + +```bash +check-jsonschema --schemafile plugin/schema.json my-plugin-spec.json +``` + +## Best Practices + +1. **Use descriptive names** - Make config options and function names self-explanatory +2. **Provide clear descriptions** - Help users understand what each option does +3. **Group related options** - Use nested ConfigScopes for logical grouping +4. **Document parameters** - Specify parameter types and purposes +5. **Be consistent** - Follow naming conventions (camelCase for options, snake_case for parameters) + +## See Also + +- [Quick Start Guide](../getting-started/quick-start.md) +- [Plugin Examples](../examples/plugin-examples.md) +- [Testing Guide](../development/testing.md) diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..1f79d9c --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,78 @@ +site_name: Nextflow Schemas +site_description: JSON schemas for Nextflow pipeline inputs and plugins +site_url: https://github.com/nextflow-io/schemas +repo_url: https://github.com/nextflow-io/schemas +repo_name: nextflow-io/schemas + +theme: + name: material + icon: + logo: octicons/codescan-checkmark-16 + font: + text: Inter + code: Fira Code + palette: + - media: "(prefers-color-scheme)" + toggle: + icon: material/brightness-auto + name: Switch to light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: green + accent: grey + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: green + accent: grey + toggle: + icon: material/brightness-4 + name: Switch to light mode + features: + - navigation.tabs + - navigation.sections + - navigation.expand + - navigation.top + - search.suggest + - search.highlight + - content.code.copy + - content.code.annotate + +plugins: + - search + - social + - info + - offline + +markdown_extensions: + - admonition + - pymdownx.details + - pymdownx.superfences + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.tabbed: + alternate_style: true + - tables + - toc: + permalink: true + +nav: + - Home: index.md + - Getting Started: + - Overview: getting-started/overview.md + - Installation: getting-started/installation.md + - Quick Start: getting-started/quick-start.md + - Schemas: + - Pipeline Input Schema: schemas/pipeline-input.md + - Plugin Schema: schemas/plugin.md + - Development: + - Contributing: development/contributing.md + - Testing: development/testing.md + - CI/CD: development/ci-cd.md + - Examples: + - Pipeline Input Examples: examples/pipeline-input-examples.md + - Plugin Examples: examples/plugin-examples.md diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..32ef526 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,20 @@ +[project] +name = "nextflow-schemas" +version = "0.1.0" +description = "JSON schemas for Nextflow pipeline inputs and plugins" +readme = "README.md" +requires-python = ">=3.9" + +[project.optional-dependencies] +docs = [ + "mkdocs>=1.5.0", + "mkdocs-material[imaging]>=9.5.0", + "pymdown-extensions>=10.0", + "pre-commit>=4.3.0" +] + +[dependency-groups] +dev = [ + "check-jsonschema>=0.27.0", + "pre-commit>=4.3.0" +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..48cfc4d --- /dev/null +++ b/uv.lock @@ -0,0 +1,1473 @@ +version = 1 +revision = 3 +requires-python = ">=3.9" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version < '3.10'", +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "backrefs" +version = "5.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" }, +] + +[[package]] +name = "cairocffi" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload-time = "2024-06-18T10:56:06.741Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload-time = "2024-06-18T10:55:59.489Z" }, +] + +[[package]] +name = "cairosvg" +version = "2.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cairocffi" }, + { name = "cssselect2" }, + { name = "defusedxml" }, + { name = "pillow" }, + { name = "tinycss2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload-time = "2025-05-15T06:56:32.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload-time = "2025-05-15T06:56:28.552Z" }, +] + +[[package]] +name = "certifi" +version = "2025.10.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cc/08ed5a43f2996a16b462f64a7055c6e962803534924b9b2f1371d8c00b7b/cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf", size = 184288, upload-time = "2025-09-08T23:23:48.404Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/38d9726324e127f727b4ecc376bc85e505bfe61ef130eaf3f290c6847dd4/cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7", size = 180509, upload-time = "2025-09-08T23:23:49.73Z" }, + { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813, upload-time = "2025-09-08T23:23:51.263Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498, upload-time = "2025-09-08T23:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/5c51c1c7600bdd7ed9a24a203ec255dccdd0ebf4527f7b922a0bde2fb6ed/cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534", size = 203243, upload-time = "2025-09-08T23:23:53.836Z" }, + { url = "https://files.pythonhosted.org/packages/32/f2/81b63e288295928739d715d00952c8c6034cb6c6a516b17d37e0c8be5600/cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f", size = 203158, upload-time = "2025-09-08T23:23:55.169Z" }, + { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548, upload-time = "2025-09-08T23:23:56.506Z" }, + { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897, upload-time = "2025-09-08T23:23:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249, upload-time = "2025-09-08T23:23:59.139Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041, upload-time = "2025-09-08T23:24:00.496Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d9/6218d78f920dcd7507fc16a766b5ef8f3b913cc7aa938e7fc80b9978d089/cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", size = 172138, upload-time = "2025-09-08T23:24:01.7Z" }, + { url = "https://files.pythonhosted.org/packages/54/8f/a1e836f82d8e32a97e6b29cc8f641779181ac7363734f12df27db803ebda/cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", size = 182794, upload-time = "2025-09-08T23:24:02.943Z" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/98/f3b8013223728a99b908c9344da3aa04ee6e3fa235f19409033eda92fb78/charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", size = 207695, upload-time = "2025-08-09T07:55:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/21/40/5188be1e3118c82dcb7c2a5ba101b783822cfb413a0268ed3be0468532de/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", size = 147153, upload-time = "2025-08-09T07:55:38.467Z" }, + { url = "https://files.pythonhosted.org/packages/37/60/5d0d74bc1e1380f0b72c327948d9c2aca14b46a9efd87604e724260f384c/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", size = 160428, upload-time = "2025-08-09T07:55:40.072Z" }, + { url = "https://files.pythonhosted.org/packages/85/9a/d891f63722d9158688de58d050c59dc3da560ea7f04f4c53e769de5140f5/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", size = 157627, upload-time = "2025-08-09T07:55:41.706Z" }, + { url = "https://files.pythonhosted.org/packages/65/1a/7425c952944a6521a9cfa7e675343f83fd82085b8af2b1373a2409c683dc/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", size = 152388, upload-time = "2025-08-09T07:55:43.262Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c9/a2c9c2a355a8594ce2446085e2ec97fd44d323c684ff32042e2a6b718e1d/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", size = 150077, upload-time = "2025-08-09T07:55:44.903Z" }, + { url = "https://files.pythonhosted.org/packages/3b/38/20a1f44e4851aa1c9105d6e7110c9d020e093dfa5836d712a5f074a12bf7/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", size = 161631, upload-time = "2025-08-09T07:55:46.346Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fa/384d2c0f57edad03d7bec3ebefb462090d8905b4ff5a2d2525f3bb711fac/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", size = 159210, upload-time = "2025-08-09T07:55:47.539Z" }, + { url = "https://files.pythonhosted.org/packages/33/9e/eca49d35867ca2db336b6ca27617deed4653b97ebf45dfc21311ce473c37/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", size = 153739, upload-time = "2025-08-09T07:55:48.744Z" }, + { url = "https://files.pythonhosted.org/packages/2a/91/26c3036e62dfe8de8061182d33be5025e2424002125c9500faff74a6735e/charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", size = 99825, upload-time = "2025-08-09T07:55:50.305Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/f05db471f81af1fa01839d44ae2a8bfeec8d2a8b4590f16c4e7393afd323/charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", size = 107452, upload-time = "2025-08-09T07:55:51.461Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b5/991245018615474a60965a7c9cd2b4efbaabd16d582a5547c47ee1c7730b/charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", size = 204483, upload-time = "2025-08-09T07:55:53.12Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/ae245c41c06299ec18262825c1569c5d3298fc920e4ddf56ab011b417efd/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", size = 145520, upload-time = "2025-08-09T07:55:54.712Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/b3b6c76e7a635748c4421d2b92c7b8f90a432f98bda5082049af37ffc8e3/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", size = 158876, upload-time = "2025-08-09T07:55:56.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e6/63bb0e10f90a8243c5def74b5b105b3bbbfb3e7bb753915fe333fb0c11ea/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", size = 156083, upload-time = "2025-08-09T07:55:57.582Z" }, + { url = "https://files.pythonhosted.org/packages/87/df/b7737ff046c974b183ea9aa111b74185ac8c3a326c6262d413bd5a1b8c69/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", size = 150295, upload-time = "2025-08-09T07:55:59.147Z" }, + { url = "https://files.pythonhosted.org/packages/61/f1/190d9977e0084d3f1dc169acd060d479bbbc71b90bf3e7bf7b9927dec3eb/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", size = 148379, upload-time = "2025-08-09T07:56:00.364Z" }, + { url = "https://files.pythonhosted.org/packages/4c/92/27dbe365d34c68cfe0ca76f1edd70e8705d82b378cb54ebbaeabc2e3029d/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", size = 160018, upload-time = "2025-08-09T07:56:01.678Z" }, + { url = "https://files.pythonhosted.org/packages/99/04/baae2a1ea1893a01635d475b9261c889a18fd48393634b6270827869fa34/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", size = 157430, upload-time = "2025-08-09T07:56:02.87Z" }, + { url = "https://files.pythonhosted.org/packages/2f/36/77da9c6a328c54d17b960c89eccacfab8271fdaaa228305330915b88afa9/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", size = 151600, upload-time = "2025-08-09T07:56:04.089Z" }, + { url = "https://files.pythonhosted.org/packages/64/d4/9eb4ff2c167edbbf08cdd28e19078bf195762e9bd63371689cab5ecd3d0d/charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", size = 99616, upload-time = "2025-08-09T07:56:05.658Z" }, + { url = "https://files.pythonhosted.org/packages/f4/9c/996a4a028222e7761a96634d1820de8a744ff4327a00ada9c8942033089b/charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", size = 107108, upload-time = "2025-08-09T07:56:07.176Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ca/9a0983dd5c8e9733565cf3db4df2b0a2e9a82659fd8aa2a868ac6e4a991f/charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", size = 207520, upload-time = "2025-08-09T07:57:11.026Z" }, + { url = "https://files.pythonhosted.org/packages/39/c6/99271dc37243a4f925b09090493fb96c9333d7992c6187f5cfe5312008d2/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", size = 147307, upload-time = "2025-08-09T07:57:12.4Z" }, + { url = "https://files.pythonhosted.org/packages/e4/69/132eab043356bba06eb333cc2cc60c6340857d0a2e4ca6dc2b51312886b3/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", size = 160448, upload-time = "2025-08-09T07:57:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/04/9a/914d294daa4809c57667b77470533e65def9c0be1ef8b4c1183a99170e9d/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", size = 157758, upload-time = "2025-08-09T07:57:14.979Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a8/6f5bcf1bcf63cb45625f7c5cadca026121ff8a6c8a3256d8d8cd59302663/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", size = 152487, upload-time = "2025-08-09T07:57:16.332Z" }, + { url = "https://files.pythonhosted.org/packages/c4/72/d3d0e9592f4e504f9dea08b8db270821c909558c353dc3b457ed2509f2fb/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", size = 150054, upload-time = "2025-08-09T07:57:17.576Z" }, + { url = "https://files.pythonhosted.org/packages/20/30/5f64fe3981677fe63fa987b80e6c01042eb5ff653ff7cec1b7bd9268e54e/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", size = 161703, upload-time = "2025-08-09T07:57:20.012Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ef/dd08b2cac9284fd59e70f7d97382c33a3d0a926e45b15fc21b3308324ffd/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", size = 159096, upload-time = "2025-08-09T07:57:21.329Z" }, + { url = "https://files.pythonhosted.org/packages/45/8c/dcef87cfc2b3f002a6478f38906f9040302c68aebe21468090e39cde1445/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", size = 153852, upload-time = "2025-08-09T07:57:22.608Z" }, + { url = "https://files.pythonhosted.org/packages/63/86/9cbd533bd37883d467fcd1bd491b3547a3532d0fbb46de2b99feeebf185e/charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", size = 99840, upload-time = "2025-08-09T07:57:23.883Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d6/7e805c8e5c46ff9729c49950acc4ee0aeb55efb8b3a56687658ad10c3216/charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", size = 107438, upload-time = "2025-08-09T07:57:25.287Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, +] + +[[package]] +name = "check-jsonschema" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "click", version = "8.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "jsonschema" }, + { name = "regress" }, + { name = "requests" }, + { name = "ruamel-yaml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/48/be9cb9144328042b66110ed58eabdbba0f64eded54be1a659ec72a5d939e/check_jsonschema-0.34.0.tar.gz", hash = "sha256:7ff811bbd6d3936a9729375fb1e42835ecdc3758d837e2c67330c738a8b4945f", size = 310166, upload-time = "2025-09-18T01:46:26.117Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/60/ac05c3366833b04af1901c776730f0daba5bb5d8dc805706a77938e37661/check_jsonschema-0.34.0-py3-none-any.whl", hash = "sha256:7acb8abf31e28abedca4572435a94e6cf5392aa750b926c77e450d1088389aee", size = 295042, upload-time = "2025-09-18T01:46:24.243Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cssselect2" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tinycss2" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + +[[package]] +name = "filelock" +version = "3.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "identify" +version = "2.6.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "markdown" +version = "3.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, + { url = "https://files.pythonhosted.org/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623, upload-time = "2025-09-27T18:37:29.296Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049, upload-time = "2025-09-27T18:37:30.234Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923, upload-time = "2025-09-27T18:37:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543, upload-time = "2025-09-27T18:37:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585, upload-time = "2025-09-27T18:37:33.166Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387, upload-time = "2025-09-27T18:37:34.185Z" }, + { url = "https://files.pythonhosted.org/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133, upload-time = "2025-09-27T18:37:35.138Z" }, + { url = "https://files.pythonhosted.org/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588, upload-time = "2025-09-27T18:37:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566, upload-time = "2025-09-27T18:37:37.09Z" }, + { url = "https://files.pythonhosted.org/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053, upload-time = "2025-09-27T18:37:38.054Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928, upload-time = "2025-09-27T18:37:39.037Z" }, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "click", version = "8.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.6.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/d5/ab83ca9aa314954b0a9e8849780bdd01866a3cfcb15ffb7e3a61ca06ff0b/mkdocs_material-9.6.21.tar.gz", hash = "sha256:b01aa6d2731322438056f360f0e623d3faae981f8f2d8c68b1b973f4f2657870", size = 4043097, upload-time = "2025-09-30T19:11:27.517Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/4f/98681c2030375fe9b057dbfb9008b68f46c07dddf583f4df09bf8075e37f/mkdocs_material-9.6.21-py3-none-any.whl", hash = "sha256:aa6a5ab6fb4f6d381588ac51da8782a4d3757cb3d1b174f81a2ec126e1f22c92", size = 9203097, upload-time = "2025-09-30T19:11:24.063Z" }, +] + +[package.optional-dependencies] +imaging = [ + { name = "cairosvg" }, + { name = "pillow" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "nextflow-schemas" +version = "0.1.0" +source = { virtual = "." } + +[package.optional-dependencies] +docs = [ + { name = "mkdocs" }, + { name = "mkdocs-material", extra = ["imaging"] }, + { name = "pre-commit" }, + { name = "pymdown-extensions" }, +] + +[package.dev-dependencies] +dev = [ + { name = "check-jsonschema" }, + { name = "pre-commit" }, +] + +[package.metadata] +requires-dist = [ + { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.5.0" }, + { name = "mkdocs-material", extras = ["imaging"], marker = "extra == 'docs'", specifier = ">=9.5.0" }, + { name = "pre-commit", marker = "extra == 'docs'", specifier = ">=4.3.0" }, + { name = "pymdown-extensions", marker = "extra == 'docs'", specifier = ">=10.0" }, +] +provides-extras = ["docs"] + +[package.metadata.requires-dev] +dev = [ + { name = "check-jsonschema", specifier = ">=0.27.0" }, + { name = "pre-commit", specifier = ">=4.3.0" }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "pillow" +version = "11.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, + { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, + { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, + { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, + { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478, upload-time = "2025-07-01T09:15:52.209Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522, upload-time = "2025-07-01T09:15:54.162Z" }, + { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376, upload-time = "2025-07-03T13:11:01.066Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020, upload-time = "2025-07-03T13:11:06.479Z" }, + { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732, upload-time = "2025-07-01T09:15:56.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404, upload-time = "2025-07-01T09:15:58.245Z" }, + { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760, upload-time = "2025-07-01T09:16:00.003Z" }, + { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534, upload-time = "2025-07-01T09:16:02.29Z" }, + { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091, upload-time = "2025-07-01T09:16:04.4Z" }, + { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091, upload-time = "2025-07-01T09:16:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632, upload-time = "2025-07-01T09:16:08.142Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, + { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, + { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, + { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, +] + +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, +] + +[[package]] +name = "regress" +version = "2025.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/8f/87f88d2fb104c21d83355a218cec6b1176f9d02d824cb32287fa2d701c7c/regress-2025.5.1.tar.gz", hash = "sha256:bb372b76ea6a50935128f065eca4fe6649ec446f0ecf9d73ac0cd19b68acadc7", size = 10935, upload-time = "2025-05-28T19:27:57.065Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/9d/d7b1334f1f8109151f494ef640a316ede0ea38145505d573671a1c376808/regress-2025.5.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:39a8f91a2156780cb25c8daca162969396fae74fdb972f844ac6d314b939535f", size = 441036, upload-time = "2025-05-28T19:25:47.583Z" }, + { url = "https://files.pythonhosted.org/packages/2e/18/c69b302a597ef2ea7e29f9adcaea61ed483c04f54b07d86b71f284f555c6/regress-2025.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9120fbb73b1789fa0559ea88f53026eefa84a9b05f8f1eb81a26fe9cc3bfb841", size = 438625, upload-time = "2025-05-28T19:25:50.075Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0a/237cbf96fee21c2f6a94d5590c0d5e10dbc19be2fd713b1840d0c9689427/regress-2025.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7a558c5ea5def486f71ebfe227adc24d1bf425f5417e4d6497f275f8ab5a8d5", size = 513459, upload-time = "2025-05-28T19:25:51.248Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b9/2304b1bb5eb94548e0a542d82d5755795fa286ef848413d80672036a5339/regress-2025.5.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d0d0ed9ad71e93ebd5c22be66a93e6724cb40ee14d7dc6f5d0265508621d919", size = 496836, upload-time = "2025-05-28T19:25:52.46Z" }, + { url = "https://files.pythonhosted.org/packages/09/60/2d1a598728e07e54d4314f1042adb91531742af43c6a31755592c8df532e/regress-2025.5.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63f09c32eea9d063baad38def4177ad857f8737f52082a43cb4cab5d1b02e169", size = 667519, upload-time = "2025-05-28T19:25:53.883Z" }, + { url = "https://files.pythonhosted.org/packages/36/4a/d2c00bf17ea9476930a999449a6840e50e33f7abe78cc5baf739a3077609/regress-2025.5.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9436fd9d884ca9b0d99b366635457c67c577adfd17974ce7cdfae76119133f98", size = 576489, upload-time = "2025-05-28T19:25:55.201Z" }, + { url = "https://files.pythonhosted.org/packages/e6/61/8cf4258b7625214be75e58780748b469f365fe0291ef25ee5e31e4567dbc/regress-2025.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d04a0bcd6bcf6a572ab661ffca0eae18cbcdd47e3343b0db83597653ee18e3", size = 516038, upload-time = "2025-05-28T19:25:56.508Z" }, + { url = "https://files.pythonhosted.org/packages/f6/58/7c03e36ebda506504d2de54bbff65a28217d63684864d47656967459aa2a/regress-2025.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce3adf2c2032df7589b875d116d0e5ed86322a66faa7e093dee050862028a5b9", size = 517202, upload-time = "2025-05-28T19:25:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/b2/12/b551a004c86462a990c813a11c9a5fbe3c05e3cbcbfb9e37e8a0a26282e8/regress-2025.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2251ed2ab40bf51f01b0c9b71cfb0fe8e8f9c560365a9f2381b98e727b6d54d1", size = 692057, upload-time = "2025-05-28T19:26:00.044Z" }, + { url = "https://files.pythonhosted.org/packages/0d/13/3210c52a769d886f46c851a94c34373dc160021c96c21b7a3afa17bec259/regress-2025.5.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c92d15d05d909b31813c6e643a557259a2d2810922958c594cfe548b1d7f6", size = 693589, upload-time = "2025-05-28T19:26:01.665Z" }, + { url = "https://files.pythonhosted.org/packages/db/06/f96f12ecb89ef45c9bbda88b53e7f6f9ba2b7ec5976bfa249a22841c6cc3/regress-2025.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:04e5ca87022ce469cfbc21f993fc33c7c92bcee412e17dea295b5b2d6e946494", size = 686480, upload-time = "2025-05-28T19:26:03.12Z" }, + { url = "https://files.pythonhosted.org/packages/3a/bb/8a690ef42fdb8b28adbc7d4315d209762bf6a6f3d68ad4b224f5e87baef1/regress-2025.5.1-cp310-cp310-win32.whl", hash = "sha256:82dd7512065e8e818837e3eba10009aac08b9a447db0cc230efc90d9ee0f709e", size = 281441, upload-time = "2025-05-28T19:26:04.381Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/dc0ab2d289bee4863fa5090836268ed191acf12a2c08ac98329916e65a28/regress-2025.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:411214fb07b571f01fdc6bf25814f197f816f179248e031a7176e7c5c6f225c5", size = 296222, upload-time = "2025-05-28T19:26:06.097Z" }, + { url = "https://files.pythonhosted.org/packages/1a/56/14e3ad7243adaa62e82b8065b53896a5a487829d132b88ab779c40c2bed5/regress-2025.5.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:34a7a051cd63b5d39d62d7dd543d05cdc04dd939ecca84da93e3bd3f9d4e6c6c", size = 440914, upload-time = "2025-05-28T19:26:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/eb/7a/f7ebc0afe0877eac2ec6d7a31b2acef821ac7d2c7817edaf7733380d1f05/regress-2025.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:442c225ce759004ea3913d8c7c4750509885f65c29b4b83407f5750000ae7556", size = 438451, upload-time = "2025-05-28T19:26:08.762Z" }, + { url = "https://files.pythonhosted.org/packages/22/63/ccbe38566bafa07c93eff086957db206543fccac5f60fc7db2b90955438b/regress-2025.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1539dcf6962e34cd27a7f6b6948acb16e8d0d657b681e6500227fa4f3dee06d8", size = 513278, upload-time = "2025-05-28T19:26:10.152Z" }, + { url = "https://files.pythonhosted.org/packages/a0/67/493ca9ec1194420e908213e98984660acd86192e10a7698ce363d890f4ee/regress-2025.5.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44c571d32c6968aa0a606be83f34f64c01cb7de9076b674bb80524f20cb5490f", size = 496730, upload-time = "2025-05-28T19:26:11.856Z" }, + { url = "https://files.pythonhosted.org/packages/d5/55/d9bb3032e4d911d569f9af0656715a4da8982705d986129d20bf40d63a15/regress-2025.5.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f930dcf98a808d3b311afb9689171e174a72fdadf9526334ccf1f53929ba329c", size = 667479, upload-time = "2025-05-28T19:26:13.083Z" }, + { url = "https://files.pythonhosted.org/packages/05/4f/dcc0161262652dbf0017f412b5541c5bf072b71b6acd93b7e95ec418ae48/regress-2025.5.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fe4f6993c29de003d3470d8be0c333f37d22313195da1c212963b79819624cd", size = 576477, upload-time = "2025-05-28T19:26:14.7Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/04a5d18333926f5c7c892dfb76e8d247048d176620a0de9ed1efec272bd3/regress-2025.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e387ab9dcf250ad6f95bc280949cc35c50755fb2ac32e1648455a515f4a12152", size = 516234, upload-time = "2025-05-28T19:26:15.942Z" }, + { url = "https://files.pythonhosted.org/packages/43/64/ab4fddba864a3c2cfe239ccb81e50d968926a0c1b2614c56b1e45c33e2e3/regress-2025.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:007c08544f7e0bebd8ee6c1defab8e9167f4fd7412420a470cb5de3dde2986c8", size = 516500, upload-time = "2025-05-28T19:26:17.533Z" }, + { url = "https://files.pythonhosted.org/packages/61/af/8386cda353fe0ea25dc4b2c499cfde2b83a425fd4c4d46632e9b268ccbd2/regress-2025.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90560fcc0b6579f13d3b9254690720514d4ee009979cfaa3dbd3231ca3489ec4", size = 692033, upload-time = "2025-05-28T19:26:18.713Z" }, + { url = "https://files.pythonhosted.org/packages/8d/dc/5e347752b6ee12db41c26835469723d62a4346a4fd9137006401324e5920/regress-2025.5.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:73c24e2ea5d17680c007b6561d4254f10ee1080904fdd3bbc20f128ab33d8842", size = 693293, upload-time = "2025-05-28T19:26:19.803Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/f8c9c15c2019da7afe6a855d680372b2c90bf5535a8cdc8e3293bda47a9b/regress-2025.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7d6c5b1616c77298016267e12ac92685e84df9c2179c0ef4aabe19c32c0c29cd", size = 686656, upload-time = "2025-05-28T19:26:21.48Z" }, + { url = "https://files.pythonhosted.org/packages/be/67/f9a57d923020472f8090d72abc3b42b071590f6666abf92875bd43070fd2/regress-2025.5.1-cp311-cp311-win32.whl", hash = "sha256:2b76254cc600a25261380edfd9b9024ade5e4a39eab2108706ad42e957181298", size = 281293, upload-time = "2025-05-28T19:26:22.712Z" }, + { url = "https://files.pythonhosted.org/packages/62/cf/23184a752188c6449c7e1553818a1268d71c2e5bf9a3440dd143e86bf5ac/regress-2025.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:afc635337f9aaece89c5a91910ffbdc5af9c433f35e8dfa8b48cc22ed697390d", size = 296687, upload-time = "2025-05-28T19:26:23.954Z" }, + { url = "https://files.pythonhosted.org/packages/f5/85/db413b5a8fe82db861d14f5258a5b91255149f34fa1d13e61c2662fbde77/regress-2025.5.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9886e545136d83013fca8e4dac4e46bdef840567ed10b4c56502e653df19bcb", size = 439244, upload-time = "2025-05-28T19:26:25.122Z" }, + { url = "https://files.pythonhosted.org/packages/08/23/b9c2fd89f5d0731f4b21f3cd4dc33545db8fec76e1ef5dead39fbe49c5d0/regress-2025.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40eafbcc4ffe3a9684d037b3fa07238a4c89697827ceeeb225b4dcf0201ef58b", size = 434473, upload-time = "2025-05-28T19:26:26.277Z" }, + { url = "https://files.pythonhosted.org/packages/e7/73/3423f43c7303a4c18ab580ca7272eeaa18f8c2fb599a0cac969dc7d70e68/regress-2025.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1be78366b48609d89b8ac4ea1659d8ddb146ef7219a79460b88735bf3e32ba", size = 513815, upload-time = "2025-05-28T19:26:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/01/82/be11935ac6bf7c34c6c95915583a0d601a4a6d5d5def426f4ccc5bb48f3d/regress-2025.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f00421d2e804a82730f376e7fd3d34f552ad4e965b313ebf66b2c013d9cb99fd", size = 496601, upload-time = "2025-05-28T19:26:28.713Z" }, + { url = "https://files.pythonhosted.org/packages/e4/39/815099043664c6ee82adc4fc8a9097354eafb9848ac8fa420cdf20cbf40e/regress-2025.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f964b9ed7be5fe403d7fb7fb394b10c25630c2680038ece7289a044b5d530c02", size = 668314, upload-time = "2025-05-28T19:26:29.902Z" }, + { url = "https://files.pythonhosted.org/packages/67/dd/5b49032a685032d1f0c357e01fd8777871d7cbb717bda88fc0d269fec29d/regress-2025.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc9b9646aafc9b72b1e4327247c078f38231c8834e71aa74d37f7f5a0cfdec47", size = 577281, upload-time = "2025-05-28T19:26:31.16Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2f/5c94c27ad3b16f5bfc555ba83ebadf5f1892ba64e10ec02e1fe0789d8f47/regress-2025.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cf47ab24f07b61d0e5c4b0610ca21f4d8aa623cc86ca3813b6652db72bc0a0a", size = 515939, upload-time = "2025-05-28T19:26:35.042Z" }, + { url = "https://files.pythonhosted.org/packages/44/4e/6c62d2cdde05f306e2d5046bf464554a7c605014065d4532253745a3dff8/regress-2025.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:960c7420a450f546bff636196087ce53f45b4abb4a3715e2673ccfa555e4c7c2", size = 516694, upload-time = "2025-05-28T19:26:36.626Z" }, + { url = "https://files.pythonhosted.org/packages/3a/e8/d5c04240a074ea901487aa238722705edd10ce6de0309c4cc2a5ae9d2c4b/regress-2025.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7244d348aaaa97ece7127fd1ad318fddb89f2011b51ccaa4eb7d995bef70a9ec", size = 692360, upload-time = "2025-05-28T19:26:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/c7/90/2acd9265098e1aaf08fd0c0b2d086b33662ec343f39dfa05f7705be9f641/regress-2025.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:23156a298935d997904dd4a4a4abeea747472294aac5f6eb60459203e9a6df49", size = 692793, upload-time = "2025-05-28T19:26:38.99Z" }, + { url = "https://files.pythonhosted.org/packages/56/b8/5088bb60355bb502c0e2ab72aecd3e4dbdc0267ed07efea359d7980aa43c/regress-2025.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c4e0dd87e9c4090d825ac9e95449f7e02bd3155db21fd30d0fe334513adc0700", size = 686268, upload-time = "2025-05-28T19:26:42.649Z" }, + { url = "https://files.pythonhosted.org/packages/42/16/12d9fa935a0ea3a779650acec8dfe7a3b17d715b279ebab24d8c356cff4d/regress-2025.5.1-cp312-cp312-win32.whl", hash = "sha256:5b85dc7e180533c2b3f227300006fcdc03cc95f5400db97bfd342552cad6d482", size = 281712, upload-time = "2025-05-28T19:26:43.76Z" }, + { url = "https://files.pythonhosted.org/packages/ac/21/2937f983c5e6d57f06ca92a74b9be450a6acf1be9a7a5bbec06422e2d8c3/regress-2025.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:4c5818b14730397253fd2f8da89cb0161264f5b19f0f602f4a869bf34680b6c4", size = 296678, upload-time = "2025-05-28T19:26:45.015Z" }, + { url = "https://files.pythonhosted.org/packages/ab/17/d80e02ae60a6fec29ab0d73b71abfe00a7a5f31c7c384ad97062ea7835a1/regress-2025.5.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:283e91c35e85762b1bfa78b2c663efba4b8b94d90c4e7380b30f5f8e148e77d0", size = 439279, upload-time = "2025-05-28T19:26:49.079Z" }, + { url = "https://files.pythonhosted.org/packages/2d/72/f3e2cb1791e46f290f872a66126ce7e42af820649b4a243e36d10ac95241/regress-2025.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2057064b2d5c181ea194ad33558df631f2eb2f11b7f16c211cbea95783f4ced4", size = 434735, upload-time = "2025-05-28T19:26:50.472Z" }, + { url = "https://files.pythonhosted.org/packages/71/f4/dcb05da833f8bf2e994b380cee5d47955809387467fa28f936fe9f7a10a3/regress-2025.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8521f0618e63a1e34dec3bfd3fb40bf8537775b69395d1ae2c9195391d4b5064", size = 513852, upload-time = "2025-05-28T19:26:51.65Z" }, + { url = "https://files.pythonhosted.org/packages/46/c6/cd74495390be8dc9679e956967548d21ce3f802d65fdb7444260536ef089/regress-2025.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0b669eb5527089fd283dff6fd34fc3cb9dd1695aa974d4f2b4742389571339c", size = 495859, upload-time = "2025-05-28T19:26:52.779Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1a/b0a9a9eb2bcff967b36c4c964dd4d543863a63107a66106d5bdede791155/regress-2025.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3823754ab1cb01b663b0a84a44aaa6cecbfb1dd0324355997997b83a3d09f4", size = 668042, upload-time = "2025-05-28T19:26:53.912Z" }, + { url = "https://files.pythonhosted.org/packages/cb/df/4bcc598a3a0a07751550dee501607d1dd1f8db56cd367d682c25af0dd68a/regress-2025.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5851d1606927ca4713b2709322517c93be93607106b179f362a0ebfb7ed4cd5", size = 576565, upload-time = "2025-05-28T19:26:55.402Z" }, + { url = "https://files.pythonhosted.org/packages/39/b3/38956fa7c54b3f55fc37b95bcaaae3de5cf15eeaa8dab392959b2a6b9e8c/regress-2025.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49630db291b85fcef96072f040149c286d78c5ce011a2c578193c498b68ee837", size = 516273, upload-time = "2025-05-28T19:26:57.475Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/05b1db070fbdcd1b4683fc5f32bdaaf98aec602f0c83a837f3e48777115c/regress-2025.5.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36cc08989dad724255b4258ba9d8fc9a89f059f88bbfb4d903b4937a037c0478", size = 516928, upload-time = "2025-05-28T19:26:58.689Z" }, + { url = "https://files.pythonhosted.org/packages/a0/97/3014917191e9191740148227cc50fe66178f885a92fd2ab5b94b9165b50a/regress-2025.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:75ec6bba86e152230b433ae02af334c1ed8d1d4a7b4b5f18a89a617425bc2a5e", size = 692220, upload-time = "2025-05-28T19:26:59.884Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bc/b22a6e0f19d9dcaef6cb2ba63ecdc5ff5c0e3410791d395ecb8dfbc7b1e6/regress-2025.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b7439b000d74d7a7ebce6718fca19860dbd1ff5b5e0519cea4cb7eb79f491ace", size = 692772, upload-time = "2025-05-28T19:27:01.433Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c6/df45f7620aa26a7f3a8dcd5e01051e35c3eb8640ecb0da12a3075d5fff95/regress-2025.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d1e4c17af40d32b97251bbab708386eccbc8b226fe6d807c12814c339a47c", size = 685844, upload-time = "2025-05-28T19:27:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/4d/fe/550ccb67838ba37aa6c88cbef4458204852faa238e083c04aeff1ad67a2f/regress-2025.5.1-cp313-cp313-win32.whl", hash = "sha256:e35db4525fa977bfdb0dc0a1f1f96ac4803ef9bad10c0b149934be79508c8a5d", size = 281555, upload-time = "2025-05-28T19:27:03.866Z" }, + { url = "https://files.pythonhosted.org/packages/9a/83/f3a3450dd525b70d35486309f1af7d35a3878cddbda63dcf8fa9eb94a873/regress-2025.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:4d47720c882ef370afe8a0191186b84f647364529c8f310ca36a16ed85a6763f", size = 296685, upload-time = "2025-05-28T19:27:05.005Z" }, + { url = "https://files.pythonhosted.org/packages/1b/5c/e40162c6a9325d08a7176455cc059fdbe61f890cbb6cb188aea608e87252/regress-2025.5.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:acecd2c0b6ce07cf99a5dbc6c95246ad3624526d0cd181db82504ffda1e8646f", size = 441134, upload-time = "2025-05-28T19:27:06.137Z" }, + { url = "https://files.pythonhosted.org/packages/5b/82/f43c1054ab6be1dde37f7fee23c06af3e59306e268bb0ae2900349a327fd/regress-2025.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:36a77a5d5967361f92999db10319735f458de02a3eff3b3ee76c659ab6db5813", size = 439700, upload-time = "2025-05-28T19:27:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6f/8dcb5641a6fb475cc78564a5067ce955b005b0ad21743adbd9a54035731b/regress-2025.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e73e711e84a5d3215011f646f221e7e4d6103c72464722d78ab8a947bb9f902a", size = 514278, upload-time = "2025-05-28T19:27:08.444Z" }, + { url = "https://files.pythonhosted.org/packages/3e/7c/8cb23b502d0a792ba9b3384a16621689a78c2a6b09ef172abebe069cc2d5/regress-2025.5.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6f93f5668d3389244720b40b0ae4e51926999249999a031425af1e4ac1ae9c6", size = 497001, upload-time = "2025-05-28T19:27:09.578Z" }, + { url = "https://files.pythonhosted.org/packages/87/b3/1d94646bc13316c77860c6d63bf6823cad3f74189f007867700dd11e2989/regress-2025.5.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f806b2503226d0609d1036669b8b099a45527809fc88194e0457017fc523ab7", size = 670263, upload-time = "2025-05-28T19:27:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/8b/8f/07120a8dd53802b1e826bbafc49129349edfe00bc6e0e796ed681c8a0954/regress-2025.5.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1711579a7dd0dcc27bb8a9868f910b1cecfe7c0d6fc329c8d90db4c5fbce867a", size = 576455, upload-time = "2025-05-28T19:27:15.113Z" }, + { url = "https://files.pythonhosted.org/packages/f4/62/e26d0be0fd2646e4b18dd38afa29da7bbe7a5c06a6f233df548df8430569/regress-2025.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6177fc0aed26c7d630c15994dee7028b76966a729fb0c21053debb18c91864fa", size = 516133, upload-time = "2025-05-28T19:27:16.347Z" }, + { url = "https://files.pythonhosted.org/packages/17/b2/758e840fbdfe302ea988582547077e8dab12ed6493a8b8e57afc359b02a1/regress-2025.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5e8682b2f12befaa0211b0f77a07040c63ad905ac68537a4af45e83ce694a83", size = 517362, upload-time = "2025-05-28T19:27:17.491Z" }, + { url = "https://files.pythonhosted.org/packages/7e/5a/f8325425d4eea841a097f83c09f7bcef84fe4bfd87982610cb23b7cd1085/regress-2025.5.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:12ff5cb9ef002afe0c0acddb5700dca169e892c5b6d5c6c4f8ece5759696b3b5", size = 692757, upload-time = "2025-05-28T19:27:18.715Z" }, + { url = "https://files.pythonhosted.org/packages/94/0f/8537df815410be685821bfe0fe13b1fabb4d98672a7b4ff92452edefbe58/regress-2025.5.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:80180e6b03d2698ca9781322eb7d05a220515e7293374bffc2386f403313f2a2", size = 693893, upload-time = "2025-05-28T19:27:20.397Z" }, + { url = "https://files.pythonhosted.org/packages/42/b8/88936f19ef1c3f0c320cc70370fdf7ca4fd522c1f55679fa6556f6424310/regress-2025.5.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:45b7b34587ee1b312610a14b399831ff8427552a9e10e2f1a38a3c0988447dd5", size = 686454, upload-time = "2025-05-28T19:27:21.696Z" }, + { url = "https://files.pythonhosted.org/packages/91/54/85ce61658b331ef94794e06e2e0adb943df882457b0777343aa090f1c7cb/regress-2025.5.1-cp39-cp39-win32.whl", hash = "sha256:cdd8d7ad2ab4f44a2d354d47fdb23462ef914ecfe11fc82e7f45040b6e1157eb", size = 281760, upload-time = "2025-05-28T19:27:22.913Z" }, + { url = "https://files.pythonhosted.org/packages/9d/05/669052ef4e203b73d89fc7129603b85804babfe3637397c9dc92a888cfe4/regress-2025.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:3a0fd95933a380d3a5f024d4af4bb4adbfac330e745d736f37511e871264169c", size = 296674, upload-time = "2025-05-28T19:27:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/7e/48/e2243ad50777c1c1f07236e8daf16fcabdd8808b9df554d998b13e64ebf2/regress-2025.5.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:19be109256d5c25dad89e197adcbc7611f31ce0146fb6778959fa60185325871", size = 441027, upload-time = "2025-05-28T19:27:25.571Z" }, + { url = "https://files.pythonhosted.org/packages/ef/45/ab7ea6aa2dd6fbe68462c4583a4c7f776fbf18b88daad4d8a1159ba0c0e8/regress-2025.5.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:57180a82631eb25d7bd09d26c0b70cef14df7920bad5b6f592515c12cb30a823", size = 438724, upload-time = "2025-05-28T19:27:27.206Z" }, + { url = "https://files.pythonhosted.org/packages/c3/09/bb494e6571e37fc1169506d1df70f8d74e8de04535a8cc4fb6344fc6f7a5/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0136a30d59cc5b36a7b4c66100342dfce3854c762a73d0a4e807d5547d5da7e1", size = 514034, upload-time = "2025-05-28T19:27:28.362Z" }, + { url = "https://files.pythonhosted.org/packages/52/74/fa13f89b99502e7ae151af8d8811afaaedbac4e0222f60f19829f2d25689/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0fa01bcbc032e510f67a3b66c36da8140249f28ed877f1f11d43fe50b12550eb", size = 496390, upload-time = "2025-05-28T19:27:29.586Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e9/25259f600c37daaf055152db33d1471ff17a96315f2e72f29ddc80d831fe/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ece3a0c430c5079a49087100ff848b7c6616f15262fd35af25aa927837436650", size = 667577, upload-time = "2025-05-28T19:27:30.824Z" }, + { url = "https://files.pythonhosted.org/packages/da/43/c42913a73866ad9d2fec9280452072d3cb0519f37bed219fe47ac48a4ced/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69714990457813b0eb70fea7475a766eafd1f8523c9c6c23e2a95f6edc322bc3", size = 576560, upload-time = "2025-05-28T19:27:31.991Z" }, + { url = "https://files.pythonhosted.org/packages/17/15/03a654e2ffa14cd35289b115a72e01108f157559bdd89e45db824aa70a67/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dbc3f8ce807d95663f6f22ebf7181921c0ee58589e0b4bc27a3cdb869fb4f69", size = 516511, upload-time = "2025-05-28T19:27:33.157Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fc/20af13614e5377171ecd6d9a76d189719b4df28a3675fb9d739b699d98af/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a268f59caa74c3723c1625da6ecd5e4363cc356dee2f6cf786bc5592a084b30", size = 517293, upload-time = "2025-05-28T19:27:34.309Z" }, + { url = "https://files.pythonhosted.org/packages/c7/23/0eef5748e1934cf0579c18ec1cdd6b15fae0f4bb0de7fdac32a638d2f161/regress-2025.5.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:273229dfca1cd90965a87c6a193804bf981d7fe05ecc8fe7934a65d6e57e6949", size = 692639, upload-time = "2025-05-28T19:27:35.832Z" }, + { url = "https://files.pythonhosted.org/packages/a1/30/c94b73eddff8a51a02897e99ab6d83fa7591dc161ffa03ef1e0cd089f739/regress-2025.5.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:7d2a52238f28ffbbe6e5e7f11b82d62a2bf46ccd4c680cf95d1570bc54136026", size = 693700, upload-time = "2025-05-28T19:27:37.065Z" }, + { url = "https://files.pythonhosted.org/packages/ca/14/507664b58240b0e9ef415b7b4a3f3a0959fd1f5c41a46742cfb7e1be7463/regress-2025.5.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3a672f370389a17919674cf06402419f1485b53a0c6ddacd5c57a30f2e763ad3", size = 686807, upload-time = "2025-05-28T19:27:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b9/549ef1246dd0ed42e72ba89cffdc419a59ecd12d5329d9f8ddf8bcab0ae2/regress-2025.5.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:18274d9d672b41c8b82c24d983fd3dd0d4f15d1db109d271e3bfeb4e8416ac88", size = 296250, upload-time = "2025-05-28T19:27:39.481Z" }, + { url = "https://files.pythonhosted.org/packages/3a/6a/62c354eddc8c35cb5feb983f42c2c80af367d51c0893dbc76e7e7bf4c669/regress-2025.5.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:93ba1a5bf40a35692afe6363ebb1c3248a854691db03abd8b40409f17eefa20d", size = 440907, upload-time = "2025-05-28T19:27:40.613Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a1/f70c3ed780296aa05542566bb3af02fdbe7e4a53e8e2417287f6a53a7e2e/regress-2025.5.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84a60e045cbb94c8e88f37b8a8c35f6c0415cf2dd96fde9c5bf918e218cdf776", size = 439000, upload-time = "2025-05-28T19:27:42.284Z" }, + { url = "https://files.pythonhosted.org/packages/4c/07/4c832ffd7891cc1713386569a0eeb09a94aff38e7a577e072e57ccb1077c/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a8d4622b188c2e59c7a8d9da0d0a2255041f055d035f47b15bfdc1cb34d775", size = 513908, upload-time = "2025-05-28T19:27:43.438Z" }, + { url = "https://files.pythonhosted.org/packages/a8/e2/31f5fa221032bac9cb26106e65e7b7b9679c74c91149eb5a5fca9ffef800/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f67df1a4c82fb3849df44e3625ea7ff4fe572c4915365060fedd4b9c74033b7", size = 496113, upload-time = "2025-05-28T19:27:44.638Z" }, + { url = "https://files.pythonhosted.org/packages/ac/9b/6dbf605923da7a5d9295ea2aa94e8a1e10dcf3b704b862bdf5943bee47c8/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c56471ec3d0ffa38d98bb3cd3acbcd550788c62ee0cee5a09343582594d82289", size = 669026, upload-time = "2025-05-28T19:27:46.274Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0a/d0df2a3e376203792df30f02f5f0058270abc940382a8b199e40b4f2b51f/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba5aa399575fa872bd6d4c8deec97817135197c849033fd72120698c6d3aea5f", size = 576253, upload-time = "2025-05-28T19:27:47.471Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ef/a94ec34de5c85af1781fffad6a595027448a97d169350ca72d3770146162/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:452574993e4aaf85f4f3c1bd71b6d0fe641b5be70b38ba02f5efde4d0944b9f0", size = 516015, upload-time = "2025-05-28T19:27:48.693Z" }, + { url = "https://files.pythonhosted.org/packages/36/05/16afc04aedfa91ed94b0ec4be305a7ae840c803aa429c86d4ff59eca0e4c/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d01518f63b0ad6c26a9bde4de9634dd292d6877c6c2703afd3ef53976059fda5", size = 517035, upload-time = "2025-05-28T19:27:50.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a0/5beccd955a3b41f7b680f7da4a415fd9e34468c8416cdd8b54f71f5e0e83/regress-2025.5.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:10817b4f0922ecba439c271d88e1958c13a003557639e96ad2b0f0d5f2526f86", size = 692457, upload-time = "2025-05-28T19:27:51.709Z" }, + { url = "https://files.pythonhosted.org/packages/ab/64/e19dcb1523f3f0c298236b21d5342d78bbbd1abe8a615fdae96ec887c3f7/regress-2025.5.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:fedb74fdd78a79de4d7c8d950f9274fc318198758d0f46ec256218f0afa00597", size = 693420, upload-time = "2025-05-28T19:27:52.953Z" }, + { url = "https://files.pythonhosted.org/packages/ef/24/9debbb1fade18f85743cd24a3e45ad8a019ade407a07fe4cb37015196660/regress-2025.5.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:24d6ff8c02d629fce414c614a990df6bd7a32d048d066b39b9b966567a18aa1d", size = 686967, upload-time = "2025-05-28T19:27:54.182Z" }, + { url = "https://files.pythonhosted.org/packages/4d/83/33f9e090dd3208a683feefce062dbeb8d20e076abacdcfb83baa107da136/regress-2025.5.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e201c763383b3ed6ffb56403c36c519cb008cb822f329ff073b503a24734de45", size = 296531, upload-time = "2025-05-28T19:27:55.527Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/ed/3aef893e2dd30e77e35d20d4ddb45ca459db59cead748cad9796ad479411/rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef", size = 371606, upload-time = "2025-08-27T12:12:25.189Z" }, + { url = "https://files.pythonhosted.org/packages/6d/82/9818b443e5d3eb4c83c3994561387f116aae9833b35c484474769c4a8faf/rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be", size = 353452, upload-time = "2025-08-27T12:12:27.433Z" }, + { url = "https://files.pythonhosted.org/packages/99/c7/d2a110ffaaa397fc6793a83c7bd3545d9ab22658b7cdff05a24a4535cc45/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61", size = 381519, upload-time = "2025-08-27T12:12:28.719Z" }, + { url = "https://files.pythonhosted.org/packages/5a/bc/e89581d1f9d1be7d0247eaef602566869fdc0d084008ba139e27e775366c/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb", size = 394424, upload-time = "2025-08-27T12:12:30.207Z" }, + { url = "https://files.pythonhosted.org/packages/ac/2e/36a6861f797530e74bb6ed53495f8741f1ef95939eed01d761e73d559067/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657", size = 523467, upload-time = "2025-08-27T12:12:31.808Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/c1bc2be32564fa499f988f0a5c6505c2f4746ef96e58e4d7de5cf923d77e/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013", size = 402660, upload-time = "2025-08-27T12:12:33.444Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ec/ef8bf895f0628dd0a59e54d81caed6891663cb9c54a0f4bb7da918cb88cf/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a", size = 384062, upload-time = "2025-08-27T12:12:34.857Z" }, + { url = "https://files.pythonhosted.org/packages/69/f7/f47ff154be8d9a5e691c083a920bba89cef88d5247c241c10b9898f595a1/rpds_py-0.27.1-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1", size = 401289, upload-time = "2025-08-27T12:12:36.085Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d9/ca410363efd0615814ae579f6829cafb39225cd63e5ea5ed1404cb345293/rpds_py-0.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10", size = 417718, upload-time = "2025-08-27T12:12:37.401Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a0/8cb5c2ff38340f221cc067cc093d1270e10658ba4e8d263df923daa18e86/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808", size = 558333, upload-time = "2025-08-27T12:12:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8c/1b0de79177c5d5103843774ce12b84caa7164dfc6cd66378768d37db11bf/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8", size = 589127, upload-time = "2025-08-27T12:12:41.48Z" }, + { url = "https://files.pythonhosted.org/packages/c8/5e/26abb098d5e01266b0f3a2488d299d19ccc26849735d9d2b95c39397e945/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9", size = 554899, upload-time = "2025-08-27T12:12:42.925Z" }, + { url = "https://files.pythonhosted.org/packages/de/41/905cc90ced13550db017f8f20c6d8e8470066c5738ba480d7ba63e3d136b/rpds_py-0.27.1-cp310-cp310-win32.whl", hash = "sha256:ee5422d7fb21f6a00c1901bf6559c49fee13a5159d0288320737bbf6585bd3e4", size = 217450, upload-time = "2025-08-27T12:12:44.813Z" }, + { url = "https://files.pythonhosted.org/packages/75/3d/6bef47b0e253616ccdf67c283e25f2d16e18ccddd38f92af81d5a3420206/rpds_py-0.27.1-cp310-cp310-win_amd64.whl", hash = "sha256:3e039aabf6d5f83c745d5f9a0a381d031e9ed871967c0a5c38d201aca41f3ba1", size = 228447, upload-time = "2025-08-27T12:12:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c1/7907329fbef97cbd49db6f7303893bd1dd5a4a3eae415839ffdfb0762cae/rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881", size = 371063, upload-time = "2025-08-27T12:12:47.856Z" }, + { url = "https://files.pythonhosted.org/packages/11/94/2aab4bc86228bcf7c48760990273653a4900de89c7537ffe1b0d6097ed39/rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5", size = 353210, upload-time = "2025-08-27T12:12:49.187Z" }, + { url = "https://files.pythonhosted.org/packages/3a/57/f5eb3ecf434342f4f1a46009530e93fd201a0b5b83379034ebdb1d7c1a58/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e", size = 381636, upload-time = "2025-08-27T12:12:50.492Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f4/ef95c5945e2ceb5119571b184dd5a1cc4b8541bbdf67461998cfeac9cb1e/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c", size = 394341, upload-time = "2025-08-27T12:12:52.024Z" }, + { url = "https://files.pythonhosted.org/packages/5a/7e/4bd610754bf492d398b61725eb9598ddd5eb86b07d7d9483dbcd810e20bc/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195", size = 523428, upload-time = "2025-08-27T12:12:53.779Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e5/059b9f65a8c9149361a8b75094864ab83b94718344db511fd6117936ed2a/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52", size = 402923, upload-time = "2025-08-27T12:12:55.15Z" }, + { url = "https://files.pythonhosted.org/packages/f5/48/64cabb7daced2968dd08e8a1b7988bf358d7bd5bcd5dc89a652f4668543c/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed", size = 384094, upload-time = "2025-08-27T12:12:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e1/dc9094d6ff566bff87add8a510c89b9e158ad2ecd97ee26e677da29a9e1b/rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a", size = 401093, upload-time = "2025-08-27T12:12:58.985Z" }, + { url = "https://files.pythonhosted.org/packages/37/8e/ac8577e3ecdd5593e283d46907d7011618994e1d7ab992711ae0f78b9937/rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde", size = 417969, upload-time = "2025-08-27T12:13:00.367Z" }, + { url = "https://files.pythonhosted.org/packages/66/6d/87507430a8f74a93556fe55c6485ba9c259949a853ce407b1e23fea5ba31/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21", size = 558302, upload-time = "2025-08-27T12:13:01.737Z" }, + { url = "https://files.pythonhosted.org/packages/3a/bb/1db4781ce1dda3eecc735e3152659a27b90a02ca62bfeea17aee45cc0fbc/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9", size = 589259, upload-time = "2025-08-27T12:13:03.127Z" }, + { url = "https://files.pythonhosted.org/packages/7b/0e/ae1c8943d11a814d01b482e1f8da903f88047a962dff9bbdadf3bd6e6fd1/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948", size = 554983, upload-time = "2025-08-27T12:13:04.516Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/0b2a55415931db4f112bdab072443ff76131b5ac4f4dc98d10d2d357eb03/rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39", size = 217154, upload-time = "2025-08-27T12:13:06.278Z" }, + { url = "https://files.pythonhosted.org/packages/24/75/3b7ffe0d50dc86a6a964af0d1cc3a4a2cdf437cb7b099a4747bbb96d1819/rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15", size = 228627, upload-time = "2025-08-27T12:13:07.625Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3f/4fd04c32abc02c710f09a72a30c9a55ea3cc154ef8099078fd50a0596f8e/rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746", size = 220998, upload-time = "2025-08-27T12:13:08.972Z" }, + { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, + { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, + { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, + { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, + { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, + { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, + { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, + { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, + { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, + { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, + { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, + { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, + { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, + { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, + { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, + { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, + { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, + { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, + { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, + { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, + { url = "https://files.pythonhosted.org/packages/7f/6c/252e83e1ce7583c81f26d1d884b2074d40a13977e1b6c9c50bbf9a7f1f5a/rpds_py-0.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c918c65ec2e42c2a78d19f18c553d77319119bf43aa9e2edf7fb78d624355527", size = 372140, upload-time = "2025-08-27T12:15:05.441Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/949c195d927c5aeb0d0629d329a20de43a64c423a6aa53836290609ef7ec/rpds_py-0.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1fea2b1a922c47c51fd07d656324531adc787e415c8b116530a1d29c0516c62d", size = 354086, upload-time = "2025-08-27T12:15:07.404Z" }, + { url = "https://files.pythonhosted.org/packages/9f/02/e43e332ad8ce4f6c4342d151a471a7f2900ed1d76901da62eb3762663a71/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf94c58e8e0cd6b6f38d8de67acae41b3a515c26169366ab58bdca4a6883bb8", size = 382117, upload-time = "2025-08-27T12:15:09.275Z" }, + { url = "https://files.pythonhosted.org/packages/d0/05/b0fdeb5b577197ad72812bbdfb72f9a08fa1e64539cc3940b1b781cd3596/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2a8fed130ce946d5c585eddc7c8eeef0051f58ac80a8ee43bd17835c144c2cc", size = 394520, upload-time = "2025-08-27T12:15:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/67/1f/4cfef98b2349a7585181e99294fa2a13f0af06902048a5d70f431a66d0b9/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:037a2361db72ee98d829bc2c5b7cc55598ae0a5e0ec1823a56ea99374cfd73c1", size = 522657, upload-time = "2025-08-27T12:15:12.613Z" }, + { url = "https://files.pythonhosted.org/packages/44/55/ccf37ddc4c6dce7437b335088b5ca18da864b334890e2fe9aa6ddc3f79a9/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5281ed1cc1d49882f9997981c88df1a22e140ab41df19071222f7e5fc4e72125", size = 402967, upload-time = "2025-08-27T12:15:14.113Z" }, + { url = "https://files.pythonhosted.org/packages/74/e5/5903f92e41e293b07707d5bf00ef39a0eb2af7190aff4beaf581a6591510/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd50659a069c15eef8aa3d64bbef0d69fd27bb4a50c9ab4f17f83a16cbf8905", size = 384372, upload-time = "2025-08-27T12:15:15.842Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e3/fbb409e18aeefc01e49f5922ac63d2d914328430e295c12183ce56ebf76b/rpds_py-0.27.1-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:c4b676c4ae3921649a15d28ed10025548e9b561ded473aa413af749503c6737e", size = 401264, upload-time = "2025-08-27T12:15:17.388Z" }, + { url = "https://files.pythonhosted.org/packages/55/79/529ad07794e05cb0f38e2f965fc5bb20853d523976719400acecc447ec9d/rpds_py-0.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:079bc583a26db831a985c5257797b2b5d3affb0386e7ff886256762f82113b5e", size = 418691, upload-time = "2025-08-27T12:15:19.144Z" }, + { url = "https://files.pythonhosted.org/packages/33/39/6554a7fd6d9906fda2521c6d52f5d723dca123529fb719a5b5e074c15e01/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4e44099bd522cba71a2c6b97f68e19f40e7d85399de899d66cdb67b32d7cb786", size = 558989, upload-time = "2025-08-27T12:15:21.087Z" }, + { url = "https://files.pythonhosted.org/packages/19/b2/76fa15173b6f9f445e5ef15120871b945fb8dd9044b6b8c7abe87e938416/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e202e6d4188e53c6661af813b46c37ca2c45e497fc558bacc1a7630ec2695aec", size = 589835, upload-time = "2025-08-27T12:15:22.696Z" }, + { url = "https://files.pythonhosted.org/packages/ee/9e/5560a4b39bab780405bed8a88ee85b30178061d189558a86003548dea045/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f41f814b8eaa48768d1bb551591f6ba45f87ac76899453e8ccd41dba1289b04b", size = 555227, upload-time = "2025-08-27T12:15:24.278Z" }, + { url = "https://files.pythonhosted.org/packages/52/d7/cd9c36215111aa65724c132bf709c6f35175973e90b32115dedc4ced09cb/rpds_py-0.27.1-cp39-cp39-win32.whl", hash = "sha256:9e71f5a087ead99563c11fdaceee83ee982fd39cf67601f4fd66cb386336ee52", size = 217899, upload-time = "2025-08-27T12:15:25.926Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e0/d75ab7b4dd8ba777f6b365adbdfc7614bbfe7c5f05703031dfa4b61c3d6c/rpds_py-0.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:71108900c9c3c8590697244b9519017a400d9ba26a36c48381b3f64743a44aab", size = 228725, upload-time = "2025-08-27T12:15:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/d5/63/b7cc415c345625d5e62f694ea356c58fb964861409008118f1245f8c3347/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf", size = 371360, upload-time = "2025-08-27T12:15:29.218Z" }, + { url = "https://files.pythonhosted.org/packages/e5/8c/12e1b24b560cf378b8ffbdb9dc73abd529e1adcfcf82727dfd29c4a7b88d/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3", size = 353933, upload-time = "2025-08-27T12:15:30.837Z" }, + { url = "https://files.pythonhosted.org/packages/9b/85/1bb2210c1f7a1b99e91fea486b9f0f894aa5da3a5ec7097cbad7dec6d40f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636", size = 382962, upload-time = "2025-08-27T12:15:32.348Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c9/a839b9f219cf80ed65f27a7f5ddbb2809c1b85c966020ae2dff490e0b18e/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8", size = 394412, upload-time = "2025-08-27T12:15:33.839Z" }, + { url = "https://files.pythonhosted.org/packages/02/2d/b1d7f928b0b1f4fc2e0133e8051d199b01d7384875adc63b6ddadf3de7e5/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc", size = 523972, upload-time = "2025-08-27T12:15:35.377Z" }, + { url = "https://files.pythonhosted.org/packages/a9/af/2cbf56edd2d07716df1aec8a726b3159deb47cb5c27e1e42b71d705a7c2f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8", size = 403273, upload-time = "2025-08-27T12:15:37.051Z" }, + { url = "https://files.pythonhosted.org/packages/c0/93/425e32200158d44ff01da5d9612c3b6711fe69f606f06e3895511f17473b/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc", size = 385278, upload-time = "2025-08-27T12:15:38.571Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1a/1a04a915ecd0551bfa9e77b7672d1937b4b72a0fc204a17deef76001cfb2/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71", size = 402084, upload-time = "2025-08-27T12:15:40.529Z" }, + { url = "https://files.pythonhosted.org/packages/51/f7/66585c0fe5714368b62951d2513b684e5215beaceab2c6629549ddb15036/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad", size = 419041, upload-time = "2025-08-27T12:15:42.191Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7e/83a508f6b8e219bba2d4af077c35ba0e0cdd35a751a3be6a7cba5a55ad71/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab", size = 560084, upload-time = "2025-08-27T12:15:43.839Z" }, + { url = "https://files.pythonhosted.org/packages/66/66/bb945683b958a1b19eb0fe715594630d0f36396ebdef4d9b89c2fa09aa56/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059", size = 590115, upload-time = "2025-08-27T12:15:46.647Z" }, + { url = "https://files.pythonhosted.org/packages/12/00/ccfaafaf7db7e7adace915e5c2f2c2410e16402561801e9c7f96683002d3/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b", size = 556561, upload-time = "2025-08-27T12:15:48.219Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b7/92b6ed9aad103bfe1c45df98453dfae40969eef2cb6c6239c58d7e96f1b3/rpds_py-0.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c796c0c1cc68cb08b0284db4229f5af76168172670c74908fdbd4b7d7f515819", size = 229125, upload-time = "2025-08-27T12:15:49.956Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ed/e1fba02de17f4f76318b834425257c8ea297e415e12c68b4361f63e8ae92/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df", size = 371402, upload-time = "2025-08-27T12:15:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/af/7c/e16b959b316048b55585a697e94add55a4ae0d984434d279ea83442e460d/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3", size = 354084, upload-time = "2025-08-27T12:15:53.219Z" }, + { url = "https://files.pythonhosted.org/packages/de/c1/ade645f55de76799fdd08682d51ae6724cb46f318573f18be49b1e040428/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9", size = 383090, upload-time = "2025-08-27T12:15:55.158Z" }, + { url = "https://files.pythonhosted.org/packages/1f/27/89070ca9b856e52960da1472efcb6c20ba27cfe902f4f23ed095b9cfc61d/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc", size = 394519, upload-time = "2025-08-27T12:15:57.238Z" }, + { url = "https://files.pythonhosted.org/packages/b3/28/be120586874ef906aa5aeeae95ae8df4184bc757e5b6bd1c729ccff45ed5/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4", size = 523817, upload-time = "2025-08-27T12:15:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/70cc197bc11cfcde02a86f36ac1eed15c56667c2ebddbdb76a47e90306da/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66", size = 403240, upload-time = "2025-08-27T12:16:00.923Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/46936cca449f7f518f2f4996e0e8344db4b57e2081e752441154089d2a5f/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e", size = 385194, upload-time = "2025-08-27T12:16:02.802Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/29c0d3e5125c3270b51415af7cbff1ec587379c84f55a5761cc9efa8cd06/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c", size = 402086, upload-time = "2025-08-27T12:16:04.806Z" }, + { url = "https://files.pythonhosted.org/packages/8f/66/03e1087679227785474466fdd04157fb793b3b76e3fcf01cbf4c693c1949/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf", size = 419272, upload-time = "2025-08-27T12:16:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/6a/24/e3e72d265121e00b063aef3e3501e5b2473cf1b23511d56e529531acf01e/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf", size = 560003, upload-time = "2025-08-27T12:16:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/f5a344c534214cc2d41118c0699fffbdc2c1bc7046f2a2b9609765ab9c92/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6", size = 590482, upload-time = "2025-08-27T12:16:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ea/5463cd5048a7a2fcdae308b6e96432802132c141bfb9420260142632a0f1/rpds_py-0.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa8933159edc50be265ed22b401125c9eebff3171f570258854dbce3ecd55475", size = 371778, upload-time = "2025-08-27T12:16:13.851Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/f38c099db07f5114029c1467649d308543906933eebbc226d4527a5f4693/rpds_py-0.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50431bf02583e21bf273c71b89d710e7a710ad5e39c725b14e685610555926f", size = 354394, upload-time = "2025-08-27T12:16:15.609Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/b76f97704d9dd8ddbd76fed4c4048153a847c5d6003afe20a6b5c3339065/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78af06ddc7fe5cc0e967085a9115accee665fb912c22a3f54bad70cc65b05fe6", size = 382348, upload-time = "2025-08-27T12:16:17.251Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3f/ef23d3c1be1b837b648a3016d5bbe7cfe711422ad110b4081c0a90ef5a53/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70d0738ef8fee13c003b100c2fbd667ec4f133468109b3472d249231108283a3", size = 394159, upload-time = "2025-08-27T12:16:19.251Z" }, + { url = "https://files.pythonhosted.org/packages/74/8a/9e62693af1a34fd28b1a190d463d12407bd7cf561748cb4745845d9548d3/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2f6fd8a1cea5bbe599b6e78a6e5ee08db434fc8ffea51ff201c8765679698b3", size = 522775, upload-time = "2025-08-27T12:16:20.929Z" }, + { url = "https://files.pythonhosted.org/packages/36/0d/8d5bb122bf7a60976b54c5c99a739a3819f49f02d69df3ea2ca2aff47d5c/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8177002868d1426305bb5de1e138161c2ec9eb2d939be38291d7c431c4712df8", size = 402633, upload-time = "2025-08-27T12:16:22.548Z" }, + { url = "https://files.pythonhosted.org/packages/0f/0e/237948c1f425e23e0cf5a566d702652a6e55c6f8fbd332a1792eb7043daf/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:008b839781d6c9bf3b6a8984d1d8e56f0ec46dc56df61fd669c49b58ae800400", size = 384867, upload-time = "2025-08-27T12:16:24.29Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0a/da0813efcd998d260cbe876d97f55b0f469ada8ba9cbc47490a132554540/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:a55b9132bb1ade6c734ddd2759c8dc132aa63687d259e725221f106b83a0e485", size = 401791, upload-time = "2025-08-27T12:16:25.954Z" }, + { url = "https://files.pythonhosted.org/packages/51/78/c6c9e8a8aaca416a6f0d1b6b4a6ee35b88fe2c5401d02235d0a056eceed2/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a46fdec0083a26415f11d5f236b79fa1291c32aaa4a17684d82f7017a1f818b1", size = 419525, upload-time = "2025-08-27T12:16:27.659Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/5af37e1d71487cf6d56dd1420dc7e0c2732c1b6ff612aa7a88374061c0a8/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8a63b640a7845f2bdd232eb0d0a4a2dd939bcdd6c57e6bb134526487f3160ec5", size = 559255, upload-time = "2025-08-27T12:16:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/8b7b136069ef7ac3960eda25d832639bdb163018a34c960ed042dd1707c8/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7e32721e5d4922deaaf963469d795d5bde6093207c52fec719bd22e5d1bedbc4", size = 590384, upload-time = "2025-08-27T12:16:31.005Z" }, + { url = "https://files.pythonhosted.org/packages/d8/06/c316d3f6ff03f43ccb0eba7de61376f8ec4ea850067dddfafe98274ae13c/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c426b99a068601b5f4623573df7a7c3d72e87533a2dd2253353a03e7502566c", size = 555959, upload-time = "2025-08-27T12:16:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/60/94/384cf54c430b9dac742bbd2ec26c23feb78ded0d43d6d78563a281aec017/rpds_py-0.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fc9b7fe29478824361ead6e14e4f5aed570d477e06088826537e202d25fe859", size = 228784, upload-time = "2025-08-27T12:16:34.428Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.15" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865, upload-time = "2025-08-19T11:15:10.694Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702, upload-time = "2025-08-19T11:15:07.696Z" }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e9/39ec4d4b3f91188fad1842748f67d4e749c77c37e353c4e545052ee8e893/ruamel.yaml.clib-0.2.14.tar.gz", hash = "sha256:803f5044b13602d58ea378576dd75aa759f52116a0232608e8fdada4da33752e", size = 225394, upload-time = "2025-09-22T19:51:23.753Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/56/35a0a752415ae01992c68f5a6513bdef0e1b6fbdb60d7619342ce12346a0/ruamel.yaml.clib-0.2.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f8b2acb0ffdd2ce8208accbec2dca4a06937d556fdcaefd6473ba1b5daa7e3c4", size = 269216, upload-time = "2025-09-23T14:24:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/98/6a/9a68184ab93619f4607ff1675e4ef01e8accfcbff0d482f4ca44c10d8eab/ruamel.yaml.clib-0.2.14-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:aef953f3b8bd0b50bd52a2e52fb54a6a2171a1889d8dea4a5959d46c6624c451", size = 137092, upload-time = "2025-09-22T19:50:26.906Z" }, + { url = "https://files.pythonhosted.org/packages/2b/3f/cfed5f088628128a9ec66f46794fd4d165642155c7b78c26d83b16c6bf7b/ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a0ac90efbc7a77b0d796c03c8cc4e62fd710b3f1e4c32947713ef2ef52e09543", size = 633768, upload-time = "2025-09-22T19:50:31.228Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d5/5ce2cc156c1da48160171968d91f066d305840fbf930ee955a509d025a44/ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bf6b699223afe6c7fe9f2ef76e0bfa6dd892c21e94ce8c957478987ade76cd8", size = 721253, upload-time = "2025-09-22T19:50:28.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/71/d0b56bc902b38ebe4be8e270f730f929eec4edaf8a0fa7028f4ef64fa950/ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d73a0187718f6eec5b2f729b0f98e4603f7bd9c48aa65d01227d1a5dcdfbe9e8", size = 683823, upload-time = "2025-09-22T19:50:29.993Z" }, + { url = "https://files.pythonhosted.org/packages/4b/db/1f37449dd89c540218598316ccafc1a0aed60215e72efa315c5367cfd015/ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81f6d3b19bc703679a5705c6a16dabdc79823c71d791d73c65949be7f3012c02", size = 690370, upload-time = "2025-09-23T18:42:46.797Z" }, + { url = "https://files.pythonhosted.org/packages/5d/53/c498b30f35efcd9f47cb084d7ad9374f2b907470f73913dec6396b81397d/ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b28caeaf3e670c08cb7e8de221266df8494c169bd6ed8875493fab45be9607a4", size = 703578, upload-time = "2025-09-22T19:50:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/34/79/492cfad9baed68914840c39e5f3c1cc251f51a897ddb3f532601215cbb12/ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94f3efb718f8f49b031f2071ec7a27dd20cbfe511b4dfd54ecee54c956da2b31", size = 722544, upload-time = "2025-09-22T19:50:34.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f5/479ebfd5ba396e209ade90f7282d84b90c57b3e07be8dc6fcd02a6df7ffc/ruamel.yaml.clib-0.2.14-cp310-cp310-win32.whl", hash = "sha256:27c070cf3888e90d992be75dd47292ff9aa17dafd36492812a6a304a1aedc182", size = 100375, upload-time = "2025-09-22T19:50:36.832Z" }, + { url = "https://files.pythonhosted.org/packages/57/31/a044520fdb3bd409889f67f1efebda0658033c7ab3f390cee37531cc9a9e/ruamel.yaml.clib-0.2.14-cp310-cp310-win_amd64.whl", hash = "sha256:4f4a150a737fccae13fb51234d41304ff2222e3b7d4c8e9428ed1a6ab48389b8", size = 118129, upload-time = "2025-09-22T19:50:35.545Z" }, + { url = "https://files.pythonhosted.org/packages/b3/9f/3c51e9578b8c36fcc4bdd271a1a5bb65963a74a4b6ad1a989768a22f6c2a/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bae1a073ca4244620425cd3d3aa9746bde590992b98ee8c7c8be8c597ca0d4e", size = 270207, upload-time = "2025-09-23T14:24:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/4a/16/cb02815bc2ae9c66760c0c061d23c7358f9ba51dae95ac85247662b7fbe2/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:0a54e5e40a7a691a426c2703b09b0d61a14294d25cfacc00631aa6f9c964df0d", size = 137780, upload-time = "2025-09-22T19:50:37.734Z" }, + { url = "https://files.pythonhosted.org/packages/31/c6/fc687cd1b93bff8e40861eea46d6dc1a6a778d9a085684e4045ff26a8e40/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:10d9595b6a19778f3269399eff6bab642608e5966183abc2adbe558a42d4efc9", size = 641590, upload-time = "2025-09-22T19:50:41.978Z" }, + { url = "https://files.pythonhosted.org/packages/45/5d/65a2bc08b709b08576b3f307bf63951ee68a8e047cbbda6f1c9864ecf9a7/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba72975485f2b87b786075e18a6e5d07dc2b4d8973beb2732b9b2816f1bad70", size = 738090, upload-time = "2025-09-22T19:50:39.152Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d0/a70a03614d9a6788a3661ab1538879ed2aae4e84d861f101243116308a37/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29757bdb7c142f9595cc1b62ec49a3d1c83fab9cef92db52b0ccebaad4eafb98", size = 700744, upload-time = "2025-09-22T19:50:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/77/30/c93fa457611f79946d5cb6cc97493ca5425f3f21891d7b1f9b44eaa1b38e/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:557df28dbccf79b152fe2d1b935f6063d9cc431199ea2b0e84892f35c03bb0ee", size = 742321, upload-time = "2025-09-23T18:42:48.916Z" }, + { url = "https://files.pythonhosted.org/packages/40/85/e2c54ad637117cd13244a4649946eaa00f32edcb882d1f92df90e079ab00/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:26a8de280ab0d22b6e3ec745b4a5a07151a0f74aad92dd76ab9c8d8d7087720d", size = 743805, upload-time = "2025-09-22T19:50:43.58Z" }, + { url = "https://files.pythonhosted.org/packages/81/50/f899072c38877d8ef5382e0b3d47f8c4346226c1f52d6945d6f64fec6a2f/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e501c096aa3889133d674605ebd018471bc404a59cbc17da3c5924421c54d97c", size = 769529, upload-time = "2025-09-22T19:50:45.707Z" }, + { url = "https://files.pythonhosted.org/packages/99/7c/96d4b5075e30c65ea2064e40c2d657c7c235d7b6ef18751cf89a935b9041/ruamel.yaml.clib-0.2.14-cp311-cp311-win32.whl", hash = "sha256:915748cfc25b8cfd81b14d00f4bfdb2ab227a30d6d43459034533f4d1c207a2a", size = 100256, upload-time = "2025-09-22T19:50:48.26Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8c/73ee2babd04e8bfcf1fd5c20aa553d18bf0ebc24b592b4f831d12ae46cc0/ruamel.yaml.clib-0.2.14-cp311-cp311-win_amd64.whl", hash = "sha256:4ccba93c1e5a40af45b2f08e4591969fa4697eae951c708f3f83dcbf9f6c6bb1", size = 118234, upload-time = "2025-09-22T19:50:47.019Z" }, + { url = "https://files.pythonhosted.org/packages/b4/42/ccfb34a25289afbbc42017e4d3d4288e61d35b2e00cfc6b92974a6a1f94b/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6aeadc170090ff1889f0d2c3057557f9cd71f975f17535c26a5d37af98f19c27", size = 271775, upload-time = "2025-09-23T14:24:12.771Z" }, + { url = "https://files.pythonhosted.org/packages/82/73/e628a92e80197ff6a79ab81ec3fa00d4cc082d58ab78d3337b7ba7043301/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5e56ac47260c0eed992789fa0b8efe43404a9adb608608631a948cee4fc2b052", size = 138842, upload-time = "2025-09-22T19:50:49.156Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c5/346c7094344a60419764b4b1334d9e0285031c961176ff88ffb652405b0c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a911aa73588d9a8b08d662b9484bc0567949529824a55d3885b77e8dd62a127a", size = 647404, upload-time = "2025-09-22T19:50:52.921Z" }, + { url = "https://files.pythonhosted.org/packages/df/99/65080c863eb06d4498de3d6c86f3e90595e02e159fd8529f1565f56cfe2c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a05ba88adf3d7189a974b2de7a9d56731548d35dc0a822ec3dc669caa7019b29", size = 753141, upload-time = "2025-09-22T19:50:50.294Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e3/0de85f3e3333f8e29e4b10244374a202a87665d1131798946ee22cf05c7c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb04c5650de6668b853623eceadcdb1a9f2fee381f5d7b6bc842ee7c239eeec4", size = 703477, upload-time = "2025-09-22T19:50:51.508Z" }, + { url = "https://files.pythonhosted.org/packages/d9/25/0d2f09d8833c7fd77ab8efeff213093c16856479a9d293180a0d89f6bed9/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df3ec9959241d07bc261f4983d25a1205ff37703faf42b474f15d54d88b4f8c9", size = 741157, upload-time = "2025-09-23T18:42:50.408Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8c/959f10c2e2153cbdab834c46e6954b6dd9e3b109c8f8c0a3cf1618310985/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fbc08c02e9b147a11dfcaa1ac8a83168b699863493e183f7c0c8b12850b7d259", size = 745859, upload-time = "2025-09-22T19:50:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6b/e580a7c18b485e1a5f30a32cda96b20364b0ba649d9d2baaf72f8bd21f83/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c099cafc1834d3c5dac305865d04235f7c21c167c8dd31ebc3d6bbc357e2f023", size = 770200, upload-time = "2025-09-22T19:50:55.718Z" }, + { url = "https://files.pythonhosted.org/packages/ef/44/3455eebc761dc8e8fdced90f2b0a3fa61e32ba38b50de4130e2d57db0f21/ruamel.yaml.clib-0.2.14-cp312-cp312-win32.whl", hash = "sha256:b5b0f7e294700b615a3bcf6d28b26e6da94e8eba63b079f4ec92e9ba6c0d6b54", size = 98829, upload-time = "2025-09-22T19:50:58.895Z" }, + { url = "https://files.pythonhosted.org/packages/76/ab/5121f7f3b651db93de546f8c982c241397aad0a4765d793aca1dac5eadee/ruamel.yaml.clib-0.2.14-cp312-cp312-win_amd64.whl", hash = "sha256:a37f40a859b503304dd740686359fcf541d6fb3ff7fc10f539af7f7150917c68", size = 115570, upload-time = "2025-09-22T19:50:57.981Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ae/e3811f05415594025e96000349d3400978adaed88d8f98d494352d9761ee/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7e4f9da7e7549946e02a6122dcad00b7c1168513acb1f8a726b1aaf504a99d32", size = 269205, upload-time = "2025-09-23T14:24:15.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/06/7d51f4688d6d72bb72fa74254e1593c4f5ebd0036be5b41fe39315b275e9/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:dd7546c851e59c06197a7c651335755e74aa383a835878ca86d2c650c07a2f85", size = 137417, upload-time = "2025-09-22T19:50:59.82Z" }, + { url = "https://files.pythonhosted.org/packages/5a/08/b4499234a420ef42960eeb05585df5cc7eb25ccb8c980490b079e6367050/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:1c1acc3a0209ea9042cc3cfc0790edd2eddd431a2ec3f8283d081e4d5018571e", size = 642558, upload-time = "2025-09-22T19:51:03.388Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ba/1975a27dedf1c4c33306ee67c948121be8710b19387aada29e2f139c43ee/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2070bf0ad1540d5c77a664de07ebcc45eebd1ddcab71a7a06f26936920692beb", size = 744087, upload-time = "2025-09-22T19:51:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/20/15/8a19a13d27f3bd09fa18813add8380a29115a47b553845f08802959acbce/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd8fe07f49c170e09d76773fb86ad9135e0beee44f36e1576a201b0676d3d1d", size = 699709, upload-time = "2025-09-22T19:51:02.075Z" }, + { url = "https://files.pythonhosted.org/packages/19/ee/8d6146a079ad21e534b5083c9ee4a4c8bec42f79cf87594b60978286b39a/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ff86876889ea478b1381089e55cf9e345707b312beda4986f823e1d95e8c0f59", size = 708926, upload-time = "2025-09-23T18:42:51.707Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/426b714abdc222392e68f3b8ad323930d05a214a27c7e7a0f06c69126401/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1f118b707eece8cf84ecbc3e3ec94d9db879d85ed608f95870d39b2d2efa5dca", size = 740202, upload-time = "2025-09-22T19:51:04.673Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ac/3c5c2b27a183f4fda8a57c82211721c016bcb689a4a175865f7646db9f94/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b30110b29484adc597df6bd92a37b90e63a8c152ca8136aad100a02f8ba6d1b6", size = 765196, upload-time = "2025-09-22T19:51:05.916Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/06f56a71fd55021c993ed6e848c9b2e5e9cfce180a42179f0ddd28253f7c/ruamel.yaml.clib-0.2.14-cp313-cp313-win32.whl", hash = "sha256:f4e97a1cf0b7a30af9e1d9dad10a5671157b9acee790d9e26996391f49b965a2", size = 98635, upload-time = "2025-09-22T19:51:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/51/79/76aba16a1689b50528224b182f71097ece338e7a4ab55e84c2e73443b78a/ruamel.yaml.clib-0.2.14-cp313-cp313-win_amd64.whl", hash = "sha256:090782b5fb9d98df96509eecdbcaffd037d47389a89492320280d52f91330d78", size = 115238, upload-time = "2025-09-22T19:51:07.081Z" }, + { url = "https://files.pythonhosted.org/packages/21/e2/a59ff65c26aaf21a24eb38df777cb9af5d87ba8fc8107c163c2da9d1e85e/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7df6f6e9d0e33c7b1d435defb185095386c469109de723d514142632a7b9d07f", size = 271441, upload-time = "2025-09-23T14:24:16.498Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fa/3234f913fe9a6525a7b97c6dad1f51e72b917e6872e051a5e2ffd8b16fbb/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:70eda7703b8126f5e52fcf276e6c0f40b0d314674f896fc58c47b0aef2b9ae83", size = 137970, upload-time = "2025-09-22T19:51:09.472Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ec/4edbf17ac2c87fa0845dd366ef8d5852b96eb58fcd65fc1ecf5fe27b4641/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a0cb71ccc6ef9ce36eecb6272c81afdc2f565950cdcec33ae8e6cd8f7fc86f27", size = 739639, upload-time = "2025-09-22T19:51:10.566Z" }, + { url = "https://files.pythonhosted.org/packages/15/18/b0e1fafe59051de9e79cdd431863b03593ecfa8341c110affad7c8121efc/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb9ad1d525d40f7d87b6df7c0ff916a66bc52cb61b66ac1b2a16d0c1b07640", size = 764456, upload-time = "2025-09-22T19:51:11.736Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a0/e709dc2f58054049cd154319a7d37917689785b12ec43ea2df47ea5344ef/ruamel.yaml.clib-0.2.14-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:18c041b28f3456ddef1f1951d4492dbebe0f8114157c1b3c981a4611c2020792", size = 270636, upload-time = "2025-09-23T14:24:17.855Z" }, + { url = "https://files.pythonhosted.org/packages/18/81/491c9e394976e10682a596f2b785ba7066db525cc17f267005ae8ca33c73/ruamel.yaml.clib-0.2.14-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:d8354515ab62f95a07deaf7f845886cc50e2f345ceab240a3d2d09a9f7d77853", size = 137954, upload-time = "2025-09-22T19:51:12.851Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a5/c6d1c767e051bbc00146a93132bf199b3e6ec2c219131b9d3e19eff428f3/ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:275f938692013a3883edbd848edde6d9f26825d65c9a2eb1db8baa1adc96a05d", size = 636162, upload-time = "2025-09-22T19:51:16.823Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6f/4746e2e8f60b3489b6cd6fad96a8e2aaa0cf7dd6760de3daad1a6e9f5789/ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a60d69f4057ad9a92f3444e2367c08490daed6428291aa16cefb445c29b0e9", size = 723934, upload-time = "2025-09-22T19:51:13.948Z" }, + { url = "https://files.pythonhosted.org/packages/26/47/5446e8cea2f6b5391fba653196f38b3f14030c1c324bd9aa67f1773d24ec/ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac5ff9425d8acb8f59ac5b96bcb7fd3d272dc92d96a7c730025928ffcc88a7a", size = 686265, upload-time = "2025-09-22T19:51:15.142Z" }, + { url = "https://files.pythonhosted.org/packages/52/d7/344d7b3010b6a01af97431bdf89056abb2d8bd704d0f3430e7b50232cce4/ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e1d1735d97fd8a48473af048739379975651fab186f8a25a9f683534e6904179", size = 693042, upload-time = "2025-09-23T18:42:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d5/a0f2cce1b6cfa9bf1921b8a19ebceafc7a9b3c27882e5af5a07ae080b1bd/ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:83bbd8354f6abb3fdfb922d1ed47ad8d1db3ea72b0523dac8d07cdacfe1c0fcf", size = 706110, upload-time = "2025-09-22T19:51:18.467Z" }, + { url = "https://files.pythonhosted.org/packages/42/cd/85b422d24ee2096eaf6faa360c95ef9bdb59097d19b9624cebce4dd9bc2a/ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:808c7190a0fe7ae7014c42f73897cf8e9ef14ff3aa533450e51b1e72ec5239ad", size = 725028, upload-time = "2025-09-22T19:51:19.782Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ac/99e6e0ea2584f84f447069d0187fe411e9b5deb7e3ddecda25001cfc7a95/ruamel.yaml.clib-0.2.14-cp39-cp39-win32.whl", hash = "sha256:6d5472f63a31b042aadf5ed28dd3ef0523da49ac17f0463e10fda9c4a2773352", size = 100915, upload-time = "2025-09-22T19:51:21.764Z" }, + { url = "https://files.pythonhosted.org/packages/5d/8d/846e43369658958c99d959bb7774136fff9210f9017d91a4277818ceafbf/ruamel.yaml.clib-0.2.14-cp39-cp39-win_amd64.whl", hash = "sha256:8dd3c2cc49caa7a8d64b67146462aed6723a0495e44bf0aa0a2e94beaa8432f6", size = 118706, upload-time = "2025-09-22T19:51:20.878Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" }, +] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, + { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/05/52/7223011bb760fce8ddc53416beb65b83a3ea6d7d13738dde75eeb2c89679/watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8", size = 96390, upload-time = "2024-11-01T14:06:49.325Z" }, + { url = "https://files.pythonhosted.org/packages/9c/62/d2b21bc4e706d3a9d467561f487c2938cbd881c69f3808c43ac1ec242391/watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a", size = 88386, upload-time = "2024-11-01T14:06:50.536Z" }, + { url = "https://files.pythonhosted.org/packages/ea/22/1c90b20eda9f4132e4603a26296108728a8bfe9584b006bd05dd94548853/watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c", size = 89017, upload-time = "2024-11-01T14:06:51.717Z" }, + { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, + { url = "https://files.pythonhosted.org/packages/5b/79/69f2b0e8d3f2afd462029031baafb1b75d11bb62703f0e1022b2e54d49ee/watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa", size = 87903, upload-time = "2024-11-01T14:06:57.052Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2b/dc048dd71c2e5f0f7ebc04dd7912981ec45793a03c0dc462438e0591ba5d/watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e", size = 88381, upload-time = "2024-11-01T14:06:58.193Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] From dea18fed5e47dc646c7fe91b36d7b3681dedabc1 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 12:37:57 +0100 Subject: [PATCH 02/20] try out generation scrip --- docs/development/ci-cd.md | 346 ------------- docs/development/contributing.md | 298 ----------- docs/development/testing.md | 424 ---------------- docs/getting-started/installation.md | 160 ------ docs/getting-started/overview.md | 65 --- docs/getting-started/quick-start.md | 259 ---------- docs/index.md | 48 -- docs/schemas/pipeline-input.md | 734 ++++++++++----------------- docs/schemas/plugin-v1.md | 69 +++ generate_schema_docs.py | 477 +++++++++++++++++ 10 files changed, 819 insertions(+), 2061 deletions(-) delete mode 100644 docs/development/ci-cd.md delete mode 100644 docs/development/contributing.md delete mode 100644 docs/development/testing.md delete mode 100644 docs/getting-started/installation.md delete mode 100644 docs/getting-started/overview.md delete mode 100644 docs/getting-started/quick-start.md create mode 100644 docs/schemas/plugin-v1.md create mode 100644 generate_schema_docs.py diff --git a/docs/development/ci-cd.md b/docs/development/ci-cd.md deleted file mode 100644 index 7b72d9d..0000000 --- a/docs/development/ci-cd.md +++ /dev/null @@ -1,346 +0,0 @@ -# CI/CD - -This document describes the continuous integration and deployment setup for the Nextflow Schemas repository. - -## Overview - -The repository uses GitHub Actions to automatically validate schemas and test cases on every push and pull request. - -## Workflows - -### Schema Validation Workflow - -**File**: `.github/workflows/test.yml` - -**Triggers**: - -- Push to any branch that modifies: - - `*.json` files - - `validate.sh` script - - The workflow file itself -- Pull requests with the same file changes - -**Jobs**: - -#### Test Job - -**Runs on**: `ubuntu-latest` - -**Steps**: - -1. **Checkout code** - - ```yaml - - uses: actions/checkout@v4 - ``` - -2. **Set up Python** - - ```yaml - - uses: actions/setup-python@v5 - with: - python-version: "3.x" - ``` - -3. **Install dependencies** - - ```bash - pip install check-jsonschema - ``` - -4. **Run validation** - ```bash - ./validate.sh - ``` - -### Expected Behavior - -#### ✅ Success Criteria - -The workflow passes when: - -- All schema files are valid JSON Schema Draft 2020-12 -- All `valid_*.json` test files pass validation -- All `invalid_*.json` test files fail validation -- No syntax errors in scripts - -#### ❌ Failure Scenarios - -The workflow fails if: - -- Schema files contain errors -- Test files don't match naming expectations -- Script execution errors occur -- `valid_*` files fail validation -- `invalid_*` files pass validation - -## Validation Script - -### Script Overview - -The `validate.sh` script: - -1. Validates each schema against JSON Schema Draft 2020-12 -2. Validates test cases against their respective schemas -3. Checks that test naming matches expectations -4. Returns exit code 0 on success, 1 on failure - -### Script Logic - -```bash -#!/bin/bash - -for folder in pipeline-input plugin ; do - # Validate schema itself - check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema "$folder/schema.json" - - # Validate test cases - for spec in $folder/tests/*.json ; do - if check-jsonschema --schemafile "$folder/schema.json" "$spec"; then - # Should start with "valid*" - if [[ $(basename "$spec") != invalid* ]]; then - echo "✓ Valid" - else - # Failed: invalid* file passed validation - failed=1 - fi - else - # Should start with "invalid*" - if [[ $(basename "$spec") == invalid* ]]; then - echo "✓ Invalid" - else - # Failed: valid* file failed validation - failed=1 - fi - fi - done -done - -exit $failed -``` - -## Docker Validation - -### Docker Script - -**File**: `validate-docker.sh` - -Provides containerized validation for consistent environments: - -```bash -./validate-docker.sh -``` - -**Benefits**: - -- No local dependencies required -- Consistent validation environment -- Easy to reproduce CI results locally - -### Implementation - -```bash -#!/bin/bash - -docker run --rm -v "$(pwd):/workspace" -w /workspace python:3 bash -c " - pip install check-jsonschema && ./validate.sh -" -``` - -## Status Checks - -### Required Checks - -Pull requests must pass: - -- ✅ Schema validation -- ✅ Test case validation -- ✅ Naming convention checks - -### Branch Protection - -Recommended settings for `main` branch: - -- Require status checks before merging -- Require `test` workflow to pass -- Require up-to-date branches - -## Local Validation - -### Before Pushing - -Always validate locally: - -```bash -# Standard validation -./validate.sh - -# Docker validation (matches CI) -./validate-docker.sh -``` - -### Pre-commit Hooks - -Install pre-commit hooks to catch issues early: - -```bash -uv pip install pre-commit -pre-commit install -``` - -Hooks will: - -- Format JSON with Prettier -- Validate syntax -- Check for common issues - -## Debugging CI Failures - -### View Logs - -1. Go to the Actions tab in GitHub -2. Click on the failed workflow run -3. Expand the failed job -4. Review the validation output - -### Reproduce Locally - -Use Docker to match CI environment: - -```bash -./validate-docker.sh -``` - -### Common Issues - -#### Schema Validation Errors - -**Problem**: Schema file doesn't conform to JSON Schema Draft 2020-12 - -**Solution**: Check schema syntax against the specification - -```bash -check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema pipeline-input/schema.json -``` - -#### Test Case Failures - -**Problem**: `valid_*` file fails or `invalid_*` file passes - -**Solution**: - -1. Verify the test case is correct -2. Check if naming matches content -3. Validate manually to see error details - -```bash -check-jsonschema --schemafile pipeline-input/schema.json --verbose pipeline-input/tests/problematic_test.json -``` - -#### Permission Errors - -**Problem**: Script not executable - -**Solution**: Make scripts executable - -```bash -chmod +x validate.sh validate-docker.sh -``` - -#### JSON Syntax Errors - -**Problem**: Malformed JSON - -**Solution**: Validate JSON syntax - -```bash -python -m json.tool test.json -``` - -## Deployment - -### Documentation Deployment - -To deploy documentation (when set up): - -```bash -# Build documentation -uv run mkdocs build - -# Deploy to GitHub Pages -uv run mkdocs gh-deploy -``` - -### Release Process - -1. Update version numbers if applicable -2. Tag the release: - ```bash - git tag -a v1.0.0 -m "Release version 1.0.0" - git push origin v1.0.0 - ``` -3. Create GitHub release from tag -4. CI will automatically validate the release - -## Performance Optimization - -### Caching - -GitHub Actions caches Python dependencies: - -```yaml -- uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml') }} -``` - -### Parallel Testing - -Tests run in parallel when possible: - -- Schema validation runs concurrently -- Test cases are validated in batch - -## Monitoring - -### Workflow Status Badge - -Add to README.md: - -```markdown -![CI](https://github.com/nextflow-io/schemas/workflows/test/badge.svg) -``` - -### Notifications - -Configure notifications in GitHub settings: - -- Email on workflow failures -- Slack/Discord webhooks (optional) - -## Best Practices - -1. **Run tests locally** before pushing -2. **Keep workflows simple** and focused -3. **Cache dependencies** to speed up CI -4. **Use Docker validation** to match CI environment -5. **Monitor workflow status** regularly -6. **Update dependencies** periodically - -## Future Enhancements - -Potential improvements: - -- [ ] Add schema linting checks -- [ ] Performance benchmarking -- [ ] Automated release notes generation -- [ ] Coverage reporting -- [ ] Multi-version Python testing -- [ ] Automated documentation deployment - -## See Also - -- [Testing Guide](testing.md) -- [Contributing Guidelines](contributing.md) -- [GitHub Actions Documentation](https://docs.github.com/en/actions) diff --git a/docs/development/contributing.md b/docs/development/contributing.md deleted file mode 100644 index d7bc554..0000000 --- a/docs/development/contributing.md +++ /dev/null @@ -1,298 +0,0 @@ -# Contributing Guidelines - -Thank you for your interest in contributing to Nextflow Schemas! This guide will help you get started. - -## Getting Started - -### Prerequisites - -- Git -- Python 3.8+ -- [uv](https://github.com/astral-sh/uv) package manager -- Docker (optional, for containerized validation) - -### Fork and Clone - -1. Fork the repository on GitHub -2. Clone your fork locally: - -```bash -git clone https://github.com/YOUR-USERNAME/schemas.git -cd schemas -``` - -3. Add the upstream repository: - -```bash -git remote add upstream https://github.com/nextflow-io/schemas.git -``` - -### Install Dependencies - -```bash -# Install all dependencies including dev tools -uv sync - -# Install pre-commit hooks -uv pip install pre-commit -pre-commit install -``` - -## Development Workflow - -### 1. Create a Branch - -Create a feature branch for your changes: - -```bash -git checkout -b feature/my-new-feature -``` - -Use descriptive branch names: - -- `feature/add-new-format` - New features -- `fix/validation-error` - Bug fixes -- `docs/update-examples` - Documentation updates - -### 2. Make Changes - -#### Modifying Schemas - -When modifying `pipeline-input/schema.json` or `plugin/schema.json`: - -1. Update the schema file -2. Add test cases (both valid and invalid) -3. Run validation to ensure correctness -4. Update documentation if needed - -#### Adding Test Cases - -Add test files to the appropriate `tests/` directory: - -**Valid test cases** (should pass validation): - -```bash -# Name files with valid_ prefix -touch pipeline-input/tests/valid_my_test.json -``` - -**Invalid test cases** (should fail validation): - -```bash -# Name files with invalid_ prefix -touch pipeline-input/tests/invalid_my_test.json -``` - -The validation script automatically checks: - -- Files starting with `valid_` must pass validation -- Files starting with `invalid_` must fail validation - -### 3. Format Code - -Pre-commit hooks will automatically format JSON files with Prettier: - -```bash -# Run manually on all files -pre-commit run --all-files - -# Or commit to trigger hooks -git commit -m "Your commit message" -``` - -### 4. Validate Changes - -Run the validation script: - -```bash -./validate.sh -``` - -This validates: - -- Schema files against JSON Schema Draft 2020-12 -- All test cases against their respective schemas -- Test case naming conventions - -Expected output: - -``` -Validating pipeline-input/schema.json ... -ok -- validation done, no errors - -Validating test cases... -Testing pipeline-input/tests/valid_schema.json: -ok -- validation done, no errors -✓ Valid - -Testing pipeline-input/tests/invalid_schema.json: -ValidationError: ... -✓ Invalid -``` - -### 5. Run Docker Validation (Optional) - -Test in a clean environment: - -```bash -./validate-docker.sh -``` - -### 6. Update Documentation - -If your changes affect usage: - -1. Update relevant documentation in `docs/` -2. Build docs locally to verify: - -```bash -uv sync --extra docs -uv run mkdocs serve -``` - -3. Check the docs at `http://127.0.0.1:8000` - -### 7. Commit Changes - -Write clear, descriptive commit messages: - -```bash -git add . -git commit -m "Add new format validation for date-time-local - -- Add date-time-local to allowed formats -- Include test cases for valid and invalid inputs -- Update documentation with examples" -``` - -Good commit messages: - -- Use the imperative mood ("Add feature" not "Added feature") -- Keep the first line under 50 characters -- Provide details in the body if needed -- Reference issues if applicable (#123) - -### 8. Push and Create PR - -```bash -git push origin feature/my-new-feature -``` - -Then create a Pull Request on GitHub. - -## Pull Request Guidelines - -### PR Description - -Include in your PR description: - -- **Purpose**: What does this PR do? -- **Changes**: What files/functionality changed? -- **Testing**: How did you test the changes? -- **Breaking Changes**: Any breaking changes? -- **Related Issues**: Link to related issues - -### PR Checklist - -Before submitting: - -- [ ] Code follows existing style and conventions -- [ ] All tests pass (`./validate.sh`) -- [ ] New test cases added for changes -- [ ] Documentation updated if needed -- [ ] Commit messages are clear and descriptive -- [ ] Pre-commit hooks pass -- [ ] No merge conflicts with main branch - -### Review Process - -1. Automated CI checks will run on your PR -2. Maintainers will review your changes -3. Address any feedback or requested changes -4. Once approved, a maintainer will merge your PR - -## Testing Guidelines - -### Writing Good Tests - -**Valid test cases** should: - -- Cover common use cases -- Test edge cases within valid bounds -- Include all required properties -- Use realistic example data - -**Invalid test cases** should: - -- Test each validation rule -- Cover missing required properties -- Test invalid types -- Test constraint violations (min/max, pattern, etc.) - -### Test Naming - -Use descriptive names that indicate what is being tested: - -``` -valid_minimal_schema.json -valid_full_featured_schema.json -valid_with_parameter_groups.json -invalid_missing_required_type.json -invalid_wrong_format.json -invalid_exceeds_maximum.json -``` - -## Code Style - -### JSON Formatting - -- Use 2 spaces for indentation -- Use double quotes for strings -- Include trailing commas where allowed -- Keep arrays/objects readable - -Prettier will enforce these automatically. - -### Schema Conventions - -- Use descriptive property names -- Provide clear descriptions for all properties -- Include examples where helpful -- Document custom keywords - -## Reporting Issues - -### Bug Reports - -Include: - -- Clear description of the issue -- Steps to reproduce -- Expected vs actual behavior -- Schema/test file that demonstrates the issue -- Environment details (OS, Python version, etc.) - -### Feature Requests - -Include: - -- Clear description of the feature -- Use cases and benefits -- Examples of how it would work -- Any alternative solutions considered - -## Getting Help - -- **GitHub Issues**: Ask questions or report problems -- **Discussions**: Discuss ideas or get feedback -- **Nextflow Community**: Join the broader community - -## License - -By contributing, you agree that your contributions will be licensed under the same license as the project. - -## Recognition - -Contributors will be recognized in the project's release notes and GitHub contributors page. - -Thank you for contributing to Nextflow Schemas! 🎉 diff --git a/docs/development/testing.md b/docs/development/testing.md deleted file mode 100644 index 497e22b..0000000 --- a/docs/development/testing.md +++ /dev/null @@ -1,424 +0,0 @@ -# Testing Guide - -This guide covers testing strategies for Nextflow schemas, including writing test cases, running validations, and interpreting results. - -## Test Organization - -Tests are organized by schema type: - -``` -pipeline-input/tests/ -├── valid_minimal_schema.json -├── valid_full_featured_schema.json -├── invalid_missing_type.json -└── invalid_schema.json - -plugin/tests/ -├── valid_schema.json -└── invalid_schema.json -``` - -## Test Naming Convention - -Test files must follow this naming pattern: - -- **`valid_*.json`** - Files that should pass validation -- **`invalid_*.json`** - Files that should fail validation - -The validation script (`validate.sh`) automatically: - -- Expects `valid_*` files to pass -- Expects `invalid_*` files to fail -- Reports errors if expectations aren't met - -## Running Tests - -### Run All Tests - -```bash -./validate.sh -``` - -This validates: - -1. Schema files against JSON Schema Draft 2020-12 -2. All test cases against their schemas -3. Naming convention compliance - -### Run Tests with Docker - -Use Docker for a clean, isolated environment: - -```bash -./validate-docker.sh -``` - -### Validate a Single File - -Test a specific schema or test file: - -```bash -# Validate a schema file -check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema pipeline-input/schema.json - -# Validate a test case -check-jsonschema --schemafile pipeline-input/schema.json pipeline-input/tests/valid_schema.json -``` - -### Validate Your Own Files - -```bash -# Validate your pipeline schema -check-jsonschema --schemafile pipeline-input/schema.json /path/to/my-pipeline-schema.json - -# Validate your plugin spec -check-jsonschema --schemafile plugin/schema.json /path/to/my-plugin-spec.json -``` - -## Writing Test Cases - -### Valid Test Cases - -Valid test cases should pass validation and cover: - -#### Minimal Valid Case - -Test the absolute minimum required properties: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/minimal-schema.json", - "title": "Minimal Schema", - "description": "Minimal valid schema", - "type": "object" -} -``` - -#### Complete Feature Coverage - -Test all schema features: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/full-schema.json", - "title": "Full Featured Schema", - "description": "Schema with all features", - "type": "object", - "properties": { - "input": { - "type": "string", - "format": "file-path", - "description": "Input file", - "exists": true, - "help_text": "Path to input file", - "fa_icon": "fas fa-file" - }, - "threads": { - "type": "integer", - "minimum": 1, - "maximum": 64, - "default": 4, - "description": "Thread count" - }, - "format": { - "type": "string", - "enum": ["json", "csv", "tsv"], - "default": "json", - "description": "Output format" - } - }, - "$defs": { - "advanced_options": { - "title": "Advanced Options", - "type": "object", - "properties": { - "debug": { - "type": "boolean", - "description": "Enable debug mode", - "default": false - } - } - } - }, - "allOf": [{ "$ref": "#/$defs/advanced_options" }] -} -``` - -#### Edge Cases - -Test boundary conditions: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/edge-case.json", - "title": "Edge Case Schema", - "description": "Testing edge cases", - "type": "object", - "properties": { - "nullable_string": { - "type": ["string", "null"], - "description": "Can be string or null" - }, - "zero_value": { - "type": "integer", - "minimum": 0, - "description": "Can be zero" - }, - "empty_string": { - "type": "string", - "minLength": 0, - "description": "Can be empty" - } - } -} -``` - -### Invalid Test Cases - -Invalid test cases should fail validation and test specific error conditions: - -#### Missing Required Properties - -```json -{ - "title": "Invalid - Missing Required", - "description": "Missing $schema, $id, and type" -} -``` - -#### Wrong Type - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/wrong-type.json", - "title": "Invalid Type", - "description": "Wrong type value", - "type": "array" -} -``` - -#### Invalid Property Definition - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/invalid-prop.json", - "title": "Invalid Property", - "description": "Property missing required fields", - "type": "object", - "properties": { - "bad_param": { - "type": "string" - } - } -} -``` - -#### Constraint Violations - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/invalid-constraint.json", - "title": "Invalid Constraint", - "description": "Testing constraint violations", - "type": "object", - "properties": { - "threads": { - "type": "integer", - "minimum": 10, - "maximum": 5, - "description": "Invalid: min > max" - } - } -} -``` - -#### Invalid Format Usage - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/invalid-format.json", - "title": "Invalid Format", - "description": "Wrong format usage", - "type": "object", - "properties": { - "input": { - "type": "string", - "format": "file-path", - "exists": true, - "description": "Input file" - }, - "bad_exists": { - "type": "integer", - "exists": true, - "description": "Invalid: exists on non-string type" - } - } -} -``` - -## Test Coverage Guidelines - -Ensure comprehensive test coverage: - -### Required Coverage - -- ✅ Minimal valid case -- ✅ All required properties -- ✅ Missing each required property -- ✅ Wrong types for key properties - -### Recommended Coverage - -- ✅ All schema features (if applicable) -- ✅ Parameter groups and `allOf` references -- ✅ Custom keywords (`exists`, `schema`, etc.) -- ✅ Constraint boundaries (min/max values) -- ✅ Format validation -- ✅ Enum validation -- ✅ Pattern matching -- ✅ Dependent requirements - -### Plugin Schema Coverage - -- ✅ Each definition type (ConfigScope, ConfigOption, Function, Operator, Factory) -- ✅ Nested configuration scopes -- ✅ Functions with and without parameters -- ✅ Various parameter types - -## Interpreting Test Results - -### Successful Test Run - -```bash -$ ./validate.sh -Validating pipeline-input/schema.json ... -ok -- validation done, no errors - -Validating test cases... -Testing pipeline-input/tests/valid_schema.json: -ok -- validation done, no errors -✓ Valid - -Testing pipeline-input/tests/invalid_schema.json: -ValidationError: 'type' is a required property -✓ Invalid - -Validating plugin/schema.json ... -ok -- validation done, no errors -... -``` - -All tests passed ✅ - -### Failed Test Run - -```bash -$ ./validate.sh -Validating pipeline-input/schema.json ... -ValidationError: Additional properties are not allowed ('bad_property' was unexpected) -``` - -Schema itself is invalid ❌ - -```bash -Testing pipeline-input/tests/valid_schema.json: -ValidationError: 'description' is a required property -``` - -A supposedly valid test case failed validation ❌ - -```bash -Testing pipeline-input/tests/invalid_schema.json: -ok -- validation done, no errors -``` - -A supposedly invalid test case passed validation ❌ - -## Continuous Integration - -### GitHub Actions - -Tests run automatically on: - -- Push to any branch -- Pull requests -- Changes to `*.json` files -- Changes to `validate.sh` - -### CI Workflow - -The CI workflow: - -1. Checks out the repository -2. Installs Python and `check-jsonschema` -3. Runs `./validate.sh` -4. Reports results - -## Debugging Failed Tests - -### Check Schema Validity - -First, ensure the schema itself is valid: - -```bash -check-jsonschema --schemafile https://json-schema.org/draft/2020-12/schema pipeline-input/schema.json -``` - -### Verbose Validation - -Get detailed error messages: - -```bash -check-jsonschema --schemafile pipeline-input/schema.json --verbose pipeline-input/tests/invalid_test.json -``` - -### Test Individual Properties - -Isolate the problem by testing minimal cases: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/test.json", - "title": "Test", - "description": "Isolate problematic property", - "type": "object", - "properties": { - "problematic_param": { - "type": "string", - "description": "Testing this specific parameter" - } - } -} -``` - -### Check JSON Syntax - -Ensure JSON is well-formed: - -```bash -python -m json.tool test.json -``` - -## Best Practices - -1. **Test one thing at a time** - Each invalid test should fail for one specific reason -2. **Use descriptive names** - Make it clear what each test validates -3. **Cover edge cases** - Test boundary conditions and unusual inputs -4. **Keep tests simple** - Avoid unnecessary complexity -5. **Document expectations** - Add comments if the test case isn't obvious -6. **Run tests frequently** - Validate after each change - -## See Also - -- [Contributing Guidelines](contributing.md) -- [CI/CD Documentation](ci-cd.md) -- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) -- [Plugin Schema Reference](../schemas/plugin.md) diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md deleted file mode 100644 index 28246d1..0000000 --- a/docs/getting-started/installation.md +++ /dev/null @@ -1,160 +0,0 @@ -# Installation - -This guide will help you set up the tools needed to work with Nextflow schemas. - -## Prerequisites - -- Python 3.8 or higher -- [uv](https://github.com/astral-sh/uv) package manager (recommended) -- Docker (optional, for containerized validation) - -## Installing uv - -If you don't have uv installed, install it using: - -```bash -# macOS/Linux -curl -LsSf https://astral.sh/uv/install.sh | sh - -# Windows -powershell -c "irm https://astral.sh/uv/install.ps1 | iex" -``` - -## Installation Methods - -### Option 1: Using uv (Recommended) - -Clone the repository and install dependencies: - -```bash -git clone https://github.com/nextflow-io/schemas.git -cd schemas -uv sync -``` - -This will install all development dependencies including `check-jsonschema` for validation. - -### Option 2: Install Validation Tool Only - -If you only need the validation tool: - -```bash -uv pip install check-jsonschema -``` - -Or using pip: - -```bash -pip install check-jsonschema -``` - -### Option 3: Using Docker - -No local installation required. Just use the provided Docker validation script: - -```bash -./validate-docker.sh -``` - -## Installing Pre-commit Hooks - -To automatically format JSON files on commit: - -```bash -# Install pre-commit -uv pip install pre-commit - -# Set up git hooks -pre-commit install -``` - -Now Prettier will automatically format your JSON files when you commit. - -## Building Documentation - -To build and serve this documentation locally: - -```bash -# Install docs dependencies -uv sync --extra docs - -# Serve documentation locally -uv run mkdocs serve -``` - -Then open your browser to `http://127.0.0.1:8000` - -## Verifying Installation - -Test that everything is working: - -```bash -# Validate schemas -./validate.sh - -# Should output: -# ✅ All schemas are valid -# ✅ All test cases passed -``` - -## Editor Integration - -### VS Code - -Install the [JSON Schema Store](https://marketplace.visualstudio.com/items?itemName=remcohaszing.schemastore) extension for automatic schema validation and autocomplete. - -Add to your workspace settings (`.vscode/settings.json`): - -```json -{ - "json.schemas": [ - { - "fileMatch": ["**/pipeline-input/**/*.json"], - "url": "./pipeline-input/schema.json" - }, - { - "fileMatch": ["**/plugin/**/*.json"], - "url": "./plugin/schema.json" - } - ] -} -``` - -### JetBrains IDEs (IntelliJ, PyCharm, etc.) - -JetBrains IDEs have built-in JSON Schema support. Configure schemas via: - -1. Go to **Settings** → **Languages & Frameworks** → **Schemas and DTDs** → **JSON Schema Mappings** -2. Add mappings for each schema file - -## Troubleshooting - -### Permission Denied on Scripts - -Make validation scripts executable: - -```bash -chmod +x validate.sh validate-docker.sh -``` - -### Python Version Issues - -Ensure you're using Python 3.8+: - -```bash -python --version -``` - -### Docker Issues - -If Docker validation fails, ensure Docker is running: - -```bash -docker ps -``` - -## Next Steps - -- [Quick Start Guide](quick-start.md) -- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) -- [Contributing Guidelines](../development/contributing.md) diff --git a/docs/getting-started/overview.md b/docs/getting-started/overview.md deleted file mode 100644 index 0debcd0..0000000 --- a/docs/getting-started/overview.md +++ /dev/null @@ -1,65 +0,0 @@ -# Overview - -Nextflow Schemas is a collection of JSON Schema definitions used to validate Nextflow pipeline inputs and plugin specifications. These schemas ensure that your pipeline configurations and plugin definitions follow the correct structure and conventions. - -## What Are JSON Schemas? - -JSON Schema is a vocabulary that allows you to annotate and validate JSON documents. It provides a contract for your JSON data, describing: - -- Required and optional properties -- Data types (string, number, boolean, etc.) -- Value constraints (min/max, patterns, enums) -- Property relationships and dependencies - -## Why Use Nextflow Schemas? - -### Pipeline Input Schema - -The pipeline input schema helps you: - -- **Define parameter specifications** for your Nextflow pipelines -- **Validate user inputs** before pipeline execution -- **Generate documentation** automatically from schema definitions -- **Group parameters** logically for better organization -- **Add custom validation rules** specific to Nextflow workflows - -### Plugin Schema - -The plugin schema enables you to: - -- **Document plugin APIs** including functions and configuration options -- **Validate plugin specifications** during development -- **Generate reference documentation** for plugin users -- **Define configuration scopes** and their nested structure - -## Schema Specifications - -Both schemas follow the **JSON Schema Draft 2020-12** specification and include: - -- Standard JSON Schema keywords (`type`, `enum`, `pattern`, etc.) -- Custom keywords specific to Nextflow requirements -- Comprehensive validation rules -- Support for nested definitions and references - -## Use Cases - -### For Pipeline Developers - -- Validate pipeline parameter schemas during development -- Auto-generate parameter documentation -- Ensure consistent parameter naming and structure -- Validate user-provided input configurations - -### For Plugin Developers - -- Document plugin configuration options -- Define function signatures and return types -- Validate plugin specification files -- Generate API documentation - -## Next Steps - -- [Installation Guide](installation.md) - Set up validation tools -- [Quick Start](quick-start.md) - Create your first schema -- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) -- [Plugin Schema Reference](../schemas/plugin.md) diff --git a/docs/getting-started/quick-start.md b/docs/getting-started/quick-start.md deleted file mode 100644 index 8c98e9f..0000000 --- a/docs/getting-started/quick-start.md +++ /dev/null @@ -1,259 +0,0 @@ -# Quick Start - -Get started with Nextflow schemas in minutes. - -## Creating a Pipeline Input Schema - -Here's a minimal example of a pipeline input schema: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/my-pipeline/schema.json", - "title": "My Pipeline Parameters", - "description": "Input parameters for my Nextflow pipeline", - "type": "object", - "properties": { - "input": { - "type": "string", - "format": "file-path", - "description": "Path to input file", - "help_text": "Provide the path to your input data file" - }, - "outdir": { - "type": "string", - "format": "directory-path", - "description": "Output directory", - "default": "./results" - } - } -} -``` - -### With Parameter Groups - -Organize parameters into logical groups using `$defs`: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/my-pipeline/schema.json", - "title": "My Pipeline Parameters", - "description": "Input parameters for my Nextflow pipeline", - "type": "object", - "$defs": { - "input_options": { - "title": "Input Options", - "type": "object", - "fa_icon": "fas fa-file-import", - "description": "Parameters for input data", - "properties": { - "input": { - "type": "string", - "format": "file-path", - "description": "Path to input file" - } - } - }, - "output_options": { - "title": "Output Options", - "type": "object", - "fa_icon": "fas fa-folder-open", - "description": "Parameters for output", - "properties": { - "outdir": { - "type": "string", - "format": "directory-path", - "description": "Output directory", - "default": "./results" - } - } - } - }, - "allOf": [ - { "$ref": "#/$defs/input_options" }, - { "$ref": "#/$defs/output_options" } - ] -} -``` - -## Creating a Plugin Schema - -Here's a simple plugin schema example: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "ConfigScope", - "spec": { - "name": "myPlugin", - "description": "Configuration for my plugin", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "enabled", - "description": "Enable the plugin", - "type": "Boolean" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "timeout", - "description": "Timeout in seconds", - "type": "Integer" - } - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "processData", - "description": "Process input data", - "returnType": "Map", - "parameters": [ - { - "name": "data", - "type": "String" - } - ] - } - } - ] -} -``` - -## Validating Your Schema - -### Using the Validation Script - -```bash -# Validate all schemas and tests -./validate.sh -``` - -### Validate a Specific File - -```bash -# Validate against pipeline-input schema -check-jsonschema --schemafile pipeline-input/schema.json my-params.json - -# Validate against plugin schema -check-jsonschema --schemafile plugin/schema.json my-plugin.json -``` - -### Expected Output - -✅ **Success:** - -``` -ok -- validation done, no errors -``` - -❌ **Failure:** - -``` -ValidationError: 'type' is a required property -``` - -## Testing Your Schema - -Add test cases to verify your schema works correctly: - -### Valid Test Case - -Create `tests/valid_example.json`: - -```json -{ - "input": "/path/to/data.txt", - "outdir": "./results" -} -``` - -### Invalid Test Case - -Create `tests/invalid_missing_type.json`: - -```json -{ - "input": 123 -} -``` - -### Run Tests - -```bash -./validate.sh -``` - -The script automatically: - -- Validates files prefixed with `valid_` should pass -- Validates files prefixed with `invalid_` should fail - -## Common Parameter Types - -### File Paths - -```json -{ - "input_file": { - "type": "string", - "format": "file-path", - "description": "Input file", - "exists": true - } -} -``` - -### Numbers with Constraints - -```json -{ - "threads": { - "type": "integer", - "description": "Number of threads", - "minimum": 1, - "maximum": 32, - "default": 4 - } -} -``` - -### Enumerations - -```json -{ - "output_format": { - "type": "string", - "description": "Output format", - "enum": ["json", "csv", "tsv"], - "default": "json" - } -} -``` - -### Boolean Flags - -```json -{ - "skip_qc": { - "type": "boolean", - "description": "Skip quality control steps", - "default": false - } -} -``` - -## Next Steps - -- Learn more about the [Pipeline Input Schema](../schemas/pipeline-input.md) -- Explore the [Plugin Schema](../schemas/plugin.md) -- Check out [detailed examples](../examples/pipeline-input-examples.md) -- Read the [testing guide](../development/testing.md) diff --git a/docs/index.md b/docs/index.md index 245925e..56096b5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,51 +8,3 @@ This repository provides two main schemas: - **[Pipeline Input Schema](schemas/pipeline-input.md)**: Validates Nextflow pipeline input specifications, including parameter definitions, validation rules, and parameter grouping - **[Plugin Schema](schemas/plugin.md)**: Validates Nextflow plugin specifications, including configuration scopes and function definitions - -## Key Features - -- ✅ **JSON Schema Draft 2020-12** compliant -- 🔍 **Comprehensive validation** for pipeline inputs and plugins -- 🧪 **Extensive test suite** with valid and invalid examples -- 🤖 **CI/CD integration** for automated validation -- 📚 **Well-documented** with examples and guides - -## Quick Links - -- [Getting Started](getting-started/overview.md) -- [Pipeline Input Schema Reference](schemas/pipeline-input.md) -- [Plugin Schema Reference](schemas/plugin.md) -- [Contributing Guidelines](development/contributing.md) -- [GitHub Repository](https://github.com/nextflow-io/schemas) - -## Installation - -Install the validation tools using uv: - -```bash -uv sync --extra docs -``` - -Or install just the validation dependencies: - -```bash -uv pip install check-jsonschema -``` - -## Quick Validation - -Validate your schema files: - -```bash -# Using the provided script -./validate.sh - -# Or using Docker -./validate-docker.sh -``` - -## Community - -- Report issues on [GitHub Issues](https://github.com/nextflow-io/schemas/issues) -- Join the [Nextflow Community](https://www.nextflow.io/community.html) -- Follow [@nextflow_io](https://twitter.com/nextflow_io) on Twitter diff --git a/docs/schemas/pipeline-input.md b/docs/schemas/pipeline-input.md index 155e847..6336a3c 100644 --- a/docs/schemas/pipeline-input.md +++ b/docs/schemas/pipeline-input.md @@ -1,465 +1,277 @@ -# Pipeline Input Schema Reference +# Nextflow pipeline input schema -The pipeline input schema validates Nextflow pipeline parameter specifications. It follows JSON Schema Draft 2020-12 and includes both standard and custom keywords specific to Nextflow. +**Title:** Nextflow pipeline input schema -## Schema URI +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | -``` -https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json -``` - -## Top-Level Structure - -### Required Properties +**Description:** Schema to validate Nextflow pipeline input specs -| Property | Type | Description | -| ------------- | ------ | --------------------------------- | -| `$schema` | string | URI of the JSON Schema standard | -| `$id` | string | Unique identifier for your schema | -| `title` | string | Human-readable title | -| `description` | string | Schema description | -| `type` | string | Must be `"object"` | - -### Optional Properties - -| Property | Type | Description | -| ------------------- | ------ | ---------------------------------- | -| `properties` | object | Direct parameter definitions | -| `$defs` | object | Parameter group definitions | -| `allOf` | array | References to parameter groups | -| `dependentRequired` | object | Conditional parameter requirements | - -## Parameter Definitions - -Each parameter must include: - -- `type` - The parameter data type -- `description` - Human-readable description - -### Standard Keywords - -#### Type Validation - -```json -{ - "type": "string" | "integer" | "number" | "boolean" | "null" -} -``` - -Or multiple types: - -```json -{ - "type": ["string", "null"] -} -``` - -#### Format Validation (String Types) - -Validates string structure: - -| Format | Description | Example | -| ------------------- | ------------------------ | ---------------------- | -| `file-path` | Path to a file | `/data/input.txt` | -| `directory-path` | Path to a directory | `/data/output/` | -| `path` | Generic file system path | `/data/` | -| `file-path-pattern` | Glob pattern | `*.fastq.gz` | -| `date-time` | ISO 8601 datetime | `2024-01-01T12:00:00Z` | -| `date` | ISO 8601 date | `2024-01-01` | -| `time` | ISO 8601 time | `12:00:00` | -| `email` | Email address | `user@example.com` | -| `uri` | URI/URL | `https://example.com` | -| `regex` | Regular expression | `^[A-Z]+$` | - -Example: - -```json -{ - "input": { - "type": "string", - "format": "file-path", - "description": "Input file path" - } -} -``` - -#### Pattern Validation - -Validate strings against regex: - -```json -{ - "sample_id": { - "type": "string", - "pattern": "^[A-Za-z0-9_-]+$", - "description": "Sample identifier" - } -} -``` - -#### String Length Constraints - -```json -{ - "name": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "description": "Sample name" - } -} -``` - -#### Numeric Constraints - -```json -{ - "threads": { - "type": "integer", - "minimum": 1, - "maximum": 128, - "default": 4, - "description": "Number of threads" - }, - "quality_threshold": { - "type": "number", - "exclusiveMinimum": 0.0, - "exclusiveMaximum": 1.0, - "description": "Quality threshold" - }, - "step_size": { - "type": "number", - "multipleOf": 0.5, - "description": "Step size (multiples of 0.5)" - } -} -``` - -#### Enumerations - -Restrict to specific values: - -```json -{ - "aligner": { - "type": "string", - "enum": ["bwa", "bowtie2", "star"], - "default": "bwa", - "description": "Read aligner to use" - } -} -``` - -#### Constant Values - -Parameter with fixed value: - -```json -{ - "version": { - "type": "string", - "const": "1.0.0", - "description": "Schema version" - } -} -``` - -#### Default Values - -```json -{ - "outdir": { - "type": "string", - "default": "./results", - "description": "Output directory" - } -} -``` - -#### Examples - -Provide usage examples: - -```json -{ - "input": { - "type": "string", - "description": "Input file", - "examples": ["/data/sample1.fastq", "/data/sample2.fastq"] - } -} -``` - -#### Deprecation - -Mark parameters as deprecated: - -```json -{ - "old_param": { - "type": "string", - "description": "Legacy parameter", - "deprecated": true, - "errorMessage": "This parameter is deprecated. Use 'new_param' instead." - } -} -``` - -### Custom Nextflow Keywords - -These are NON-STANDARD extensions specific to Nextflow: - -#### `errorMessage` - -Custom validation error message: - -```json -{ - "threads": { - "type": "integer", - "minimum": 1, - "maximum": 64, - "description": "Thread count", - "errorMessage": "Threads must be between 1 and 64" - } -} -``` - -#### `exists` - -Check if file/directory exists (requires appropriate `format`): - -```json -{ - "reference": { - "type": "string", - "format": "file-path", - "exists": true, - "description": "Reference genome (must exist)" - } -} -``` - -#### `schema` - -Validate a file against another schema: - -```json -{ - "samplesheet": { - "type": "string", - "format": "file-path", - "schema": "assets/samplesheet.json", - "description": "Sample sheet (validated against schema)" - } -} -``` - -#### `help_text` - -Extended help documentation: - -```json -{ - "input": { - "type": "string", - "description": "Input file", - "help_text": "Provide a path to your input FASTQ file. The file should be gzip-compressed and follow the naming convention: sample_R1.fastq.gz" - } -} -``` - -#### `fa_icon` - -Font Awesome icon for documentation: - -```json -{ - "input": { - "type": "string", - "fa_icon": "fas fa-file", - "description": "Input file" - } -} -``` - -#### `hidden` - -Hide parameter from help and docs: - -```json -{ - "internal_param": { - "type": "string", - "hidden": true, - "description": "Internal parameter" - } -} -``` - -#### `mimetype` (Deprecated) - -⚠️ **Deprecated**: Use `format` or `pattern` instead. - -```json -{ - "data": { - "type": "string", - "mimetype": "text/csv" - } -} -``` - -## Parameter Groups - -Organize parameters using `$defs` and `allOf`: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/schema.json", - "title": "Pipeline Parameters", - "description": "My pipeline parameters", - "type": "object", - "$defs": { - "input_output_options": { - "title": "Input/Output Options", - "type": "object", - "fa_icon": "fas fa-terminal", - "description": "Define where the pipeline should find input data and save output data", - "required": ["input", "outdir"], - "properties": { - "input": { - "type": "string", - "format": "file-path", - "description": "Input samplesheet" - }, - "outdir": { - "type": "string", - "format": "directory-path", - "description": "Output directory", - "default": "./results" - } - } - }, - "reference_genome_options": { - "title": "Reference Genome", - "type": "object", - "fa_icon": "fas fa-dna", - "description": "Reference genome options", - "properties": { - "genome": { - "type": "string", - "description": "Genome name", - "enum": ["GRCh38", "GRCh37"], - "help_text": "Select the reference genome assembly" - }, - "fasta": { - "type": "string", - "format": "file-path", - "description": "Custom reference FASTA", - "help_text": "Provide a custom reference genome FASTA file" - } - } - } - }, - "allOf": [ - { "$ref": "#/$defs/input_output_options" }, - { "$ref": "#/$defs/reference_genome_options" } - ] -} -``` - -## Dependent Requirements - -Make parameters conditionally required: - -```json -{ - "properties": { - "use_cache": { - "type": "boolean", - "description": "Enable caching" - }, - "cache_dir": { - "type": "string", - "format": "directory-path", - "description": "Cache directory" - } - }, - "dependentRequired": { - "use_cache": ["cache_dir"] - } -} -``` - -When `use_cache` is provided, `cache_dir` becomes required. - -## Complete Example - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://raw.githubusercontent.com/my-org/my-pipeline/main/nextflow_schema.json", - "title": "RNA-Seq Pipeline Parameters", - "description": "Parameters for RNA-Seq analysis pipeline", - "type": "object", - "$defs": { - "input_output_options": { - "title": "Input/Output Options", - "type": "object", - "fa_icon": "fas fa-terminal", - "description": "Input and output file paths", - "required": ["input", "outdir"], - "properties": { - "input": { - "type": "string", - "format": "file-path", - "exists": true, - "description": "Input samplesheet", - "help_text": "CSV file with sample information", - "fa_icon": "fas fa-file-csv" - }, - "outdir": { - "type": "string", - "format": "directory-path", - "description": "Output directory", - "default": "./results", - "fa_icon": "fas fa-folder-open" - } - } - }, - "alignment_options": { - "title": "Alignment Options", - "type": "object", - "fa_icon": "fas fa-align-center", - "description": "Parameters for read alignment", - "properties": { - "aligner": { - "type": "string", - "enum": ["star", "hisat2"], - "default": "star", - "description": "Read aligner" - }, - "min_mapping_quality": { - "type": "integer", - "minimum": 0, - "maximum": 60, - "default": 10, - "description": "Minimum mapping quality" - } - } - } - }, - "allOf": [ - { "$ref": "#/$defs/input_output_options" }, - { "$ref": "#/$defs/alignment_options" } - ] -} -``` - -## See Also - -- [Quick Start Guide](../getting-started/quick-start.md) -- [Pipeline Input Examples](../examples/pipeline-input-examples.md) -- [Testing Guide](../development/testing.md) +**Schema:** https://json-schema.org/draft/2020-12/schema + +**ID:** https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json + +| Property | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------------------------ | --------------- | ---------- | --------------------------- | ------------------------- | +| + [\$schema](#Nextflow_pipeline_input_schema_schema) | string | | | schema | +| + [\$id](#Nextflow_pipeline_input_schema_id) | string | | | ID URI | +| + [title](#Nextflow_pipeline_input_schema_title) | string | | | Title | +| + [description](#Nextflow_pipeline_input_schema_description) | string | | | Description | +| + [type](#Nextflow_pipeline_input_schema_type) | const | | | Top level type | +| - [\$defs](#Nextflow_pipeline_input_schema_defs) | object | | | Parameter groups | +| - [properties](#Nextflow_pipeline_input_schema_properties) | object | | In #/$defs/parameterOptions | - | +| - [dependentRequired](#Nextflow_pipeline_input_schema_dependentRequired) | object | | | - | +| - [allOf](#Nextflow_pipeline_input_schema_allOf) | array of object | | | Combine definition groups | + +## `$schema` + +**Title:** schema + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | Yes | + +| Restrictions | | +| -------------- | --- | +| **Min length** | 1 | + +## `$id` + +**Title:** ID URI + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | Yes | + +| Restrictions | | +| -------------- | --- | +| **Min length** | 1 | + +## `title` + +**Title:** Title + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | Yes | + +| Restrictions | | +| -------------- | --- | +| **Min length** | 1 | + +## `description` + +**Title:** Description + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | Yes | + +| Restrictions | | +| -------------- | --- | +| **Min length** | 1 | + +## `type` + +**Title:** Top level type + +| | | +| ------------ | ------- | +| **Type** | `const` | +| **Required** | Yes | + +Specific value: `"object"` + +## `$defs` + +**Title:** Parameter groups + +| | | +| ------------ | -------- | +| **Type** | `object` | +| **Required** | No | + +**Pattern Properties:** + +Properties matching pattern `^.*$` must conform to: + +### `pattern: ^.*$` + +| | | +| ------------ | -------- | +| **Type** | `object` | +| **Required** | No | + +**Properties:** + +| Property | Type | Deprecated | Definition | Title/Description | +| ---------------------------------------------------------------------------------------- | ------ | ---------- | --------------------------- | ----------------- | +| + [title](#Nextflow_pipeline_input_schema_defs_pattern:_._title) | string | | | - | +| + [type](#Nextflow_pipeline_input_schema_defs_pattern:_._type) | const | | | - | +| - [fa_icon](#Nextflow_pipeline_input_schema_defs_pattern:_._fa_icon) | string | | | - | +| - [description](#Nextflow_pipeline_input_schema_defs_pattern:_._description) | string | | | - | +| - [required](#Nextflow_pipeline_input_schema_defs_pattern:_._required) | array | | | - | +| + [properties](#Nextflow_pipeline_input_schema_defs_pattern:_._properties) | object | | In #/$defs/parameterOptions | - | +| - [dependentRequired](#Nextflow_pipeline_input_schema_defs_pattern:_._dependentRequired) | object | | | - | + +#### `title` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | Yes | + +| Restrictions | | +| -------------- | --- | +| **Min length** | 1 | + +#### `type` + +| | | +| ------------ | ------- | +| **Type** | `const` | +| **Required** | Yes | + +Specific value: `"object"` + +#### `fa_icon` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +| Restrictions | | +| --------------------------------- | ----------------------------------------------- | +| **Must match regular expression** | `^fa` [Test](https://regex101.com/?regex=%5Efa) | + +#### `description` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +#### `required` + +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + +#### `properties` + +| | | +| ------------ | -------- | +| **Type** | `object` | +| **Required** | Yes | + +#### `dependentRequired` + +| | | +| ------------ | -------- | +| **Type** | `object` | +| **Required** | No | + +## `properties` + +| | | +| ------------ | -------- | +| **Type** | `object` | +| **Required** | No | + +## `dependentRequired` + +| | | +| ------------ | -------- | +| **Type** | `object` | +| **Required** | No | + +## `allOf` + +**Title:** Combine definition groups + +| | | +| ------------ | ----------------- | +| **Type** | `array of object` | +| **Required** | No | + +| | Array restrictions | +| -------------------- | ------------------ | +| **Tuple validation** | See below | + +**Array Items:** + +Each item must be of type: `object` + +## Definitions + +The following definitions are used throughout the schema: + +### typeAnnotation + +**Type:** `enum (of string)` + +### allTypes + +**Type:** `boolean or integer or null or number or string` + +### nonNegativeInteger + +**Type:** `integer` + +### parameterOptions + +**Type:** `object` + +### standardKeywords + +**Description:** Allowed standard JSON Schema properties. + +**Type:** `object` + +| Property | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------------- | ---------------- | ---------- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| - [type](#defs_standardKeywords_type) | combining | | | The type of the parameter value. Can be one or more of these: `['integer', 'boolean', 'number', 'string', 'null']` | +| - [format](#defs_standardKeywords_format) | enum (of string) | | | The format of a parameter value with the 'string' type. This is used for additional validation on the structure of the value. | +| - [pattern](#defs_standardKeywords_pattern) | string | | | Check a parameter value of 'string' type against a regex pattern | +| - [description](#defs_standardKeywords_description) | string | | | The description of the current parameter | +| - [default](#defs_standardKeywords_default) | object | | In #/$defs/allTypes | Specifies a default value to use for this parameter | +| - [examples](#defs_standardKeywords_examples) | array | | | A list of examples for the current parameter | +| - [deprecated](#defs_standardKeywords_deprecated) | boolean | | | States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' | +| - [minLength](#defs_standardKeywords_minLength) | object | | In #/$defs/nonNegativeInteger | The minimum length a 'string' parameter value should be | +| - [maxLength](#defs_standardKeywords_maxLength) | object | | In #/$defs/nonNegativeInteger | The maximum length a 'string' parameter value should be | +| - [minimum](#defs_standardKeywords_minimum) | number | | | The mimimum value an 'integer' or 'number' parameter value should be | +| - [exclusiveMinimum](#defs_standardKeywords_exclusiveMinimum) | number | | | The exclusive mimimum value an 'integer' or 'number' parameter value should be | +| - [maximum](#defs_standardKeywords_maximum) | number | | | The maximum value an 'integer' or 'number' parameter value should be | +| - [exclusiveMaximum](#defs_standardKeywords_exclusiveMaximum) | number | | | The exclusive maximum value an 'integer' or 'number' parameter value should be | +| - [multipleOf](#defs_standardKeywords_multipleOf) | number | | | The 'integer' or 'number' parameter value should be a multiple of this value | +| - [enum](#defs_standardKeywords_enum) | array | | | The parameter value should be one of the values specified in this enum array | +| - [const](#defs_standardKeywords_const) | object | | In #/$defs/allTypes | The parameter value should be equal to this value | + +### customKeywords + +**Description:** Additional custom JSON Schema properties. + +**Type:** `object` + +| Property | Type | Deprecated | Definition | Title/Description | +| --------------------------------------------------- | ------- | ---------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| - [errorMessage](#defs_customKeywords_errorMessage) | string | | | NON STANDARD OPTION: The custom error message to display in case validation against this parameter fails. Can also be used as a deprecation message if 'deprecated' is true | +| - [exists](#defs_customKeywords_exists) | boolean | | | NON STANDARD OPTION: Check if a file exists. This parameter value needs to be a `string` type with one of these formats: `['path', 'file-path', 'directory-path', 'file-path-pattern']` | +| - [schema](#defs_customKeywords_schema) | string | | | NON STANDARD OPTION: Check the given file against a schema passed to this keyword. Will only work when type is `string` and format is `path` or `file-path` | +| - [help_text](#defs_customKeywords_help_text) | string | | | NON STANDARD OPTION: A more detailed help text | +| - [fa_icon](#defs_customKeywords_fa_icon) | string | | | NON STANDARD OPTION: A font awesome icon to use in the nf-core parameter documentation | +| - [hidden](#defs_customKeywords_hidden) | boolean | | | NON STANDARD OPTION: Hide this parameter from the help message and documentation | +| - [mimetype](#defs_customKeywords_mimetype) | string | Yes | | NON STANDARD OPTION: The MIME type of the parameter value | + +--- + +Generated using a custom JSON Schema documentation generator. diff --git a/docs/schemas/plugin-v1.md b/docs/schemas/plugin-v1.md new file mode 100644 index 0000000..66fde5b --- /dev/null +++ b/docs/schemas/plugin-v1.md @@ -0,0 +1,69 @@ +# Nextflow plugin schema + +**Title:** Nextflow plugin schema + +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +**Description:** Schema for Nextflow plugin specs + +**Schema:** https://json-schema.org/draft/2020-12/schema + +**ID:** https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/v1/schema.json + +| Property | Type | Deprecated | Definition | Title/Description | +| ---------------------------------------------------- | ----- | ---------- | ---------- | ----------------- | +| - [definitions](#Nextflow_plugin_schema_definitions) | array | | | - | + +## `definitions` + +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + +| | Array restrictions | +| -------------------- | ------------------ | +| **Tuple validation** | See below | + +**Array Items:** + +Each item must be of type: `combining` + +## Definitions + +The following definitions are used throughout the schema: + +### config_scope + +**Type:** `object` + +| Property | Type | Deprecated | Definition | Title/Description | +| --------------------------------- | ---------------- | ---------- | ---------- | ----------------- | +| - [type](#defs_config_scope_type) | enum (of string) | | | - | +| - [spec](#defs_config_scope_spec) | object | | | - | + +### config_option + +**Type:** `object` + +| Property | Type | Deprecated | Definition | Title/Description | +| ---------------------------------- | ---------------- | ---------- | ---------- | ----------------- | +| - [type](#defs_config_option_type) | enum (of string) | | | - | +| - [spec](#defs_config_option_spec) | object | | | - | + +### function + +**Type:** `object` + +| Property | Type | Deprecated | Definition | Title/Description | +| ----------------------------- | ---------------- | ---------- | ---------- | ----------------- | +| - [type](#defs_function_type) | enum (of string) | | | - | +| - [spec](#defs_function_spec) | object | | | - | + +--- + +Generated using a custom JSON Schema documentation generator. diff --git a/generate_schema_docs.py b/generate_schema_docs.py new file mode 100644 index 0000000..54de19e --- /dev/null +++ b/generate_schema_docs.py @@ -0,0 +1,477 @@ +#!/usr/bin/env python3 +""" +Generate markdown documentation from JSON schemas. +Similar to json-schema-for-humans output format. +""" + +import json +import re +from pathlib import Path +from typing import Any, Dict, List, Optional +from urllib.parse import quote + + +class SchemaDocGenerator: + """Generate markdown documentation from JSON Schema.""" + + # Characters to remove/replace in anchor IDs + ANCHOR_CLEANUP = str.maketrans({ + " ": "_", ">": "", "$": "", "#": "", "/": "_", + "[": "", "]": "", "(": "", ")": "", "{": "", + "}": "", "^": "", "*": "" + }) + + def __init__(self, schema: Dict[str, Any]): + self.schema = schema + self.defs = schema.get("$defs", {}) + + def generate_id(self, *parts: str) -> str: + """Generate a unique ID for anchors.""" + id_str = "_".join(str(p) for p in parts if p) + id_str = id_str.translate(self.ANCHOR_CLEANUP) + id_str = re.sub(r'_+', '_', id_str) + return id_str.strip("_") + + def type_str(self, prop: Dict[str, Any]) -> str: + """Get human-readable type string.""" + if "const" in prop: + return "const" + if "enum" in prop: + return "enum (of string)" + + type_val = prop.get("type") + if isinstance(type_val, list): + return " or ".join(sorted(type_val)) + + if type_val: + if type_val == "array" and "items" in prop: + items_type = prop["items"].get("type") + if items_type: + return f"array of {items_type}s" + return type_val + + # Check for combining keywords + if any(key in prop for key in ("anyOf", "allOf", "oneOf")): + return "combining" + + return "object" + + @staticmethod + def format_table_cell(text: str) -> str: + """Format text for use in markdown table cells.""" + return str(text).replace("|", "\\|").replace("\n", " ") + + def generate_property_table( + self, properties: Dict[str, Any], required: List[str], path: str = "" + ) -> str: + """Generate a table of properties.""" + if not properties: + return "" + + rows = [ + "| Property | Type | Deprecated | Definition | Title/Description |", + "| " + " | ".join(["-" * 10] * 5) + " |" + ] + + for prop_name, prop_def in properties.items(): + prefix = "+ " if prop_name in required else "- " + prop_type = self.type_str(prop_def) + + # Only show deprecated if it's actually deprecated + deprecated = "Yes" if prop_def.get("deprecated") else "" + + # Check for $ref + definition = f"In {prop_def['$ref']}" if "$ref" in prop_def and prop_def["$ref"].startswith("#/") else "" + + title_desc = prop_def.get("title") or prop_def.get("description") or "-" + anchor_id = self.generate_id(path, prop_name) + display_name = prop_name.replace("$", "\\$") + prop_link = f"[{display_name}](#{anchor_id})" + + rows.append(f"| {prefix}{prop_link} | {prop_type} | {deprecated} | {definition} | {self.format_table_cell(title_desc)} |") + + return "\n".join(rows) + "\n" + + def generate_restrictions_table(self, prop: Dict[str, Any]) -> str: + """Generate restrictions table for a property.""" + restrictions = [] + + # String constraints + if "minLength" in prop: + restrictions.append(("**Min length**", str(prop["minLength"]))) + if "maxLength" in prop: + restrictions.append(("**Max length**", str(prop["maxLength"]))) + if "pattern" in prop: + pattern = prop["pattern"] + regex_url = f"https://regex101.com/?regex={quote(pattern)}" + restrictions.append(("**Must match regular expression**", f"```{pattern}``` [Test]({regex_url})")) + + # Number constraints + if "minimum" in prop: + restrictions.append(("**Minimum**", f"≥ {prop['minimum']}")) + if "exclusiveMinimum" in prop: + restrictions.append(("**Minimum**", f"> {prop['exclusiveMinimum']}")) + if "maximum" in prop: + restrictions.append(("**Maximum**", f"≤ {prop['maximum']}")) + if "exclusiveMaximum" in prop: + restrictions.append(("**Maximum**", f"< {prop['exclusiveMaximum']}")) + if "multipleOf" in prop: + restrictions.append(("**Multiple of**", str(prop["multipleOf"]))) + if "format" in prop: + restrictions.append(("**Format**", f"`{prop['format']}`")) + + if not restrictions: + return "" + + rows = ["| Restrictions | |", "| " + " | ".join(["-" * 10] * 2) + " |"] + rows.extend(f"| {key} | {value} |" for key, value in restrictions) + return "\n".join(rows) + "\n" + + def generate_array_restrictions(self, prop: Dict[str, Any]) -> str: + """Generate array restrictions table.""" + if prop.get("type") != "array": + return "" + + restrictions = [] + + # Only show meaningful values + if "minItems" in prop: + restrictions.append(("**Min items**", str(prop["minItems"]))) + if "maxItems" in prop: + restrictions.append(("**Max items**", str(prop["maxItems"]))) + if prop.get("uniqueItems"): + restrictions.append(("**Items unicity**", "True")) + if "items" in prop: + restrictions.append(("**Tuple validation**", "See below")) + + if not restrictions: + return "" + + rows = ["| | Array restrictions |", "| " + " | ".join(["-" * 10] * 2) + " |"] + rows.extend(f"| {key} | {value} |" for key, value in restrictions) + return "\n".join(rows) + "\n" + + def generate_enum_values(self, prop: Dict[str, Any]) -> str: + """Generate enum values list.""" + if "enum" not in prop: + return "" + + values = "\n".join(f"* `{v}`" if isinstance(v, str) else f"* {v}" for v in prop["enum"]) + return f"\nMust be one of:\n{values}\n" + + def generate_const_value(self, prop: Dict[str, Any]) -> str: + """Generate const value.""" + if "const" not in prop: + return "" + + const_val = prop["const"] + if isinstance(const_val, str): + return f'\nSpecific value: `"{const_val}"`\n' + return f"\nSpecific value: `{const_val}`\n" + + def generate_examples(self, prop: Dict[str, Any]) -> str: + """Generate examples section.""" + if "examples" not in prop: + return "" + + examples = prop["examples"] + if not examples: + return "" + + result = "\n**Examples:**\n\n" + for example in examples: + if isinstance(example, str): + result += f'```\n"{example}"\n```\n\n' + else: + result += f"```\n{json.dumps(example, indent=2)}\n```\n\n" + + return result + + def generate_property_details( + self, prop_name: str, prop: Dict[str, Any], path: str, level: int, parent_required: Optional[List[str]] = None + ) -> str: + """Generate detailed documentation for a property.""" + full_path = f"{path} > {prop_name}" if path else prop_name + + anchor_id = self.generate_id(path, prop_name) + # Only show the property name itself in code ticks + title = f"{'#' * level} `{prop_name}`\n\n" + + details = "" + + # Title + if "title" in prop: + details += f"**Title:** {prop['title']}\n\n" + + # Basic info table + prop_type = self.type_str(prop) + + # Use parent_required if provided, otherwise check schema root + if parent_required is None: + parent_required = self.schema.get("required", []) + is_required = prop_name in parent_required + + basic_table = "| | |\n" + basic_table += "| ------------ | -------- |\n" + basic_table += f"| **Type** | `{prop_type}` |\n" + basic_table += f"| **Required** | {'Yes' if is_required else 'No'} |\n" + + # Add format if present + if "format" in prop: + basic_table = basic_table.rstrip() + f"\n| **Format** | `{prop['format']}` |\n" + + # Add default if present + if "default" in prop: + default_val = json.dumps(prop["default"]) if not isinstance(prop["default"], str) else f'`{prop["default"]}`' + basic_table = basic_table.rstrip() + f"\n| **Default** | {default_val} |\n" + + details += basic_table + "\n" + + # Description + if "description" in prop: + details += f"**Description:** {prop['description']}\n\n" + + # Restrictions + restrictions = self.generate_restrictions_table(prop) + if restrictions: + details += restrictions + "\n" + + # Array restrictions + array_restrictions = self.generate_array_restrictions(prop) + if array_restrictions: + details += array_restrictions + "\n" + + # Enum values + details += self.generate_enum_values(prop) + + # Const value + details += self.generate_const_value(prop) + + # Examples + details += self.generate_examples(prop) + + # Handle nested properties + if "properties" in prop: + nested_props = prop["properties"] + nested_required = prop.get("required", []) + details += "\n**Properties:**\n\n" + details += self.generate_property_table(nested_props, nested_required, full_path) + details += "\n" + + # Generate details for each nested property + for nested_name, nested_prop in nested_props.items(): + details += self.generate_property_details( + nested_name, nested_prop, full_path, level + 1, nested_required + ) + + # Handle pattern properties + if "patternProperties" in prop: + details += "\n**Pattern Properties:**\n\n" + for pattern, pattern_def in prop["patternProperties"].items(): + pattern_required = pattern_def.get("required", []) + details += f"Properties matching pattern `{pattern}` must conform to:\n\n" + details += self.generate_property_details( + f"pattern: {pattern}", pattern_def, full_path, level + 1, pattern_required + ) + + # Handle combining schemas (allOf, anyOf, oneOf) + for keyword, label in [("allOf", "All of (Requirements)"), ("anyOf", "Any of (Options)"), ("oneOf", "One of (Options)")]: + if keyword in prop: + details += f"\n**{label}:**\n\n" + for i, subschema in enumerate(prop[keyword]): + item_label = subschema.get("$ref", f"Item {i}") + details += f"- {item_label}\n" + details += "\n" + + # Handle array items + if prop.get("type") == "array" and "items" in prop: + items = prop["items"] + details += "\n**Array Items:**\n\n" + if "$ref" in items: + details += f"Each item must conform to: {items['$ref']}\n\n" + else: + items_type = self.type_str(items) + details += f"Each item must be of type: `{items_type}`\n\n" + + return title + details + + def generate_header(self) -> str: + """Generate document header.""" + title = self.schema.get("title", "Schema Documentation") + description = self.schema.get("description", "") + schema_type = self.schema.get("type", "object") + + header = f"# {title}\n\n" + header += f"**Title:** {title}\n\n" + + # Basic schema info table + header += "| | |\n" + header += "| ------------------------- | ---------------- |\n" + header += f"| **Type** | `{schema_type}` |\n" + header += "| **Required** | No |\n" + header += "| **Additional properties** | Any type allowed |\n\n" + + if description: + header += f"**Description:** {description}\n\n" + + # Schema metadata + if "$schema" in self.schema: + header += f"**Schema:** {self.schema['$schema']}\n\n" + if "$id" in self.schema: + header += f"**ID:** {self.schema['$id']}\n\n" + + return header + + def generate_properties_section(self) -> str: + """Generate main properties section.""" + properties = self.schema.get("properties", {}) + required = self.schema.get("required", []) + + if not properties: + return "" + + section = self.generate_property_table(properties, required, self.schema.get("title", "")) + section += "\n" + + return section + + def generate_all_property_details(self) -> str: + """Generate detailed sections for all properties.""" + properties = self.schema.get("properties", {}) + if not properties: + return "" + + details = "" + required = self.schema.get("required", []) + for prop_name, prop_def in properties.items(): + schema_title = self.schema.get("title", "") + details += self.generate_property_details(prop_name, prop_def, schema_title, 2, required) + details += "\n" + + return details + + def generate_definitions_section(self) -> str: + """Generate definitions section.""" + if not self.defs: + return "" + + section = "## Definitions\n\n" + section += "The following definitions are used throughout the schema:\n\n" + + for def_name, def_schema in self.defs.items(): + section += f"### {def_name}\n\n" + + if "description" in def_schema: + section += f"**Description:** {def_schema['description']}\n\n" + + def_type = self.type_str(def_schema) + section += f"**Type:** `{def_type}`\n\n" + + if "properties" in def_schema: + required = def_schema.get("required", []) + section += self.generate_property_table( + def_schema["properties"], required, f"$defs/{def_name}" + ) + section += "\n" + + return section + + def generate(self) -> str: + """Generate complete documentation.""" + doc = self.generate_header() + doc += self.generate_properties_section() + doc += self.generate_all_property_details() + doc += self.generate_definitions_section() + + # Add footer + doc += "\n---\n\n" + doc += "Generated using a custom JSON Schema documentation generator.\n" + + return doc + + +def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: + """ + Generate documentation for a JSON schema file. + + Args: + schema_path: Path to the JSON schema file + output_path: Optional path to write the output markdown file + + Returns: + Generated markdown documentation + """ + with open(schema_path) as f: + schema = json.load(f) + + generator = SchemaDocGenerator(schema) + markdown = generator.generate() + + if output_path: + output_path.parent.mkdir(parents=True, exist_ok=True) + output_path.write_text(markdown) + print(f"Documentation generated: {output_path}") + + return markdown + + +def main(): + """Main entry point.""" + import argparse + + parser = argparse.ArgumentParser( + description="Generate markdown documentation from JSON schemas" + ) + parser.add_argument("schema", nargs="?", type=Path, help="Path to JSON schema file") + parser.add_argument( + "-o", + "--output", + type=Path, + help="Output markdown file (default: same name as schema with .md extension)", + ) + parser.add_argument( + "--all", + action="store_true", + help="Generate docs for all schemas in the repository", + ) + parser.add_argument( + "--output-dir", + type=Path, + default=None, + help="Output directory for generated docs (default: docs/schemas/)", + ) + + args = parser.parse_args() + + if args.all: + # Find all schema.json files + repo_root = Path(__file__).parent + schema_files = [f for f in repo_root.glob("**/schema.json") + if not any(p.startswith('.') for p in f.parts)] + + print(f"Found {len(schema_files)} schema files") + + output_dir = args.output_dir or (repo_root / "docs" / "schemas") + + for schema_file in schema_files: + # Get the directory path relative to repo root + schema_dir = schema_file.parent.relative_to(repo_root) + + # Use parent directory name as file name (e.g., pipeline-input, plugin/v1 -> plugin-v1) + schema_name = schema_file.stem if str(schema_dir) == "." else str(schema_dir).replace("/", "-") + + output_file = output_dir / f"{schema_name}.md" + generate_docs(schema_file, output_file) + else: + if not args.schema: + parser.error("schema argument is required when not using --all") + + output_path = args.output + if not output_path: + output_path = args.schema.with_suffix(".md") + + generate_docs(args.schema, output_path) + + +if __name__ == "__main__": + main() From 54c50f7258a3620fc17d3d422d775abe99369f50 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 13:29:00 +0100 Subject: [PATCH 03/20] switch to zensical and prek --- .github/workflows/pre-commit.yml | 6 +- README.md | 12 +- mkdocs.yml | 78 -- pyproject.toml | 15 +- uv.lock | 1133 +++--------------------------- zensical.toml | 304 ++++++++ 6 files changed, 422 insertions(+), 1126 deletions(-) delete mode 100644 mkdocs.yml create mode 100644 zensical.toml diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 6b56e69..cdb8c82 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -7,6 +7,6 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - - uses: pre-commit/action@v3.0.0 + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + - uses: j178/prek-action@v1 diff --git a/README.md b/README.md index a10672c..4d92706 100644 --- a/README.md +++ b/README.md @@ -14,23 +14,27 @@ Each folder contains the schema (`schema.json`) and a `tests` folder with test c ### Prettier formatting We use [Prettier](https://prettier.io/) to format all files in this repository. -We use [pre-commit](https://pre-commit.com/) to run Prettier on all files before committing. +We use [prek](https://prek.j178.dev/) to run Prettier on all files before committing. To install the pre-commit hooks, run the following command: ```bash -pre-commit install +prek install ``` To run Prettier on all files, run the following command: +```bash +prek run --all-files +``` + ### Building Documentation Serve documentation locally: ```bash -uv sync --extra docs -uv run mkdocs serve +uv sync --dev +uv run zensical serve ``` Then open `http://127.0.0.1:8000` in your browser. diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 1f79d9c..0000000 --- a/mkdocs.yml +++ /dev/null @@ -1,78 +0,0 @@ -site_name: Nextflow Schemas -site_description: JSON schemas for Nextflow pipeline inputs and plugins -site_url: https://github.com/nextflow-io/schemas -repo_url: https://github.com/nextflow-io/schemas -repo_name: nextflow-io/schemas - -theme: - name: material - icon: - logo: octicons/codescan-checkmark-16 - font: - text: Inter - code: Fira Code - palette: - - media: "(prefers-color-scheme)" - toggle: - icon: material/brightness-auto - name: Switch to light mode - - media: "(prefers-color-scheme: light)" - scheme: default - primary: green - accent: grey - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - primary: green - accent: grey - toggle: - icon: material/brightness-4 - name: Switch to light mode - features: - - navigation.tabs - - navigation.sections - - navigation.expand - - navigation.top - - search.suggest - - search.highlight - - content.code.copy - - content.code.annotate - -plugins: - - search - - social - - info - - offline - -markdown_extensions: - - admonition - - pymdownx.details - - pymdownx.superfences - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.snippets - - pymdownx.tabbed: - alternate_style: true - - tables - - toc: - permalink: true - -nav: - - Home: index.md - - Getting Started: - - Overview: getting-started/overview.md - - Installation: getting-started/installation.md - - Quick Start: getting-started/quick-start.md - - Schemas: - - Pipeline Input Schema: schemas/pipeline-input.md - - Plugin Schema: schemas/plugin.md - - Development: - - Contributing: development/contributing.md - - Testing: development/testing.md - - CI/CD: development/ci-cd.md - - Examples: - - Pipeline Input Examples: examples/pipeline-input-examples.md - - Plugin Examples: examples/plugin-examples.md diff --git a/pyproject.toml b/pyproject.toml index 32ef526..286ab1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,18 +3,11 @@ name = "nextflow-schemas" version = "0.1.0" description = "JSON schemas for Nextflow pipeline inputs and plugins" readme = "README.md" -requires-python = ">=3.9" - -[project.optional-dependencies] -docs = [ - "mkdocs>=1.5.0", - "mkdocs-material[imaging]>=9.5.0", - "pymdown-extensions>=10.0", - "pre-commit>=4.3.0" -] +requires-python = ">=3.10" [dependency-groups] dev = [ - "check-jsonschema>=0.27.0", - "pre-commit>=4.3.0" + "json-schema-for-humans>=1.5.1", + "prek>=0.2.27", + "zensical>=0.0.2", ] diff --git a/uv.lock b/uv.lock index 48cfc4d..8884bba 100644 --- a/uv.lock +++ b/uv.lock @@ -1,70 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.9" -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version < '3.10'", -] - -[[package]] -name = "attrs" -version = "25.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, -] - -[[package]] -name = "babel" -version = "2.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, -] - -[[package]] -name = "backrefs" -version = "5.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" }, -] - -[[package]] -name = "cairocffi" -version = "1.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload-time = "2024-06-18T10:56:06.741Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload-time = "2024-06-18T10:55:59.489Z" }, -] - -[[package]] -name = "cairosvg" -version = "2.8.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cairocffi" }, - { name = "cssselect2" }, - { name = "defusedxml" }, - { name = "pillow" }, - { name = "tinycss2" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/5106168bd43d7cd8b7cc2a2ee465b385f14b63f4c092bb89eee2d48c8e67/cairosvg-2.8.2.tar.gz", hash = "sha256:07cbf4e86317b27a92318a4cac2a4bb37a5e9c1b8a27355d06874b22f85bef9f", size = 8398590, upload-time = "2025-05-15T06:56:32.653Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/48/816bd4aaae93dbf9e408c58598bc32f4a8c65f4b86ab560864cb3ee60adb/cairosvg-2.8.2-py3-none-any.whl", hash = "sha256:eab46dad4674f33267a671dce39b64be245911c901c70d65d2b7b0821e852bf5", size = 45773, upload-time = "2025-05-15T06:56:28.552Z" }, -] +requires-python = ">=3.10" [[package]] name = "certifi" @@ -75,109 +11,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, ] -[[package]] -name = "cffi" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, - { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, - { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, - { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, - { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, - { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, - { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, - { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, - { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, - { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, - { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, - { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, - { url = "https://files.pythonhosted.org/packages/c0/cc/08ed5a43f2996a16b462f64a7055c6e962803534924b9b2f1371d8c00b7b/cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf", size = 184288, upload-time = "2025-09-08T23:23:48.404Z" }, - { url = "https://files.pythonhosted.org/packages/3d/de/38d9726324e127f727b4ecc376bc85e505bfe61ef130eaf3f290c6847dd4/cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7", size = 180509, upload-time = "2025-09-08T23:23:49.73Z" }, - { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813, upload-time = "2025-09-08T23:23:51.263Z" }, - { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498, upload-time = "2025-09-08T23:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/5c51c1c7600bdd7ed9a24a203ec255dccdd0ebf4527f7b922a0bde2fb6ed/cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534", size = 203243, upload-time = "2025-09-08T23:23:53.836Z" }, - { url = "https://files.pythonhosted.org/packages/32/f2/81b63e288295928739d715d00952c8c6034cb6c6a516b17d37e0c8be5600/cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f", size = 203158, upload-time = "2025-09-08T23:23:55.169Z" }, - { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548, upload-time = "2025-09-08T23:23:56.506Z" }, - { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897, upload-time = "2025-09-08T23:23:57.825Z" }, - { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249, upload-time = "2025-09-08T23:23:59.139Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041, upload-time = "2025-09-08T23:24:00.496Z" }, - { url = "https://files.pythonhosted.org/packages/aa/d9/6218d78f920dcd7507fc16a766b5ef8f3b913cc7aa938e7fc80b9978d089/cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", size = 172138, upload-time = "2025-09-08T23:24:01.7Z" }, - { url = "https://files.pythonhosted.org/packages/54/8f/a1e836f82d8e32a97e6b29cc8f641779181ac7363734f12df27db803ebda/cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", size = 182794, upload-time = "2025-09-08T23:24:02.943Z" }, -] - -[[package]] -name = "cfgv" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, -] - [[package]] name = "charset-normalizer" version = "3.4.3" @@ -239,62 +72,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ca/9a0983dd5c8e9733565cf3db4df2b0a2e9a82659fd8aa2a868ac6e4a991f/charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", size = 207520, upload-time = "2025-08-09T07:57:11.026Z" }, - { url = "https://files.pythonhosted.org/packages/39/c6/99271dc37243a4f925b09090493fb96c9333d7992c6187f5cfe5312008d2/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", size = 147307, upload-time = "2025-08-09T07:57:12.4Z" }, - { url = "https://files.pythonhosted.org/packages/e4/69/132eab043356bba06eb333cc2cc60c6340857d0a2e4ca6dc2b51312886b3/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", size = 160448, upload-time = "2025-08-09T07:57:13.712Z" }, - { url = "https://files.pythonhosted.org/packages/04/9a/914d294daa4809c57667b77470533e65def9c0be1ef8b4c1183a99170e9d/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", size = 157758, upload-time = "2025-08-09T07:57:14.979Z" }, - { url = "https://files.pythonhosted.org/packages/b0/a8/6f5bcf1bcf63cb45625f7c5cadca026121ff8a6c8a3256d8d8cd59302663/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", size = 152487, upload-time = "2025-08-09T07:57:16.332Z" }, - { url = "https://files.pythonhosted.org/packages/c4/72/d3d0e9592f4e504f9dea08b8db270821c909558c353dc3b457ed2509f2fb/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", size = 150054, upload-time = "2025-08-09T07:57:17.576Z" }, - { url = "https://files.pythonhosted.org/packages/20/30/5f64fe3981677fe63fa987b80e6c01042eb5ff653ff7cec1b7bd9268e54e/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", size = 161703, upload-time = "2025-08-09T07:57:20.012Z" }, - { url = "https://files.pythonhosted.org/packages/e1/ef/dd08b2cac9284fd59e70f7d97382c33a3d0a926e45b15fc21b3308324ffd/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", size = 159096, upload-time = "2025-08-09T07:57:21.329Z" }, - { url = "https://files.pythonhosted.org/packages/45/8c/dcef87cfc2b3f002a6478f38906f9040302c68aebe21468090e39cde1445/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", size = 153852, upload-time = "2025-08-09T07:57:22.608Z" }, - { url = "https://files.pythonhosted.org/packages/63/86/9cbd533bd37883d467fcd1bd491b3547a3532d0fbb46de2b99feeebf185e/charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", size = 99840, upload-time = "2025-08-09T07:57:23.883Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d6/7e805c8e5c46ff9729c49950acc4ee0aeb55efb8b3a56687658ad10c3216/charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", size = 107438, upload-time = "2025-08-09T07:57:25.287Z" }, { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] -[[package]] -name = "check-jsonschema" -version = "0.34.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "click", version = "8.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "jsonschema" }, - { name = "regress" }, - { name = "requests" }, - { name = "ruamel-yaml" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/48/be9cb9144328042b66110ed58eabdbba0f64eded54be1a659ec72a5d939e/check_jsonschema-0.34.0.tar.gz", hash = "sha256:7ff811bbd6d3936a9729375fb1e42835ecdc3758d837e2c67330c738a8b4945f", size = 310166, upload-time = "2025-09-18T01:46:26.117Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/60/ac05c3366833b04af1901c776730f0daba5bb5d8dc805706a77938e37661/check_jsonschema-0.34.0-py3-none-any.whl", hash = "sha256:7acb8abf31e28abedca4572435a94e6cf5392aa750b926c77e450d1088389aee", size = 295042, upload-time = "2025-09-18T01:46:24.243Z" }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, -] - [[package]] name = "click" version = "8.3.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } wheels = [ @@ -311,64 +97,25 @@ wheels = [ ] [[package]] -name = "cssselect2" -version = "0.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tinycss2" }, - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" }, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, -] - -[[package]] -name = "distlib" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, -] - -[[package]] -name = "filelock" -version = "3.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" }, -] - -[[package]] -name = "ghp-import" -version = "2.1.0" +name = "dataclasses-json" +version = "0.6.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "python-dateutil" }, + { name = "marshmallow" }, + { name = "typing-inspect" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, ] [[package]] -name = "identify" -version = "2.6.15" +name = "deepmerge" +version = "2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890, upload-time = "2024-08-30T05:31:50.308Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, + { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475, upload-time = "2024-08-30T05:31:48.659Z" }, ] [[package]] @@ -380,18 +127,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] -[[package]] -name = "importlib-metadata" -version = "8.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, -] - [[package]] name = "jinja2" version = "3.1.6" @@ -405,42 +140,40 @@ wheels = [ ] [[package]] -name = "jsonschema" -version = "4.25.1" +name = "json-schema-for-humans" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, + { name = "click" }, + { name = "dataclasses-json" }, + { name = "jinja2" }, + { name = "markdown2" }, + { name = "pygments" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/4c/83fc5c339cabfc0d14717c843f506ad2e70a197b6f2c139bb7b2a27e368b/json_schema_for_humans-1.5.1.tar.gz", hash = "sha256:a43023f6c1b99f8e75126cc824c22992d8f55e941060aa3fddfc7c38de3cb973", size = 256753, upload-time = "2025-11-21T14:55:54.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/a1/97/1e9a730a7d7674d6022e9eaabff9218ba096b310cef712c004854248a64b/json_schema_for_humans-1.5.1-py3-none-any.whl", hash = "sha256:6b5bb65c8ccfb46219352f3da32312c9d904c08790bb96f43f109338c2141478", size = 285017, upload-time = "2025-11-21T14:55:53.26Z" }, ] [[package]] -name = "jsonschema-specifications" -version = "2025.9.1" +name = "markdown" +version = "3.9" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" }, ] [[package]] -name = "markdown" -version = "3.9" +name = "markdown2" +version = "2.5.4" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/f8/b2ae8bf5f28f9b510ae097415e6e4cb63226bb28d7ee01aec03a755ba03b/markdown2-2.5.4.tar.gz", hash = "sha256:a09873f0b3c23dbfae589b0080587df52ad75bb09a5fa6559147554736676889", size = 145652, upload-time = "2025-07-27T16:16:24.307Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/b8/06/2697b5043c3ecb720ce0d243fc7cf5024c0b5b1e450506e9b21939019963/markdown2-2.5.4-py3-none-any.whl", hash = "sha256:3c4b2934e677be7fec0e6f2de4410e116681f4ad50ec8e5ba7557be506d3f439", size = 49954, upload-time = "2025-07-27T16:16:23.026Z" }, ] [[package]] @@ -526,104 +259,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, - { url = "https://files.pythonhosted.org/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623, upload-time = "2025-09-27T18:37:29.296Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049, upload-time = "2025-09-27T18:37:30.234Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923, upload-time = "2025-09-27T18:37:31.177Z" }, - { url = "https://files.pythonhosted.org/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543, upload-time = "2025-09-27T18:37:32.168Z" }, - { url = "https://files.pythonhosted.org/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585, upload-time = "2025-09-27T18:37:33.166Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387, upload-time = "2025-09-27T18:37:34.185Z" }, - { url = "https://files.pythonhosted.org/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133, upload-time = "2025-09-27T18:37:35.138Z" }, - { url = "https://files.pythonhosted.org/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588, upload-time = "2025-09-27T18:37:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566, upload-time = "2025-09-27T18:37:37.09Z" }, - { url = "https://files.pythonhosted.org/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053, upload-time = "2025-09-27T18:37:38.054Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928, upload-time = "2025-09-27T18:37:39.037Z" }, ] [[package]] -name = "mergedeep" -version = "1.3.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, -] - -[[package]] -name = "mkdocs" -version = "1.6.1" +name = "marshmallow" +version = "3.26.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "click", version = "8.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "ghp-import" }, - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, - { name = "jinja2" }, - { name = "markdown" }, - { name = "markupsafe" }, - { name = "mergedeep" }, - { name = "mkdocs-get-deps" }, { name = "packaging" }, - { name = "pathspec" }, - { name = "pyyaml" }, - { name = "pyyaml-env-tag" }, - { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/79/de6c16cc902f4fc372236926b0ce2ab7845268dcc30fb2fbb7f71b418631/marshmallow-3.26.2.tar.gz", hash = "sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57", size = 222095, upload-time = "2025-12-22T06:53:53.309Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl", hash = "sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73", size = 50964, upload-time = "2025-12-22T06:53:51.801Z" }, ] [[package]] -name = "mkdocs-get-deps" -version = "0.2.0" +name = "mypy-extensions" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, - { name = "mergedeep" }, - { name = "platformdirs" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, -] - -[[package]] -name = "mkdocs-material" -version = "9.6.21" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "babel" }, - { name = "backrefs" }, - { name = "colorama" }, - { name = "jinja2" }, - { name = "markdown" }, - { name = "mkdocs" }, - { name = "mkdocs-material-extensions" }, - { name = "paginate" }, - { name = "pygments" }, - { name = "pymdown-extensions" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/d5/ab83ca9aa314954b0a9e8849780bdd01866a3cfcb15ffb7e3a61ca06ff0b/mkdocs_material-9.6.21.tar.gz", hash = "sha256:b01aa6d2731322438056f360f0e623d3faae981f8f2d8c68b1b973f4f2657870", size = 4043097, upload-time = "2025-09-30T19:11:27.517Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/4f/98681c2030375fe9b057dbfb9008b68f46c07dddf583f4df09bf8075e37f/mkdocs_material-9.6.21-py3-none-any.whl", hash = "sha256:aa6a5ab6fb4f6d381588ac51da8782a4d3757cb3d1b174f81a2ec126e1f22c92", size = 9203097, upload-time = "2025-09-30T19:11:24.063Z" }, -] - -[package.optional-dependencies] -imaging = [ - { name = "cairosvg" }, - { name = "pillow" }, -] - -[[package]] -name = "mkdocs-material-extensions" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[package]] @@ -631,42 +287,20 @@ name = "nextflow-schemas" version = "0.1.0" source = { virtual = "." } -[package.optional-dependencies] -docs = [ - { name = "mkdocs" }, - { name = "mkdocs-material", extra = ["imaging"] }, - { name = "pre-commit" }, - { name = "pymdown-extensions" }, -] - [package.dev-dependencies] dev = [ - { name = "check-jsonschema" }, - { name = "pre-commit" }, + { name = "json-schema-for-humans" }, + { name = "prek" }, + { name = "zensical" }, ] [package.metadata] -requires-dist = [ - { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.5.0" }, - { name = "mkdocs-material", extras = ["imaging"], marker = "extra == 'docs'", specifier = ">=9.5.0" }, - { name = "pre-commit", marker = "extra == 'docs'", specifier = ">=4.3.0" }, - { name = "pymdown-extensions", marker = "extra == 'docs'", specifier = ">=10.0" }, -] -provides-extras = ["docs"] [package.metadata.requires-dev] dev = [ - { name = "check-jsonschema", specifier = ">=0.27.0" }, - { name = "pre-commit", specifier = ">=4.3.0" }, -] - -[[package]] -name = "nodeenv" -version = "1.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { name = "json-schema-for-humans", specifier = ">=1.5.1" }, + { name = "prek", specifier = ">=0.2.27" }, + { name = "zensical", specifier = ">=0.0.2" }, ] [[package]] @@ -679,168 +313,27 @@ wheels = [ ] [[package]] -name = "paginate" -version = "0.5.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, -] - -[[package]] -name = "pillow" -version = "11.3.0" +name = "prek" +version = "0.2.27" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/0b/2a0509d2d8881811e4505227df9ca31b3a4482497689b5c2b7f38faab1e5/prek-0.2.27.tar.gz", hash = "sha256:dfd2a1b040f55402c2449ae36ea28e8c1bb05ca900490d5c0996b1b72297cc0e", size = 283076, upload-time = "2026-01-07T14:23:17.123Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, - { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, - { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, - { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, - { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, - { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, - { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, - { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, - { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, - { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, - { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, - { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, - { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, - { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, - { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478, upload-time = "2025-07-01T09:15:52.209Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522, upload-time = "2025-07-01T09:15:54.162Z" }, - { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376, upload-time = "2025-07-03T13:11:01.066Z" }, - { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020, upload-time = "2025-07-03T13:11:06.479Z" }, - { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732, upload-time = "2025-07-01T09:15:56.111Z" }, - { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404, upload-time = "2025-07-01T09:15:58.245Z" }, - { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760, upload-time = "2025-07-01T09:16:00.003Z" }, - { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534, upload-time = "2025-07-01T09:16:02.29Z" }, - { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091, upload-time = "2025-07-01T09:16:04.4Z" }, - { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091, upload-time = "2025-07-01T09:16:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632, upload-time = "2025-07-01T09:16:08.142Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, - { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, - { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, - { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, - { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, -] - -[[package]] -name = "pre-commit" -version = "4.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, -] - -[[package]] -name = "pycparser" -version = "2.23" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { url = "https://files.pythonhosted.org/packages/d8/03/01dd50c89aa38bc194bb14073468bcbd1fec1621150967b7d424d2f043a7/prek-0.2.27-py3-none-linux_armv6l.whl", hash = "sha256:3c7ce590289e4fc0119524d0f0f187133a883d6784279b6a3a4080f5851f1612", size = 4799872, upload-time = "2026-01-07T14:23:15.5Z" }, + { url = "https://files.pythonhosted.org/packages/51/86/807267659e4775c384e755274a214a45461266d6a1117ec059fbd245731b/prek-0.2.27-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:df35dee5dcf09a9613c8b9c6f3d79a3ec894eb13172f569773d529a5458887f8", size = 4903805, upload-time = "2026-01-07T14:23:35.199Z" }, + { url = "https://files.pythonhosted.org/packages/1b/5b/cc3c13ed43e7523f27a2f9b14d18c9b557fb1090e7a74689f934cb24d721/prek-0.2.27-py3-none-macosx_11_0_arm64.whl", hash = "sha256:772d84ebe19b70eba1da0f347d7d486b9b03c0a33fe19c2d1bf008e72faa13b3", size = 4629083, upload-time = "2026-01-07T14:23:12.204Z" }, + { url = "https://files.pythonhosted.org/packages/34/d9/86eafc1d7bddf9236263d4428acca76b7bfc7564ccc2dc5e539d1be22b5e/prek-0.2.27-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:571aab2e9c0eace30a51b0667533862f4bdc0a81334d342f6f516796a63fd1e4", size = 4825005, upload-time = "2026-01-07T14:23:28.438Z" }, + { url = "https://files.pythonhosted.org/packages/44/cf/83004be0a9e8ac3c8c927afab5948d9e31760e15442a0fff273f158cae51/prek-0.2.27-py3-none-manylinux_2_24_armv7l.whl", hash = "sha256:cc7a47f40f36c503e77eb6209f7ad5979772f9c7c5e88ba95cf20f0d24ece926", size = 4724850, upload-time = "2026-01-07T14:23:18.276Z" }, + { url = "https://files.pythonhosted.org/packages/73/8c/5c754f4787fc07e7fa6d2c25ac90931cd3692b51f03c45259aca2ea6fd3f/prek-0.2.27-py3-none-manylinux_2_24_i686.whl", hash = "sha256:cd87b034e56f610f9cafd3b7d554dca69f1269a511ad330544d696f08c656eb3", size = 5042584, upload-time = "2026-01-07T14:23:37.892Z" }, + { url = "https://files.pythonhosted.org/packages/4d/80/762283280ae3d2aa35385ed2db76c39518ed789fbaa0b6fb52352764d41c/prek-0.2.27-py3-none-manylinux_2_24_s390x.whl", hash = "sha256:638b4e942dd1cea6fc0ddf4ce5b877e5aa97c6c142b7bf28e9ce6db8f0d06a4a", size = 5511089, upload-time = "2026-01-07T14:23:23.121Z" }, + { url = "https://files.pythonhosted.org/packages/e0/78/1b53b604c188f4054346b237ec1652489718fedc0d465baadecf7907dc42/prek-0.2.27-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:769b13d7bd11fbb4a5fc5fffd2158aea728518ec9aca7b36723b10ad8b189810", size = 5100175, upload-time = "2026-01-07T14:23:19.643Z" }, + { url = "https://files.pythonhosted.org/packages/86/fc/a9dc29598e664e6e663da316338e1e980e885072107876a3ca8d697f4d65/prek-0.2.27-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:6c0bc38806caf14d47d44980d936ee0cb153bccea703fb141c16bb9be49fb778", size = 4833004, upload-time = "2026-01-07T14:23:36.467Z" }, + { url = "https://files.pythonhosted.org/packages/04/b7/56ca9226f20375519d84a2728a985cc491536f0b872f10cb62bcc55ccea0/prek-0.2.27-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:77c8ac95a0bb1156159edcb3c52b5f852910a7d2ed53d6136ecc1d9d6dc39fe1", size = 4842559, upload-time = "2026-01-07T14:23:31.691Z" }, + { url = "https://files.pythonhosted.org/packages/87/20/71ef2c558daabbe2a4cfe6567597f7942dbbad1a3caca0d786b4ec1304cb/prek-0.2.27-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:5e8d56b386660266c2a31e12af8b52a0901fe21fb71ab05768fdd41b405794ac", size = 4709053, upload-time = "2026-01-07T14:23:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/e8/14/7376117d0e91e35ce0f6581d4427280f634b9564c86615f74b79f242fa79/prek-0.2.27-py3-none-musllinux_1_1_i686.whl", hash = "sha256:3fdeaa1b9f97e21d870ba091914bc7ccf85106a9ef74d81f362a92cdbfe33569", size = 4927803, upload-time = "2026-01-07T14:23:30Z" }, + { url = "https://files.pythonhosted.org/packages/fb/81/87f36898ec2ac1439468b20e9e7061b4956ce0cf518c7cc15ac0457f2971/prek-0.2.27-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:20dd04fe33b9fcfbc2069f4e523ec8d9b4813c1ca4ac9784fe2154dcab42dacb", size = 5210701, upload-time = "2026-01-07T14:23:24.87Z" }, + { url = "https://files.pythonhosted.org/packages/50/5a/53f7828543c09cb70ed35291818ec145a42ef04246fa4f82c128b26abd4f/prek-0.2.27-py3-none-win32.whl", hash = "sha256:15948cacbbccd935f57ca164b36c4c5d7b03c58cd5a335a6113cdbd149b6e50d", size = 4623511, upload-time = "2026-01-07T14:23:33.472Z" }, + { url = "https://files.pythonhosted.org/packages/73/21/3a079075a4d4db58f909eedfd7a79517ba90bb12f7b61f6e84c3c29d4d61/prek-0.2.27-py3-none-win_amd64.whl", hash = "sha256:8225dc8523e7a0e95767b3d3e8cfb3bc160fe6af0ee5115fc16c68428c4e0779", size = 5312713, upload-time = "2026-01-07T14:23:21.116Z" }, + { url = "https://files.pythonhosted.org/packages/39/79/d1c3d96ed4f7dff37ed11101d8336131e8108315c3078246007534dcdd27/prek-0.2.27-py3-none-win_arm64.whl", hash = "sha256:f9192bfb6710db2be10f0e28ff31706a2648c1eb8a450b20b2f55f70ba05e769", size = 4978272, upload-time = "2026-01-07T14:23:13.681Z" }, ] [[package]] @@ -866,15 +359,12 @@ wheels = [ ] [[package]] -name = "python-dateutil" -version = "2.9.0.post0" +name = "pytz" +version = "2025.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -939,138 +429,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, - { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, - { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, - { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, - { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, - { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, - { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, - { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, - { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, -] - -[[package]] -name = "pyyaml-env-tag" -version = "1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, -] - -[[package]] -name = "referencing" -version = "0.36.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, -] - -[[package]] -name = "regress" -version = "2025.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/8f/87f88d2fb104c21d83355a218cec6b1176f9d02d824cb32287fa2d701c7c/regress-2025.5.1.tar.gz", hash = "sha256:bb372b76ea6a50935128f065eca4fe6649ec446f0ecf9d73ac0cd19b68acadc7", size = 10935, upload-time = "2025-05-28T19:27:57.065Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/9d/d7b1334f1f8109151f494ef640a316ede0ea38145505d573671a1c376808/regress-2025.5.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:39a8f91a2156780cb25c8daca162969396fae74fdb972f844ac6d314b939535f", size = 441036, upload-time = "2025-05-28T19:25:47.583Z" }, - { url = "https://files.pythonhosted.org/packages/2e/18/c69b302a597ef2ea7e29f9adcaea61ed483c04f54b07d86b71f284f555c6/regress-2025.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9120fbb73b1789fa0559ea88f53026eefa84a9b05f8f1eb81a26fe9cc3bfb841", size = 438625, upload-time = "2025-05-28T19:25:50.075Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0a/237cbf96fee21c2f6a94d5590c0d5e10dbc19be2fd713b1840d0c9689427/regress-2025.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7a558c5ea5def486f71ebfe227adc24d1bf425f5417e4d6497f275f8ab5a8d5", size = 513459, upload-time = "2025-05-28T19:25:51.248Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b9/2304b1bb5eb94548e0a542d82d5755795fa286ef848413d80672036a5339/regress-2025.5.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d0d0ed9ad71e93ebd5c22be66a93e6724cb40ee14d7dc6f5d0265508621d919", size = 496836, upload-time = "2025-05-28T19:25:52.46Z" }, - { url = "https://files.pythonhosted.org/packages/09/60/2d1a598728e07e54d4314f1042adb91531742af43c6a31755592c8df532e/regress-2025.5.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63f09c32eea9d063baad38def4177ad857f8737f52082a43cb4cab5d1b02e169", size = 667519, upload-time = "2025-05-28T19:25:53.883Z" }, - { url = "https://files.pythonhosted.org/packages/36/4a/d2c00bf17ea9476930a999449a6840e50e33f7abe78cc5baf739a3077609/regress-2025.5.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9436fd9d884ca9b0d99b366635457c67c577adfd17974ce7cdfae76119133f98", size = 576489, upload-time = "2025-05-28T19:25:55.201Z" }, - { url = "https://files.pythonhosted.org/packages/e6/61/8cf4258b7625214be75e58780748b469f365fe0291ef25ee5e31e4567dbc/regress-2025.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d04a0bcd6bcf6a572ab661ffca0eae18cbcdd47e3343b0db83597653ee18e3", size = 516038, upload-time = "2025-05-28T19:25:56.508Z" }, - { url = "https://files.pythonhosted.org/packages/f6/58/7c03e36ebda506504d2de54bbff65a28217d63684864d47656967459aa2a/regress-2025.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce3adf2c2032df7589b875d116d0e5ed86322a66faa7e093dee050862028a5b9", size = 517202, upload-time = "2025-05-28T19:25:58.56Z" }, - { url = "https://files.pythonhosted.org/packages/b2/12/b551a004c86462a990c813a11c9a5fbe3c05e3cbcbfb9e37e8a0a26282e8/regress-2025.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2251ed2ab40bf51f01b0c9b71cfb0fe8e8f9c560365a9f2381b98e727b6d54d1", size = 692057, upload-time = "2025-05-28T19:26:00.044Z" }, - { url = "https://files.pythonhosted.org/packages/0d/13/3210c52a769d886f46c851a94c34373dc160021c96c21b7a3afa17bec259/regress-2025.5.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c92d15d05d909b31813c6e643a557259a2d2810922958c594cfe548b1d7f6", size = 693589, upload-time = "2025-05-28T19:26:01.665Z" }, - { url = "https://files.pythonhosted.org/packages/db/06/f96f12ecb89ef45c9bbda88b53e7f6f9ba2b7ec5976bfa249a22841c6cc3/regress-2025.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:04e5ca87022ce469cfbc21f993fc33c7c92bcee412e17dea295b5b2d6e946494", size = 686480, upload-time = "2025-05-28T19:26:03.12Z" }, - { url = "https://files.pythonhosted.org/packages/3a/bb/8a690ef42fdb8b28adbc7d4315d209762bf6a6f3d68ad4b224f5e87baef1/regress-2025.5.1-cp310-cp310-win32.whl", hash = "sha256:82dd7512065e8e818837e3eba10009aac08b9a447db0cc230efc90d9ee0f709e", size = 281441, upload-time = "2025-05-28T19:26:04.381Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/dc0ab2d289bee4863fa5090836268ed191acf12a2c08ac98329916e65a28/regress-2025.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:411214fb07b571f01fdc6bf25814f197f816f179248e031a7176e7c5c6f225c5", size = 296222, upload-time = "2025-05-28T19:26:06.097Z" }, - { url = "https://files.pythonhosted.org/packages/1a/56/14e3ad7243adaa62e82b8065b53896a5a487829d132b88ab779c40c2bed5/regress-2025.5.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:34a7a051cd63b5d39d62d7dd543d05cdc04dd939ecca84da93e3bd3f9d4e6c6c", size = 440914, upload-time = "2025-05-28T19:26:07.656Z" }, - { url = "https://files.pythonhosted.org/packages/eb/7a/f7ebc0afe0877eac2ec6d7a31b2acef821ac7d2c7817edaf7733380d1f05/regress-2025.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:442c225ce759004ea3913d8c7c4750509885f65c29b4b83407f5750000ae7556", size = 438451, upload-time = "2025-05-28T19:26:08.762Z" }, - { url = "https://files.pythonhosted.org/packages/22/63/ccbe38566bafa07c93eff086957db206543fccac5f60fc7db2b90955438b/regress-2025.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1539dcf6962e34cd27a7f6b6948acb16e8d0d657b681e6500227fa4f3dee06d8", size = 513278, upload-time = "2025-05-28T19:26:10.152Z" }, - { url = "https://files.pythonhosted.org/packages/a0/67/493ca9ec1194420e908213e98984660acd86192e10a7698ce363d890f4ee/regress-2025.5.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44c571d32c6968aa0a606be83f34f64c01cb7de9076b674bb80524f20cb5490f", size = 496730, upload-time = "2025-05-28T19:26:11.856Z" }, - { url = "https://files.pythonhosted.org/packages/d5/55/d9bb3032e4d911d569f9af0656715a4da8982705d986129d20bf40d63a15/regress-2025.5.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f930dcf98a808d3b311afb9689171e174a72fdadf9526334ccf1f53929ba329c", size = 667479, upload-time = "2025-05-28T19:26:13.083Z" }, - { url = "https://files.pythonhosted.org/packages/05/4f/dcc0161262652dbf0017f412b5541c5bf072b71b6acd93b7e95ec418ae48/regress-2025.5.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fe4f6993c29de003d3470d8be0c333f37d22313195da1c212963b79819624cd", size = 576477, upload-time = "2025-05-28T19:26:14.7Z" }, - { url = "https://files.pythonhosted.org/packages/1d/57/04a5d18333926f5c7c892dfb76e8d247048d176620a0de9ed1efec272bd3/regress-2025.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e387ab9dcf250ad6f95bc280949cc35c50755fb2ac32e1648455a515f4a12152", size = 516234, upload-time = "2025-05-28T19:26:15.942Z" }, - { url = "https://files.pythonhosted.org/packages/43/64/ab4fddba864a3c2cfe239ccb81e50d968926a0c1b2614c56b1e45c33e2e3/regress-2025.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:007c08544f7e0bebd8ee6c1defab8e9167f4fd7412420a470cb5de3dde2986c8", size = 516500, upload-time = "2025-05-28T19:26:17.533Z" }, - { url = "https://files.pythonhosted.org/packages/61/af/8386cda353fe0ea25dc4b2c499cfde2b83a425fd4c4d46632e9b268ccbd2/regress-2025.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90560fcc0b6579f13d3b9254690720514d4ee009979cfaa3dbd3231ca3489ec4", size = 692033, upload-time = "2025-05-28T19:26:18.713Z" }, - { url = "https://files.pythonhosted.org/packages/8d/dc/5e347752b6ee12db41c26835469723d62a4346a4fd9137006401324e5920/regress-2025.5.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:73c24e2ea5d17680c007b6561d4254f10ee1080904fdd3bbc20f128ab33d8842", size = 693293, upload-time = "2025-05-28T19:26:19.803Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0b/f8c9c15c2019da7afe6a855d680372b2c90bf5535a8cdc8e3293bda47a9b/regress-2025.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7d6c5b1616c77298016267e12ac92685e84df9c2179c0ef4aabe19c32c0c29cd", size = 686656, upload-time = "2025-05-28T19:26:21.48Z" }, - { url = "https://files.pythonhosted.org/packages/be/67/f9a57d923020472f8090d72abc3b42b071590f6666abf92875bd43070fd2/regress-2025.5.1-cp311-cp311-win32.whl", hash = "sha256:2b76254cc600a25261380edfd9b9024ade5e4a39eab2108706ad42e957181298", size = 281293, upload-time = "2025-05-28T19:26:22.712Z" }, - { url = "https://files.pythonhosted.org/packages/62/cf/23184a752188c6449c7e1553818a1268d71c2e5bf9a3440dd143e86bf5ac/regress-2025.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:afc635337f9aaece89c5a91910ffbdc5af9c433f35e8dfa8b48cc22ed697390d", size = 296687, upload-time = "2025-05-28T19:26:23.954Z" }, - { url = "https://files.pythonhosted.org/packages/f5/85/db413b5a8fe82db861d14f5258a5b91255149f34fa1d13e61c2662fbde77/regress-2025.5.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9886e545136d83013fca8e4dac4e46bdef840567ed10b4c56502e653df19bcb", size = 439244, upload-time = "2025-05-28T19:26:25.122Z" }, - { url = "https://files.pythonhosted.org/packages/08/23/b9c2fd89f5d0731f4b21f3cd4dc33545db8fec76e1ef5dead39fbe49c5d0/regress-2025.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40eafbcc4ffe3a9684d037b3fa07238a4c89697827ceeeb225b4dcf0201ef58b", size = 434473, upload-time = "2025-05-28T19:26:26.277Z" }, - { url = "https://files.pythonhosted.org/packages/e7/73/3423f43c7303a4c18ab580ca7272eeaa18f8c2fb599a0cac969dc7d70e68/regress-2025.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1be78366b48609d89b8ac4ea1659d8ddb146ef7219a79460b88735bf3e32ba", size = 513815, upload-time = "2025-05-28T19:26:27.46Z" }, - { url = "https://files.pythonhosted.org/packages/01/82/be11935ac6bf7c34c6c95915583a0d601a4a6d5d5def426f4ccc5bb48f3d/regress-2025.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f00421d2e804a82730f376e7fd3d34f552ad4e965b313ebf66b2c013d9cb99fd", size = 496601, upload-time = "2025-05-28T19:26:28.713Z" }, - { url = "https://files.pythonhosted.org/packages/e4/39/815099043664c6ee82adc4fc8a9097354eafb9848ac8fa420cdf20cbf40e/regress-2025.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f964b9ed7be5fe403d7fb7fb394b10c25630c2680038ece7289a044b5d530c02", size = 668314, upload-time = "2025-05-28T19:26:29.902Z" }, - { url = "https://files.pythonhosted.org/packages/67/dd/5b49032a685032d1f0c357e01fd8777871d7cbb717bda88fc0d269fec29d/regress-2025.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc9b9646aafc9b72b1e4327247c078f38231c8834e71aa74d37f7f5a0cfdec47", size = 577281, upload-time = "2025-05-28T19:26:31.16Z" }, - { url = "https://files.pythonhosted.org/packages/7a/2f/5c94c27ad3b16f5bfc555ba83ebadf5f1892ba64e10ec02e1fe0789d8f47/regress-2025.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cf47ab24f07b61d0e5c4b0610ca21f4d8aa623cc86ca3813b6652db72bc0a0a", size = 515939, upload-time = "2025-05-28T19:26:35.042Z" }, - { url = "https://files.pythonhosted.org/packages/44/4e/6c62d2cdde05f306e2d5046bf464554a7c605014065d4532253745a3dff8/regress-2025.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:960c7420a450f546bff636196087ce53f45b4abb4a3715e2673ccfa555e4c7c2", size = 516694, upload-time = "2025-05-28T19:26:36.626Z" }, - { url = "https://files.pythonhosted.org/packages/3a/e8/d5c04240a074ea901487aa238722705edd10ce6de0309c4cc2a5ae9d2c4b/regress-2025.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7244d348aaaa97ece7127fd1ad318fddb89f2011b51ccaa4eb7d995bef70a9ec", size = 692360, upload-time = "2025-05-28T19:26:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/c7/90/2acd9265098e1aaf08fd0c0b2d086b33662ec343f39dfa05f7705be9f641/regress-2025.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:23156a298935d997904dd4a4a4abeea747472294aac5f6eb60459203e9a6df49", size = 692793, upload-time = "2025-05-28T19:26:38.99Z" }, - { url = "https://files.pythonhosted.org/packages/56/b8/5088bb60355bb502c0e2ab72aecd3e4dbdc0267ed07efea359d7980aa43c/regress-2025.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c4e0dd87e9c4090d825ac9e95449f7e02bd3155db21fd30d0fe334513adc0700", size = 686268, upload-time = "2025-05-28T19:26:42.649Z" }, - { url = "https://files.pythonhosted.org/packages/42/16/12d9fa935a0ea3a779650acec8dfe7a3b17d715b279ebab24d8c356cff4d/regress-2025.5.1-cp312-cp312-win32.whl", hash = "sha256:5b85dc7e180533c2b3f227300006fcdc03cc95f5400db97bfd342552cad6d482", size = 281712, upload-time = "2025-05-28T19:26:43.76Z" }, - { url = "https://files.pythonhosted.org/packages/ac/21/2937f983c5e6d57f06ca92a74b9be450a6acf1be9a7a5bbec06422e2d8c3/regress-2025.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:4c5818b14730397253fd2f8da89cb0161264f5b19f0f602f4a869bf34680b6c4", size = 296678, upload-time = "2025-05-28T19:26:45.015Z" }, - { url = "https://files.pythonhosted.org/packages/ab/17/d80e02ae60a6fec29ab0d73b71abfe00a7a5f31c7c384ad97062ea7835a1/regress-2025.5.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:283e91c35e85762b1bfa78b2c663efba4b8b94d90c4e7380b30f5f8e148e77d0", size = 439279, upload-time = "2025-05-28T19:26:49.079Z" }, - { url = "https://files.pythonhosted.org/packages/2d/72/f3e2cb1791e46f290f872a66126ce7e42af820649b4a243e36d10ac95241/regress-2025.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2057064b2d5c181ea194ad33558df631f2eb2f11b7f16c211cbea95783f4ced4", size = 434735, upload-time = "2025-05-28T19:26:50.472Z" }, - { url = "https://files.pythonhosted.org/packages/71/f4/dcb05da833f8bf2e994b380cee5d47955809387467fa28f936fe9f7a10a3/regress-2025.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8521f0618e63a1e34dec3bfd3fb40bf8537775b69395d1ae2c9195391d4b5064", size = 513852, upload-time = "2025-05-28T19:26:51.65Z" }, - { url = "https://files.pythonhosted.org/packages/46/c6/cd74495390be8dc9679e956967548d21ce3f802d65fdb7444260536ef089/regress-2025.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0b669eb5527089fd283dff6fd34fc3cb9dd1695aa974d4f2b4742389571339c", size = 495859, upload-time = "2025-05-28T19:26:52.779Z" }, - { url = "https://files.pythonhosted.org/packages/0e/1a/b0a9a9eb2bcff967b36c4c964dd4d543863a63107a66106d5bdede791155/regress-2025.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3823754ab1cb01b663b0a84a44aaa6cecbfb1dd0324355997997b83a3d09f4", size = 668042, upload-time = "2025-05-28T19:26:53.912Z" }, - { url = "https://files.pythonhosted.org/packages/cb/df/4bcc598a3a0a07751550dee501607d1dd1f8db56cd367d682c25af0dd68a/regress-2025.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5851d1606927ca4713b2709322517c93be93607106b179f362a0ebfb7ed4cd5", size = 576565, upload-time = "2025-05-28T19:26:55.402Z" }, - { url = "https://files.pythonhosted.org/packages/39/b3/38956fa7c54b3f55fc37b95bcaaae3de5cf15eeaa8dab392959b2a6b9e8c/regress-2025.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49630db291b85fcef96072f040149c286d78c5ce011a2c578193c498b68ee837", size = 516273, upload-time = "2025-05-28T19:26:57.475Z" }, - { url = "https://files.pythonhosted.org/packages/07/fb/05b1db070fbdcd1b4683fc5f32bdaaf98aec602f0c83a837f3e48777115c/regress-2025.5.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36cc08989dad724255b4258ba9d8fc9a89f059f88bbfb4d903b4937a037c0478", size = 516928, upload-time = "2025-05-28T19:26:58.689Z" }, - { url = "https://files.pythonhosted.org/packages/a0/97/3014917191e9191740148227cc50fe66178f885a92fd2ab5b94b9165b50a/regress-2025.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:75ec6bba86e152230b433ae02af334c1ed8d1d4a7b4b5f18a89a617425bc2a5e", size = 692220, upload-time = "2025-05-28T19:26:59.884Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bc/b22a6e0f19d9dcaef6cb2ba63ecdc5ff5c0e3410791d395ecb8dfbc7b1e6/regress-2025.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b7439b000d74d7a7ebce6718fca19860dbd1ff5b5e0519cea4cb7eb79f491ace", size = 692772, upload-time = "2025-05-28T19:27:01.433Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c6/df45f7620aa26a7f3a8dcd5e01051e35c3eb8640ecb0da12a3075d5fff95/regress-2025.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d1e4c17af40d32b97251bbab708386eccbc8b226fe6d807c12814c339a47c", size = 685844, upload-time = "2025-05-28T19:27:02.627Z" }, - { url = "https://files.pythonhosted.org/packages/4d/fe/550ccb67838ba37aa6c88cbef4458204852faa238e083c04aeff1ad67a2f/regress-2025.5.1-cp313-cp313-win32.whl", hash = "sha256:e35db4525fa977bfdb0dc0a1f1f96ac4803ef9bad10c0b149934be79508c8a5d", size = 281555, upload-time = "2025-05-28T19:27:03.866Z" }, - { url = "https://files.pythonhosted.org/packages/9a/83/f3a3450dd525b70d35486309f1af7d35a3878cddbda63dcf8fa9eb94a873/regress-2025.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:4d47720c882ef370afe8a0191186b84f647364529c8f310ca36a16ed85a6763f", size = 296685, upload-time = "2025-05-28T19:27:05.005Z" }, - { url = "https://files.pythonhosted.org/packages/1b/5c/e40162c6a9325d08a7176455cc059fdbe61f890cbb6cb188aea608e87252/regress-2025.5.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:acecd2c0b6ce07cf99a5dbc6c95246ad3624526d0cd181db82504ffda1e8646f", size = 441134, upload-time = "2025-05-28T19:27:06.137Z" }, - { url = "https://files.pythonhosted.org/packages/5b/82/f43c1054ab6be1dde37f7fee23c06af3e59306e268bb0ae2900349a327fd/regress-2025.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:36a77a5d5967361f92999db10319735f458de02a3eff3b3ee76c659ab6db5813", size = 439700, upload-time = "2025-05-28T19:27:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/c4/6f/8dcb5641a6fb475cc78564a5067ce955b005b0ad21743adbd9a54035731b/regress-2025.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e73e711e84a5d3215011f646f221e7e4d6103c72464722d78ab8a947bb9f902a", size = 514278, upload-time = "2025-05-28T19:27:08.444Z" }, - { url = "https://files.pythonhosted.org/packages/3e/7c/8cb23b502d0a792ba9b3384a16621689a78c2a6b09ef172abebe069cc2d5/regress-2025.5.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6f93f5668d3389244720b40b0ae4e51926999249999a031425af1e4ac1ae9c6", size = 497001, upload-time = "2025-05-28T19:27:09.578Z" }, - { url = "https://files.pythonhosted.org/packages/87/b3/1d94646bc13316c77860c6d63bf6823cad3f74189f007867700dd11e2989/regress-2025.5.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f806b2503226d0609d1036669b8b099a45527809fc88194e0457017fc523ab7", size = 670263, upload-time = "2025-05-28T19:27:10.727Z" }, - { url = "https://files.pythonhosted.org/packages/8b/8f/07120a8dd53802b1e826bbafc49129349edfe00bc6e0e796ed681c8a0954/regress-2025.5.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1711579a7dd0dcc27bb8a9868f910b1cecfe7c0d6fc329c8d90db4c5fbce867a", size = 576455, upload-time = "2025-05-28T19:27:15.113Z" }, - { url = "https://files.pythonhosted.org/packages/f4/62/e26d0be0fd2646e4b18dd38afa29da7bbe7a5c06a6f233df548df8430569/regress-2025.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6177fc0aed26c7d630c15994dee7028b76966a729fb0c21053debb18c91864fa", size = 516133, upload-time = "2025-05-28T19:27:16.347Z" }, - { url = "https://files.pythonhosted.org/packages/17/b2/758e840fbdfe302ea988582547077e8dab12ed6493a8b8e57afc359b02a1/regress-2025.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5e8682b2f12befaa0211b0f77a07040c63ad905ac68537a4af45e83ce694a83", size = 517362, upload-time = "2025-05-28T19:27:17.491Z" }, - { url = "https://files.pythonhosted.org/packages/7e/5a/f8325425d4eea841a097f83c09f7bcef84fe4bfd87982610cb23b7cd1085/regress-2025.5.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:12ff5cb9ef002afe0c0acddb5700dca169e892c5b6d5c6c4f8ece5759696b3b5", size = 692757, upload-time = "2025-05-28T19:27:18.715Z" }, - { url = "https://files.pythonhosted.org/packages/94/0f/8537df815410be685821bfe0fe13b1fabb4d98672a7b4ff92452edefbe58/regress-2025.5.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:80180e6b03d2698ca9781322eb7d05a220515e7293374bffc2386f403313f2a2", size = 693893, upload-time = "2025-05-28T19:27:20.397Z" }, - { url = "https://files.pythonhosted.org/packages/42/b8/88936f19ef1c3f0c320cc70370fdf7ca4fd522c1f55679fa6556f6424310/regress-2025.5.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:45b7b34587ee1b312610a14b399831ff8427552a9e10e2f1a38a3c0988447dd5", size = 686454, upload-time = "2025-05-28T19:27:21.696Z" }, - { url = "https://files.pythonhosted.org/packages/91/54/85ce61658b331ef94794e06e2e0adb943df882457b0777343aa090f1c7cb/regress-2025.5.1-cp39-cp39-win32.whl", hash = "sha256:cdd8d7ad2ab4f44a2d354d47fdb23462ef914ecfe11fc82e7f45040b6e1157eb", size = 281760, upload-time = "2025-05-28T19:27:22.913Z" }, - { url = "https://files.pythonhosted.org/packages/9d/05/669052ef4e203b73d89fc7129603b85804babfe3637397c9dc92a888cfe4/regress-2025.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:3a0fd95933a380d3a5f024d4af4bb4adbfac330e745d736f37511e871264169c", size = 296674, upload-time = "2025-05-28T19:27:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/7e/48/e2243ad50777c1c1f07236e8daf16fcabdd8808b9df554d998b13e64ebf2/regress-2025.5.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:19be109256d5c25dad89e197adcbc7611f31ce0146fb6778959fa60185325871", size = 441027, upload-time = "2025-05-28T19:27:25.571Z" }, - { url = "https://files.pythonhosted.org/packages/ef/45/ab7ea6aa2dd6fbe68462c4583a4c7f776fbf18b88daad4d8a1159ba0c0e8/regress-2025.5.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:57180a82631eb25d7bd09d26c0b70cef14df7920bad5b6f592515c12cb30a823", size = 438724, upload-time = "2025-05-28T19:27:27.206Z" }, - { url = "https://files.pythonhosted.org/packages/c3/09/bb494e6571e37fc1169506d1df70f8d74e8de04535a8cc4fb6344fc6f7a5/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0136a30d59cc5b36a7b4c66100342dfce3854c762a73d0a4e807d5547d5da7e1", size = 514034, upload-time = "2025-05-28T19:27:28.362Z" }, - { url = "https://files.pythonhosted.org/packages/52/74/fa13f89b99502e7ae151af8d8811afaaedbac4e0222f60f19829f2d25689/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0fa01bcbc032e510f67a3b66c36da8140249f28ed877f1f11d43fe50b12550eb", size = 496390, upload-time = "2025-05-28T19:27:29.586Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e9/25259f600c37daaf055152db33d1471ff17a96315f2e72f29ddc80d831fe/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ece3a0c430c5079a49087100ff848b7c6616f15262fd35af25aa927837436650", size = 667577, upload-time = "2025-05-28T19:27:30.824Z" }, - { url = "https://files.pythonhosted.org/packages/da/43/c42913a73866ad9d2fec9280452072d3cb0519f37bed219fe47ac48a4ced/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69714990457813b0eb70fea7475a766eafd1f8523c9c6c23e2a95f6edc322bc3", size = 576560, upload-time = "2025-05-28T19:27:31.991Z" }, - { url = "https://files.pythonhosted.org/packages/17/15/03a654e2ffa14cd35289b115a72e01108f157559bdd89e45db824aa70a67/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dbc3f8ce807d95663f6f22ebf7181921c0ee58589e0b4bc27a3cdb869fb4f69", size = 516511, upload-time = "2025-05-28T19:27:33.157Z" }, - { url = "https://files.pythonhosted.org/packages/ea/fc/20af13614e5377171ecd6d9a76d189719b4df28a3675fb9d739b699d98af/regress-2025.5.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a268f59caa74c3723c1625da6ecd5e4363cc356dee2f6cf786bc5592a084b30", size = 517293, upload-time = "2025-05-28T19:27:34.309Z" }, - { url = "https://files.pythonhosted.org/packages/c7/23/0eef5748e1934cf0579c18ec1cdd6b15fae0f4bb0de7fdac32a638d2f161/regress-2025.5.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:273229dfca1cd90965a87c6a193804bf981d7fe05ecc8fe7934a65d6e57e6949", size = 692639, upload-time = "2025-05-28T19:27:35.832Z" }, - { url = "https://files.pythonhosted.org/packages/a1/30/c94b73eddff8a51a02897e99ab6d83fa7591dc161ffa03ef1e0cd089f739/regress-2025.5.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:7d2a52238f28ffbbe6e5e7f11b82d62a2bf46ccd4c680cf95d1570bc54136026", size = 693700, upload-time = "2025-05-28T19:27:37.065Z" }, - { url = "https://files.pythonhosted.org/packages/ca/14/507664b58240b0e9ef415b7b4a3f3a0959fd1f5c41a46742cfb7e1be7463/regress-2025.5.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3a672f370389a17919674cf06402419f1485b53a0c6ddacd5c57a30f2e763ad3", size = 686807, upload-time = "2025-05-28T19:27:38.217Z" }, - { url = "https://files.pythonhosted.org/packages/dd/b9/549ef1246dd0ed42e72ba89cffdc419a59ecd12d5329d9f8ddf8bcab0ae2/regress-2025.5.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:18274d9d672b41c8b82c24d983fd3dd0d4f15d1db109d271e3bfeb4e8416ac88", size = 296250, upload-time = "2025-05-28T19:27:39.481Z" }, - { url = "https://files.pythonhosted.org/packages/3a/6a/62c354eddc8c35cb5feb983f42c2c80af367d51c0893dbc76e7e7bf4c669/regress-2025.5.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:93ba1a5bf40a35692afe6363ebb1c3248a854691db03abd8b40409f17eefa20d", size = 440907, upload-time = "2025-05-28T19:27:40.613Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a1/f70c3ed780296aa05542566bb3af02fdbe7e4a53e8e2417287f6a53a7e2e/regress-2025.5.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84a60e045cbb94c8e88f37b8a8c35f6c0415cf2dd96fde9c5bf918e218cdf776", size = 439000, upload-time = "2025-05-28T19:27:42.284Z" }, - { url = "https://files.pythonhosted.org/packages/4c/07/4c832ffd7891cc1713386569a0eeb09a94aff38e7a577e072e57ccb1077c/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a8d4622b188c2e59c7a8d9da0d0a2255041f055d035f47b15bfdc1cb34d775", size = 513908, upload-time = "2025-05-28T19:27:43.438Z" }, - { url = "https://files.pythonhosted.org/packages/a8/e2/31f5fa221032bac9cb26106e65e7b7b9679c74c91149eb5a5fca9ffef800/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f67df1a4c82fb3849df44e3625ea7ff4fe572c4915365060fedd4b9c74033b7", size = 496113, upload-time = "2025-05-28T19:27:44.638Z" }, - { url = "https://files.pythonhosted.org/packages/ac/9b/6dbf605923da7a5d9295ea2aa94e8a1e10dcf3b704b862bdf5943bee47c8/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c56471ec3d0ffa38d98bb3cd3acbcd550788c62ee0cee5a09343582594d82289", size = 669026, upload-time = "2025-05-28T19:27:46.274Z" }, - { url = "https://files.pythonhosted.org/packages/8f/0a/d0df2a3e376203792df30f02f5f0058270abc940382a8b199e40b4f2b51f/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba5aa399575fa872bd6d4c8deec97817135197c849033fd72120698c6d3aea5f", size = 576253, upload-time = "2025-05-28T19:27:47.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/ef/a94ec34de5c85af1781fffad6a595027448a97d169350ca72d3770146162/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:452574993e4aaf85f4f3c1bd71b6d0fe641b5be70b38ba02f5efde4d0944b9f0", size = 516015, upload-time = "2025-05-28T19:27:48.693Z" }, - { url = "https://files.pythonhosted.org/packages/36/05/16afc04aedfa91ed94b0ec4be305a7ae840c803aa429c86d4ff59eca0e4c/regress-2025.5.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d01518f63b0ad6c26a9bde4de9634dd292d6877c6c2703afd3ef53976059fda5", size = 517035, upload-time = "2025-05-28T19:27:50.309Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a0/5beccd955a3b41f7b680f7da4a415fd9e34468c8416cdd8b54f71f5e0e83/regress-2025.5.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:10817b4f0922ecba439c271d88e1958c13a003557639e96ad2b0f0d5f2526f86", size = 692457, upload-time = "2025-05-28T19:27:51.709Z" }, - { url = "https://files.pythonhosted.org/packages/ab/64/e19dcb1523f3f0c298236b21d5342d78bbbd1abe8a615fdae96ec887c3f7/regress-2025.5.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:fedb74fdd78a79de4d7c8d950f9274fc318198758d0f46ec256218f0afa00597", size = 693420, upload-time = "2025-05-28T19:27:52.953Z" }, - { url = "https://files.pythonhosted.org/packages/ef/24/9debbb1fade18f85743cd24a3e45ad8a019ade407a07fe4cb37015196660/regress-2025.5.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:24d6ff8c02d629fce414c614a990df6bd7a32d048d066b39b9b966567a18aa1d", size = 686967, upload-time = "2025-05-28T19:27:54.182Z" }, - { url = "https://files.pythonhosted.org/packages/4d/83/33f9e090dd3208a683feefce062dbeb8d20e076abacdcfb83baa107da136/regress-2025.5.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e201c763383b3ed6ffb56403c36c519cb008cb822f329ff073b503a24734de45", size = 296531, upload-time = "2025-05-28T19:27:55.527Z" }, ] [[package]] @@ -1088,263 +446,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] -[[package]] -name = "rpds-py" -version = "0.27.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/ed/3aef893e2dd30e77e35d20d4ddb45ca459db59cead748cad9796ad479411/rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef", size = 371606, upload-time = "2025-08-27T12:12:25.189Z" }, - { url = "https://files.pythonhosted.org/packages/6d/82/9818b443e5d3eb4c83c3994561387f116aae9833b35c484474769c4a8faf/rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be", size = 353452, upload-time = "2025-08-27T12:12:27.433Z" }, - { url = "https://files.pythonhosted.org/packages/99/c7/d2a110ffaaa397fc6793a83c7bd3545d9ab22658b7cdff05a24a4535cc45/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61", size = 381519, upload-time = "2025-08-27T12:12:28.719Z" }, - { url = "https://files.pythonhosted.org/packages/5a/bc/e89581d1f9d1be7d0247eaef602566869fdc0d084008ba139e27e775366c/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb", size = 394424, upload-time = "2025-08-27T12:12:30.207Z" }, - { url = "https://files.pythonhosted.org/packages/ac/2e/36a6861f797530e74bb6ed53495f8741f1ef95939eed01d761e73d559067/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657", size = 523467, upload-time = "2025-08-27T12:12:31.808Z" }, - { url = "https://files.pythonhosted.org/packages/c4/59/c1bc2be32564fa499f988f0a5c6505c2f4746ef96e58e4d7de5cf923d77e/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013", size = 402660, upload-time = "2025-08-27T12:12:33.444Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ec/ef8bf895f0628dd0a59e54d81caed6891663cb9c54a0f4bb7da918cb88cf/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a", size = 384062, upload-time = "2025-08-27T12:12:34.857Z" }, - { url = "https://files.pythonhosted.org/packages/69/f7/f47ff154be8d9a5e691c083a920bba89cef88d5247c241c10b9898f595a1/rpds_py-0.27.1-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1", size = 401289, upload-time = "2025-08-27T12:12:36.085Z" }, - { url = "https://files.pythonhosted.org/packages/3b/d9/ca410363efd0615814ae579f6829cafb39225cd63e5ea5ed1404cb345293/rpds_py-0.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10", size = 417718, upload-time = "2025-08-27T12:12:37.401Z" }, - { url = "https://files.pythonhosted.org/packages/e3/a0/8cb5c2ff38340f221cc067cc093d1270e10658ba4e8d263df923daa18e86/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808", size = 558333, upload-time = "2025-08-27T12:12:38.672Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8c/1b0de79177c5d5103843774ce12b84caa7164dfc6cd66378768d37db11bf/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8", size = 589127, upload-time = "2025-08-27T12:12:41.48Z" }, - { url = "https://files.pythonhosted.org/packages/c8/5e/26abb098d5e01266b0f3a2488d299d19ccc26849735d9d2b95c39397e945/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9", size = 554899, upload-time = "2025-08-27T12:12:42.925Z" }, - { url = "https://files.pythonhosted.org/packages/de/41/905cc90ced13550db017f8f20c6d8e8470066c5738ba480d7ba63e3d136b/rpds_py-0.27.1-cp310-cp310-win32.whl", hash = "sha256:ee5422d7fb21f6a00c1901bf6559c49fee13a5159d0288320737bbf6585bd3e4", size = 217450, upload-time = "2025-08-27T12:12:44.813Z" }, - { url = "https://files.pythonhosted.org/packages/75/3d/6bef47b0e253616ccdf67c283e25f2d16e18ccddd38f92af81d5a3420206/rpds_py-0.27.1-cp310-cp310-win_amd64.whl", hash = "sha256:3e039aabf6d5f83c745d5f9a0a381d031e9ed871967c0a5c38d201aca41f3ba1", size = 228447, upload-time = "2025-08-27T12:12:46.204Z" }, - { url = "https://files.pythonhosted.org/packages/b5/c1/7907329fbef97cbd49db6f7303893bd1dd5a4a3eae415839ffdfb0762cae/rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881", size = 371063, upload-time = "2025-08-27T12:12:47.856Z" }, - { url = "https://files.pythonhosted.org/packages/11/94/2aab4bc86228bcf7c48760990273653a4900de89c7537ffe1b0d6097ed39/rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5", size = 353210, upload-time = "2025-08-27T12:12:49.187Z" }, - { url = "https://files.pythonhosted.org/packages/3a/57/f5eb3ecf434342f4f1a46009530e93fd201a0b5b83379034ebdb1d7c1a58/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e", size = 381636, upload-time = "2025-08-27T12:12:50.492Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f4/ef95c5945e2ceb5119571b184dd5a1cc4b8541bbdf67461998cfeac9cb1e/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c", size = 394341, upload-time = "2025-08-27T12:12:52.024Z" }, - { url = "https://files.pythonhosted.org/packages/5a/7e/4bd610754bf492d398b61725eb9598ddd5eb86b07d7d9483dbcd810e20bc/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195", size = 523428, upload-time = "2025-08-27T12:12:53.779Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e5/059b9f65a8c9149361a8b75094864ab83b94718344db511fd6117936ed2a/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52", size = 402923, upload-time = "2025-08-27T12:12:55.15Z" }, - { url = "https://files.pythonhosted.org/packages/f5/48/64cabb7daced2968dd08e8a1b7988bf358d7bd5bcd5dc89a652f4668543c/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed", size = 384094, upload-time = "2025-08-27T12:12:57.194Z" }, - { url = "https://files.pythonhosted.org/packages/ae/e1/dc9094d6ff566bff87add8a510c89b9e158ad2ecd97ee26e677da29a9e1b/rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a", size = 401093, upload-time = "2025-08-27T12:12:58.985Z" }, - { url = "https://files.pythonhosted.org/packages/37/8e/ac8577e3ecdd5593e283d46907d7011618994e1d7ab992711ae0f78b9937/rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde", size = 417969, upload-time = "2025-08-27T12:13:00.367Z" }, - { url = "https://files.pythonhosted.org/packages/66/6d/87507430a8f74a93556fe55c6485ba9c259949a853ce407b1e23fea5ba31/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21", size = 558302, upload-time = "2025-08-27T12:13:01.737Z" }, - { url = "https://files.pythonhosted.org/packages/3a/bb/1db4781ce1dda3eecc735e3152659a27b90a02ca62bfeea17aee45cc0fbc/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9", size = 589259, upload-time = "2025-08-27T12:13:03.127Z" }, - { url = "https://files.pythonhosted.org/packages/7b/0e/ae1c8943d11a814d01b482e1f8da903f88047a962dff9bbdadf3bd6e6fd1/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948", size = 554983, upload-time = "2025-08-27T12:13:04.516Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d5/0b2a55415931db4f112bdab072443ff76131b5ac4f4dc98d10d2d357eb03/rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39", size = 217154, upload-time = "2025-08-27T12:13:06.278Z" }, - { url = "https://files.pythonhosted.org/packages/24/75/3b7ffe0d50dc86a6a964af0d1cc3a4a2cdf437cb7b099a4747bbb96d1819/rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15", size = 228627, upload-time = "2025-08-27T12:13:07.625Z" }, - { url = "https://files.pythonhosted.org/packages/8d/3f/4fd04c32abc02c710f09a72a30c9a55ea3cc154ef8099078fd50a0596f8e/rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746", size = 220998, upload-time = "2025-08-27T12:13:08.972Z" }, - { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, - { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, - { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, - { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, - { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, - { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, - { url = "https://files.pythonhosted.org/packages/6e/96/6772cbfa0e2485bcceef8071de7821f81aeac8bb45fbfd5542a3e8108165/rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39", size = 221343, upload-time = "2025-08-27T12:13:26.967Z" }, - { url = "https://files.pythonhosted.org/packages/67/b6/c82f0faa9af1c6a64669f73a17ee0eeef25aff30bb9a1c318509efe45d84/rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594", size = 232497, upload-time = "2025-08-27T12:13:28.326Z" }, - { url = "https://files.pythonhosted.org/packages/e1/96/2817b44bd2ed11aebacc9251da03689d56109b9aba5e311297b6902136e2/rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502", size = 222790, upload-time = "2025-08-27T12:13:29.71Z" }, - { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, - { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, - { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, - { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, - { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, - { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, - { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, - { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, - { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, - { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, - { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, - { url = "https://files.pythonhosted.org/packages/00/95/3c863973d409210da7fb41958172c6b7dbe7fc34e04d3cc1f10bb85e979f/rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3", size = 221462, upload-time = "2025-08-27T12:13:48.742Z" }, - { url = "https://files.pythonhosted.org/packages/ce/2c/5867b14a81dc217b56d95a9f2a40fdbc56a1ab0181b80132beeecbd4b2d6/rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83", size = 232034, upload-time = "2025-08-27T12:13:50.11Z" }, - { url = "https://files.pythonhosted.org/packages/c7/78/3958f3f018c01923823f1e47f1cc338e398814b92d83cd278364446fac66/rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d", size = 222392, upload-time = "2025-08-27T12:13:52.587Z" }, - { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, - { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, - { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, - { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, - { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, - { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, - { url = "https://files.pythonhosted.org/packages/e5/ee/375469849e6b429b3516206b4580a79e9ef3eb12920ddbd4492b56eaacbe/rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688", size = 216714, upload-time = "2025-08-27T12:14:13.629Z" }, - { url = "https://files.pythonhosted.org/packages/21/87/3fc94e47c9bd0742660e84706c311a860dcae4374cf4a03c477e23ce605a/rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797", size = 228943, upload-time = "2025-08-27T12:14:14.937Z" }, - { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, - { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, - { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, - { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, - { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, - { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, - { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, - { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, - { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, - { url = "https://files.pythonhosted.org/packages/c5/d6/99228e6bbcf4baa764b18258f519a9035131d91b538d4e0e294313462a98/rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3", size = 221943, upload-time = "2025-08-27T12:14:36.898Z" }, - { url = "https://files.pythonhosted.org/packages/be/07/c802bc6b8e95be83b79bdf23d1aa61d68324cb1006e245d6c58e959e314d/rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456", size = 233739, upload-time = "2025-08-27T12:14:38.386Z" }, - { url = "https://files.pythonhosted.org/packages/c8/89/3e1b1c16d4c2d547c5717377a8df99aee8099ff050f87c45cb4d5fa70891/rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3", size = 223120, upload-time = "2025-08-27T12:14:39.82Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, - { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, - { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, - { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, - { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, - { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, - { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, - { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, - { url = "https://files.pythonhosted.org/packages/04/2e/30b5ea18c01379da6272a92825dd7e53dc9d15c88a19e97932d35d430ef7/rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a", size = 217385, upload-time = "2025-08-27T12:15:01.937Z" }, - { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, - { url = "https://files.pythonhosted.org/packages/7f/6c/252e83e1ce7583c81f26d1d884b2074d40a13977e1b6c9c50bbf9a7f1f5a/rpds_py-0.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c918c65ec2e42c2a78d19f18c553d77319119bf43aa9e2edf7fb78d624355527", size = 372140, upload-time = "2025-08-27T12:15:05.441Z" }, - { url = "https://files.pythonhosted.org/packages/9d/71/949c195d927c5aeb0d0629d329a20de43a64c423a6aa53836290609ef7ec/rpds_py-0.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1fea2b1a922c47c51fd07d656324531adc787e415c8b116530a1d29c0516c62d", size = 354086, upload-time = "2025-08-27T12:15:07.404Z" }, - { url = "https://files.pythonhosted.org/packages/9f/02/e43e332ad8ce4f6c4342d151a471a7f2900ed1d76901da62eb3762663a71/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf94c58e8e0cd6b6f38d8de67acae41b3a515c26169366ab58bdca4a6883bb8", size = 382117, upload-time = "2025-08-27T12:15:09.275Z" }, - { url = "https://files.pythonhosted.org/packages/d0/05/b0fdeb5b577197ad72812bbdfb72f9a08fa1e64539cc3940b1b781cd3596/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2a8fed130ce946d5c585eddc7c8eeef0051f58ac80a8ee43bd17835c144c2cc", size = 394520, upload-time = "2025-08-27T12:15:10.727Z" }, - { url = "https://files.pythonhosted.org/packages/67/1f/4cfef98b2349a7585181e99294fa2a13f0af06902048a5d70f431a66d0b9/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:037a2361db72ee98d829bc2c5b7cc55598ae0a5e0ec1823a56ea99374cfd73c1", size = 522657, upload-time = "2025-08-27T12:15:12.613Z" }, - { url = "https://files.pythonhosted.org/packages/44/55/ccf37ddc4c6dce7437b335088b5ca18da864b334890e2fe9aa6ddc3f79a9/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5281ed1cc1d49882f9997981c88df1a22e140ab41df19071222f7e5fc4e72125", size = 402967, upload-time = "2025-08-27T12:15:14.113Z" }, - { url = "https://files.pythonhosted.org/packages/74/e5/5903f92e41e293b07707d5bf00ef39a0eb2af7190aff4beaf581a6591510/rpds_py-0.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd50659a069c15eef8aa3d64bbef0d69fd27bb4a50c9ab4f17f83a16cbf8905", size = 384372, upload-time = "2025-08-27T12:15:15.842Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e3/fbb409e18aeefc01e49f5922ac63d2d914328430e295c12183ce56ebf76b/rpds_py-0.27.1-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:c4b676c4ae3921649a15d28ed10025548e9b561ded473aa413af749503c6737e", size = 401264, upload-time = "2025-08-27T12:15:17.388Z" }, - { url = "https://files.pythonhosted.org/packages/55/79/529ad07794e05cb0f38e2f965fc5bb20853d523976719400acecc447ec9d/rpds_py-0.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:079bc583a26db831a985c5257797b2b5d3affb0386e7ff886256762f82113b5e", size = 418691, upload-time = "2025-08-27T12:15:19.144Z" }, - { url = "https://files.pythonhosted.org/packages/33/39/6554a7fd6d9906fda2521c6d52f5d723dca123529fb719a5b5e074c15e01/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4e44099bd522cba71a2c6b97f68e19f40e7d85399de899d66cdb67b32d7cb786", size = 558989, upload-time = "2025-08-27T12:15:21.087Z" }, - { url = "https://files.pythonhosted.org/packages/19/b2/76fa15173b6f9f445e5ef15120871b945fb8dd9044b6b8c7abe87e938416/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e202e6d4188e53c6661af813b46c37ca2c45e497fc558bacc1a7630ec2695aec", size = 589835, upload-time = "2025-08-27T12:15:22.696Z" }, - { url = "https://files.pythonhosted.org/packages/ee/9e/5560a4b39bab780405bed8a88ee85b30178061d189558a86003548dea045/rpds_py-0.27.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f41f814b8eaa48768d1bb551591f6ba45f87ac76899453e8ccd41dba1289b04b", size = 555227, upload-time = "2025-08-27T12:15:24.278Z" }, - { url = "https://files.pythonhosted.org/packages/52/d7/cd9c36215111aa65724c132bf709c6f35175973e90b32115dedc4ced09cb/rpds_py-0.27.1-cp39-cp39-win32.whl", hash = "sha256:9e71f5a087ead99563c11fdaceee83ee982fd39cf67601f4fd66cb386336ee52", size = 217899, upload-time = "2025-08-27T12:15:25.926Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e0/d75ab7b4dd8ba777f6b365adbdfc7614bbfe7c5f05703031dfa4b61c3d6c/rpds_py-0.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:71108900c9c3c8590697244b9519017a400d9ba26a36c48381b3f64743a44aab", size = 228725, upload-time = "2025-08-27T12:15:27.398Z" }, - { url = "https://files.pythonhosted.org/packages/d5/63/b7cc415c345625d5e62f694ea356c58fb964861409008118f1245f8c3347/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf", size = 371360, upload-time = "2025-08-27T12:15:29.218Z" }, - { url = "https://files.pythonhosted.org/packages/e5/8c/12e1b24b560cf378b8ffbdb9dc73abd529e1adcfcf82727dfd29c4a7b88d/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3", size = 353933, upload-time = "2025-08-27T12:15:30.837Z" }, - { url = "https://files.pythonhosted.org/packages/9b/85/1bb2210c1f7a1b99e91fea486b9f0f894aa5da3a5ec7097cbad7dec6d40f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636", size = 382962, upload-time = "2025-08-27T12:15:32.348Z" }, - { url = "https://files.pythonhosted.org/packages/cc/c9/a839b9f219cf80ed65f27a7f5ddbb2809c1b85c966020ae2dff490e0b18e/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8", size = 394412, upload-time = "2025-08-27T12:15:33.839Z" }, - { url = "https://files.pythonhosted.org/packages/02/2d/b1d7f928b0b1f4fc2e0133e8051d199b01d7384875adc63b6ddadf3de7e5/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc", size = 523972, upload-time = "2025-08-27T12:15:35.377Z" }, - { url = "https://files.pythonhosted.org/packages/a9/af/2cbf56edd2d07716df1aec8a726b3159deb47cb5c27e1e42b71d705a7c2f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8", size = 403273, upload-time = "2025-08-27T12:15:37.051Z" }, - { url = "https://files.pythonhosted.org/packages/c0/93/425e32200158d44ff01da5d9612c3b6711fe69f606f06e3895511f17473b/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc", size = 385278, upload-time = "2025-08-27T12:15:38.571Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1a/1a04a915ecd0551bfa9e77b7672d1937b4b72a0fc204a17deef76001cfb2/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71", size = 402084, upload-time = "2025-08-27T12:15:40.529Z" }, - { url = "https://files.pythonhosted.org/packages/51/f7/66585c0fe5714368b62951d2513b684e5215beaceab2c6629549ddb15036/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad", size = 419041, upload-time = "2025-08-27T12:15:42.191Z" }, - { url = "https://files.pythonhosted.org/packages/8e/7e/83a508f6b8e219bba2d4af077c35ba0e0cdd35a751a3be6a7cba5a55ad71/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab", size = 560084, upload-time = "2025-08-27T12:15:43.839Z" }, - { url = "https://files.pythonhosted.org/packages/66/66/bb945683b958a1b19eb0fe715594630d0f36396ebdef4d9b89c2fa09aa56/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059", size = 590115, upload-time = "2025-08-27T12:15:46.647Z" }, - { url = "https://files.pythonhosted.org/packages/12/00/ccfaafaf7db7e7adace915e5c2f2c2410e16402561801e9c7f96683002d3/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b", size = 556561, upload-time = "2025-08-27T12:15:48.219Z" }, - { url = "https://files.pythonhosted.org/packages/e1/b7/92b6ed9aad103bfe1c45df98453dfae40969eef2cb6c6239c58d7e96f1b3/rpds_py-0.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c796c0c1cc68cb08b0284db4229f5af76168172670c74908fdbd4b7d7f515819", size = 229125, upload-time = "2025-08-27T12:15:49.956Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ed/e1fba02de17f4f76318b834425257c8ea297e415e12c68b4361f63e8ae92/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df", size = 371402, upload-time = "2025-08-27T12:15:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/af/7c/e16b959b316048b55585a697e94add55a4ae0d984434d279ea83442e460d/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3", size = 354084, upload-time = "2025-08-27T12:15:53.219Z" }, - { url = "https://files.pythonhosted.org/packages/de/c1/ade645f55de76799fdd08682d51ae6724cb46f318573f18be49b1e040428/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9", size = 383090, upload-time = "2025-08-27T12:15:55.158Z" }, - { url = "https://files.pythonhosted.org/packages/1f/27/89070ca9b856e52960da1472efcb6c20ba27cfe902f4f23ed095b9cfc61d/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc", size = 394519, upload-time = "2025-08-27T12:15:57.238Z" }, - { url = "https://files.pythonhosted.org/packages/b3/28/be120586874ef906aa5aeeae95ae8df4184bc757e5b6bd1c729ccff45ed5/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4", size = 523817, upload-time = "2025-08-27T12:15:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ef/70cc197bc11cfcde02a86f36ac1eed15c56667c2ebddbdb76a47e90306da/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66", size = 403240, upload-time = "2025-08-27T12:16:00.923Z" }, - { url = "https://files.pythonhosted.org/packages/cf/35/46936cca449f7f518f2f4996e0e8344db4b57e2081e752441154089d2a5f/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e", size = 385194, upload-time = "2025-08-27T12:16:02.802Z" }, - { url = "https://files.pythonhosted.org/packages/e1/62/29c0d3e5125c3270b51415af7cbff1ec587379c84f55a5761cc9efa8cd06/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c", size = 402086, upload-time = "2025-08-27T12:16:04.806Z" }, - { url = "https://files.pythonhosted.org/packages/8f/66/03e1087679227785474466fdd04157fb793b3b76e3fcf01cbf4c693c1949/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf", size = 419272, upload-time = "2025-08-27T12:16:06.471Z" }, - { url = "https://files.pythonhosted.org/packages/6a/24/e3e72d265121e00b063aef3e3501e5b2473cf1b23511d56e529531acf01e/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf", size = 560003, upload-time = "2025-08-27T12:16:08.06Z" }, - { url = "https://files.pythonhosted.org/packages/26/ca/f5a344c534214cc2d41118c0699fffbdc2c1bc7046f2a2b9609765ab9c92/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6", size = 590482, upload-time = "2025-08-27T12:16:10.137Z" }, - { url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ea/5463cd5048a7a2fcdae308b6e96432802132c141bfb9420260142632a0f1/rpds_py-0.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa8933159edc50be265ed22b401125c9eebff3171f570258854dbce3ecd55475", size = 371778, upload-time = "2025-08-27T12:16:13.851Z" }, - { url = "https://files.pythonhosted.org/packages/0d/c8/f38c099db07f5114029c1467649d308543906933eebbc226d4527a5f4693/rpds_py-0.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50431bf02583e21bf273c71b89d710e7a710ad5e39c725b14e685610555926f", size = 354394, upload-time = "2025-08-27T12:16:15.609Z" }, - { url = "https://files.pythonhosted.org/packages/7d/79/b76f97704d9dd8ddbd76fed4c4048153a847c5d6003afe20a6b5c3339065/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78af06ddc7fe5cc0e967085a9115accee665fb912c22a3f54bad70cc65b05fe6", size = 382348, upload-time = "2025-08-27T12:16:17.251Z" }, - { url = "https://files.pythonhosted.org/packages/8a/3f/ef23d3c1be1b837b648a3016d5bbe7cfe711422ad110b4081c0a90ef5a53/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70d0738ef8fee13c003b100c2fbd667ec4f133468109b3472d249231108283a3", size = 394159, upload-time = "2025-08-27T12:16:19.251Z" }, - { url = "https://files.pythonhosted.org/packages/74/8a/9e62693af1a34fd28b1a190d463d12407bd7cf561748cb4745845d9548d3/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2f6fd8a1cea5bbe599b6e78a6e5ee08db434fc8ffea51ff201c8765679698b3", size = 522775, upload-time = "2025-08-27T12:16:20.929Z" }, - { url = "https://files.pythonhosted.org/packages/36/0d/8d5bb122bf7a60976b54c5c99a739a3819f49f02d69df3ea2ca2aff47d5c/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8177002868d1426305bb5de1e138161c2ec9eb2d939be38291d7c431c4712df8", size = 402633, upload-time = "2025-08-27T12:16:22.548Z" }, - { url = "https://files.pythonhosted.org/packages/0f/0e/237948c1f425e23e0cf5a566d702652a6e55c6f8fbd332a1792eb7043daf/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:008b839781d6c9bf3b6a8984d1d8e56f0ec46dc56df61fd669c49b58ae800400", size = 384867, upload-time = "2025-08-27T12:16:24.29Z" }, - { url = "https://files.pythonhosted.org/packages/d6/0a/da0813efcd998d260cbe876d97f55b0f469ada8ba9cbc47490a132554540/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:a55b9132bb1ade6c734ddd2759c8dc132aa63687d259e725221f106b83a0e485", size = 401791, upload-time = "2025-08-27T12:16:25.954Z" }, - { url = "https://files.pythonhosted.org/packages/51/78/c6c9e8a8aaca416a6f0d1b6b4a6ee35b88fe2c5401d02235d0a056eceed2/rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a46fdec0083a26415f11d5f236b79fa1291c32aaa4a17684d82f7017a1f818b1", size = 419525, upload-time = "2025-08-27T12:16:27.659Z" }, - { url = "https://files.pythonhosted.org/packages/a3/69/5af37e1d71487cf6d56dd1420dc7e0c2732c1b6ff612aa7a88374061c0a8/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8a63b640a7845f2bdd232eb0d0a4a2dd939bcdd6c57e6bb134526487f3160ec5", size = 559255, upload-time = "2025-08-27T12:16:29.343Z" }, - { url = "https://files.pythonhosted.org/packages/40/7f/8b7b136069ef7ac3960eda25d832639bdb163018a34c960ed042dd1707c8/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7e32721e5d4922deaaf963469d795d5bde6093207c52fec719bd22e5d1bedbc4", size = 590384, upload-time = "2025-08-27T12:16:31.005Z" }, - { url = "https://files.pythonhosted.org/packages/d8/06/c316d3f6ff03f43ccb0eba7de61376f8ec4ea850067dddfafe98274ae13c/rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c426b99a068601b5f4623573df7a7c3d72e87533a2dd2253353a03e7502566c", size = 555959, upload-time = "2025-08-27T12:16:32.73Z" }, - { url = "https://files.pythonhosted.org/packages/60/94/384cf54c430b9dac742bbd2ec26c23feb78ded0d43d6d78563a281aec017/rpds_py-0.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fc9b7fe29478824361ead6e14e4f5aed570d477e06088826537e202d25fe859", size = 228784, upload-time = "2025-08-27T12:16:34.428Z" }, -] - -[[package]] -name = "ruamel-yaml" -version = "0.18.15" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3e/db/f3950f5e5031b618aae9f423a39bf81a55c148aecd15a34527898e752cf4/ruamel.yaml-0.18.15.tar.gz", hash = "sha256:dbfca74b018c4c3fba0b9cc9ee33e53c371194a9000e694995e620490fd40700", size = 146865, upload-time = "2025-08-19T11:15:10.694Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/e5/f2a0621f1781b76a38194acae72f01e37b1941470407345b6e8653ad7640/ruamel.yaml-0.18.15-py3-none-any.whl", hash = "sha256:148f6488d698b7a5eded5ea793a025308b25eca97208181b6a026037f391f701", size = 119702, upload-time = "2025-08-19T11:15:07.696Z" }, -] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/e9/39ec4d4b3f91188fad1842748f67d4e749c77c37e353c4e545052ee8e893/ruamel.yaml.clib-0.2.14.tar.gz", hash = "sha256:803f5044b13602d58ea378576dd75aa759f52116a0232608e8fdada4da33752e", size = 225394, upload-time = "2025-09-22T19:51:23.753Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/56/35a0a752415ae01992c68f5a6513bdef0e1b6fbdb60d7619342ce12346a0/ruamel.yaml.clib-0.2.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f8b2acb0ffdd2ce8208accbec2dca4a06937d556fdcaefd6473ba1b5daa7e3c4", size = 269216, upload-time = "2025-09-23T14:24:09.742Z" }, - { url = "https://files.pythonhosted.org/packages/98/6a/9a68184ab93619f4607ff1675e4ef01e8accfcbff0d482f4ca44c10d8eab/ruamel.yaml.clib-0.2.14-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:aef953f3b8bd0b50bd52a2e52fb54a6a2171a1889d8dea4a5959d46c6624c451", size = 137092, upload-time = "2025-09-22T19:50:26.906Z" }, - { url = "https://files.pythonhosted.org/packages/2b/3f/cfed5f088628128a9ec66f46794fd4d165642155c7b78c26d83b16c6bf7b/ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a0ac90efbc7a77b0d796c03c8cc4e62fd710b3f1e4c32947713ef2ef52e09543", size = 633768, upload-time = "2025-09-22T19:50:31.228Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d5/5ce2cc156c1da48160171968d91f066d305840fbf930ee955a509d025a44/ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bf6b699223afe6c7fe9f2ef76e0bfa6dd892c21e94ce8c957478987ade76cd8", size = 721253, upload-time = "2025-09-22T19:50:28.776Z" }, - { url = "https://files.pythonhosted.org/packages/2b/71/d0b56bc902b38ebe4be8e270f730f929eec4edaf8a0fa7028f4ef64fa950/ruamel.yaml.clib-0.2.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d73a0187718f6eec5b2f729b0f98e4603f7bd9c48aa65d01227d1a5dcdfbe9e8", size = 683823, upload-time = "2025-09-22T19:50:29.993Z" }, - { url = "https://files.pythonhosted.org/packages/4b/db/1f37449dd89c540218598316ccafc1a0aed60215e72efa315c5367cfd015/ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81f6d3b19bc703679a5705c6a16dabdc79823c71d791d73c65949be7f3012c02", size = 690370, upload-time = "2025-09-23T18:42:46.797Z" }, - { url = "https://files.pythonhosted.org/packages/5d/53/c498b30f35efcd9f47cb084d7ad9374f2b907470f73913dec6396b81397d/ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b28caeaf3e670c08cb7e8de221266df8494c169bd6ed8875493fab45be9607a4", size = 703578, upload-time = "2025-09-22T19:50:32.531Z" }, - { url = "https://files.pythonhosted.org/packages/34/79/492cfad9baed68914840c39e5f3c1cc251f51a897ddb3f532601215cbb12/ruamel.yaml.clib-0.2.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94f3efb718f8f49b031f2071ec7a27dd20cbfe511b4dfd54ecee54c956da2b31", size = 722544, upload-time = "2025-09-22T19:50:34.157Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f5/479ebfd5ba396e209ade90f7282d84b90c57b3e07be8dc6fcd02a6df7ffc/ruamel.yaml.clib-0.2.14-cp310-cp310-win32.whl", hash = "sha256:27c070cf3888e90d992be75dd47292ff9aa17dafd36492812a6a304a1aedc182", size = 100375, upload-time = "2025-09-22T19:50:36.832Z" }, - { url = "https://files.pythonhosted.org/packages/57/31/a044520fdb3bd409889f67f1efebda0658033c7ab3f390cee37531cc9a9e/ruamel.yaml.clib-0.2.14-cp310-cp310-win_amd64.whl", hash = "sha256:4f4a150a737fccae13fb51234d41304ff2222e3b7d4c8e9428ed1a6ab48389b8", size = 118129, upload-time = "2025-09-22T19:50:35.545Z" }, - { url = "https://files.pythonhosted.org/packages/b3/9f/3c51e9578b8c36fcc4bdd271a1a5bb65963a74a4b6ad1a989768a22f6c2a/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bae1a073ca4244620425cd3d3aa9746bde590992b98ee8c7c8be8c597ca0d4e", size = 270207, upload-time = "2025-09-23T14:24:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/4a/16/cb02815bc2ae9c66760c0c061d23c7358f9ba51dae95ac85247662b7fbe2/ruamel.yaml.clib-0.2.14-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:0a54e5e40a7a691a426c2703b09b0d61a14294d25cfacc00631aa6f9c964df0d", size = 137780, upload-time = "2025-09-22T19:50:37.734Z" }, - { url = "https://files.pythonhosted.org/packages/31/c6/fc687cd1b93bff8e40861eea46d6dc1a6a778d9a085684e4045ff26a8e40/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:10d9595b6a19778f3269399eff6bab642608e5966183abc2adbe558a42d4efc9", size = 641590, upload-time = "2025-09-22T19:50:41.978Z" }, - { url = "https://files.pythonhosted.org/packages/45/5d/65a2bc08b709b08576b3f307bf63951ee68a8e047cbbda6f1c9864ecf9a7/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba72975485f2b87b786075e18a6e5d07dc2b4d8973beb2732b9b2816f1bad70", size = 738090, upload-time = "2025-09-22T19:50:39.152Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d0/a70a03614d9a6788a3661ab1538879ed2aae4e84d861f101243116308a37/ruamel.yaml.clib-0.2.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29757bdb7c142f9595cc1b62ec49a3d1c83fab9cef92db52b0ccebaad4eafb98", size = 700744, upload-time = "2025-09-22T19:50:40.811Z" }, - { url = "https://files.pythonhosted.org/packages/77/30/c93fa457611f79946d5cb6cc97493ca5425f3f21891d7b1f9b44eaa1b38e/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:557df28dbccf79b152fe2d1b935f6063d9cc431199ea2b0e84892f35c03bb0ee", size = 742321, upload-time = "2025-09-23T18:42:48.916Z" }, - { url = "https://files.pythonhosted.org/packages/40/85/e2c54ad637117cd13244a4649946eaa00f32edcb882d1f92df90e079ab00/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:26a8de280ab0d22b6e3ec745b4a5a07151a0f74aad92dd76ab9c8d8d7087720d", size = 743805, upload-time = "2025-09-22T19:50:43.58Z" }, - { url = "https://files.pythonhosted.org/packages/81/50/f899072c38877d8ef5382e0b3d47f8c4346226c1f52d6945d6f64fec6a2f/ruamel.yaml.clib-0.2.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e501c096aa3889133d674605ebd018471bc404a59cbc17da3c5924421c54d97c", size = 769529, upload-time = "2025-09-22T19:50:45.707Z" }, - { url = "https://files.pythonhosted.org/packages/99/7c/96d4b5075e30c65ea2064e40c2d657c7c235d7b6ef18751cf89a935b9041/ruamel.yaml.clib-0.2.14-cp311-cp311-win32.whl", hash = "sha256:915748cfc25b8cfd81b14d00f4bfdb2ab227a30d6d43459034533f4d1c207a2a", size = 100256, upload-time = "2025-09-22T19:50:48.26Z" }, - { url = "https://files.pythonhosted.org/packages/7d/8c/73ee2babd04e8bfcf1fd5c20aa553d18bf0ebc24b592b4f831d12ae46cc0/ruamel.yaml.clib-0.2.14-cp311-cp311-win_amd64.whl", hash = "sha256:4ccba93c1e5a40af45b2f08e4591969fa4697eae951c708f3f83dcbf9f6c6bb1", size = 118234, upload-time = "2025-09-22T19:50:47.019Z" }, - { url = "https://files.pythonhosted.org/packages/b4/42/ccfb34a25289afbbc42017e4d3d4288e61d35b2e00cfc6b92974a6a1f94b/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6aeadc170090ff1889f0d2c3057557f9cd71f975f17535c26a5d37af98f19c27", size = 271775, upload-time = "2025-09-23T14:24:12.771Z" }, - { url = "https://files.pythonhosted.org/packages/82/73/e628a92e80197ff6a79ab81ec3fa00d4cc082d58ab78d3337b7ba7043301/ruamel.yaml.clib-0.2.14-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5e56ac47260c0eed992789fa0b8efe43404a9adb608608631a948cee4fc2b052", size = 138842, upload-time = "2025-09-22T19:50:49.156Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c5/346c7094344a60419764b4b1334d9e0285031c961176ff88ffb652405b0c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a911aa73588d9a8b08d662b9484bc0567949529824a55d3885b77e8dd62a127a", size = 647404, upload-time = "2025-09-22T19:50:52.921Z" }, - { url = "https://files.pythonhosted.org/packages/df/99/65080c863eb06d4498de3d6c86f3e90595e02e159fd8529f1565f56cfe2c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a05ba88adf3d7189a974b2de7a9d56731548d35dc0a822ec3dc669caa7019b29", size = 753141, upload-time = "2025-09-22T19:50:50.294Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e3/0de85f3e3333f8e29e4b10244374a202a87665d1131798946ee22cf05c7c/ruamel.yaml.clib-0.2.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb04c5650de6668b853623eceadcdb1a9f2fee381f5d7b6bc842ee7c239eeec4", size = 703477, upload-time = "2025-09-22T19:50:51.508Z" }, - { url = "https://files.pythonhosted.org/packages/d9/25/0d2f09d8833c7fd77ab8efeff213093c16856479a9d293180a0d89f6bed9/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df3ec9959241d07bc261f4983d25a1205ff37703faf42b474f15d54d88b4f8c9", size = 741157, upload-time = "2025-09-23T18:42:50.408Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8c/959f10c2e2153cbdab834c46e6954b6dd9e3b109c8f8c0a3cf1618310985/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fbc08c02e9b147a11dfcaa1ac8a83168b699863493e183f7c0c8b12850b7d259", size = 745859, upload-time = "2025-09-22T19:50:54.497Z" }, - { url = "https://files.pythonhosted.org/packages/ed/6b/e580a7c18b485e1a5f30a32cda96b20364b0ba649d9d2baaf72f8bd21f83/ruamel.yaml.clib-0.2.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c099cafc1834d3c5dac305865d04235f7c21c167c8dd31ebc3d6bbc357e2f023", size = 770200, upload-time = "2025-09-22T19:50:55.718Z" }, - { url = "https://files.pythonhosted.org/packages/ef/44/3455eebc761dc8e8fdced90f2b0a3fa61e32ba38b50de4130e2d57db0f21/ruamel.yaml.clib-0.2.14-cp312-cp312-win32.whl", hash = "sha256:b5b0f7e294700b615a3bcf6d28b26e6da94e8eba63b079f4ec92e9ba6c0d6b54", size = 98829, upload-time = "2025-09-22T19:50:58.895Z" }, - { url = "https://files.pythonhosted.org/packages/76/ab/5121f7f3b651db93de546f8c982c241397aad0a4765d793aca1dac5eadee/ruamel.yaml.clib-0.2.14-cp312-cp312-win_amd64.whl", hash = "sha256:a37f40a859b503304dd740686359fcf541d6fb3ff7fc10f539af7f7150917c68", size = 115570, upload-time = "2025-09-22T19:50:57.981Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ae/e3811f05415594025e96000349d3400978adaed88d8f98d494352d9761ee/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7e4f9da7e7549946e02a6122dcad00b7c1168513acb1f8a726b1aaf504a99d32", size = 269205, upload-time = "2025-09-23T14:24:15.06Z" }, - { url = "https://files.pythonhosted.org/packages/72/06/7d51f4688d6d72bb72fa74254e1593c4f5ebd0036be5b41fe39315b275e9/ruamel.yaml.clib-0.2.14-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:dd7546c851e59c06197a7c651335755e74aa383a835878ca86d2c650c07a2f85", size = 137417, upload-time = "2025-09-22T19:50:59.82Z" }, - { url = "https://files.pythonhosted.org/packages/5a/08/b4499234a420ef42960eeb05585df5cc7eb25ccb8c980490b079e6367050/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:1c1acc3a0209ea9042cc3cfc0790edd2eddd431a2ec3f8283d081e4d5018571e", size = 642558, upload-time = "2025-09-22T19:51:03.388Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ba/1975a27dedf1c4c33306ee67c948121be8710b19387aada29e2f139c43ee/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2070bf0ad1540d5c77a664de07ebcc45eebd1ddcab71a7a06f26936920692beb", size = 744087, upload-time = "2025-09-22T19:51:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/20/15/8a19a13d27f3bd09fa18813add8380a29115a47b553845f08802959acbce/ruamel.yaml.clib-0.2.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd8fe07f49c170e09d76773fb86ad9135e0beee44f36e1576a201b0676d3d1d", size = 699709, upload-time = "2025-09-22T19:51:02.075Z" }, - { url = "https://files.pythonhosted.org/packages/19/ee/8d6146a079ad21e534b5083c9ee4a4c8bec42f79cf87594b60978286b39a/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ff86876889ea478b1381089e55cf9e345707b312beda4986f823e1d95e8c0f59", size = 708926, upload-time = "2025-09-23T18:42:51.707Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/426b714abdc222392e68f3b8ad323930d05a214a27c7e7a0f06c69126401/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1f118b707eece8cf84ecbc3e3ec94d9db879d85ed608f95870d39b2d2efa5dca", size = 740202, upload-time = "2025-09-22T19:51:04.673Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ac/3c5c2b27a183f4fda8a57c82211721c016bcb689a4a175865f7646db9f94/ruamel.yaml.clib-0.2.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b30110b29484adc597df6bd92a37b90e63a8c152ca8136aad100a02f8ba6d1b6", size = 765196, upload-time = "2025-09-22T19:51:05.916Z" }, - { url = "https://files.pythonhosted.org/packages/92/2e/06f56a71fd55021c993ed6e848c9b2e5e9cfce180a42179f0ddd28253f7c/ruamel.yaml.clib-0.2.14-cp313-cp313-win32.whl", hash = "sha256:f4e97a1cf0b7a30af9e1d9dad10a5671157b9acee790d9e26996391f49b965a2", size = 98635, upload-time = "2025-09-22T19:51:08.183Z" }, - { url = "https://files.pythonhosted.org/packages/51/79/76aba16a1689b50528224b182f71097ece338e7a4ab55e84c2e73443b78a/ruamel.yaml.clib-0.2.14-cp313-cp313-win_amd64.whl", hash = "sha256:090782b5fb9d98df96509eecdbcaffd037d47389a89492320280d52f91330d78", size = 115238, upload-time = "2025-09-22T19:51:07.081Z" }, - { url = "https://files.pythonhosted.org/packages/21/e2/a59ff65c26aaf21a24eb38df777cb9af5d87ba8fc8107c163c2da9d1e85e/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7df6f6e9d0e33c7b1d435defb185095386c469109de723d514142632a7b9d07f", size = 271441, upload-time = "2025-09-23T14:24:16.498Z" }, - { url = "https://files.pythonhosted.org/packages/6b/fa/3234f913fe9a6525a7b97c6dad1f51e72b917e6872e051a5e2ffd8b16fbb/ruamel.yaml.clib-0.2.14-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:70eda7703b8126f5e52fcf276e6c0f40b0d314674f896fc58c47b0aef2b9ae83", size = 137970, upload-time = "2025-09-22T19:51:09.472Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ec/4edbf17ac2c87fa0845dd366ef8d5852b96eb58fcd65fc1ecf5fe27b4641/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a0cb71ccc6ef9ce36eecb6272c81afdc2f565950cdcec33ae8e6cd8f7fc86f27", size = 739639, upload-time = "2025-09-22T19:51:10.566Z" }, - { url = "https://files.pythonhosted.org/packages/15/18/b0e1fafe59051de9e79cdd431863b03593ecfa8341c110affad7c8121efc/ruamel.yaml.clib-0.2.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7cb9ad1d525d40f7d87b6df7c0ff916a66bc52cb61b66ac1b2a16d0c1b07640", size = 764456, upload-time = "2025-09-22T19:51:11.736Z" }, - { url = "https://files.pythonhosted.org/packages/2a/a0/e709dc2f58054049cd154319a7d37917689785b12ec43ea2df47ea5344ef/ruamel.yaml.clib-0.2.14-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:18c041b28f3456ddef1f1951d4492dbebe0f8114157c1b3c981a4611c2020792", size = 270636, upload-time = "2025-09-23T14:24:17.855Z" }, - { url = "https://files.pythonhosted.org/packages/18/81/491c9e394976e10682a596f2b785ba7066db525cc17f267005ae8ca33c73/ruamel.yaml.clib-0.2.14-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:d8354515ab62f95a07deaf7f845886cc50e2f345ceab240a3d2d09a9f7d77853", size = 137954, upload-time = "2025-09-22T19:51:12.851Z" }, - { url = "https://files.pythonhosted.org/packages/ad/a5/c6d1c767e051bbc00146a93132bf199b3e6ec2c219131b9d3e19eff428f3/ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:275f938692013a3883edbd848edde6d9f26825d65c9a2eb1db8baa1adc96a05d", size = 636162, upload-time = "2025-09-22T19:51:16.823Z" }, - { url = "https://files.pythonhosted.org/packages/e3/6f/4746e2e8f60b3489b6cd6fad96a8e2aaa0cf7dd6760de3daad1a6e9f5789/ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a60d69f4057ad9a92f3444e2367c08490daed6428291aa16cefb445c29b0e9", size = 723934, upload-time = "2025-09-22T19:51:13.948Z" }, - { url = "https://files.pythonhosted.org/packages/26/47/5446e8cea2f6b5391fba653196f38b3f14030c1c324bd9aa67f1773d24ec/ruamel.yaml.clib-0.2.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac5ff9425d8acb8f59ac5b96bcb7fd3d272dc92d96a7c730025928ffcc88a7a", size = 686265, upload-time = "2025-09-22T19:51:15.142Z" }, - { url = "https://files.pythonhosted.org/packages/52/d7/344d7b3010b6a01af97431bdf89056abb2d8bd704d0f3430e7b50232cce4/ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e1d1735d97fd8a48473af048739379975651fab186f8a25a9f683534e6904179", size = 693042, upload-time = "2025-09-23T18:42:53.238Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d5/a0f2cce1b6cfa9bf1921b8a19ebceafc7a9b3c27882e5af5a07ae080b1bd/ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:83bbd8354f6abb3fdfb922d1ed47ad8d1db3ea72b0523dac8d07cdacfe1c0fcf", size = 706110, upload-time = "2025-09-22T19:51:18.467Z" }, - { url = "https://files.pythonhosted.org/packages/42/cd/85b422d24ee2096eaf6faa360c95ef9bdb59097d19b9624cebce4dd9bc2a/ruamel.yaml.clib-0.2.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:808c7190a0fe7ae7014c42f73897cf8e9ef14ff3aa533450e51b1e72ec5239ad", size = 725028, upload-time = "2025-09-22T19:51:19.782Z" }, - { url = "https://files.pythonhosted.org/packages/4d/ac/99e6e0ea2584f84f447069d0187fe411e9b5deb7e3ddecda25001cfc7a95/ruamel.yaml.clib-0.2.14-cp39-cp39-win32.whl", hash = "sha256:6d5472f63a31b042aadf5ed28dd3ef0523da49ac17f0463e10fda9c4a2773352", size = 100915, upload-time = "2025-09-22T19:51:21.764Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8d/846e43369658958c99d959bb7774136fff9210f9017d91a4277818ceafbf/ruamel.yaml.clib-0.2.14-cp39-cp39-win_amd64.whl", hash = "sha256:8dd3c2cc49caa7a8d64b67146462aed6723a0495e44bf0aa0a2e94beaa8432f6", size = 118706, upload-time = "2025-09-22T19:51:20.878Z" }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, -] - -[[package]] -name = "tinycss2" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, -] - [[package]] name = "tomli" version = "2.2.1" @@ -1394,80 +495,52 @@ wheels = [ ] [[package]] -name = "urllib3" -version = "2.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, -] - -[[package]] -name = "virtualenv" -version = "20.34.0" +name = "typing-inspect" +version = "0.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "mypy-extensions" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, ] [[package]] -name = "watchdog" -version = "6.0.0" +name = "urllib3" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, - { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, - { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, - { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, - { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/05/52/7223011bb760fce8ddc53416beb65b83a3ea6d7d13738dde75eeb2c89679/watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8", size = 96390, upload-time = "2024-11-01T14:06:49.325Z" }, - { url = "https://files.pythonhosted.org/packages/9c/62/d2b21bc4e706d3a9d467561f487c2938cbd881c69f3808c43ac1ec242391/watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a", size = 88386, upload-time = "2024-11-01T14:06:50.536Z" }, - { url = "https://files.pythonhosted.org/packages/ea/22/1c90b20eda9f4132e4603a26296108728a8bfe9584b006bd05dd94548853/watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c", size = 89017, upload-time = "2024-11-01T14:06:51.717Z" }, - { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, - { url = "https://files.pythonhosted.org/packages/5b/79/69f2b0e8d3f2afd462029031baafb1b75d11bb62703f0e1022b2e54d49ee/watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa", size = 87903, upload-time = "2024-11-01T14:06:57.052Z" }, - { url = "https://files.pythonhosted.org/packages/e2/2b/dc048dd71c2e5f0f7ebc04dd7912981ec45793a03c0dc462438e0591ba5d/watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e", size = 88381, upload-time = "2024-11-01T14:06:58.193Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] [[package]] -name = "webencodings" -version = "0.5.1" +name = "zensical" +version = "0.0.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +dependencies = [ + { name = "click" }, + { name = "deepmerge" }, + { name = "markdown" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "pyyaml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] - -[[package]] -name = "zipp" -version = "3.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/fd/ad/87b7b591551c74de67b08dcf172532fbb6df6f0e626dce9f220aae293052/zensical-0.0.15.tar.gz", hash = "sha256:b3200c91b30370671c50b8b4aa41c20e55ff2814b9003ee23c9b6f923a0c19be", size = 3816831, upload-time = "2025-12-24T11:15:49.058Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/07/ede00d39ff6cff7ab4971d15caa04a6710b126cbf0c8342add0337f4db89/zensical-0.0.15-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:13f205d24baeb4a77d096c3d385a8496850567b45c397cd54dde7c22dcbf0da8", size = 11934661, upload-time = "2025-12-24T11:15:09.019Z" }, + { url = "https://files.pythonhosted.org/packages/d6/32/24449c59f90a6a17dd0d9740ee44f245887d0c177c9c1dc452b9eb812024/zensical-0.0.15-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:99702504d38d8f7da4bf9a69513d2f65a0371dcb8f0e9f180c861cb285adb61f", size = 11820384, upload-time = "2025-12-24T11:15:12.265Z" }, + { url = "https://files.pythonhosted.org/packages/ac/db/64fed914788f2f5a8880dcc9a08ce25bcf1a7f2586a09e5d7d61003fd652/zensical-0.0.15-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:051ea368d268ffebf7ed7b6422f211a57680b2810fcde7f251816eb5c8d2f488", size = 12128961, upload-time = "2025-12-24T11:15:16.178Z" }, + { url = "https://files.pythonhosted.org/packages/59/ca/04fd676880acad9571736e470e1f7bd8e6a2391f09952e69800f1b77fc75/zensical-0.0.15-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31a333afaf54d042bb51ac7dc623bd1b3bbe173c0ce4c7b72764cdef143ff4e2", size = 12098586, upload-time = "2025-12-24T11:15:19.452Z" }, + { url = "https://files.pythonhosted.org/packages/8b/02/6a6ecad3b4cb07e11c8d160882cc937f8e3e96868f598c371892f1e594d7/zensical-0.0.15-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:072f80b7346ad4657a4c23008ae5cd3b3511e3bfac8d6bb277cbb6b3c11b6387", size = 12418552, upload-time = "2025-12-24T11:15:23.096Z" }, + { url = "https://files.pythonhosted.org/packages/bb/b7/2a7205dfbeeb8612fbb1e22ad9f770804a07e440b276dcf23cbce3592da4/zensical-0.0.15-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec1b146adb3ee4146a3f800e0a4e6c8e681092d87ac51c60e35e99b68a724b31", size = 12193618, upload-time = "2025-12-24T11:15:26.359Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f4/5f38022d09e668622e49e8b5606bbfb5177d42ab1b4e91706ef0d38e2422/zensical-0.0.15-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:07a24e11a0e00d14f37d209cc37df446f91908109ca86ab3fe41c0b981e32668", size = 12308805, upload-time = "2025-12-24T11:15:29.602Z" }, + { url = "https://files.pythonhosted.org/packages/48/f2/6dd7657d6e1c1cd4b01ad531cea6a95eb660a2f960b03415d2184720a283/zensical-0.0.15-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:cc2bc9b4f89863d8b3443b0b9446ccaf5181085c3fc7a7e1bbc4708afe864f7d", size = 12367060, upload-time = "2025-12-24T11:15:32.621Z" }, + { url = "https://files.pythonhosted.org/packages/d3/83/781bdfbf459ec84b085085b142f433541de70d642d665227442a4deb9360/zensical-0.0.15-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:a3809be6d5f25bbd69dbe43715a60bf9d0186c51a1ec821e02f106e660e632b4", size = 12493255, upload-time = "2025-12-24T11:15:36.126Z" }, + { url = "https://files.pythonhosted.org/packages/54/10/0440e848658b97467c15c356f9038906fa90ac52b7f969ed1cce5deaf017/zensical-0.0.15-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4fd9382db77eff79eb347d4d0b6194c1c285e4151ad104bc9c8f65a27cb71d7f", size = 12430315, upload-time = "2025-12-24T11:15:39.697Z" }, + { url = "https://files.pythonhosted.org/packages/19/d9/50f3e833075e678047cd6e302f731b4b992762d366949124c2eeed6bd96c/zensical-0.0.15-cp310-abi3-win32.whl", hash = "sha256:1d29712dd4659e26b351417534e2ad6364f506514e168ac4c0ed42093b3a9469", size = 11559368, upload-time = "2025-12-24T11:15:42.893Z" }, + { url = "https://files.pythonhosted.org/packages/18/07/cf06fc620dd94b2ffaa3e9df47b174603e0234096fd857b25dcda6c4a538/zensical-0.0.15-cp310-abi3-win_amd64.whl", hash = "sha256:0d0b303ec8a7aec2e733239f21d3602ce29e0eaabe4e4d60c9bcccb5c2d162dc", size = 11740088, upload-time = "2025-12-24T11:15:45.631Z" }, ] diff --git a/zensical.toml b/zensical.toml new file mode 100644 index 0000000..75e2842 --- /dev/null +++ b/zensical.toml @@ -0,0 +1,304 @@ +# ============================================================================ +# +# The configuration produced by default is meant to highlight the features +# that Zensical provides and to serve as a starting point for your own +# projects. +# +# ============================================================================ + +[project] + +# The site_name is shown in the page header and the browser window title +# +# Read more: https://zensical.org/docs/setup/basics/#site_name +site_name = "Nextflow schemas" + +# The site_description is included in the HTML head and should contain a +# meaningful description of the site content for use by search engines. +# +# Read more: https://zensical.org/docs/setup/basics/#site_description +site_description = "Specifications of Nextflow schemas" + +# The site_author attribute. This is used in the HTML head element. +# +# Read more: https://zensical.org/docs/setup/basics/#site_author +site_author = "Matthias Hörtenhuber" + +# The site_url is the canonical URL for your site. When building online +# documentation you should set this. +# Read more: https://zensical.org/docs/setup/basics/#site_url +#site_url = "https://www.example.com/" + +# The copyright notice appears in the page footer and can contain an HTML +# fragment. +# +# Read more: https://zensical.org/docs/setup/basics/#copyright +copyright = """ +Copyright © 2026 The authors +""" + +# Zensical supports both implicit navigation and explicitly defined navigation. +# If you decide not to define a navigation here then Zensical will simply +# derive the navigation structure from the directory structure of your +# "docs_dir". The definition below demonstrates how a navigation structure +# can be defined using TOML syntax. +# +# Read more: https://zensical.org/docs/setup/navigation/ +# nav = [ +# { "Get started" = "index.md" }, +# { "Markdown in 5min" = "markdown.md" }, +# ] + +# With the "extra_css" option you can add your own CSS styling to customize +# your Zensical project according to your needs. You can add any number of +# CSS files. +# +# The path provided should be relative to the "docs_dir". +# +# Read more: https://zensical.org/docs/customization/#additional-css +# +#extra_css = ["stylesheets/extra.css"] + +# With the `extra_javascript` option you can add your own JavaScript to your +# project to customize the behavior according to your needs. +# +# The path provided should be relative to the "docs_dir". +# +# Read more: https://zensical.org/docs/customization/#additional-javascript +#extra_javascript = ["javascripts/extra.js"] + +# ---------------------------------------------------------------------------- +# Section for configuring theme options +# ---------------------------------------------------------------------------- +[project.theme] + +# change this to "classic" to use the traditional Material for MkDocs look. +#variant = "classic" + +# Zensical allows you to override specific blocks, partials, or whole +# templates as well as to define your own templates. To do this, uncomment +# the custom_dir setting below and set it to a directory in which you +# keep your template overrides. +# +# Read more: +# - https://zensical.org/docs/customization/#extending-the-theme +# +#custom_dir = "overrides" + +# With the "favicon" option you can set your own image to use as the icon +# browsers will use in the browser title bar or tab bar. The path provided +# must be relative to the "docs_dir". +# +# Read more: +# - https://zensical.org/docs/setup/logo-and-icons/#favicon +# - https://developer.mozilla.org/en-US/docs/Glossary/Favicon +# +#favicon = "images/favicon.png" + +# Zensical supports more than 60 different languages. This means that the +# labels and tooltips that Zensical's templates produce are translated. +# The "language" option allows you to set the language used. This language +# is also indicated in the HTML head element to help with accessibility +# and guide search engines and translation tools. +# +# The default language is "en" (English). It is possible to create +# sites with multiple languages and configure a language selector. See +# the documentation for details. +# +# Read more: +# - https://zensical.org/docs/setup/language/ +# +language = "en" + +# Zensical provides a number of feature toggles that change the behavior +# of the documentation site. +features = [ + # Zensical includes an announcement bar. This feature allows users to + # dismiss it then they have read the announcement. + # https://zensical.org/docs/setup/header/#announcement-bar + "announce.dismiss", + + # If you have a repository configured and turn on this feature, Zensical + # will generate an edit button for the page. This works for common + # repository hosting services. + # https://zensical.org/docs/setup/repository/#code-actions + "content.action.edit", + + # If you have a repository configured and turn on this feature, Zensical + # will generate a button that allows the user to view the Markdown + # code for the current page. + # https://zensical.org/docs/setup/repository/#code-actions + #"content.action.view", + + # Code annotations allow you to add an icon with a tooltip to your + # code blocks to provide explanations at crucial points. + # https://zensical.org/docs/authoring/code-blocks/#code-annotations + "content.code.annotate", + + # This feature turns on a button in code blocks that allow users to + # copy the content to their clipboard without first selecting it. + # https://zensical.org/docs/authoring/code-blocks/#code-copy-button + "content.code.copy", + + # Code blocks can include a button to allow for the selection of line + # ranges by the user. + # https://zensical.org/docs/authoring/code-blocks/#code-selection-button + "content.code.select", + + # Zensical can render footnotes as inline tooltips, so the user can read + # the footnote without leaving the context of the document. + # https://zensical.org/docs/authoring/footnotes/#footnote-tooltips + "content.footnote.tooltips", + + # If you have many content tabs that have the same titles (e.g., "Python", + # "JavaScript", "Cobol"), this feature causes all of them to switch to + # at the same time when the user chooses their language in one. + # https://zensical.org/docs/authoring/content-tabs/#linked-content-tabs + "content.tabs.link", + + # TODO: not sure I understand this one? Is there a demo of this in the docs? + # https://zensical.org/docs/authoring/tooltips/#improved-tooltips + "content.tooltips", + + # With this feature enabled, Zensical will automatically hide parts + # of the header when the user scrolls past a certain point. + # https://zensical.org/docs/setup/header/#automatic-hiding + # "header.autohide", + + # Turn on this feature to expand all collapsible sections in the + # navigation sidebar by default. + # https://zensical.org/docs/setup/navigation/#navigation-expansion + # "navigation.expand", + + # This feature turns on navigation elements in the footer that allow the + # user to navigate to a next or previous page. + # https://zensical.org/docs/setup/footer/#navigation + "navigation.footer", + + # When section index pages are enabled, documents can be directly attached + # to sections, which is particularly useful for providing overview pages. + # https://zensical.org/docs/setup/navigation/#section-index-pages + "navigation.indexes", + + # When instant navigation is enabled, clicks on all internal links will be + # intercepted and dispatched via XHR without fully reloading the page. + # https://zensical.org/docs/setup/navigation/#instant-navigation + "navigation.instant", + + # With instant prefetching, your site will start to fetch a page once the + # user hovers over a link. This will reduce the perceived loading time + # for the user. + # https://zensical.org/docs/setup/navigation/#instant-prefetching + "navigation.instant.prefetch", + + # In order to provide a better user experience on slow connections when + # using instant navigation, a progress indicator can be enabled. + # https://zensical.org/docs/setup/navigation/#progress-indicator + #"navigation.instant.progress", + + # When navigation paths are activated, a breadcrumb navigation is rendered + # above the title of each page + # https://zensical.org/docs/setup/navigation/#navigation-path + "navigation.path", + + # When pruning is enabled, only the visible navigation items are included + # in the rendered HTML, reducing the size of the built site by 33% or more. + # https://zensical.org/docs/setup/navigation/#navigation-pruning + #"navigation.prune", + + # When sections are enabled, top-level sections are rendered as groups in + # the sidebar for viewports above 1220px, but remain as-is on mobile. + # https://zensical.org/docs/setup/navigation/#navigation-sections + "navigation.sections", + + # When tabs are enabled, top-level sections are rendered in a menu layer + # below the header for viewports above 1220px, but remain as-is on mobile. + # https://zensical.org/docs/setup/navigation/#navigation-tabs + "navigation.tabs", + + # When sticky tabs are enabled, navigation tabs will lock below the header + # and always remain visible when scrolling down. + # https://zensical.org/docs/setup/navigation/#sticky-navigation-tabs + "navigation.tabs.sticky", + + # A back-to-top button can be shown when the user, after scrolling down, + # starts to scroll up again. + # https://zensical.org/docs/setup/navigation/#back-to-top-button + "navigation.top", + + # When anchor tracking is enabled, the URL in the address bar is + # automatically updated with the active anchor as highlighted in the table + # of contents. + # https://zensical.org/docs/setup/navigation/#anchor-tracking + "navigation.tracking", + + # When search highlighting is enabled and a user clicks on a search result, + # Zensical will highlight all occurrences after following the link. + # https://zensical.org/docs/setup/search/#search-highlighting + "search.highlight", + + # When anchor following for the table of contents is enabled, the sidebar + # is automatically scrolled so that the active anchor is always visible. + # https://zensical.org/docs/setup/navigation/#anchor-following + # "toc.follow", + + # When navigation integration for the table of contents is enabled, it is + # always rendered as part of the navigation sidebar on the left. + # https://zensical.org/docs/setup/navigation/#navigation-integration + #"toc.integrate", +] + +# ---------------------------------------------------------------------------- +# In the "palette" subsection you can configure options for the color scheme. +# You can configure different color # schemes, e.g., to turn on dark mode, +# that the user can switch between. Each color scheme can be further +# customized. +# +# Read more: +# - https://zensical.org/docs/setup/colors/ +# ---------------------------------------------------------------------------- +[[project.theme.palette]] +scheme = "default" +toggle.icon = "lucide/sun" +toggle.name = "Switch to dark mode" + +[[project.theme.palette]] +scheme = "slate" +toggle.icon = "lucide/moon" +toggle.name = "Switch to light mode" + +# ---------------------------------------------------------------------------- +# In the "font" subsection you can configure the fonts used. By default, fonts +# are loaded from Google Fonts, giving you a wide range of choices from a set +# of suitably licensed fonts. There are options for a normal text font and for +# a monospaced font used in code blocks. +# ---------------------------------------------------------------------------- +#[project.theme.font] +#text = "Inter" +#code = "Jetbrains Mono" + +# ---------------------------------------------------------------------------- +# You can configure your own logo to be shown in the header using the "logo" +# option in the "icons" subsection. The logo can be a path to a file in your +# "docs_dir" or it can be a path to an icon. +# +# Likewise, you can customize the logo used for the repository section of the +# header. Zensical derives the default logo for this from the repository URL. +# See below... +# +# There are other icons you can customize. See the documentation for details. +# +# Read more: +# - https://zensical.org/docs/setup/logo-and-icons +# - https://zensical.org/docs/authoring/icons-emojis/#search +# ---------------------------------------------------------------------------- +#[project.theme.icon] +#logo = "lucide/smile" +#repo = "lucide/smile" + +# ---------------------------------------------------------------------------- +# The "extra" section contains miscellaneous settings. +# ---------------------------------------------------------------------------- +#[[project.extra.social]] +#icon = "fontawesome/brands/github" +#link = "https://github.com/user/repo" From 8863b10cb791324a1efe58e9c3b14a0f445ee945 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 13:32:52 +0100 Subject: [PATCH 04/20] add schema doc generation script --- .github/workflows/docs.yml | 32 + docs/examples/pipeline-input-examples.md | 579 ---------------- docs/examples/plugin-examples.md | 848 ----------------------- docs/schemas/pipeline-input.md | 672 +++++++++++++++--- docs/schemas/plugin-v1.md | 303 +++++++- generate_schema_docs.py | 496 ++----------- 6 files changed, 943 insertions(+), 1987 deletions(-) create mode 100644 .github/workflows/docs.yml delete mode 100644 docs/examples/pipeline-input-examples.md delete mode 100644 docs/examples/plugin-examples.md diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..37186ec --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,32 @@ +name: Documentation +on: + push: + branches: + - main +permissions: + contents: read + pages: write + id-token: write +concurrency: + group: pages + cancel-in-progress: false +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/configure-pages@v5 + - uses: actions/setup-python@v6 + with: + python-version: 3.x + - uses: astral-sh/setup-uv@v7 + - run: uv run zensical build --clean + - run: uv run prek --all-files + - uses: actions/upload-pages-artifact@v4 + with: + path: site + - uses: actions/deploy-pages@v4 + id: deployment diff --git a/docs/examples/pipeline-input-examples.md b/docs/examples/pipeline-input-examples.md deleted file mode 100644 index 19b5773..0000000 --- a/docs/examples/pipeline-input-examples.md +++ /dev/null @@ -1,579 +0,0 @@ -# Pipeline Input Examples - -This page provides practical examples of pipeline input schemas for various use cases. - -## Basic Examples - -### Minimal Schema - -The simplest valid schema with only required properties: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/minimal-schema.json", - "title": "Minimal Pipeline", - "description": "Minimal valid pipeline schema", - "type": "object" -} -``` - -### Simple Parameters - -Basic parameter definitions: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/simple-params.json", - "title": "Simple Parameters", - "description": "Basic parameter types", - "type": "object", - "properties": { - "input": { - "type": "string", - "format": "file-path", - "description": "Input file path" - }, - "output_dir": { - "type": "string", - "format": "directory-path", - "description": "Output directory", - "default": "./results" - }, - "threads": { - "type": "integer", - "minimum": 1, - "maximum": 32, - "default": 4, - "description": "Number of threads" - }, - "verbose": { - "type": "boolean", - "description": "Enable verbose output", - "default": false - } - } -} -``` - -## RNA-Seq Pipeline - -Comprehensive RNA-Seq analysis pipeline schema: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://github.com/my-org/rnaseq-pipeline/schema.json", - "title": "RNA-Seq Pipeline Parameters", - "description": "Parameters for RNA sequencing analysis", - "type": "object", - "$defs": { - "input_output_options": { - "title": "Input/Output Options", - "type": "object", - "fa_icon": "fas fa-terminal", - "description": "Define input data and output locations", - "required": ["input", "outdir"], - "properties": { - "input": { - "type": "string", - "format": "file-path", - "exists": true, - "description": "Path to samplesheet CSV", - "help_text": "CSV file with columns: sample,fastq_1,fastq_2,strandedness", - "fa_icon": "fas fa-file-csv" - }, - "outdir": { - "type": "string", - "format": "directory-path", - "description": "Output directory", - "default": "./results", - "fa_icon": "fas fa-folder-open" - } - } - }, - "reference_genome_options": { - "title": "Reference Genome", - "type": "object", - "fa_icon": "fas fa-dna", - "description": "Reference genome configuration", - "properties": { - "genome": { - "type": "string", - "description": "Reference genome name", - "enum": ["GRCh38", "GRCh37", "GRCm39", "GRCm38"], - "help_text": "Select a built-in reference genome" - }, - "fasta": { - "type": "string", - "format": "file-path", - "description": "Custom reference genome FASTA", - "help_text": "Path to custom reference genome (overrides --genome)" - }, - "gtf": { - "type": "string", - "format": "file-path", - "description": "Custom GTF annotation file", - "help_text": "Gene annotation in GTF format" - } - } - }, - "alignment_options": { - "title": "Alignment Options", - "type": "object", - "fa_icon": "fas fa-align-center", - "description": "Read alignment parameters", - "properties": { - "aligner": { - "type": "string", - "enum": ["star", "hisat2"], - "default": "star", - "description": "RNA-seq aligner to use" - }, - "min_mapping_quality": { - "type": "integer", - "minimum": 0, - "maximum": 60, - "default": 10, - "description": "Minimum mapping quality score", - "help_text": "Reads with mapping quality below this threshold will be filtered" - } - } - }, - "quantification_options": { - "title": "Quantification Options", - "type": "object", - "fa_icon": "fas fa-calculator", - "description": "Gene/transcript quantification settings", - "properties": { - "pseudo_aligner": { - "type": "string", - "enum": ["salmon", "kallisto"], - "default": "salmon", - "description": "Pseudo-aligner for quantification" - }, - "skip_quantification": { - "type": "boolean", - "default": false, - "description": "Skip quantification step" - } - } - }, - "quality_control_options": { - "title": "Quality Control", - "type": "object", - "fa_icon": "fas fa-check-circle", - "description": "Quality control parameters", - "properties": { - "skip_fastqc": { - "type": "boolean", - "default": false, - "description": "Skip FastQC" - }, - "skip_multiqc": { - "type": "boolean", - "default": false, - "description": "Skip MultiQC report generation" - } - } - }, - "resource_options": { - "title": "Resource Options", - "type": "object", - "fa_icon": "fas fa-server", - "description": "Computational resource settings", - "properties": { - "max_cpus": { - "type": "integer", - "minimum": 1, - "default": 16, - "description": "Maximum CPUs per process" - }, - "max_memory": { - "type": "string", - "pattern": "^\\d+\\.(GB|MB)$", - "default": "128.GB", - "description": "Maximum memory per process", - "examples": ["128.GB", "256.GB"] - }, - "max_time": { - "type": "string", - "pattern": "^\\d+\\.(h|d)$", - "default": "240.h", - "description": "Maximum time per process", - "examples": ["240.h", "10.d"] - } - } - } - }, - "allOf": [ - { "$ref": "#/$defs/input_output_options" }, - { "$ref": "#/$defs/reference_genome_options" }, - { "$ref": "#/$defs/alignment_options" }, - { "$ref": "#/$defs/quantification_options" }, - { "$ref": "#/$defs/quality_control_options" }, - { "$ref": "#/$defs/resource_options" } - ] -} -``` - -## Variant Calling Pipeline - -Genomic variant calling pipeline: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://github.com/my-org/variant-calling/schema.json", - "title": "Variant Calling Pipeline", - "description": "Parameters for variant calling from sequencing data", - "type": "object", - "$defs": { - "input_output_options": { - "title": "Input/Output Options", - "type": "object", - "required": ["input", "outdir"], - "properties": { - "input": { - "type": "string", - "format": "file-path-pattern", - "description": "Input FASTQ files", - "help_text": "Path to input files. Use wildcards like: 'data/*.fastq.gz'", - "examples": ["data/*.fastq.gz", "samples/*_R{1,2}.fastq.gz"] - }, - "outdir": { - "type": "string", - "format": "directory-path", - "default": "./results", - "description": "Output directory" - }, - "publish_dir_mode": { - "type": "string", - "enum": ["symlink", "copy", "move"], - "default": "copy", - "description": "Method for publishing files to output directory" - } - } - }, - "reference_options": { - "title": "Reference Options", - "type": "object", - "required": ["reference"], - "properties": { - "reference": { - "type": "string", - "format": "file-path", - "exists": true, - "description": "Reference genome FASTA file" - }, - "known_sites": { - "type": "string", - "format": "file-path", - "description": "Known variant sites VCF for recalibration" - } - } - }, - "variant_calling_options": { - "title": "Variant Calling", - "type": "object", - "properties": { - "caller": { - "type": "string", - "enum": ["gatk", "freebayes", "bcftools"], - "default": "gatk", - "description": "Variant calling tool" - }, - "ploidy": { - "type": "integer", - "minimum": 1, - "maximum": 4, - "default": 2, - "description": "Sample ploidy" - }, - "min_base_quality": { - "type": "integer", - "minimum": 0, - "maximum": 60, - "default": 20, - "description": "Minimum base quality score" - } - } - }, - "filtering_options": { - "title": "Filtering Options", - "type": "object", - "properties": { - "min_depth": { - "type": "integer", - "minimum": 1, - "default": 10, - "description": "Minimum read depth" - }, - "min_quality": { - "type": "number", - "minimum": 0, - "default": 30.0, - "description": "Minimum variant quality score" - }, - "filter_low_qual": { - "type": "boolean", - "default": true, - "description": "Filter low-quality variants" - } - } - } - }, - "allOf": [ - { "$ref": "#/$defs/input_output_options" }, - { "$ref": "#/$defs/reference_options" }, - { "$ref": "#/$defs/variant_calling_options" }, - { "$ref": "#/$defs/filtering_options" } - ], - "dependentRequired": { - "known_sites": ["reference"] - } -} -``` - -## Machine Learning Pipeline - -Data processing and ML pipeline: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://github.com/my-org/ml-pipeline/schema.json", - "title": "Machine Learning Pipeline", - "description": "Parameters for ML model training pipeline", - "type": "object", - "$defs": { - "data_options": { - "title": "Data Options", - "type": "object", - "required": ["training_data"], - "properties": { - "training_data": { - "type": "string", - "format": "file-path", - "exists": true, - "description": "Training dataset" - }, - "validation_data": { - "type": "string", - "format": "file-path", - "description": "Validation dataset (optional)" - }, - "test_data": { - "type": "string", - "format": "file-path", - "description": "Test dataset (optional)" - }, - "data_format": { - "type": "string", - "enum": ["csv", "parquet", "json"], - "default": "csv", - "description": "Input data format" - } - } - }, - "preprocessing_options": { - "title": "Preprocessing", - "type": "object", - "properties": { - "normalize": { - "type": "boolean", - "default": true, - "description": "Normalize features" - }, - "impute_missing": { - "type": "boolean", - "default": true, - "description": "Impute missing values" - }, - "feature_selection": { - "type": "string", - "enum": ["none", "variance", "mutual_info", "rfe"], - "default": "none", - "description": "Feature selection method" - } - } - }, - "model_options": { - "title": "Model Options", - "type": "object", - "properties": { - "model_type": { - "type": "string", - "enum": ["random_forest", "xgboost", "neural_network", "svm"], - "default": "random_forest", - "description": "Model architecture" - }, - "random_seed": { - "type": "integer", - "minimum": 0, - "default": 42, - "description": "Random seed for reproducibility" - }, - "n_estimators": { - "type": "integer", - "minimum": 1, - "default": 100, - "description": "Number of estimators (tree-based models)" - }, - "learning_rate": { - "type": "number", - "exclusiveMinimum": 0, - "maximum": 1, - "default": 0.01, - "description": "Learning rate" - } - } - }, - "training_options": { - "title": "Training Options", - "type": "object", - "properties": { - "epochs": { - "type": "integer", - "minimum": 1, - "default": 100, - "description": "Training epochs" - }, - "batch_size": { - "type": "integer", - "minimum": 1, - "multipleOf": 2, - "default": 32, - "description": "Batch size (power of 2 recommended)" - }, - "early_stopping": { - "type": "boolean", - "default": true, - "description": "Enable early stopping" - }, - "patience": { - "type": "integer", - "minimum": 1, - "default": 10, - "description": "Early stopping patience" - } - } - } - }, - "allOf": [ - { "$ref": "#/$defs/data_options" }, - { "$ref": "#/$defs/preprocessing_options" }, - { "$ref": "#/$defs/model_options" }, - { "$ref": "#/$defs/training_options" } - ] -} -``` - -## Advanced Features - -### Conditional Requirements - -Parameters that depend on other parameters: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/conditional.json", - "title": "Conditional Requirements", - "description": "Parameters with dependencies", - "type": "object", - "properties": { - "use_cache": { - "type": "boolean", - "description": "Enable caching" - }, - "cache_dir": { - "type": "string", - "format": "directory-path", - "description": "Cache directory" - }, - "enable_logging": { - "type": "boolean", - "description": "Enable logging" - }, - "log_file": { - "type": "string", - "format": "file-path", - "description": "Log file path" - } - }, - "dependentRequired": { - "use_cache": ["cache_dir"], - "enable_logging": ["log_file"] - } -} -``` - -### Custom Error Messages - -Helpful error messages for validation failures: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/error-messages.json", - "title": "Custom Error Messages", - "description": "Parameters with custom validation messages", - "type": "object", - "properties": { - "email": { - "type": "string", - "format": "email", - "description": "Notification email", - "errorMessage": "Please provide a valid email address for notifications" - }, - "memory": { - "type": "string", - "pattern": "^\\d+\\.(GB|MB)$", - "description": "Memory allocation", - "errorMessage": "Memory must be specified with units, e.g., '8.GB' or '512.MB'" - }, - "threads": { - "type": "integer", - "minimum": 1, - "maximum": 64, - "description": "Thread count", - "errorMessage": "Thread count must be between 1 and 64" - } - } -} -``` - -### Deprecated Parameters - -Marking parameters as deprecated: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json", - "$id": "https://example.com/deprecated.json", - "title": "Deprecated Parameters", - "description": "Schema with deprecated options", - "type": "object", - "properties": { - "output_format": { - "type": "string", - "enum": ["json", "yaml", "csv"], - "description": "Output format" - }, - "outfmt": { - "type": "string", - "description": "Legacy output format parameter", - "deprecated": true, - "errorMessage": "The 'outfmt' parameter is deprecated. Please use 'output_format' instead." - } - } -} -``` - -## See Also - -- [Pipeline Input Schema Reference](../schemas/pipeline-input.md) -- [Quick Start Guide](../getting-started/quick-start.md) -- [Testing Guide](../development/testing.md) diff --git a/docs/examples/plugin-examples.md b/docs/examples/plugin-examples.md deleted file mode 100644 index 7b4b251..0000000 --- a/docs/examples/plugin-examples.md +++ /dev/null @@ -1,848 +0,0 @@ -# Plugin Examples - -This page provides practical examples of plugin schemas for various use cases. - -## Basic Examples - -### Minimal Plugin - -Simplest valid plugin schema: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [] -} -``` - -### Simple Configuration - -Plugin with basic configuration options: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "ConfigScope", - "spec": { - "name": "myPlugin", - "description": "My plugin configuration", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "enabled", - "description": "Enable the plugin", - "type": "Boolean" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "debug", - "description": "Enable debug mode", - "type": "Boolean" - } - } - ] - } - } - ] -} -``` - -**Usage**: - -```groovy -myPlugin { - enabled = true - debug = false -} -``` - -### Simple Function - -Plugin with a single function: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "Function", - "spec": { - "name": "greet", - "description": "Generate a greeting message", - "returnType": "String", - "parameters": [ - { - "name": "name", - "type": "String" - } - ] - } - } - ] -} -``` - -**Usage**: - -```groovy -def message = greet('World') -println message // "Hello, World!" -``` - -## AWS Plugin Example - -Comprehensive AWS integration plugin: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "ConfigScope", - "spec": { - "name": "aws", - "description": "AWS plugin configuration", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "region", - "description": "AWS region", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "profile", - "description": "AWS credentials profile name", - "type": "String" - } - }, - { - "type": "ConfigScope", - "spec": { - "name": "batch", - "description": "AWS Batch configuration", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "cliPath", - "description": "Path to AWS CLI executable", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "jobQueue", - "description": "Default job queue name", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "maxParallelTransfers", - "description": "Maximum parallel file transfers", - "type": "Integer" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "retryMode", - "description": "Retry strategy mode", - "type": "String" - } - } - ] - } - }, - { - "type": "ConfigScope", - "spec": { - "name": "client", - "description": "AWS client configuration", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "maxConnections", - "description": "Maximum HTTP connections", - "type": "Integer" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "connectionTimeout", - "description": "Connection timeout", - "type": "Duration" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "uploadMaxThreads", - "description": "Maximum upload threads", - "type": "Integer" - } - } - ] - } - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "uploadToS3", - "description": "Upload a file to S3 bucket", - "returnType": "String", - "parameters": [ - { - "name": "localPath", - "type": "String" - }, - { - "name": "bucket", - "type": "String" - }, - { - "name": "key", - "type": "String" - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "downloadFromS3", - "description": "Download a file from S3 bucket", - "returnType": "Path", - "parameters": [ - { - "name": "bucket", - "type": "String" - }, - { - "name": "key", - "type": "String" - }, - { - "name": "localPath", - "type": "String" - } - ] - } - } - ] -} -``` - -**Usage**: - -```groovy -aws { - region = 'us-east-1' - profile = 'my-profile' - - batch { - cliPath = '/usr/local/bin/aws' - jobQueue = 'my-queue' - maxParallelTransfers = 4 - retryMode = 'standard' - } - - client { - maxConnections = 20 - connectionTimeout = '30.s' - uploadMaxThreads = 4 - } -} - -// Upload file -uploadToS3('/data/results.txt', 'my-bucket', 'outputs/results.txt') - -// Download file -downloadFromS3('my-bucket', 'inputs/data.txt', '/tmp/data.txt') -``` - -## Database Plugin Example - -Database integration with connection pooling: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "ConfigScope", - "spec": { - "name": "database", - "description": "Database plugin configuration", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "url", - "description": "Database connection URL", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "username", - "description": "Database username", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "password", - "description": "Database password", - "type": "String" - } - }, - { - "type": "ConfigScope", - "spec": { - "name": "pool", - "description": "Connection pool settings", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "minConnections", - "description": "Minimum pool connections", - "type": "Integer" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "maxConnections", - "description": "Maximum pool connections", - "type": "Integer" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "timeout", - "description": "Connection timeout", - "type": "Duration" - } - } - ] - } - } - ] - } - }, - { - "type": "Factory", - "spec": { - "name": "createConnection", - "description": "Create a database connection", - "returnType": "Connection", - "parameters": [] - } - }, - { - "type": "Function", - "spec": { - "name": "executeQuery", - "description": "Execute a SQL query", - "returnType": "List", - "parameters": [ - { - "name": "query", - "type": "String" - }, - { - "name": "params", - "type": "Map" - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "executeUpdate", - "description": "Execute a SQL update statement", - "returnType": "Integer", - "parameters": [ - { - "name": "statement", - "type": "String" - }, - { - "name": "params", - "type": "Map" - } - ] - } - } - ] -} -``` - -**Usage**: - -```groovy -database { - url = 'jdbc:postgresql://localhost:5432/mydb' - username = 'user' - password = 'pass' - - pool { - minConnections = 2 - maxConnections = 10 - timeout = '30.s' - } -} - -// Create connection -def conn = createConnection() - -// Query data -def results = executeQuery( - 'SELECT * FROM samples WHERE status = :status', - [status: 'active'] -) - -// Update data -def affected = executeUpdate( - 'UPDATE samples SET processed = true WHERE id = :id', - [id: 123] -) -``` - -## Channel Operator Plugin - -Custom channel operators: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "Operator", - "spec": { - "name": "customFilter", - "description": "Filter channel items with custom predicate", - "returnType": "DataflowChannel", - "parameters": [ - { - "name": "predicate", - "type": "Closure" - } - ] - } - }, - { - "type": "Operator", - "spec": { - "name": "batchBy", - "description": "Group items into batches by a key function", - "returnType": "DataflowChannel", - "parameters": [ - { - "name": "size", - "type": "Integer" - }, - { - "name": "keyFunc", - "type": "Closure" - } - ] - } - }, - { - "type": "Operator", - "spec": { - "name": "retryOn", - "description": "Retry failed items based on exception type", - "returnType": "DataflowChannel", - "parameters": [ - { - "name": "exceptionClass", - "type": "Class" - }, - { - "name": "maxRetries", - "type": "Integer" - } - ] - } - }, - { - "type": "Operator", - "spec": { - "name": "transformParallel", - "description": "Transform items in parallel with specified concurrency", - "returnType": "DataflowChannel", - "parameters": [ - { - "name": "concurrency", - "type": "Integer" - }, - { - "name": "transformer", - "type": "Closure" - } - ] - } - } - ] -} -``` - -**Usage**: - -```groovy -// Custom filter -Channel - .from(1, 2, 3, 4, 5) - .customFilter { it % 2 == 0 } - .view() // 2, 4 - -// Batch by key -Channel - .from('apple', 'apricot', 'banana', 'blueberry') - .batchBy(2) { it[0] } // Group by first letter - .view() // ['apple', 'apricot'], ['banana', 'blueberry'] - -// Retry on failure -Channel - .from(urls) - .retryOn(IOException, 3) - .view() - -// Parallel transformation -Channel - .from(files) - .transformParallel(4) { file -> - processFile(file) - } - .view() -``` - -## API Client Plugin - -REST API integration: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "ConfigScope", - "spec": { - "name": "apiClient", - "description": "API client configuration", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "baseUrl", - "description": "API base URL", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "apiKey", - "description": "API authentication key", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "timeout", - "description": "Request timeout", - "type": "Duration" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "retries", - "description": "Maximum retry attempts", - "type": "Integer" - } - } - ] - } - }, - { - "type": "Factory", - "spec": { - "name": "createClient", - "description": "Create an API client instance", - "returnType": "ApiClient", - "parameters": [ - { - "name": "config", - "type": "Map" - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "get", - "description": "Perform GET request", - "returnType": "Map", - "parameters": [ - { - "name": "endpoint", - "type": "String" - }, - { - "name": "params", - "type": "Map" - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "post", - "description": "Perform POST request", - "returnType": "Map", - "parameters": [ - { - "name": "endpoint", - "type": "String" - }, - { - "name": "body", - "type": "Map" - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "uploadFile", - "description": "Upload a file via multipart POST", - "returnType": "Map", - "parameters": [ - { - "name": "endpoint", - "type": "String" - }, - { - "name": "filePath", - "type": "String" - }, - { - "name": "metadata", - "type": "Map" - } - ] - } - } - ] -} -``` - -**Usage**: - -```groovy -apiClient { - baseUrl = 'https://api.example.com/v1' - apiKey = secrets.API_KEY - timeout = '60.s' - retries = 3 -} - -// Create client -def client = createClient([ - baseUrl: 'https://custom-api.com', - apiKey: 'custom-key' -]) - -// GET request -def data = get('/samples', [status: 'active', limit: 100]) - -// POST request -def result = post('/samples', [ - name: 'Sample1', - type: 'RNA-seq', - metadata: [organism: 'human'] -]) - -// Upload file -def response = uploadFile( - '/uploads', - '/data/results.csv', - [description: 'Analysis results'] -) -``` - -## Notification Plugin - -Multi-channel notifications: - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "ConfigScope", - "spec": { - "name": "notifications", - "description": "Notification plugin configuration", - "children": [ - { - "type": "ConfigScope", - "spec": { - "name": "email", - "description": "Email notification settings", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "enabled", - "description": "Enable email notifications", - "type": "Boolean" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "to", - "description": "Recipient email address", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "from", - "description": "Sender email address", - "type": "String" - } - } - ] - } - }, - { - "type": "ConfigScope", - "spec": { - "name": "slack", - "description": "Slack notification settings", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "enabled", - "description": "Enable Slack notifications", - "type": "Boolean" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "webhook", - "description": "Slack webhook URL", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "channel", - "description": "Slack channel name", - "type": "String" - } - } - ] - } - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "sendNotification", - "description": "Send notification via all enabled channels", - "returnType": "Boolean", - "parameters": [ - { - "name": "message", - "type": "String" - }, - { - "name": "level", - "type": "String" - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "notifyOnComplete", - "description": "Send notification when pipeline completes", - "returnType": "void", - "parameters": [] - } - } - ] -} -``` - -**Usage**: - -```groovy -notifications { - email { - enabled = true - to = 'user@example.com' - from = 'pipeline@example.com' - } - - slack { - enabled = true - webhook = 'https://hooks.slack.com/...' - channel = '#pipeline-notifications' - } -} - -// Send notification -sendNotification('Pipeline started', 'info') -sendNotification('Critical error occurred', 'error') - -// Notify on completion -workflow.onComplete { - notifyOnComplete() -} -``` - -## See Also - -- [Plugin Schema Reference](../schemas/plugin.md) -- [Quick Start Guide](../getting-started/quick-start.md) -- [Testing Guide](../development/testing.md) diff --git a/docs/schemas/pipeline-input.md b/docs/schemas/pipeline-input.md index 6336a3c..12fab59 100644 --- a/docs/schemas/pipeline-input.md +++ b/docs/schemas/pipeline-input.md @@ -10,23 +10,19 @@ **Description:** Schema to validate Nextflow pipeline input specs -**Schema:** https://json-schema.org/draft/2020-12/schema - -**ID:** https://raw.githubusercontent.com/nextflow-io/schemas/main/pipeline-input/schema.json - -| Property | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------------------------ | --------------- | ---------- | --------------------------- | ------------------------- | -| + [\$schema](#Nextflow_pipeline_input_schema_schema) | string | | | schema | -| + [\$id](#Nextflow_pipeline_input_schema_id) | string | | | ID URI | -| + [title](#Nextflow_pipeline_input_schema_title) | string | | | Title | -| + [description](#Nextflow_pipeline_input_schema_description) | string | | | Description | -| + [type](#Nextflow_pipeline_input_schema_type) | const | | | Top level type | -| - [\$defs](#Nextflow_pipeline_input_schema_defs) | object | | | Parameter groups | -| - [properties](#Nextflow_pipeline_input_schema_properties) | object | | In #/$defs/parameterOptions | - | -| - [dependentRequired](#Nextflow_pipeline_input_schema_dependentRequired) | object | | | - | -| - [allOf](#Nextflow_pipeline_input_schema_allOf) | array of object | | | Combine definition groups | - -## `$schema` +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ----------------------------------------- | ------- | --------------- | ---------- | ----------------------------------------------- | ------------------------- | +| + [$schema](#schema) | No | string | No | - | schema | +| + [$id](#id) | No | string | No | - | ID URI | +| + [title](#title) | No | string | No | - | Title | +| + [description](#description) | No | string | No | - | Description | +| + [type](#type) | No | const | No | - | Top level type | +| - [$defs](#defs) | No | object | No | - | Parameter groups | +| - [properties](#properties) | No | object | No | Same as [properties](#defs_pattern1_properties) | - | +| - [dependentRequired](#dependentRequired) | No | object | No | - | - | +| - [allOf](#allOf) | No | array of object | No | - | Combine definition groups | + +## `$schema` **Title:** schema @@ -39,7 +35,7 @@ | -------------- | --- | | **Min length** | 1 | -## `$id` +## `$id` **Title:** ID URI @@ -52,7 +48,7 @@ | -------------- | --- | | **Min length** | 1 | -## `title` +## `title` **Title:** Title @@ -65,7 +61,7 @@ | -------------- | --- | | **Min length** | 1 | -## `description` +## `description` **Title:** Description @@ -78,7 +74,7 @@ | -------------- | --- | | **Min length** | 1 | -## `type` +## `type` **Title:** Top level type @@ -89,39 +85,43 @@ Specific value: `"object"` -## `$defs` +## `$defs` **Title:** Parameter groups -| | | -| ------------ | -------- | -| **Type** | `object` | -| **Required** | No | - -**Pattern Properties:** +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | -Properties matching pattern `^.*$` must conform to: +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | +| - [^.\*$](#defs_pattern1) | Yes | object | No | - | - | -### `pattern: ^.*$` +### `^.*$` -| | | -| ------------ | -------- | -| **Type** | `object` | -| **Required** | No | +> All properties whose name matches the regular expression +> `^.*$` ([Test](https://regex101.com/?regex=%5E.%2A%24)) +> must respect the following conditions -**Properties:** +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | -| Property | Type | Deprecated | Definition | Title/Description | -| ---------------------------------------------------------------------------------------- | ------ | ---------- | --------------------------- | ----------------- | -| + [title](#Nextflow_pipeline_input_schema_defs_pattern:_._title) | string | | | - | -| + [type](#Nextflow_pipeline_input_schema_defs_pattern:_._type) | const | | | - | -| - [fa_icon](#Nextflow_pipeline_input_schema_defs_pattern:_._fa_icon) | string | | | - | -| - [description](#Nextflow_pipeline_input_schema_defs_pattern:_._description) | string | | | - | -| - [required](#Nextflow_pipeline_input_schema_defs_pattern:_._required) | array | | | - | -| + [properties](#Nextflow_pipeline_input_schema_defs_pattern:_._properties) | object | | In #/$defs/parameterOptions | - | -| - [dependentRequired](#Nextflow_pipeline_input_schema_defs_pattern:_._dependentRequired) | object | | | - | +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------- | ------- | ------ | ---------- | --------------------------- | ----------------- | +| + [title](#defs_pattern1_title) | No | string | No | - | - | +| + [type](#defs_pattern1_type) | No | const | No | - | - | +| - [fa_icon](#defs_pattern1_fa_icon) | No | string | No | - | - | +| - [description](#defs_pattern1_description) | No | string | No | - | - | +| - [required](#defs_pattern1_required) | No | array | No | - | - | +| + [properties](#defs_pattern1_properties) | No | object | No | In #/$defs/parameterOptions | - | +| - [dependentRequired](#defs_pattern1_dependentRequired) | No | object | No | - | - | -#### `title` +#### `title` | | | | ------------ | -------- | @@ -132,7 +132,7 @@ Properties matching pattern `^.*$` must conform to: | -------------- | --- | | **Min length** | 1 | -#### `type` +#### `type` | | | | ------------ | ------- | @@ -141,7 +141,7 @@ Properties matching pattern `^.*$` must conform to: Specific value: `"object"` -#### `fa_icon` +#### `fa_icon` | | | | ------------ | -------- | @@ -152,126 +152,580 @@ Specific value: `"object"` | --------------------------------- | ----------------------------------------------- | | **Must match regular expression** | `^fa` [Test](https://regex101.com/?regex=%5Efa) | -#### `description` +#### `description` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +#### `required` + +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | False | +| **Additional items** | False | +| **Tuple validation** | N/A | + +#### `properties` + +| | | +| ------------------------- | ------------------------ | +| **Type** | `object` | +| **Required** | Yes | +| **Additional properties** | Any type allowed | +| **Defined in** | #/$defs/parameterOptions | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| --------------------------------------------- | ------- | ----------- | ---------- | ---------- | ----------------- | +| - [^.\*$](#defs_pattern1_properties_pattern1) | Yes | Combination | No | - | - | + +##### `^.*$` + +> All properties whose name matches the regular expression +> `^.*$` ([Test](https://regex101.com/?regex=%5E.%2A%24)) +> must respect the following conditions + +| | | +| ------------------------- | ---------------- | +| **Type** | `combining` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +| All of(Requirement) | +| ------------------------------------------------------------------ | +| [standardKeywords](#defs_pattern1_properties_pattern1_pattern2_i0) | +| [customKeywords](#defs_pattern1_properties_pattern1_pattern2_i1) | + +###### `standardKeywords` + +| | | +| ------------------------- | ------------------------ | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | +| **Defined in** | #/$defs/standardKeywords | + +**Description:** Allowed standard JSON Schema properties. + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------------------------------------- | ------- | ---------------------------------------- | ---------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| - [type](#defs_pattern1_properties_pattern1_pattern2_i0_type) | No | Combination | No | - | The type of the parameter value. Can be one or more of these: \`['integer', 'boolean', 'number', 'string', 'null']\` | +| - [format](#defs_pattern1_properties_pattern1_pattern2_i0_format) | No | enum (of string) | No | - | The format of a parameter value with the \`string\` type. This is used for additional validation on the structure of the value. | +| - [pattern](#defs_pattern1_properties_pattern1_pattern2_i0_pattern) | No | string | No | - | Check a parameter value of 'string' type against a regex pattern | +| - [description](#defs_pattern1_properties_pattern1_pattern2_i0_description) | No | string | No | - | The description of the current parameter | +| - [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | No | integer, boolean, string, number or null | No | In #/$defs/allTypes | Specifies a default value to use for this parameter | +| - [examples](#defs_pattern1_properties_pattern1_pattern2_i0_examples) | No | array | No | - | A list of examples for the current parameter | +| - [deprecated](#defs_pattern1_properties_pattern1_pattern2_i0_deprecated) | No | boolean | No | - | States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' | +| - [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | No | integer | No | In #/$defs/nonNegativeInteger | The minimum length a 'string' parameter value should be | +| - [maxLength](#defs_pattern1_properties_pattern1_pattern2_i0_maxLength) | No | integer | No | Same as [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | The maximum length a 'string' parameter value should be | +| - [minimum](#defs_pattern1_properties_pattern1_pattern2_i0_minimum) | No | number | No | - | The mimimum value an 'integer' or 'number' parameter value should be | +| - [exclusiveMinimum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMinimum) | No | number | No | - | The exclusive mimimum value an 'integer' or 'number' parameter value should be | +| - [maximum](#defs_pattern1_properties_pattern1_pattern2_i0_maximum) | No | number | No | - | The maximum value an 'integer' or 'number' parameter value should be | +| - [exclusiveMaximum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMaximum) | No | number | No | - | The exclusive maximum value an 'integer' or 'number' parameter value should be | +| - [multipleOf](#defs_pattern1_properties_pattern1_pattern2_i0_multipleOf) | No | number | No | - | The 'integer' or 'number' parameter value should be a multiple of this value | +| - [enum](#defs_pattern1_properties_pattern1_pattern2_i0_enum) | No | array | No | - | The parameter value should be one of the values specified in this enum array | +| - [const](#defs_pattern1_properties_pattern1_pattern2_i0_const) | No | integer, boolean, string, number or null | No | Same as [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | The parameter value should be equal to this value | + +###### `type` + +| | | +| ------------------------- | ---------------- | +| **Type** | `combining` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +**Description:** The type of the parameter value. Can be one or more of these: `['integer', 'boolean', 'number', 'string', 'null']` + +| Any of(Option) | +| ------------------------------------------------------------------------------ | +| [typeAnnotation](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i0) | +| [item 1](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i1) | + +###### `typeAnnotation` + +| | | +| -------------- | ---------------------- | +| **Type** | `enum (of string)` | +| **Required** | No | +| **Defined in** | #/$defs/typeAnnotation | + +Must be one of: + +- "string" +- "boolean" +- "integer" +- "number" +- "null" + +###### `item 1` + +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | False | +| **Additional items** | False | +| **Tuple validation** | See below | + +| Each item of this array must be | Description | +| ------------------------------------------------------------------------------------ | ----------- | +| [typeAnnotation](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i1_items) | - | + +###### typeAnnotation + +| | | +| ---------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| **Type** | `enum (of string)` | +| **Required** | No | +| **Same definition as** | [defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i0](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i0) | + +###### `format` + +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | + +**Description:** The format of a parameter value with the `string` type. This is used for additional validation on the structure of the value. + +Must be one of: + +- "file-path" +- "directory-path" +- "path" +- "file-path-pattern" +- "date-time" +- "date" +- "time" +- "email" +- "uri" +- "regex" + +###### `pattern` | | | | ------------ | -------- | | **Type** | `string` | | **Required** | No | +| **Format** | `regex` | + +**Description:** Check a parameter value of 'string' type against a regex pattern + +| Restrictions | | +| -------------- | --- | +| **Min length** | 1 | + +###### `description` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +**Description:** The description of the current parameter -#### `required` +###### `default` + +| | | +| -------------- | ------------------------------------------ | +| **Type** | `integer, boolean, string, number or null` | +| **Required** | No | +| **Defined in** | #/$defs/allTypes | + +**Description:** Specifies a default value to use for this parameter + +###### `examples` | | | | ------------ | ------- | | **Type** | `array` | | **Required** | No | -#### `properties` +**Description:** A list of examples for the current parameter + +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | False | +| **Additional items** | False | +| **Tuple validation** | See below | + +| Each item of this array must be | Description | +| ------------------------------------------------------------------------- | ----------- | +| [allTypes](#defs_pattern1_properties_pattern1_pattern2_i0_examples_items) | - | + +###### allTypes + +| | | +| ---------------------- | ----------------------------------------------------------------- | +| **Type** | `integer, boolean, string, number or null` | +| **Required** | No | +| **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | + +###### `deprecated` + +| | | +| ------------ | --------- | +| **Type** | `boolean` | +| **Required** | No | + +**Description:** States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' + +###### `minLength` + +| | | +| -------------- | -------------------------- | +| **Type** | `integer` | +| **Required** | No | +| **Defined in** | #/$defs/nonNegativeInteger | + +**Description:** The minimum length a 'string' parameter value should be + +| Restrictions | | +| ------------ | ------ | +| **Minimum** | ≥ 0 | + +###### `maxLength` + +| | | +| ---------------------- | --------------------------------------------------------------------- | +| **Type** | `integer` | +| **Required** | No | +| **Same definition as** | [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | + +**Description:** The maximum length a 'string' parameter value should be + +###### `minimum` | | | | ------------ | -------- | -| **Type** | `object` | -| **Required** | Yes | +| **Type** | `number` | +| **Required** | No | -#### `dependentRequired` +**Description:** The mimimum value an 'integer' or 'number' parameter value should be + +###### `exclusiveMinimum` | | | | ------------ | -------- | -| **Type** | `object` | +| **Type** | `number` | | **Required** | No | -## `properties` +**Description:** The exclusive mimimum value an 'integer' or 'number' parameter value should be + +###### `maximum` | | | | ------------ | -------- | -| **Type** | `object` | +| **Type** | `number` | | **Required** | No | -## `dependentRequired` +**Description:** The maximum value an 'integer' or 'number' parameter value should be + +###### `exclusiveMaximum` | | | | ------------ | -------- | -| **Type** | `object` | +| **Type** | `number` | | **Required** | No | -## `allOf` +**Description:** The exclusive maximum value an 'integer' or 'number' parameter value should be -**Title:** Combine definition groups +###### `multipleOf` + +| | | +| ------------ | -------- | +| **Type** | `number` | +| **Required** | No | + +**Description:** The 'integer' or 'number' parameter value should be a multiple of this value + +###### `enum` + +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + +**Description:** The parameter value should be one of the values specified in this enum array + +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | True | +| **Additional items** | False | +| **Tuple validation** | See below | + +| Each item of this array must be | Description | +| --------------------------------------------------------------------- | ----------- | +| [allTypes](#defs_pattern1_properties_pattern1_pattern2_i0_enum_items) | - | + +###### allTypes + +| | | +| ---------------------- | ----------------------------------------------------------------- | +| **Type** | `integer, boolean, string, number or null` | +| **Required** | No | +| **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | + +###### `const` + +| | | +| ---------------------- | ----------------------------------------------------------------- | +| **Type** | `integer, boolean, string, number or null` | +| **Required** | No | +| **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | + +**Description:** The parameter value should be equal to this value + +###### `customKeywords` + +| | | +| ------------------------- | ---------------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | +| **Defined in** | #/$defs/customKeywords | + +**Description:** Additional custom JSON Schema properties. + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ----------------------------------------------------------------------------- | ------- | ------- | ---------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| - [errorMessage](#defs_pattern1_properties_pattern1_pattern2_i1_errorMessage) | No | string | No | - | NON STANDARD OPTION: The custom error message to display in case validation against this parameter fails. Can also be used as a deprecation message if 'deprecated' is true | +| - [exists](#defs_pattern1_properties_pattern1_pattern2_i1_exists) | No | boolean | No | - | NON STANDARD OPTION: Check if a file exists. This parameter value needs to be a \`string\` type with one of these formats: \`['path', 'file-path', 'directory-path', 'file-path-pattern']\` | +| - [schema](#defs_pattern1_properties_pattern1_pattern2_i1_schema) | No | string | No | - | NON STANDARD OPTION: Check the given file against a schema passed to this keyword. Will only work when type is \`string\` and format is \`path\` or \`file-path\` | +| - [help_text](#defs_pattern1_properties_pattern1_pattern2_i1_help_text) | No | string | No | - | NON STANDARD OPTION: A more detailed help text | +| - [fa_icon](#defs_pattern1_properties_pattern1_pattern2_i1_fa_icon) | No | string | No | - | NON STANDARD OPTION: A font awesome icon to use in the nf-core parameter documentation | +| - [hidden](#defs_pattern1_properties_pattern1_pattern2_i1_hidden) | No | boolean | No | - | NON STANDARD OPTION: Hide this parameter from the help message and documentation | +| - [mimetype](#defs_pattern1_properties_pattern1_pattern2_i1_mimetype) | No | string | No | - | NON STANDARD OPTION: The MIME type of the parameter value | + +###### `errorMessage` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +**Description:** NON STANDARD OPTION: The custom error message to display in case validation against this parameter fails. Can also be used as a deprecation message if 'deprecated' is true + +| Restrictions | | +| -------------- | --- | +| **Min length** | 1 | + +###### `exists` + +| | | +| ------------ | --------- | +| **Type** | `boolean` | +| **Required** | No | + +**Description:** NON STANDARD OPTION: Check if a file exists. This parameter value needs to be a `string` type with one of these formats: `['path', 'file-path', 'directory-path', 'file-path-pattern']` + +###### `schema` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +**Description:** NON STANDARD OPTION: Check the given file against a schema passed to this keyword. Will only work when type is `string` and format is `path` or `file-path` + +| Restrictions | | +| --------------------------------- | --------------------------------------------------------- | +| **Min length** | 1 | +| **Must match regular expression** | `\.json$` [Test](https://regex101.com/?regex=%5C.json%24) | + +###### `help_text` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +**Description:** NON STANDARD OPTION: A more detailed help text + +###### `fa_icon` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +**Description:** NON STANDARD OPTION: A font awesome icon to use in the nf-core parameter documentation + +| Restrictions | | +| --------------------------------- | ----------------------------------------------- | +| **Must match regular expression** | `^fa` [Test](https://regex101.com/?regex=%5Efa) | + +###### `hidden` + +| | | +| ------------ | --------- | +| **Type** | `boolean` | +| **Required** | No | + +**Description:** NON STANDARD OPTION: Hide this parameter from the help message and documentation + +###### `mimetype` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +**Description:** NON STANDARD OPTION: The MIME type of the parameter value + +###### The following properties are required + +- type +- description + +#### `dependentRequired` + +| | | +| ------------------------- | ------------------------------------------------------------------------------------------------------------ | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | [Each additional property must conform to the schema](#defs_pattern1_dependentRequired_additionalProperties) | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ----------------------------------------------------------- | ------- | --------------- | ---------- | ---------- | ----------------- | +| - [](#defs_pattern1_dependentRequired_additionalProperties) | No | array of string | No | - | - | + +##### `additionalProperties` | | | | ------------ | ----------------- | -| **Type** | `array of object` | +| **Type** | `array of string` | | **Required** | No | +| **Default** | `[]` | | | Array restrictions | | -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | True | +| **Additional items** | False | | **Tuple validation** | See below | -**Array Items:** +| Each item of this array must be | Description | +| ----------------------------------------------------------------------------------------- | ----------- | +| [additionalProperties items](#defs_pattern1_dependentRequired_additionalProperties_items) | - | + +###### additionalProperties items + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +## `properties` + +| | | +| ------------------------- | --------------------------------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | +| **Same definition as** | [properties](#defs_pattern1_properties) | + +## `dependentRequired` + +| | | +| ------------------------- | ---------------------------------------------------------------------------------------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | [Each additional property must conform to the schema](#dependentRequired_additionalProperties) | -Each item must be of type: `object` +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| --------------------------------------------- | ------- | --------------- | ---------- | ---------- | ----------------- | +| - [](#dependentRequired_additionalProperties) | No | array of string | No | - | - | -## Definitions +### `additionalProperties` -The following definitions are used throughout the schema: +| | | +| ------------ | ----------------- | +| **Type** | `array of string` | +| **Required** | No | +| **Default** | `[]` | -### typeAnnotation +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | True | +| **Additional items** | False | +| **Tuple validation** | See below | -**Type:** `enum (of string)` +| Each item of this array must be | Description | +| --------------------------------------------------------------------------- | ----------- | +| [additionalProperties items](#dependentRequired_additionalProperties_items) | - | -### allTypes +#### additionalProperties items -**Type:** `boolean or integer or null or number or string` +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | -### nonNegativeInteger +## `allOf` + +**Title:** Combine definition groups -**Type:** `integer` +| | | +| ------------ | ----------------- | +| **Type** | `array of object` | +| **Required** | No | -### parameterOptions +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | False | +| **Additional items** | False | +| **Tuple validation** | See below | -**Type:** `object` +| Each item of this array must be | Description | +| ------------------------------- | ----------- | +| [allOf items](#allOf_items) | - | -### standardKeywords +### allOf items -**Description:** Allowed standard JSON Schema properties. +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | -**Type:** `object` - -| Property | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------------- | ---------------- | ---------- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| - [type](#defs_standardKeywords_type) | combining | | | The type of the parameter value. Can be one or more of these: `['integer', 'boolean', 'number', 'string', 'null']` | -| - [format](#defs_standardKeywords_format) | enum (of string) | | | The format of a parameter value with the 'string' type. This is used for additional validation on the structure of the value. | -| - [pattern](#defs_standardKeywords_pattern) | string | | | Check a parameter value of 'string' type against a regex pattern | -| - [description](#defs_standardKeywords_description) | string | | | The description of the current parameter | -| - [default](#defs_standardKeywords_default) | object | | In #/$defs/allTypes | Specifies a default value to use for this parameter | -| - [examples](#defs_standardKeywords_examples) | array | | | A list of examples for the current parameter | -| - [deprecated](#defs_standardKeywords_deprecated) | boolean | | | States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' | -| - [minLength](#defs_standardKeywords_minLength) | object | | In #/$defs/nonNegativeInteger | The minimum length a 'string' parameter value should be | -| - [maxLength](#defs_standardKeywords_maxLength) | object | | In #/$defs/nonNegativeInteger | The maximum length a 'string' parameter value should be | -| - [minimum](#defs_standardKeywords_minimum) | number | | | The mimimum value an 'integer' or 'number' parameter value should be | -| - [exclusiveMinimum](#defs_standardKeywords_exclusiveMinimum) | number | | | The exclusive mimimum value an 'integer' or 'number' parameter value should be | -| - [maximum](#defs_standardKeywords_maximum) | number | | | The maximum value an 'integer' or 'number' parameter value should be | -| - [exclusiveMaximum](#defs_standardKeywords_exclusiveMaximum) | number | | | The exclusive maximum value an 'integer' or 'number' parameter value should be | -| - [multipleOf](#defs_standardKeywords_multipleOf) | number | | | The 'integer' or 'number' parameter value should be a multiple of this value | -| - [enum](#defs_standardKeywords_enum) | array | | | The parameter value should be one of the values specified in this enum array | -| - [const](#defs_standardKeywords_const) | object | | In #/$defs/allTypes | The parameter value should be equal to this value | - -### customKeywords +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| -------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | +| + [$ref](#allOf_items_ref) | No | string | No | - | - | -**Description:** Additional custom JSON Schema properties. +#### `$ref` -**Type:** `object` +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | Yes | -| Property | Type | Deprecated | Definition | Title/Description | -| --------------------------------------------------- | ------- | ---------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| - [errorMessage](#defs_customKeywords_errorMessage) | string | | | NON STANDARD OPTION: The custom error message to display in case validation against this parameter fails. Can also be used as a deprecation message if 'deprecated' is true | -| - [exists](#defs_customKeywords_exists) | boolean | | | NON STANDARD OPTION: Check if a file exists. This parameter value needs to be a `string` type with one of these formats: `['path', 'file-path', 'directory-path', 'file-path-pattern']` | -| - [schema](#defs_customKeywords_schema) | string | | | NON STANDARD OPTION: Check the given file against a schema passed to this keyword. Will only work when type is `string` and format is `path` or `file-path` | -| - [help_text](#defs_customKeywords_help_text) | string | | | NON STANDARD OPTION: A more detailed help text | -| - [fa_icon](#defs_customKeywords_fa_icon) | string | | | NON STANDARD OPTION: A font awesome icon to use in the nf-core parameter documentation | -| - [hidden](#defs_customKeywords_hidden) | boolean | | | NON STANDARD OPTION: Hide this parameter from the help message and documentation | -| - [mimetype](#defs_customKeywords_mimetype) | string | Yes | | NON STANDARD OPTION: The MIME type of the parameter value | +| Restrictions | | +| --------------------------------- | ----------------------------------------------------------------------------------------------- | +| **Must match regular expression** | `^#/\$defs/[^/]+$` [Test](https://regex101.com/?regex=%5E%23%2F%5C%24defs%2F%5B%5E%2F%5D%2B%24) | --- -Generated using a custom JSON Schema documentation generator. +Generated using [json-schema-for-humans](https://github.com/coveooss/json-schema-for-humans) diff --git a/docs/schemas/plugin-v1.md b/docs/schemas/plugin-v1.md index 66fde5b..2443928 100644 --- a/docs/schemas/plugin-v1.md +++ b/docs/schemas/plugin-v1.md @@ -10,15 +10,96 @@ **Description:** Schema for Nextflow plugin specs -**Schema:** https://json-schema.org/draft/2020-12/schema +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ----------------------------- | ------- | ----- | ---------- | ---------- | ----------------- | +| - [definitions](#definitions) | No | array | No | - | - | -**ID:** https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/v1/schema.json +## `definitions` -| Property | Type | Deprecated | Definition | Title/Description | -| ---------------------------------------------------- | ----- | ---------- | ---------- | ----------------- | -| - [definitions](#Nextflow_plugin_schema_definitions) | array | | | - | +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | -## `definitions` +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | False | +| **Additional items** | False | +| **Tuple validation** | See below | + +| Each item of this array must be | Description | +| --------------------------------------- | ----------- | +| [definitions items](#definitions_items) | - | + +### definitions items + +| | | +| ------------------------- | ---------------- | +| **Type** | `combining` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +| Any of(Option) | +| ------------------------------------------- | +| [config_scope](#definitions_items_anyOf_i0) | +| [function](#definitions_items_anyOf_i1) | + +#### `config_scope` + +| | | +| ------------------------- | -------------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | +| **Defined in** | #/$defs/config_scope | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------ | ------- | ---------------- | ---------- | ---------- | ----------------- | +| - [type](#definitions_items_anyOf_i0_type) | No | enum (of string) | No | - | - | +| - [spec](#definitions_items_anyOf_i0_spec) | No | object | No | - | - | + +##### `type` + +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | + +Must be one of: + +- "ConfigScope" + +##### `spec` + +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | +| - [name](#definitions_items_anyOf_i0_spec_name) | No | string | No | - | - | +| - [description](#definitions_items_anyOf_i0_spec_description) | No | string | No | - | - | +| - [children](#definitions_items_anyOf_i0_spec_children) | No | array | No | - | - | + +###### `name` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +###### `description` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +###### `children` | | | | ------------ | ------- | @@ -27,43 +108,207 @@ | | Array restrictions | | -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | False | +| **Additional items** | False | | **Tuple validation** | See below | -**Array Items:** +| Each item of this array must be | Description | +| ----------------------------------------------------------------- | ----------- | +| [children items](#definitions_items_anyOf_i0_spec_children_items) | - | + +###### children items + +| | | +| ------------------------- | ---------------- | +| **Type** | `combining` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +| Any of(Option) | +| ------------------------------------------------------------------------- | +| [config_scope](#definitions_items_anyOf_i0_spec_children_items_anyOf_i0) | +| [config_option](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1) | + +###### `config_scope` + +| | | +| ------------------------- | --------------------------------------------------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | +| **Same definition as** | [definitions_items_anyOf_i0](#definitions_items_anyOf_i0) | + +###### `config_option` + +| | | +| ------------------------- | --------------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | +| **Defined in** | #/$defs/config_option | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ----------------------------------------------------------------------- | ------- | ---------------- | ---------- | ---------- | ----------------- | +| - [type](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_type) | No | enum (of string) | No | - | - | +| - [spec](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec) | No | object | No | - | - | + +###### `type` + +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | -Each item must be of type: `combining` +Must be one of: -## Definitions +- "ConfigOption" -The following definitions are used throughout the schema: +###### `spec` -### config_scope +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------------------------------------------ | ------- | ------ | ---------- | ---------- | ----------------- | +| - [name](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_name) | No | string | No | - | - | +| - [description](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_description) | No | string | No | - | - | +| - [type](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_type) | No | string | No | - | - | + +###### `name` -**Type:** `object` +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | -| Property | Type | Deprecated | Definition | Title/Description | -| --------------------------------- | ---------------- | ---------- | ---------- | ----------------- | -| - [type](#defs_config_scope_type) | enum (of string) | | | - | -| - [spec](#defs_config_scope_spec) | object | | | - | +###### `description` -### config_option +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +###### `type` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +#### `function` + +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | +| **Defined in** | #/$defs/function | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------ | ------- | ---------------- | ---------- | ---------- | ----------------- | +| - [type](#definitions_items_anyOf_i1_type) | No | enum (of string) | No | - | - | +| - [spec](#definitions_items_anyOf_i1_spec) | No | object | No | - | - | + +##### `type` + +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | + +Must be one of: + +- "Factory" +- "Function" +- "Operator" + +##### `spec` + +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | + +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------------- | ------- | --------------- | ---------- | ---------- | ----------------- | +| - [name](#definitions_items_anyOf_i1_spec_name) | No | string | No | - | - | +| - [description](#definitions_items_anyOf_i1_spec_description) | No | string | No | - | - | +| - [returnType](#definitions_items_anyOf_i1_spec_returnType) | No | string | No | - | - | +| - [parameters](#definitions_items_anyOf_i1_spec_parameters) | No | array of object | No | - | - | + +###### `name` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +###### `description` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +###### `returnType` + +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +###### `parameters` + +| | | +| ------------ | ----------------- | +| **Type** | `array of object` | +| **Required** | No | + +| | Array restrictions | +| -------------------- | ------------------ | +| **Min items** | N/A | +| **Max items** | N/A | +| **Items unicity** | False | +| **Additional items** | False | +| **Tuple validation** | See below | + +| Each item of this array must be | Description | +| --------------------------------------------------------------------- | ----------- | +| [parameters items](#definitions_items_anyOf_i1_spec_parameters_items) | - | + +###### parameters items + +| | | +| ------------------------- | ---------------- | +| **Type** | `object` | +| **Required** | No | +| **Additional properties** | Any type allowed | -**Type:** `object` +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ---------------------------------------------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | +| - [name](#definitions_items_anyOf_i1_spec_parameters_items_name) | No | string | No | - | - | +| - [type](#definitions_items_anyOf_i1_spec_parameters_items_type) | No | string | No | - | - | -| Property | Type | Deprecated | Definition | Title/Description | -| ---------------------------------- | ---------------- | ---------- | ---------- | ----------------- | -| - [type](#defs_config_option_type) | enum (of string) | | | - | -| - [spec](#defs_config_option_spec) | object | | | - | +###### `name` -### function +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | -**Type:** `object` +###### `type` -| Property | Type | Deprecated | Definition | Title/Description | -| ----------------------------- | ---------------- | ---------- | ---------- | ----------------- | -| - [type](#defs_function_type) | enum (of string) | | | - | -| - [spec](#defs_function_spec) | object | | | - | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | --- -Generated using a custom JSON Schema documentation generator. +Generated using [json-schema-for-humans](https://github.com/coveooss/json-schema-for-humans) diff --git a/generate_schema_docs.py b/generate_schema_docs.py index 54de19e..4e22001 100644 --- a/generate_schema_docs.py +++ b/generate_schema_docs.py @@ -1,417 +1,93 @@ #!/usr/bin/env python3 """ -Generate markdown documentation from JSON schemas. -Similar to json-schema-for-humans output format. +Super simple schema documentation generator. +Uses json-schema-for-humans to generate markdown, then post-processes headings. """ -import json import re from pathlib import Path -from typing import Any, Dict, List, Optional -from urllib.parse import quote +from typing import Optional +from json_schema_for_humans.generate import generate_from_filename +from json_schema_for_humans.generation_configuration import GenerationConfiguration -class SchemaDocGenerator: - """Generate markdown documentation from JSON Schema.""" - # Characters to remove/replace in anchor IDs - ANCHOR_CLEANUP = str.maketrans({ - " ": "_", ">": "", "$": "", "#": "", "/": "_", - "[": "", "]": "", "(": "", ")": "", "{": "", - "}": "", "^": "", "*": "" - }) - - def __init__(self, schema: Dict[str, Any]): - self.schema = schema - self.defs = schema.get("$defs", {}) - - def generate_id(self, *parts: str) -> str: - """Generate a unique ID for anchors.""" - id_str = "_".join(str(p) for p in parts if p) - id_str = id_str.translate(self.ANCHOR_CLEANUP) - id_str = re.sub(r'_+', '_', id_str) - return id_str.strip("_") - - def type_str(self, prop: Dict[str, Any]) -> str: - """Get human-readable type string.""" - if "const" in prop: - return "const" - if "enum" in prop: - return "enum (of string)" - - type_val = prop.get("type") - if isinstance(type_val, list): - return " or ".join(sorted(type_val)) - - if type_val: - if type_val == "array" and "items" in prop: - items_type = prop["items"].get("type") - if items_type: - return f"array of {items_type}s" - return type_val - - # Check for combining keywords - if any(key in prop for key in ("anyOf", "allOf", "oneOf")): - return "combining" - - return "object" - - @staticmethod - def format_table_cell(text: str) -> str: - """Format text for use in markdown table cells.""" - return str(text).replace("|", "\\|").replace("\n", " ") - - def generate_property_table( - self, properties: Dict[str, Any], required: List[str], path: str = "" - ) -> str: - """Generate a table of properties.""" - if not properties: - return "" - - rows = [ - "| Property | Type | Deprecated | Definition | Title/Description |", - "| " + " | ".join(["-" * 10] * 5) + " |" - ] - - for prop_name, prop_def in properties.items(): - prefix = "+ " if prop_name in required else "- " - prop_type = self.type_str(prop_def) - - # Only show deprecated if it's actually deprecated - deprecated = "Yes" if prop_def.get("deprecated") else "" - - # Check for $ref - definition = f"In {prop_def['$ref']}" if "$ref" in prop_def and prop_def["$ref"].startswith("#/") else "" - - title_desc = prop_def.get("title") or prop_def.get("description") or "-" - anchor_id = self.generate_id(path, prop_name) - display_name = prop_name.replace("$", "\\$") - prop_link = f"[{display_name}](#{anchor_id})" - - rows.append(f"| {prefix}{prop_link} | {prop_type} | {deprecated} | {definition} | {self.format_table_cell(title_desc)} |") - - return "\n".join(rows) + "\n" - - def generate_restrictions_table(self, prop: Dict[str, Any]) -> str: - """Generate restrictions table for a property.""" - restrictions = [] - - # String constraints - if "minLength" in prop: - restrictions.append(("**Min length**", str(prop["minLength"]))) - if "maxLength" in prop: - restrictions.append(("**Max length**", str(prop["maxLength"]))) - if "pattern" in prop: - pattern = prop["pattern"] - regex_url = f"https://regex101.com/?regex={quote(pattern)}" - restrictions.append(("**Must match regular expression**", f"```{pattern}``` [Test]({regex_url})")) - - # Number constraints - if "minimum" in prop: - restrictions.append(("**Minimum**", f"≥ {prop['minimum']}")) - if "exclusiveMinimum" in prop: - restrictions.append(("**Minimum**", f"> {prop['exclusiveMinimum']}")) - if "maximum" in prop: - restrictions.append(("**Maximum**", f"≤ {prop['maximum']}")) - if "exclusiveMaximum" in prop: - restrictions.append(("**Maximum**", f"< {prop['exclusiveMaximum']}")) - if "multipleOf" in prop: - restrictions.append(("**Multiple of**", str(prop["multipleOf"]))) - if "format" in prop: - restrictions.append(("**Format**", f"`{prop['format']}`")) - - if not restrictions: - return "" - - rows = ["| Restrictions | |", "| " + " | ".join(["-" * 10] * 2) + " |"] - rows.extend(f"| {key} | {value} |" for key, value in restrictions) - return "\n".join(rows) + "\n" - - def generate_array_restrictions(self, prop: Dict[str, Any]) -> str: - """Generate array restrictions table.""" - if prop.get("type") != "array": - return "" - - restrictions = [] - - # Only show meaningful values - if "minItems" in prop: - restrictions.append(("**Min items**", str(prop["minItems"]))) - if "maxItems" in prop: - restrictions.append(("**Max items**", str(prop["maxItems"]))) - if prop.get("uniqueItems"): - restrictions.append(("**Items unicity**", "True")) - if "items" in prop: - restrictions.append(("**Tuple validation**", "See below")) - - if not restrictions: - return "" - - rows = ["| | Array restrictions |", "| " + " | ".join(["-" * 10] * 2) + " |"] - rows.extend(f"| {key} | {value} |" for key, value in restrictions) - return "\n".join(rows) + "\n" - - def generate_enum_values(self, prop: Dict[str, Any]) -> str: - """Generate enum values list.""" - if "enum" not in prop: - return "" - - values = "\n".join(f"* `{v}`" if isinstance(v, str) else f"* {v}" for v in prop["enum"]) - return f"\nMust be one of:\n{values}\n" - - def generate_const_value(self, prop: Dict[str, Any]) -> str: - """Generate const value.""" - if "const" not in prop: - return "" - - const_val = prop["const"] - if isinstance(const_val, str): - return f'\nSpecific value: `"{const_val}"`\n' - return f"\nSpecific value: `{const_val}`\n" - - def generate_examples(self, prop: Dict[str, Any]) -> str: - """Generate examples section.""" - if "examples" not in prop: - return "" +def fix_headings(markdown: str) -> str: + """ + Post-process markdown to fix headings: + - Remove numbering from headings + - Keep only leaf property names + - Wrap property names in backticks + """ + lines = [] - examples = prop["examples"] - if not examples: - return "" + for line in markdown.split('\n'): + # Fix headings: ## 1.2.3 Property `name` or ## 1. Property `name` + heading_match = re.match(r'^(#{2,})\s+[\d.]+\.\s+(.*)$', line) + if not heading_match: + heading_match = re.match(r'^(#{2,})\s+[\d.]+\.\s+(.*)$', line) - result = "\n**Examples:**\n\n" - for example in examples: - if isinstance(example, str): - result += f'```\n"{example}"\n```\n\n' + if heading_match: + if len(heading_match.groups()) == 3: + level, anchor, rest = heading_match.groups() else: - result += f"```\n{json.dumps(example, indent=2)}\n```\n\n" - - return result - - def generate_property_details( - self, prop_name: str, prop: Dict[str, Any], path: str, level: int, parent_required: Optional[List[str]] = None - ) -> str: - """Generate detailed documentation for a property.""" - full_path = f"{path} > {prop_name}" if path else prop_name - - anchor_id = self.generate_id(path, prop_name) - # Only show the property name itself in code ticks - title = f"{'#' * level} `{prop_name}`\n\n" - - details = "" - - # Title - if "title" in prop: - details += f"**Title:** {prop['title']}\n\n" - - # Basic info table - prop_type = self.type_str(prop) - - # Use parent_required if provided, otherwise check schema root - if parent_required is None: - parent_required = self.schema.get("required", []) - is_required = prop_name in parent_required - - basic_table = "| | |\n" - basic_table += "| ------------ | -------- |\n" - basic_table += f"| **Type** | `{prop_type}` |\n" - basic_table += f"| **Required** | {'Yes' if is_required else 'No'} |\n" - - # Add format if present - if "format" in prop: - basic_table = basic_table.rstrip() + f"\n| **Format** | `{prop['format']}` |\n" - - # Add default if present - if "default" in prop: - default_val = json.dumps(prop["default"]) if not isinstance(prop["default"], str) else f'`{prop["default"]}`' - basic_table = basic_table.rstrip() + f"\n| **Default** | {default_val} |\n" - - details += basic_table + "\n" - - # Description - if "description" in prop: - details += f"**Description:** {prop['description']}\n\n" - - # Restrictions - restrictions = self.generate_restrictions_table(prop) - if restrictions: - details += restrictions + "\n" - - # Array restrictions - array_restrictions = self.generate_array_restrictions(prop) - if array_restrictions: - details += array_restrictions + "\n" - - # Enum values - details += self.generate_enum_values(prop) - - # Const value - details += self.generate_const_value(prop) - - # Examples - details += self.generate_examples(prop) - - # Handle nested properties - if "properties" in prop: - nested_props = prop["properties"] - nested_required = prop.get("required", []) - details += "\n**Properties:**\n\n" - details += self.generate_property_table(nested_props, nested_required, full_path) - details += "\n" - - # Generate details for each nested property - for nested_name, nested_prop in nested_props.items(): - details += self.generate_property_details( - nested_name, nested_prop, full_path, level + 1, nested_required - ) - - # Handle pattern properties - if "patternProperties" in prop: - details += "\n**Pattern Properties:**\n\n" - for pattern, pattern_def in prop["patternProperties"].items(): - pattern_required = pattern_def.get("required", []) - details += f"Properties matching pattern `{pattern}` must conform to:\n\n" - details += self.generate_property_details( - f"pattern: {pattern}", pattern_def, full_path, level + 1, pattern_required - ) - - # Handle combining schemas (allOf, anyOf, oneOf) - for keyword, label in [("allOf", "All of (Requirements)"), ("anyOf", "Any of (Options)"), ("oneOf", "One of (Options)")]: - if keyword in prop: - details += f"\n**{label}:**\n\n" - for i, subschema in enumerate(prop[keyword]): - item_label = subschema.get("$ref", f"Item {i}") - details += f"- {item_label}\n" - details += "\n" - - # Handle array items - if prop.get("type") == "array" and "items" in prop: - items = prop["items"] - details += "\n**Array Items:**\n\n" - if "$ref" in items: - details += f"Each item must conform to: {items['$ref']}\n\n" + level, rest = heading_match.groups() + anchor = None + + + # Extract property name + # Patterns: "Property `name`" or just "`name`" or "name items" + prop_match = re.search(r'Property\s+`([^`]+)`|`([^`]+)`', rest) + if prop_match: + prop_name = prop_match.group(1) or prop_match.group(2) + # Just use the property name as-is (already a leaf in jsfh output) + if anchor: + line = f"{level} `{prop_name}`" + else: + line = f"{level} `{prop_name}`" else: - items_type = self.type_str(items) - details += f"Each item must be of type: `{items_type}`\n\n" - - return title + details - - def generate_header(self) -> str: - """Generate document header.""" - title = self.schema.get("title", "Schema Documentation") - description = self.schema.get("description", "") - schema_type = self.schema.get("type", "object") - - header = f"# {title}\n\n" - header += f"**Title:** {title}\n\n" - - # Basic schema info table - header += "| | |\n" - header += "| ------------------------- | ---------------- |\n" - header += f"| **Type** | `{schema_type}` |\n" - header += "| **Required** | No |\n" - header += "| **Additional properties** | Any type allowed |\n\n" - - if description: - header += f"**Description:** {description}\n\n" - - # Schema metadata - if "$schema" in self.schema: - header += f"**Schema:** {self.schema['$schema']}\n\n" - if "$id" in self.schema: - header += f"**ID:** {self.schema['$id']}\n\n" - - return header - - def generate_properties_section(self) -> str: - """Generate main properties section.""" - properties = self.schema.get("properties", {}) - required = self.schema.get("required", []) - - if not properties: - return "" - - section = self.generate_property_table(properties, required, self.schema.get("title", "")) - section += "\n" - - return section - - def generate_all_property_details(self) -> str: - """Generate detailed sections for all properties.""" - properties = self.schema.get("properties", {}) - if not properties: - return "" + # Handle "xxx items" headings - keep them as-is but remove numbering + line = f"{level} {rest}" - details = "" - required = self.schema.get("required", []) - for prop_name, prop_def in properties.items(): - schema_title = self.schema.get("title", "") - details += self.generate_property_details(prop_name, prop_def, schema_title, 2, required) - details += "\n" + lines.append(line) - return details - - def generate_definitions_section(self) -> str: - """Generate definitions section.""" - if not self.defs: - return "" - - section = "## Definitions\n\n" - section += "The following definitions are used throughout the schema:\n\n" - - for def_name, def_schema in self.defs.items(): - section += f"### {def_name}\n\n" - - if "description" in def_schema: - section += f"**Description:** {def_schema['description']}\n\n" - - def_type = self.type_str(def_schema) - section += f"**Type:** `{def_type}`\n\n" - - if "properties" in def_schema: - required = def_schema.get("required", []) - section += self.generate_property_table( - def_schema["properties"], required, f"$defs/{def_name}" - ) - section += "\n" - - return section - - def generate(self) -> str: - """Generate complete documentation.""" - doc = self.generate_header() - doc += self.generate_properties_section() - doc += self.generate_all_property_details() - doc += self.generate_definitions_section() - - # Add footer - doc += "\n---\n\n" - doc += "Generated using a custom JSON Schema documentation generator.\n" - - return doc + return '\n'.join(lines) def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: """ Generate documentation for a JSON schema file. + Uses json-schema-for-humans, then fixes the headings. + """ + if not output_path: + output_path = schema_path.with_suffix('.md') + + # Use json-schema-for-humans to generate markdown + config = GenerationConfiguration( + template_name="md", + show_breadcrumbs=False, + show_toc=False, + collapse_long_descriptions=False, + link_to_reused_ref=True, + footer_show_time=False + ) - Args: - schema_path: Path to the JSON schema file - output_path: Optional path to write the output markdown file + # Generate to temp location + temp_output = output_path.parent / f"temp_{output_path.name}" + generate_from_filename(schema_path, str(temp_output), config=config) - Returns: - Generated markdown documentation - """ - with open(schema_path) as f: - schema = json.load(f) + # Read and post-process + markdown = temp_output.read_text() + markdown = fix_headings(markdown) - generator = SchemaDocGenerator(schema) - markdown = generator.generate() + # Write final output + output_path.parent.mkdir(parents=True, exist_ok=True) + output_path.write_text(markdown) - if output_path: - output_path.parent.mkdir(parents=True, exist_ok=True) - output_path.write_text(markdown) - print(f"Documentation generated: {output_path}") + # Clean up temp file + temp_output.unlink() + print(f"Documentation generated: {output_path}") return markdown @@ -423,54 +99,30 @@ def main(): description="Generate markdown documentation from JSON schemas" ) parser.add_argument("schema", nargs="?", type=Path, help="Path to JSON schema file") - parser.add_argument( - "-o", - "--output", - type=Path, - help="Output markdown file (default: same name as schema with .md extension)", - ) - parser.add_argument( - "--all", - action="store_true", - help="Generate docs for all schemas in the repository", - ) - parser.add_argument( - "--output-dir", - type=Path, - default=None, - help="Output directory for generated docs (default: docs/schemas/)", - ) + parser.add_argument("-o", "--output", type=Path, help="Output markdown file") + parser.add_argument("--all", action="store_true", help="Generate docs for all schemas") + parser.add_argument("--output-dir", type=Path, help="Output directory (default: docs/schemas/)") args = parser.parse_args() if args.all: - # Find all schema.json files repo_root = Path(__file__).parent - schema_files = [f for f in repo_root.glob("**/schema.json") - if not any(p.startswith('.') for p in f.parts)] + schema_files = [ + f for f in repo_root.glob("**/schema.json") + if not any(p.startswith('.') for p in f.parts) + ] print(f"Found {len(schema_files)} schema files") - output_dir = args.output_dir or (repo_root / "docs" / "schemas") for schema_file in schema_files: - # Get the directory path relative to repo root schema_dir = schema_file.parent.relative_to(repo_root) - - # Use parent directory name as file name (e.g., pipeline-input, plugin/v1 -> plugin-v1) schema_name = schema_file.stem if str(schema_dir) == "." else str(schema_dir).replace("/", "-") - - output_file = output_dir / f"{schema_name}.md" - generate_docs(schema_file, output_file) + generate_docs(schema_file, output_dir / f"{schema_name}.md") else: if not args.schema: parser.error("schema argument is required when not using --all") - - output_path = args.output - if not output_path: - output_path = args.schema.with_suffix(".md") - - generate_docs(args.schema, output_path) + generate_docs(args.schema, args.output or args.schema.with_suffix(".md")) if __name__ == "__main__": From dbe7f45babbb7561bd6a7f0b524d230017484659 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 13:54:52 +0100 Subject: [PATCH 05/20] add deploy preview action --- .github/workflows/deploy-preview..yml | 29 +++++++++++++++++++++++++++ .github/workflows/docs.yml | 6 ++---- 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/deploy-preview..yml diff --git a/.github/workflows/deploy-preview..yml b/.github/workflows/deploy-preview..yml new file mode 100644 index 0000000..d318f9c --- /dev/null +++ b/.github/workflows/deploy-preview..yml @@ -0,0 +1,29 @@ +name: Deploy PR previews + +on: + pull_request: + types: + - opened + - reopened + - synchronize + - closed + +concurrency: preview-${{ github.ref }} + +jobs: + deploy-preview: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: 3.x + - uses: astral-sh/setup-uv@v7 + - run: uv run zensical build --clean + - run: uv run prek --all-files + + - name: Deploy preview + uses: rossjrw/pr-preview-action@v1 + with: + source-dir: ./build/ + preview-branch: gh-pages diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 37186ec..5fe13e3 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -25,8 +25,6 @@ jobs: - uses: astral-sh/setup-uv@v7 - run: uv run zensical build --clean - run: uv run prek --all-files - - uses: actions/upload-pages-artifact@v4 + - uses: JamesIves/github-pages-deploy-action@v4 with: - path: site - - uses: actions/deploy-pages@v4 - id: deployment + folder: docs # The folder the action should deploy. From e4a1606a7c7f8247ef05a02590aceb3832a7aec2 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 14:02:38 +0100 Subject: [PATCH 06/20] deploy correct directory --- .github/workflows/docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5fe13e3..e763f89 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,4 +1,4 @@ -name: Documentation +name: build documentation on: push: branches: @@ -27,4 +27,4 @@ jobs: - run: uv run prek --all-files - uses: JamesIves/github-pages-deploy-action@v4 with: - folder: docs # The folder the action should deploy. + folder: site # The folder the action should deploy. From e521779c573f0d234234306f37e21c0bbfdc0e46 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 14:03:16 +0100 Subject: [PATCH 07/20] regenerate schema docs before build --- .github/workflows/deploy-preview..yml | 1 + .github/workflows/docs.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/deploy-preview..yml b/.github/workflows/deploy-preview..yml index d318f9c..31d6835 100644 --- a/.github/workflows/deploy-preview..yml +++ b/.github/workflows/deploy-preview..yml @@ -19,6 +19,7 @@ jobs: with: python-version: 3.x - uses: astral-sh/setup-uv@v7 + - run: uv run generate_schema_docs.py --all - run: uv run zensical build --clean - run: uv run prek --all-files diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index e763f89..cf0d747 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,6 +23,7 @@ jobs: with: python-version: 3.x - uses: astral-sh/setup-uv@v7 + - run: uv run generate_schema_docs.py --all - run: uv run zensical build --clean - run: uv run prek --all-files - uses: JamesIves/github-pages-deploy-action@v4 From 82c75f37a2a5aa9186c58bc95c321ebff996bac4 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 14:06:11 +0100 Subject: [PATCH 08/20] continue deployment on prek failure --- .github/workflows/deploy-preview..yml | 3 ++- .github/workflows/docs.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-preview..yml b/.github/workflows/deploy-preview..yml index 31d6835..9f5f29f 100644 --- a/.github/workflows/deploy-preview..yml +++ b/.github/workflows/deploy-preview..yml @@ -21,7 +21,8 @@ jobs: - uses: astral-sh/setup-uv@v7 - run: uv run generate_schema_docs.py --all - run: uv run zensical build --clean - - run: uv run prek --all-files + - uses: j178/prek-action@v1 + continue-on-error: true - name: Deploy preview uses: rossjrw/pr-preview-action@v1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index cf0d747..cdbd515 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -25,7 +25,8 @@ jobs: - uses: astral-sh/setup-uv@v7 - run: uv run generate_schema_docs.py --all - run: uv run zensical build --clean - - run: uv run prek --all-files + - uses: j178/prek-action@v1 + continue-on-error: true - uses: JamesIves/github-pages-deploy-action@v4 with: folder: site # The folder the action should deploy. From 220731e456fc10fe226e448906a6ae01cdb1a879 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 14:11:48 +0100 Subject: [PATCH 09/20] fix source-dir for deploy preview --- .github/workflows/deploy-preview..yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-preview..yml b/.github/workflows/deploy-preview..yml index 9f5f29f..67f3bb5 100644 --- a/.github/workflows/deploy-preview..yml +++ b/.github/workflows/deploy-preview..yml @@ -27,5 +27,5 @@ jobs: - name: Deploy preview uses: rossjrw/pr-preview-action@v1 with: - source-dir: ./build/ + source-dir: ./site/ preview-branch: gh-pages From 8b4259733645dcbab8a68caf59d363c7ec7a8e38 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 15:33:44 +0100 Subject: [PATCH 10/20] remove old docs readme --- docs/README.md | 77 ---------------------------------- docs/schemas/pipeline-input.md | 38 ++++++++--------- 2 files changed, 19 insertions(+), 96 deletions(-) delete mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 792adbb..0000000 --- a/docs/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Documentation - -This directory contains the MkDocs documentation for Nextflow Schemas. - -## Building Documentation - -### Install Dependencies - -Using uv: - -```bash -uv sync --extra docs -``` - -### Serve Locally - -Start the development server: - -```bash -uv run mkdocs serve -``` - -Then open your browser to `http://127.0.0.1:8000` - -### Build Static Site - -Generate static HTML: - -```bash -uv run mkdocs build -``` - -Output will be in the `site/` directory. - -## Deploy to GitHub Pages - -```bash -uv run mkdocs gh-deploy -``` - -## Documentation Structure - -``` -docs/ -├── index.md # Home page -├── getting-started/ -│ ├── overview.md # Overview of the project -│ ├── installation.md # Installation instructions -│ └── quick-start.md # Quick start guide -├── schemas/ -│ ├── pipeline-input.md # Pipeline input schema reference -│ └── plugin.md # Plugin schema reference -├── development/ -│ ├── contributing.md # Contributing guidelines -│ ├── testing.md # Testing guide -│ └── ci-cd.md # CI/CD documentation -└── examples/ - ├── pipeline-input-examples.md # Pipeline examples - └── plugin-examples.md # Plugin examples -``` - -## Writing Documentation - -- Use GitHub-flavored Markdown -- Code blocks should specify language for syntax highlighting -- Use admonitions for notes, warnings, tips: - - ```markdown - !!! note - This is a note - - !!! warning - This is a warning - ``` - -- Cross-reference other pages with relative links -- Include practical examples where possible diff --git a/docs/schemas/pipeline-input.md b/docs/schemas/pipeline-input.md index 12fab59..a5be1d5 100644 --- a/docs/schemas/pipeline-input.md +++ b/docs/schemas/pipeline-input.md @@ -215,24 +215,24 @@ Specific value: `"object"` **Description:** Allowed standard JSON Schema properties. -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------------------------------------- | ------- | ---------------------------------------- | ---------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| - [type](#defs_pattern1_properties_pattern1_pattern2_i0_type) | No | Combination | No | - | The type of the parameter value. Can be one or more of these: \`['integer', 'boolean', 'number', 'string', 'null']\` | -| - [format](#defs_pattern1_properties_pattern1_pattern2_i0_format) | No | enum (of string) | No | - | The format of a parameter value with the \`string\` type. This is used for additional validation on the structure of the value. | -| - [pattern](#defs_pattern1_properties_pattern1_pattern2_i0_pattern) | No | string | No | - | Check a parameter value of 'string' type against a regex pattern | -| - [description](#defs_pattern1_properties_pattern1_pattern2_i0_description) | No | string | No | - | The description of the current parameter | -| - [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | No | integer, boolean, string, number or null | No | In #/$defs/allTypes | Specifies a default value to use for this parameter | -| - [examples](#defs_pattern1_properties_pattern1_pattern2_i0_examples) | No | array | No | - | A list of examples for the current parameter | -| - [deprecated](#defs_pattern1_properties_pattern1_pattern2_i0_deprecated) | No | boolean | No | - | States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' | -| - [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | No | integer | No | In #/$defs/nonNegativeInteger | The minimum length a 'string' parameter value should be | -| - [maxLength](#defs_pattern1_properties_pattern1_pattern2_i0_maxLength) | No | integer | No | Same as [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | The maximum length a 'string' parameter value should be | -| - [minimum](#defs_pattern1_properties_pattern1_pattern2_i0_minimum) | No | number | No | - | The mimimum value an 'integer' or 'number' parameter value should be | -| - [exclusiveMinimum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMinimum) | No | number | No | - | The exclusive mimimum value an 'integer' or 'number' parameter value should be | -| - [maximum](#defs_pattern1_properties_pattern1_pattern2_i0_maximum) | No | number | No | - | The maximum value an 'integer' or 'number' parameter value should be | -| - [exclusiveMaximum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMaximum) | No | number | No | - | The exclusive maximum value an 'integer' or 'number' parameter value should be | -| - [multipleOf](#defs_pattern1_properties_pattern1_pattern2_i0_multipleOf) | No | number | No | - | The 'integer' or 'number' parameter value should be a multiple of this value | -| - [enum](#defs_pattern1_properties_pattern1_pattern2_i0_enum) | No | array | No | - | The parameter value should be one of the values specified in this enum array | -| - [const](#defs_pattern1_properties_pattern1_pattern2_i0_const) | No | integer, boolean, string, number or null | No | Same as [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | The parameter value should be equal to this value | +| Property | Pattern | Type | Deprecated | Definition | Title/Description | +| ------------------------------------------------------------------------------------- | ------- | ---------------------------------------- | ---------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| - [type](#defs_pattern1_properties_pattern1_pattern2_i0_type) | No | Combination | No | - | The type of the parameter value. Can be one or more of these: \`['integer', 'boolean', 'number', 'string', 'null']\` | +| - [format](#defs_pattern1_properties_pattern1_pattern2_i0_format) | No | enum (of string) | No | - | The format of a parameter value with the 'string' type. This is used for additional validation on the structure of the value. | +| - [pattern](#defs_pattern1_properties_pattern1_pattern2_i0_pattern) | No | string | No | - | Check a parameter value of 'string' type against a regex pattern | +| - [description](#defs_pattern1_properties_pattern1_pattern2_i0_description) | No | string | No | - | The description of the current parameter | +| - [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | No | integer, boolean, string, number or null | No | In #/$defs/allTypes | Specifies a default value to use for this parameter | +| - [examples](#defs_pattern1_properties_pattern1_pattern2_i0_examples) | No | array | No | - | A list of examples for the current parameter | +| - [deprecated](#defs_pattern1_properties_pattern1_pattern2_i0_deprecated) | No | boolean | No | - | States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' | +| - [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | No | integer | No | In #/$defs/nonNegativeInteger | The minimum length a 'string' parameter value should be | +| - [maxLength](#defs_pattern1_properties_pattern1_pattern2_i0_maxLength) | No | integer | No | Same as [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | The maximum length a 'string' parameter value should be | +| - [minimum](#defs_pattern1_properties_pattern1_pattern2_i0_minimum) | No | number | No | - | The mimimum value an 'integer' or 'number' parameter value should be | +| - [exclusiveMinimum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMinimum) | No | number | No | - | The exclusive mimimum value an 'integer' or 'number' parameter value should be | +| - [maximum](#defs_pattern1_properties_pattern1_pattern2_i0_maximum) | No | number | No | - | The maximum value an 'integer' or 'number' parameter value should be | +| - [exclusiveMaximum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMaximum) | No | number | No | - | The exclusive maximum value an 'integer' or 'number' parameter value should be | +| - [multipleOf](#defs_pattern1_properties_pattern1_pattern2_i0_multipleOf) | No | number | No | - | The 'integer' or 'number' parameter value should be a multiple of this value | +| - [enum](#defs_pattern1_properties_pattern1_pattern2_i0_enum) | No | array | No | - | The parameter value should be one of the values specified in this enum array | +| - [const](#defs_pattern1_properties_pattern1_pattern2_i0_const) | No | integer, boolean, string, number or null | No | Same as [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | The parameter value should be equal to this value | ###### `type` @@ -299,7 +299,7 @@ Must be one of: | **Type** | `enum (of string)` | | **Required** | No | -**Description:** The format of a parameter value with the `string` type. This is used for additional validation on the structure of the value. +**Description:** The format of a parameter value with the 'string' type. This is used for additional validation on the structure of the value. Must be one of: From 8e3a2f157092d8c17de207b139b8585fa55173e8 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 16:51:43 +0100 Subject: [PATCH 11/20] add versioning # Conflicts: # pipeline-input/schema.json # pipeline-input/tests/full_featured_schema.json # pipeline-input/tests/invalid_meta_valid_json.json # pipeline-input/tests/invalid_schema.json # pipeline-input/tests/minimal_valid_schema.json # pipeline-input/tests/multiplesequencealign_nextflow_schema.json # pipeline-input/tests/valid_schema.json # pipeline-input/v1/schema.json # pipeline-input/v1/tests/full_featured_schema.json # pipeline-input/v1/tests/invalid_meta_valid_json.json # pipeline-input/v1/tests/invalid_schema.json # pipeline-input/v1/tests/minimal_valid_schema.json # pipeline-input/v1/tests/multiplesequencealign_nextflow_schema.json # pipeline-input/v1/tests/valid_schema.json # pipeline/v1/schema.json # pipeline/v1/tests/full_featured_schema.json # pipeline/v1/tests/invalid_meta_valid_json.json # pipeline/v1/tests/invalid_schema.json # pipeline/v1/tests/minimal_valid_schema.json # pipeline/v1/tests/multiplesequencealign_nextflow_schema.json # pipeline/v1/tests/valid_schema.json --- docs/index.md | 11 +- .../v1/schema.md} | 0 docs/schemas/plugin.md | 483 ------------------ .../{plugin-v1.md => plugin/v1/schema.md} | 0 docs/stylesheets/extra.css | 10 + generate_schema_docs.py | 13 +- 6 files changed, 26 insertions(+), 491 deletions(-) rename docs/schemas/{pipeline-input.md => pipeline-input/v1/schema.md} (100%) delete mode 100644 docs/schemas/plugin.md rename docs/schemas/{plugin-v1.md => plugin/v1/schema.md} (100%) create mode 100644 docs/stylesheets/extra.css diff --git a/docs/index.md b/docs/index.md index 56096b5..0bee4aa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,9 @@ -# Nextflow Schemas +--- +hide: + - toc +--- + +# Introduction Welcome to the Nextflow Schemas documentation. This repository contains JSON schemas used by Nextflow for validating pipeline inputs and plugin specifications. @@ -6,5 +11,5 @@ Welcome to the Nextflow Schemas documentation. This repository contains JSON sch This repository provides two main schemas: -- **[Pipeline Input Schema](schemas/pipeline-input.md)**: Validates Nextflow pipeline input specifications, including parameter definitions, validation rules, and parameter grouping -- **[Plugin Schema](schemas/plugin.md)**: Validates Nextflow plugin specifications, including configuration scopes and function definitions +- **[Pipeline Input Schema](schemas/v1/pipeline-input.md)**: Validates Nextflow pipeline input specifications, including parameter definitions, validation rules, and parameter grouping +- **[Plugin Schema](schemas/v1/plugin.md)**: Validates Nextflow plugin specifications, including configuration scopes and function definitions diff --git a/docs/schemas/pipeline-input.md b/docs/schemas/pipeline-input/v1/schema.md similarity index 100% rename from docs/schemas/pipeline-input.md rename to docs/schemas/pipeline-input/v1/schema.md diff --git a/docs/schemas/plugin.md b/docs/schemas/plugin.md deleted file mode 100644 index cb2de55..0000000 --- a/docs/schemas/plugin.md +++ /dev/null @@ -1,483 +0,0 @@ -# Plugin Schema Reference - -The plugin schema validates Nextflow plugin specifications, including configuration scopes, configuration options, and function definitions. - -## Schema URI - -``` -https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json -``` - -## Top-Level Structure - -The plugin schema has a single top-level property: - -| Property | Type | Description | -| ------------- | ----- | --------------------------------------------------------- | -| `definitions` | array | Array of definition objects (config scopes and functions) | - -## Definition Types - -Each item in the `definitions` array must be one of: - -- **ConfigScope** - Configuration scope with nested children -- **ConfigOption** - Individual configuration option -- **Factory** - Factory function definition -- **Function** - Standard function definition -- **Operator** - Operator function definition - -## Configuration Scopes - -Configuration scopes define hierarchical configuration structures. - -### Structure - -```json -{ - "type": "ConfigScope", - "spec": { - "name": "string", - "description": "string", - "children": [] - } -} -``` - -### Properties - -| Property | Type | Required | Description | -| ------------------ | ------ | -------- | ------------------------------- | -| `type` | string | Yes | Must be `"ConfigScope"` | -| `spec.name` | string | Yes | Scope name | -| `spec.description` | string | Yes | Scope description | -| `spec.children` | array | Yes | Nested config options or scopes | - -### Example - -```json -{ - "type": "ConfigScope", - "spec": { - "name": "aws", - "description": "AWS plugin configuration", - "children": [ - { - "type": "ConfigScope", - "spec": { - "name": "batch", - "description": "AWS Batch settings", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "cliPath", - "description": "Path to AWS CLI executable", - "type": "String" - } - } - ] - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "region", - "description": "AWS region", - "type": "String" - } - } - ] - } -} -``` - -This creates a configuration structure: - -```groovy -aws { - batch { - cliPath = '/usr/bin/aws' - } - region = 'us-east-1' -} -``` - -## Configuration Options - -Configuration options are individual settings within a scope. - -### Structure - -```json -{ - "type": "ConfigOption", - "spec": { - "name": "string", - "description": "string", - "type": "string" - } -} -``` - -### Properties - -| Property | Type | Required | Description | -| ------------------ | ------ | -------- | ------------------------------------------ | -| `type` | string | Yes | Must be `"ConfigOption"` | -| `spec.name` | string | Yes | Option name | -| `spec.description` | string | Yes | Option description | -| `spec.type` | string | Yes | Data type (String, Integer, Boolean, etc.) | - -### Common Data Types - -- `String` - Text value -- `Integer` - Whole number -- `Boolean` - true/false -- `Duration` - Time duration (e.g., `10.s`, `5.m`) -- `MemoryUnit` - Memory size (e.g., `1.GB`, `512.MB`) -- `Map` - Key-value pairs -- `List` - Array of values - -### Example - -```json -{ - "type": "ConfigOption", - "spec": { - "name": "maxRetries", - "description": "Maximum number of retry attempts", - "type": "Integer" - } -} -``` - -## Functions - -Function definitions document callable functions provided by the plugin. - -### Types of Functions - -#### Function - -Standard function: - -```json -{ - "type": "Function", - "spec": { - "name": "string", - "description": "string", - "returnType": "string", - "parameters": [] - } -} -``` - -#### Factory - -Factory function that creates objects: - -```json -{ - "type": "Factory", - "spec": { - "name": "string", - "description": "string", - "returnType": "string", - "parameters": [] - } -} -``` - -#### Operator - -Channel operator function: - -```json -{ - "type": "Operator", - "spec": { - "name": "string", - "description": "string", - "returnType": "string", - "parameters": [] - } -} -``` - -### Properties - -| Property | Type | Required | Description | -| ------------------ | ------ | -------- | ------------------------------------------ | -| `type` | string | Yes | `"Function"`, `"Factory"`, or `"Operator"` | -| `spec.name` | string | Yes | Function name | -| `spec.description` | string | Yes | Function description | -| `spec.returnType` | string | Yes | Return type | -| `spec.parameters` | array | No | Function parameters | - -### Parameters - -Each parameter object: - -| Property | Type | Required | Description | -| -------- | ------ | -------- | -------------- | -| `name` | string | Yes | Parameter name | -| `type` | string | Yes | Parameter type | - -### Example: Function - -```json -{ - "type": "Function", - "spec": { - "name": "uploadFile", - "description": "Upload a file to S3", - "returnType": "String", - "parameters": [ - { - "name": "localPath", - "type": "String" - }, - { - "name": "bucket", - "type": "String" - }, - { - "name": "key", - "type": "String" - } - ] - } -} -``` - -Usage in Nextflow: - -```groovy -def result = uploadFile('/data/file.txt', 'my-bucket', 'output/file.txt') -``` - -### Example: Operator - -```json -{ - "type": "Operator", - "spec": { - "name": "customFilter", - "description": "Filter channel items with custom logic", - "returnType": "DataflowChannel", - "parameters": [ - { - "name": "closure", - "type": "Closure" - } - ] - } -} -``` - -Usage in Nextflow: - -```groovy -Channel - .from(1, 2, 3, 4, 5) - .customFilter { it > 2 } -``` - -### Example: Factory - -```json -{ - "type": "Factory", - "spec": { - "name": "createClient", - "description": "Create an API client", - "returnType": "ApiClient", - "parameters": [ - { - "name": "config", - "type": "Map" - } - ] - } -} -``` - -Usage in Nextflow: - -```groovy -def client = createClient([ - endpoint: 'https://api.example.com', - apiKey: 'secret' -]) -``` - -## Complete Example - -```json -{ - "$schema": "https://raw.githubusercontent.com/nextflow-io/schemas/main/plugin/schema.json", - "definitions": [ - { - "type": "ConfigScope", - "spec": { - "name": "myPlugin", - "description": "My custom plugin configuration", - "children": [ - { - "type": "ConfigScope", - "spec": { - "name": "server", - "description": "Server connection settings", - "children": [ - { - "type": "ConfigOption", - "spec": { - "name": "endpoint", - "description": "API endpoint URL", - "type": "String" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "timeout", - "description": "Connection timeout", - "type": "Duration" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "retries", - "description": "Maximum retry attempts", - "type": "Integer" - } - } - ] - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "enabled", - "description": "Enable the plugin", - "type": "Boolean" - } - }, - { - "type": "ConfigOption", - "spec": { - "name": "debug", - "description": "Enable debug logging", - "type": "Boolean" - } - } - ] - } - }, - { - "type": "Function", - "spec": { - "name": "processData", - "description": "Process input data and return results", - "returnType": "Map", - "parameters": [ - { - "name": "input", - "type": "String" - }, - { - "name": "options", - "type": "Map" - } - ] - } - }, - { - "type": "Operator", - "spec": { - "name": "transform", - "description": "Transform channel data", - "returnType": "DataflowChannel", - "parameters": [ - { - "name": "mapper", - "type": "Closure" - } - ] - } - }, - { - "type": "Factory", - "spec": { - "name": "createProcessor", - "description": "Create a data processor instance", - "returnType": "DataProcessor", - "parameters": [ - { - "name": "config", - "type": "Map" - } - ] - } - } - ] -} -``` - -### Resulting Configuration - -The above schema allows this configuration: - -```groovy -myPlugin { - enabled = true - debug = false - - server { - endpoint = 'https://api.example.com' - timeout = '30.s' - retries = 3 - } -} -``` - -### Resulting Functions - -And these function calls: - -```groovy -// Function -def result = processData('/path/to/input', [format: 'json']) - -// Operator -Channel - .from('data1', 'data2') - .transform { it.toUpperCase() } - -// Factory -def processor = createProcessor([threads: 4, memory: '8.GB']) -``` - -## Validation - -Validate your plugin schema: - -```bash -check-jsonschema --schemafile plugin/schema.json my-plugin-spec.json -``` - -## Best Practices - -1. **Use descriptive names** - Make config options and function names self-explanatory -2. **Provide clear descriptions** - Help users understand what each option does -3. **Group related options** - Use nested ConfigScopes for logical grouping -4. **Document parameters** - Specify parameter types and purposes -5. **Be consistent** - Follow naming conventions (camelCase for options, snake_case for parameters) - -## See Also - -- [Quick Start Guide](../getting-started/quick-start.md) -- [Plugin Examples](../examples/plugin-examples.md) -- [Testing Guide](../development/testing.md) diff --git a/docs/schemas/plugin-v1.md b/docs/schemas/plugin/v1/schema.md similarity index 100% rename from docs/schemas/plugin-v1.md rename to docs/schemas/plugin/v1/schema.md diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..2628d8a --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,10 @@ +.md-typeset h4 code { + font-size: 1.25rem; +} + +.md-typeset h5 code { + font-size: 1rem !important; +} +.md-typeset h6 code { + font-size: 1rem !important; +} diff --git a/generate_schema_docs.py b/generate_schema_docs.py index 4e22001..890b1e4 100644 --- a/generate_schema_docs.py +++ b/generate_schema_docs.py @@ -72,6 +72,9 @@ def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: footer_show_time=False ) + # Ensure output directory exists before generating + output_path.parent.mkdir(parents=True, exist_ok=True) + # Generate to temp location temp_output = output_path.parent / f"temp_{output_path.name}" generate_from_filename(schema_path, str(temp_output), config=config) @@ -79,9 +82,6 @@ def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: # Read and post-process markdown = temp_output.read_text() markdown = fix_headings(markdown) - - # Write final output - output_path.parent.mkdir(parents=True, exist_ok=True) output_path.write_text(markdown) # Clean up temp file @@ -117,8 +117,11 @@ def main(): for schema_file in schema_files: schema_dir = schema_file.parent.relative_to(repo_root) - schema_name = schema_file.stem if str(schema_dir) == "." else str(schema_dir).replace("/", "-") - generate_docs(schema_file, output_dir / f"{schema_name}.md") + if str(schema_dir) == ".": + output_file = output_dir / f"{schema_file.stem}.md" + else: + output_file = output_dir / schema_dir / f"{schema_file.stem}.md" + generate_docs(schema_file, output_file) else: if not args.schema: parser.error("schema argument is required when not using --all") From 5726dd4e9242728d977104b9e81f45eeb676fafa Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 16:52:02 +0100 Subject: [PATCH 12/20] polish zensical setup --- zensical.toml | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/zensical.toml b/zensical.toml index 75e2842..05d70a6 100644 --- a/zensical.toml +++ b/zensical.toml @@ -37,6 +37,9 @@ copyright = """ Copyright © 2026 The authors """ +repo_url = "https://github.com/nextflow-io/schemas" +repo_name = "nextflow-io/schemas" + # Zensical supports both implicit navigation and explicitly defined navigation. # If you decide not to define a navigation here then Zensical will simply # derive the navigation structure from the directory structure of your @@ -57,7 +60,7 @@ Copyright © 2026 The authors # # Read more: https://zensical.org/docs/customization/#additional-css # -#extra_css = ["stylesheets/extra.css"] +extra_css = ["stylesheets/extra.css"] # With the `extra_javascript` option you can add your own JavaScript to your # project to customize the behavior according to your needs. @@ -240,7 +243,7 @@ features = [ # When anchor following for the table of contents is enabled, the sidebar # is automatically scrolled so that the active anchor is always visible. # https://zensical.org/docs/setup/navigation/#anchor-following - # "toc.follow", + "toc.follow", # When navigation integration for the table of contents is enabled, it is # always rendered as part of the navigation sidebar on the left. @@ -257,15 +260,25 @@ features = [ # Read more: # - https://zensical.org/docs/setup/colors/ # ---------------------------------------------------------------------------- +# Palette toggle for automatic mode [[project.theme.palette]] +media = "(prefers-color-scheme)" +toggle.icon = "lucide/eye" +toggle.name = "Switch to light mode" + +# Palette toggle for light mode +[[project.theme.palette]] +media = "(prefers-color-scheme: light)" scheme = "default" toggle.icon = "lucide/sun" toggle.name = "Switch to dark mode" +# Palette toggle for dark mode [[project.theme.palette]] +media = "(prefers-color-scheme: dark)" scheme = "slate" toggle.icon = "lucide/moon" -toggle.name = "Switch to light mode" +toggle.name = "Switch to system preference" # ---------------------------------------------------------------------------- # In the "font" subsection you can configure the fonts used. By default, fonts @@ -273,9 +286,9 @@ toggle.name = "Switch to light mode" # of suitably licensed fonts. There are options for a normal text font and for # a monospaced font used in code blocks. # ---------------------------------------------------------------------------- -#[project.theme.font] -#text = "Inter" -#code = "Jetbrains Mono" +[project.theme.font] +text = "Inter" +code = "Fira Code" # ---------------------------------------------------------------------------- # You can configure your own logo to be shown in the header using the "logo" @@ -292,8 +305,8 @@ toggle.name = "Switch to light mode" # - https://zensical.org/docs/setup/logo-and-icons # - https://zensical.org/docs/authoring/icons-emojis/#search # ---------------------------------------------------------------------------- -#[project.theme.icon] -#logo = "lucide/smile" +[project.theme.icon] +logo = "lucide/braces" #repo = "lucide/smile" # ---------------------------------------------------------------------------- From 0d15128bcf4908c06439e94b1ac93e2bcbe32a42 Mon Sep 17 00:00:00 2001 From: mashehu Date: Tue, 13 Jan 2026 17:04:43 +0100 Subject: [PATCH 13/20] hide empty table headers --- docs/stylesheets/extra.css | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 2628d8a..a5e5f39 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -6,5 +6,12 @@ font-size: 1rem !important; } .md-typeset h6 code { - font-size: 1rem !important; + font-size: 0.8rem !important; +} + +/* Hide empty table headers (headers with only whitespace) */ +.md-typeset table thead tr th:empty { + visibility: hidden; + padding: 0; + border: none; } From c1bd3f5475921cb2b5241da3c46df6341a08c32c Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 14 Jan 2026 10:05:57 +0100 Subject: [PATCH 14/20] update docs to new schema names --- docs/schemas/{pipeline-input => pipeline}/v1/schema.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/schemas/{pipeline-input => pipeline}/v1/schema.md (100%) diff --git a/docs/schemas/pipeline-input/v1/schema.md b/docs/schemas/pipeline/v1/schema.md similarity index 100% rename from docs/schemas/pipeline-input/v1/schema.md rename to docs/schemas/pipeline/v1/schema.md From a0874b3c2b9112f37c68b951b632daab2621b663 Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 14 Jan 2026 10:34:57 +0100 Subject: [PATCH 15/20] run prek rules in generation script --- .github/workflows/deploy-preview..yml | 2 -- .github/workflows/docs.yml | 3 +-- generate_schema_docs.py | 25 +++++++++++++++++++++++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy-preview..yml b/.github/workflows/deploy-preview..yml index 67f3bb5..0a92a4f 100644 --- a/.github/workflows/deploy-preview..yml +++ b/.github/workflows/deploy-preview..yml @@ -21,8 +21,6 @@ jobs: - uses: astral-sh/setup-uv@v7 - run: uv run generate_schema_docs.py --all - run: uv run zensical build --clean - - uses: j178/prek-action@v1 - continue-on-error: true - name: Deploy preview uses: rossjrw/pr-preview-action@v1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index cdbd515..21edaca 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -25,8 +25,7 @@ jobs: - uses: astral-sh/setup-uv@v7 - run: uv run generate_schema_docs.py --all - run: uv run zensical build --clean - - uses: j178/prek-action@v1 - continue-on-error: true + - uses: JamesIves/github-pages-deploy-action@v4 with: folder: site # The folder the action should deploy. diff --git a/generate_schema_docs.py b/generate_schema_docs.py index 890b1e4..ea4a575 100644 --- a/generate_schema_docs.py +++ b/generate_schema_docs.py @@ -5,6 +5,7 @@ """ import re +import subprocess from pathlib import Path from typing import Optional @@ -69,7 +70,10 @@ def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: show_toc=False, collapse_long_descriptions=False, link_to_reused_ref=True, - footer_show_time=False + footer_show_time=False, + template_md_options={ + "show_array_restrictions": False, + } ) # Ensure output directory exists before generating @@ -87,6 +91,7 @@ def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: # Clean up temp file temp_output.unlink() + print(f"Documentation generated: {output_path}") return markdown @@ -105,6 +110,8 @@ def main(): args = parser.parse_args() + generated_files = [] + if args.all: repo_root = Path(__file__).parent schema_files = [ @@ -122,10 +129,24 @@ def main(): else: output_file = output_dir / schema_dir / f"{schema_file.stem}.md" generate_docs(schema_file, output_file) + generated_files.append(output_file) else: if not args.schema: parser.error("schema argument is required when not using --all") - generate_docs(args.schema, args.output or args.schema.with_suffix(".md")) + output_file = args.output or args.schema.with_suffix(".md") + generate_docs(args.schema, output_file) + generated_files.append(output_file) + + # Run prek --files on all generated files + if generated_files: + print(f"\nRunning prek on {len(generated_files)} generated file(s)...") + try: + subprocess.run( + ["prek", "--files"] + [str(f) for f in generated_files], + capture_output=True + ) + except FileNotFoundError: + print("Warning: prek not found in PATH, skipping formatting") if __name__ == "__main__": From f9b25dd9a3b2333fde8d4350a7c43e095ebb8f52 Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 14 Jan 2026 12:20:34 +0100 Subject: [PATCH 16/20] simplify generator code --- docs/stylesheets/extra.css | 2 +- generate_schema_docs.py | 75 +++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index a5e5f39..cdcd68f 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -5,7 +5,7 @@ .md-typeset h5 code { font-size: 1rem !important; } -.md-typeset h6 code { +.md-typeset h6 { font-size: 0.8rem !important; } diff --git a/generate_schema_docs.py b/generate_schema_docs.py index ea4a575..1cf13b98 100644 --- a/generate_schema_docs.py +++ b/generate_schema_docs.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ Super simple schema documentation generator. -Uses json-schema-for-humans to generate markdown, then post-processes headings. +Uses json-schema-for-humans to generate markdown. """ import re @@ -13,52 +13,43 @@ from json_schema_for_humans.generation_configuration import GenerationConfiguration -def fix_headings(markdown: str) -> str: +def clean_headings(markdown: str) -> str: """ - Post-process markdown to fix headings: - - Remove numbering from headings - - Keep only leaf property names - - Wrap property names in backticks + Remove "Property " and "Pattern Property " prefixes from markdown headings. + Converts: ###### Property `name` + To: ###### `name` """ - lines = [] - - for line in markdown.split('\n'): - # Fix headings: ## 1.2.3 Property `name` or ## 1. Property `name` - heading_match = re.match(r'^(#{2,})\s+[\d.]+\.\s+(.*)$', line) - if not heading_match: - heading_match = re.match(r'^(#{2,})\s+[\d.]+\.\s+(.*)$', line) + # Remove "Property " prefix from headings + markdown = re.sub( + r'(#{2,})\s+Property\s+(.*)$', + r'\1 \3', + markdown, + flags=re.MULTILINE + ) - if heading_match: - if len(heading_match.groups()) == 3: - level, anchor, rest = heading_match.groups() - else: - level, rest = heading_match.groups() - anchor = None - - - # Extract property name - # Patterns: "Property `name`" or just "`name`" or "name items" - prop_match = re.search(r'Property\s+`([^`]+)`|`([^`]+)`', rest) - if prop_match: - prop_name = prop_match.group(1) or prop_match.group(2) - # Just use the property name as-is (already a leaf in jsfh output) - if anchor: - line = f"{level} `{prop_name}`" - else: - line = f"{level} `{prop_name}`" - else: - # Handle "xxx items" headings - keep them as-is but remove numbering - line = f"{level} {rest}" + # Remove "Pattern Property " prefix from headings + markdown = re.sub( + r'(#{2,})\s+Pattern Property\s+(.*)$', + r'\1 \3', + markdown, + flags=re.MULTILINE + ) - lines.append(line) + # Remove "Required | No" table rows + markdown = re.sub( + r'^\|\s*\*\*Required\*\*\s*\|\s*No\s*\|\s*$\n', + '', + markdown, + flags=re.MULTILINE + ) - return '\n'.join(lines) + return markdown def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: """ Generate documentation for a JSON schema file. - Uses json-schema-for-humans, then fixes the headings. + Uses json-schema-for-humans with standard md template. """ if not output_path: output_path = schema_path.with_suffix('.md') @@ -73,7 +64,10 @@ def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: footer_show_time=False, template_md_options={ "show_array_restrictions": False, - } + "properties_table_columns": ['Property','Type'], + "show_heading_numbers": False, + }, + expand_buttons=True ) # Ensure output directory exists before generating @@ -83,15 +77,14 @@ def generate_docs(schema_path: Path, output_path: Optional[Path] = None) -> str: temp_output = output_path.parent / f"temp_{output_path.name}" generate_from_filename(schema_path, str(temp_output), config=config) - # Read and post-process + # Read, clean up, and write final output markdown = temp_output.read_text() - markdown = fix_headings(markdown) + markdown = clean_headings(markdown) output_path.write_text(markdown) # Clean up temp file temp_output.unlink() - print(f"Documentation generated: {output_path}") return markdown From 20baac205cf13154d766008f5884ab40a24c9a3e Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 14 Jan 2026 12:27:01 +0100 Subject: [PATCH 17/20] add description text from nf-schema docs to pipeline schema --- docs/schemas/pipeline/v1/schema.md | 788 ++++++++++++++++++----------- docs/schemas/plugin/v1/schema.md | 232 ++++----- pipeline/v1/schema.json | 44 +- 3 files changed, 618 insertions(+), 446 deletions(-) diff --git a/docs/schemas/pipeline/v1/schema.md b/docs/schemas/pipeline/v1/schema.md index a5be1d5..1cc8c7d 100644 --- a/docs/schemas/pipeline/v1/schema.md +++ b/docs/schemas/pipeline/v1/schema.md @@ -5,22 +5,21 @@ | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | **Description:** Schema to validate Nextflow pipeline input specs -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ----------------------------------------- | ------- | --------------- | ---------- | ----------------------------------------------- | ------------------------- | -| + [$schema](#schema) | No | string | No | - | schema | -| + [$id](#id) | No | string | No | - | ID URI | -| + [title](#title) | No | string | No | - | Title | -| + [description](#description) | No | string | No | - | Description | -| + [type](#type) | No | const | No | - | Top level type | -| - [$defs](#defs) | No | object | No | - | Parameter groups | -| - [properties](#properties) | No | object | No | Same as [properties](#defs_pattern1_properties) | - | -| - [dependentRequired](#dependentRequired) | No | object | No | - | - | -| - [allOf](#allOf) | No | array of object | No | - | Combine definition groups | +| Property | Type | +| ----------------------------------------- | --------------- | +| + [$schema](#schema) | string | +| + [$id](#id) | string | +| + [title](#title) | string | +| + [description](#description) | string | +| + [type](#type) | const | +| - [$defs](#defs) | object | +| - [properties](#properties) | object | +| - [dependentRequired](#dependentRequired) | object | +| - [allOf](#allOf) | array of object | ## `$schema` @@ -92,12 +91,22 @@ Specific value: `"object"` | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | -| - [^.\*$](#defs_pattern1) | Yes | object | No | - | - | +**Description:** A slightly strange use of a JSON schema standard that we use for Nextflow schema is `$defs`. + +JSON schema can group variables together in an `object`, but then the validation expects this structure to exist in the data that it is validating. +In reality, we have a very long "flat" list of parameters, all at the top level of `params.foo`. + +In order to give some structure to log outputs, documentation and so on, we group parameters into `$defs`. +Each `def` is an object with a title, description and so on. +However, as they are under `$defs` scope they are effectively ignored by the validation and so their nested nature is not a problem. +We then bring the contents of each definition object back to the "flat" top level for validation using a series of `allOf` statements at the end of the schema, +which reference the specific definition keys. + +| Property | Type | +| ------------------------- | ------ | +| - [^.\*$](#defs_pattern1) | object | ### `^.*$` @@ -108,18 +117,17 @@ Specific value: `"object"` | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------- | ------- | ------ | ---------- | --------------------------- | ----------------- | -| + [title](#defs_pattern1_title) | No | string | No | - | - | -| + [type](#defs_pattern1_type) | No | const | No | - | - | -| - [fa_icon](#defs_pattern1_fa_icon) | No | string | No | - | - | -| - [description](#defs_pattern1_description) | No | string | No | - | - | -| - [required](#defs_pattern1_required) | No | array | No | - | - | -| + [properties](#defs_pattern1_properties) | No | object | No | In #/$defs/parameterOptions | - | -| - [dependentRequired](#defs_pattern1_dependentRequired) | No | object | No | - | - | +| Property | Type | +| ------------------------------------------------------- | ------ | +| + [title](#defs_pattern1_title) | string | +| + [type](#defs_pattern1_type) | const | +| - [fa_icon](#defs_pattern1_fa_icon) | string | +| - [description](#defs_pattern1_description) | string | +| - [required](#defs_pattern1_required) | array | +| + [properties](#defs_pattern1_properties) | object | +| - [dependentRequired](#defs_pattern1_dependentRequired) | object | #### `title` @@ -143,36 +151,35 @@ Specific value: `"object"` #### `fa_icon` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | - -| Restrictions | | -| --------------------------------- | ----------------------------------------------- | -| **Must match regular expression** | `^fa` [Test](https://regex101.com/?regex=%5Efa) | +| | | +| --------------------------------- | --------------------------------------------------- | +| **Type** | `string` | +| Restrictions | | +| --------------------------------- | --------------------------------------------------- | +| **Must match regular expression** | `^fa` [Test](https://regex101.com/?regex=%5Efa) | #### `description` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | #### `required` -| | | -| ------------ | ------- | -| **Type** | `array` | -| **Required** | No | +| | | +| -------- | ------- | +| **Type** | `array` | -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | False | -| **Additional items** | False | -| **Tuple validation** | N/A | +**Description:** Any parameters that _must_ be specified should be set as `required` in the schema. + +!!! tip + + Make sure you do set `null` as a default value for the parameter, otherwise it will have a value even if not supplied by the pipeline user and the required property will have no effect. + +This is not done with a property key like other things described below, but rather by naming +the parameter in the `required` array in the definition object / top-level object. + +For more information, see the [JSON schema documentation](https://json-schema.org/understanding-json-schema/reference/object.html#required-properties). #### `properties` @@ -183,9 +190,9 @@ Specific value: `"object"` | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/parameterOptions | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| --------------------------------------------- | ------- | ----------- | ---------- | ---------- | ----------------- | -| - [^.\*$](#defs_pattern1_properties_pattern1) | Yes | Combination | No | - | - | +| Property | Type | +| --------------------------------------------- | ----------- | +| - [^.\*$](#defs_pattern1_properties_pattern1) | Combination | ##### `^.*$` @@ -196,7 +203,6 @@ Specific value: `"object"` | | | | ------------------------- | ---------------- | | **Type** | `combining` | -| **Required** | No | | **Additional properties** | Any type allowed | | All of(Requirement) | @@ -209,40 +215,51 @@ Specific value: `"object"` | | | | ------------------------- | ------------------------ | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/standardKeywords | **Description:** Allowed standard JSON Schema properties. -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------------------------------------- | ------- | ---------------------------------------- | ---------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| - [type](#defs_pattern1_properties_pattern1_pattern2_i0_type) | No | Combination | No | - | The type of the parameter value. Can be one or more of these: \`['integer', 'boolean', 'number', 'string', 'null']\` | -| - [format](#defs_pattern1_properties_pattern1_pattern2_i0_format) | No | enum (of string) | No | - | The format of a parameter value with the 'string' type. This is used for additional validation on the structure of the value. | -| - [pattern](#defs_pattern1_properties_pattern1_pattern2_i0_pattern) | No | string | No | - | Check a parameter value of 'string' type against a regex pattern | -| - [description](#defs_pattern1_properties_pattern1_pattern2_i0_description) | No | string | No | - | The description of the current parameter | -| - [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | No | integer, boolean, string, number or null | No | In #/$defs/allTypes | Specifies a default value to use for this parameter | -| - [examples](#defs_pattern1_properties_pattern1_pattern2_i0_examples) | No | array | No | - | A list of examples for the current parameter | -| - [deprecated](#defs_pattern1_properties_pattern1_pattern2_i0_deprecated) | No | boolean | No | - | States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' | -| - [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | No | integer | No | In #/$defs/nonNegativeInteger | The minimum length a 'string' parameter value should be | -| - [maxLength](#defs_pattern1_properties_pattern1_pattern2_i0_maxLength) | No | integer | No | Same as [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | The maximum length a 'string' parameter value should be | -| - [minimum](#defs_pattern1_properties_pattern1_pattern2_i0_minimum) | No | number | No | - | The mimimum value an 'integer' or 'number' parameter value should be | -| - [exclusiveMinimum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMinimum) | No | number | No | - | The exclusive mimimum value an 'integer' or 'number' parameter value should be | -| - [maximum](#defs_pattern1_properties_pattern1_pattern2_i0_maximum) | No | number | No | - | The maximum value an 'integer' or 'number' parameter value should be | -| - [exclusiveMaximum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMaximum) | No | number | No | - | The exclusive maximum value an 'integer' or 'number' parameter value should be | -| - [multipleOf](#defs_pattern1_properties_pattern1_pattern2_i0_multipleOf) | No | number | No | - | The 'integer' or 'number' parameter value should be a multiple of this value | -| - [enum](#defs_pattern1_properties_pattern1_pattern2_i0_enum) | No | array | No | - | The parameter value should be one of the values specified in this enum array | -| - [const](#defs_pattern1_properties_pattern1_pattern2_i0_const) | No | integer, boolean, string, number or null | No | Same as [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | The parameter value should be equal to this value | +| Property | Type | +| ------------------------------------------------------------------------------------- | ---------------------------------------- | +| - [type](#defs_pattern1_properties_pattern1_pattern2_i0_type) | Combination | +| - [format](#defs_pattern1_properties_pattern1_pattern2_i0_format) | enum (of string) | +| - [pattern](#defs_pattern1_properties_pattern1_pattern2_i0_pattern) | string | +| - [description](#defs_pattern1_properties_pattern1_pattern2_i0_description) | string | +| - [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | integer, boolean, string, number or null | +| - [examples](#defs_pattern1_properties_pattern1_pattern2_i0_examples) | array | +| - [deprecated](#defs_pattern1_properties_pattern1_pattern2_i0_deprecated) | boolean | +| - [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | integer | +| - [maxLength](#defs_pattern1_properties_pattern1_pattern2_i0_maxLength) | integer | +| - [minimum](#defs_pattern1_properties_pattern1_pattern2_i0_minimum) | number | +| - [exclusiveMinimum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMinimum) | number | +| - [maximum](#defs_pattern1_properties_pattern1_pattern2_i0_maximum) | number | +| - [exclusiveMaximum](#defs_pattern1_properties_pattern1_pattern2_i0_exclusiveMaximum) | number | +| - [multipleOf](#defs_pattern1_properties_pattern1_pattern2_i0_multipleOf) | number | +| - [enum](#defs_pattern1_properties_pattern1_pattern2_i0_enum) | array | +| - [const](#defs_pattern1_properties_pattern1_pattern2_i0_const) | integer, boolean, string, number or null | ###### `type` | | | | ------------------------- | ---------------- | | **Type** | `combining` | -| **Required** | No | | **Additional properties** | Any type allowed | -**Description:** The type of the parameter value. Can be one or more of these: `['integer', 'boolean', 'number', 'string', 'null']` +**Description:** Variable type, taken from the [JSON schema keyword vocabulary](https://json-schema.org/understanding-json-schema/reference/type.html): + +- `string` +- `number` (float) +- `integer` +- `boolean` (true / false) +- `object` (currently only supported for file validation, see Nested parameters) +- `array` (currently only supported for file validation, see Nested parameters) + +Validation checks that the supplied parameter matches the expected type, and will fail with an error if not. + +This JSON schema type is _not_ supported: + +- `null` | Any of(Option) | | ------------------------------------------------------------------------------ | @@ -254,7 +271,6 @@ Specific value: `"object"` | | | | -------------- | ---------------------- | | **Type** | `enum (of string)` | -| **Required** | No | | **Defined in** | #/$defs/typeAnnotation | Must be one of: @@ -267,39 +283,55 @@ Must be one of: ###### `item 1` -| | | -| ------------ | ------- | -| **Type** | `array` | -| **Required** | No | - -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | False | -| **Additional items** | False | -| **Tuple validation** | See below | - +| | | +| ------------------------------------------------------------------------------------ | ----------- | +| **Type** | `array` | | Each item of this array must be | Description | | ------------------------------------------------------------------------------------ | ----------- | | [typeAnnotation](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i1_items) | - | -###### typeAnnotation +###### typeAnnotation | | | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------- | | **Type** | `enum (of string)` | -| **Required** | No | | **Same definition as** | [defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i0](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i0) | ###### `format` -| | | -| ------------ | ------------------ | -| **Type** | `enum (of string)` | -| **Required** | No | +| | | +| -------- | ------------------ | +| **Type** | `enum (of string)` | + +**Description:** Formats can be used to give additional validation checks against `string` values for certain properties. + +!!! example "Non-standard key (values)" -**Description:** The format of a parameter value with the 'string' type. This is used for additional validation on the structure of the value. + The `format` key is a [standard JSON schema key](https://json-schema.org/understanding-json-schema/reference/string.html#format), + however we primarily use it for validating file / directory path operations with non-standard schema values. + +Example usage is as follows: + +```json +{ + "type": "string", + "format": "file-path" +} +``` + +The available `format` types are below: + +`file-path` +: States that the provided value is a file. Does not check its existence, but it does check if the path is not a directory. + +`directory-path` +: States that the provided value is a directory. Does not check its existence, but if it exists, it does check that the path is not a file. + +`path` +: States that the provided value is a path (file or directory). Does not check its existence. + +`file-path-pattern` +: States that the provided value is a glob pattern that will be used to fetch files. Checks that the pattern is valid and that at least one file is found. Must be one of: @@ -316,13 +348,25 @@ Must be one of: ###### `pattern` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | -| **Format** | `regex` | +| | | +| ---------- | -------- | +| **Type** | `string` | +| **Format** | `regex` | + +**Description:** Regular expression which the string must match in order to pass validation. + +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/string.html#regular-expressions) + for details. +- Use for help with writing regular expressions. -**Description:** Check a parameter value of 'string' type against a regex pattern +For example, this pattern only validates if the supplied string ends in `.fastq`, `.fq`, `.fastq.gz` or `.fq.gz`: + +```json +{ + "type": "string", + "pattern": ".*.f(ast)?q(.gz)?$" +} +``` | Restrictions | | | -------------- | --- | @@ -330,70 +374,95 @@ Must be one of: ###### `description` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | -**Description:** The description of the current parameter +**Description:** A short description of what the parameter does, written in markdown. +Printed in docs and terminal help text. +Should be maximum one short sentence. ###### `default` | | | | -------------- | ------------------------------------------ | | **Type** | `integer, boolean, string, number or null` | -| **Required** | No | | **Defined in** | #/$defs/allTypes | -**Description:** Specifies a default value to use for this parameter +**Description:** Default value for the parameter. + +Should match the `type` and validation patterns set for the parameter in other fields. + +!!! tip + + If no default should be set, completely omit this key from the schema. + Do not set it as an empty string, or `null`. + + However, parameters with no defaults _should_ be set to `null` within your Nextflow config file. + +!!! note + + When creating a schema using `nf-core schema build`, this field will be automatically created based + on the default value defined in the pipeline config files. + + Generally speaking, the two should always be kept in sync to avoid unexpected problems and usage errors. + In some rare cases, this may not be possible (for example, a dynamic groovy expression cannot be encoded in JSON), + in which case try to specify as "sensible" a default within the schema as possible. ###### `examples` -| | | -| ------------ | ------- | -| **Type** | `array` | -| **Required** | No | +| | | +| -------- | ------- | +| **Type** | `array` | **Description:** A list of examples for the current parameter -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | False | -| **Additional items** | False | -| **Tuple validation** | See below | - | Each item of this array must be | Description | | ------------------------------------------------------------------------- | ----------- | | [allTypes](#defs_pattern1_properties_pattern1_pattern2_i0_examples_items) | - | -###### allTypes +###### allTypes | | | | ---------------------- | ----------------------------------------------------------------- | | **Type** | `integer, boolean, string, number or null` | -| **Required** | No | | **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | ###### `deprecated` -| | | -| ------------ | --------- | -| **Type** | `boolean` | -| **Required** | No | +| | | +| -------- | --------- | +| **Type** | `boolean` | + +**Description:** !!! example "Extended key" + +A boolean JSON flag that instructs anything using the schema that this parameter/field is deprecated and should not be used. This can be useful to generate messages telling the user that a parameter has changed between versions. -**Description:** States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage' +JSON schema states that this is an informative key only, but in `nf-schema` this will cause a validation error if the parameter/field is used. + +!!! tip + + Using the [`errorMessage`](#errormessage) keyword can be useful to provide more information about the deprecation and what to use instead. ###### `minLength` | | | | -------------- | -------------------------- | | **Type** | `integer` | -| **Required** | No | | **Defined in** | #/$defs/nonNegativeInteger | -**Description:** The minimum length a 'string' parameter value should be +**Description:** Specify a minimum / maximum string length with `minLength` and `maxLength`. + +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/string.html#length) + for details. + +```json +{ + "type": "string", + "minLength": 2, + "maxLength": 3 +} +``` | Restrictions | | | ------------ | ------ | @@ -404,83 +473,176 @@ Must be one of: | | | | ---------------------- | --------------------------------------------------------------------- | | **Type** | `integer` | -| **Required** | No | | **Same definition as** | [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | -**Description:** The maximum length a 'string' parameter value should be +**Description:** Specify a minimum / maximum string length with `minLength` and `maxLength`. + +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/string.html#length) + for details. + +```json +{ + "type": "string", + "minLength": 2, + "maxLength": 3 +} +``` ###### `minimum` -| | | -| ------------ | -------- | -| **Type** | `number` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `number` | + +**Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. + +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range) + for details. -**Description:** The mimimum value an 'integer' or 'number' parameter value should be +> If x is the value being validated, the following must hold true: +> +> - `x` ≥ `minimum` +> - `x` ≤ `maximum` + +```json +{ + "type": "number", + "minimum": 0, + "maximum": 100 +} +``` + +!!! note + + The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys. + Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys. + However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them. ###### `exclusiveMinimum` -| | | -| ------------ | -------- | -| **Type** | `number` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `number` | + +**Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. + +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range) + for details. + +> If x is the value being validated, the following must hold true: +> +> - `x` ≥ `minimum` +> - `x` ≤ `maximum` + +```json +{ + "type": "number", + "minimum": 0, + "maximum": 100 +} +``` -**Description:** The exclusive mimimum value an 'integer' or 'number' parameter value should be +!!! note + + The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys. + Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys. + However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them. ###### `maximum` -| | | -| ------------ | -------- | -| **Type** | `number` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `number` | + +**Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. + +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range) + for details. -**Description:** The maximum value an 'integer' or 'number' parameter value should be +> If x is the value being validated, the following must hold true: +> +> - `x` ≥ `minimum` +> - `x` ≤ `maximum` + +```json +{ + "type": "number", + "minimum": 0, + "maximum": 100 +} +``` + +!!! note + + The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys. + Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys. + However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them. ###### `exclusiveMaximum` -| | | -| ------------ | -------- | -| **Type** | `number` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `number` | -**Description:** The exclusive maximum value an 'integer' or 'number' parameter value should be +**Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. + +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range) + for details. + +> If x is the value being validated, the following must hold true: +> +> - `x` ≥ `minimum` +> - `x` ≤ `maximum` + +```json +{ + "type": "number", + "minimum": 0, + "maximum": 100 +} +``` + +!!! note + + The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys. + Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys. + However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them. ###### `multipleOf` -| | | -| ------------ | -------- | -| **Type** | `number` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `number` | **Description:** The 'integer' or 'number' parameter value should be a multiple of this value ###### `enum` -| | | -| ------------ | ------- | -| **Type** | `array` | -| **Required** | No | +| | | +| -------- | ------- | +| **Type** | `array` | + +**Description:** An array of enumerated values: the parameter must match one of these values exactly to pass validation. -**Description:** The parameter value should be one of the values specified in this enum array +- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/generic.html#enumerated-values) + for details. +- Available for strings, numbers and integers. -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | True | -| **Additional items** | False | -| **Tuple validation** | See below | +```json +{ + "enum": ["red", "amber", "green"] +} +``` | Each item of this array must be | Description | | --------------------------------------------------------------------- | ----------- | | [allTypes](#defs_pattern1_properties_pattern1_pattern2_i0_enum_items) | - | -###### allTypes +###### allTypes | | | | ---------------------- | ----------------------------------------------------------------- | | **Type** | `integer, boolean, string, number or null` | -| **Required** | No | | **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | ###### `const` @@ -488,7 +650,6 @@ Must be one of: | | | | ---------------------- | ----------------------------------------------------------------- | | **Type** | `integer, boolean, string, number or null` | -| **Required** | No | | **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | **Description:** The parameter value should be equal to this value @@ -498,30 +659,57 @@ Must be one of: | | | | ------------------------- | ---------------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/customKeywords | **Description:** Additional custom JSON Schema properties. -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ----------------------------------------------------------------------------- | ------- | ------- | ---------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| - [errorMessage](#defs_pattern1_properties_pattern1_pattern2_i1_errorMessage) | No | string | No | - | NON STANDARD OPTION: The custom error message to display in case validation against this parameter fails. Can also be used as a deprecation message if 'deprecated' is true | -| - [exists](#defs_pattern1_properties_pattern1_pattern2_i1_exists) | No | boolean | No | - | NON STANDARD OPTION: Check if a file exists. This parameter value needs to be a \`string\` type with one of these formats: \`['path', 'file-path', 'directory-path', 'file-path-pattern']\` | -| - [schema](#defs_pattern1_properties_pattern1_pattern2_i1_schema) | No | string | No | - | NON STANDARD OPTION: Check the given file against a schema passed to this keyword. Will only work when type is \`string\` and format is \`path\` or \`file-path\` | -| - [help_text](#defs_pattern1_properties_pattern1_pattern2_i1_help_text) | No | string | No | - | NON STANDARD OPTION: A more detailed help text | -| - [fa_icon](#defs_pattern1_properties_pattern1_pattern2_i1_fa_icon) | No | string | No | - | NON STANDARD OPTION: A font awesome icon to use in the nf-core parameter documentation | -| - [hidden](#defs_pattern1_properties_pattern1_pattern2_i1_hidden) | No | boolean | No | - | NON STANDARD OPTION: Hide this parameter from the help message and documentation | -| - [mimetype](#defs_pattern1_properties_pattern1_pattern2_i1_mimetype) | No | string | No | - | NON STANDARD OPTION: The MIME type of the parameter value | +| Property | Type | +| ----------------------------------------------------------------------------- | ------- | +| - [errorMessage](#defs_pattern1_properties_pattern1_pattern2_i1_errorMessage) | string | +| - [exists](#defs_pattern1_properties_pattern1_pattern2_i1_exists) | boolean | +| - [schema](#defs_pattern1_properties_pattern1_pattern2_i1_schema) | string | +| - [help_text](#defs_pattern1_properties_pattern1_pattern2_i1_help_text) | string | +| - [fa_icon](#defs_pattern1_properties_pattern1_pattern2_i1_fa_icon) | string | +| - [hidden](#defs_pattern1_properties_pattern1_pattern2_i1_hidden) | boolean | +| - [mimetype](#defs_pattern1_properties_pattern1_pattern2_i1_mimetype) | string | ###### `errorMessage` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | + +**Description:** +!!! example "Non-standard key" + +If validation fails, an error message is printed to the terminal, so that the end user knows what to fix. +However, these messages are not always very clear - especially to newcomers. + +To improve this experience, pipeline developers can set a custom `errorMessage` for a given parameter in a the schema. +If validation fails, this `errorMessage` is printed after the original error message to guide the pipeline users to an easier solution. + +For example, instead of printing: + +``` +* --input (samples.yml): "samples.yml" does not match regular expression [^\S+\.csv$] +``` + +We can set + +```json +"input": { + "type": "string", + "pattern": "^\S+\.csv$", + "errorMessage": "File name must end in '.csv' cannot contain spaces" +} +``` -**Description:** NON STANDARD OPTION: The custom error message to display in case validation against this parameter fails. Can also be used as a deprecation message if 'deprecated' is true +and get: + +``` +* --input (samples.yml): "samples.yml" does not match regular expression [^\S+\.csv$] (File name must end in '.csv' cannot contain spaces) +``` | Restrictions | | | -------------- | --- | @@ -529,21 +717,57 @@ Must be one of: ###### `exists` -| | | -| ------------ | --------- | -| **Type** | `boolean` | -| **Required** | No | +| | | +| -------- | --------- | +| **Type** | `boolean` | + +**Description:** When a format is specified for a value, you can provide the key `exists` set to true in order to validate that the provided path exists. Set this to `false` to validate that the path does not exist. + +Example usage is as follows: + +```json +{ + "type": "string", + "format": "file-path", + "exists": true +} +``` + +!!! note -**Description:** NON STANDARD OPTION: Check if a file exists. This parameter value needs to be a `string` type with one of these formats: `['path', 'file-path', 'directory-path', 'file-path-pattern']` + If the parameter is an S3, Azure or Google Cloud URI path, this validation is ignored. + +!!! warning + + Make sure to only use the `exists` keyword in combination with any file path format. Using `exists` on a normal string will assume that it's a file and will probably fail unexpectedly. ###### `schema` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | + +**Description:** Path to a JSON schema file used to validate _the supplied file_. + +Should only be set when `format` is `file-path`. + +!!! tip + + Setting this field is key to working with sample sheet validation and channel generation, as described in the next section of the nf-schema docs. -**Description:** NON STANDARD OPTION: Check the given file against a schema passed to this keyword. Will only work when type is `string` and format is `path` or `file-path` +These schema files are typically stored in the pipeline `assets` directory, but can be anywhere. + +```json +{ + "type": "string", + "format": "file-path", + "schema": "assets/foo_schema.json" +} +``` + +!!! note + + If the parameter is set to `null`, `false` or an empty string, this validation is ignored. The file won't be validated. | Restrictions | | | --------------------------------- | --------------------------------------------------------- | @@ -552,21 +776,35 @@ Must be one of: ###### `help_text` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | + +**Description:** +!!! example "Non-standard key" + +A longer text with usage help for the parameter, written in markdown. +Can include newlines with multiple paragraphs and more complex markdown structures. -**Description:** NON STANDARD OPTION: A more detailed help text +Typically hidden by default in documentation and interfaces, unless explicitly clicked / requested. ###### `fa_icon` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | + +**Description:** +!!! example "Non-standard key" + +A text identifier corresponding to an icon from [Font Awesome](https://fontawesome.com/). +Used for easier visual navigation of documentation and pipeline interfaces. + +Should be the font-awesome class names, for example: -**Description:** NON STANDARD OPTION: A font awesome icon to use in the nf-core parameter documentation +```json +"fa_icon": "fas fa-file-csv" +``` | Restrictions | | | --------------------------------- | ----------------------------------------------- | @@ -574,23 +812,43 @@ Must be one of: ###### `hidden` -| | | -| ------------ | --------- | -| **Type** | `boolean` | -| **Required** | No | +| | | +| -------- | --------- | +| **Type** | `boolean` | -**Description:** NON STANDARD OPTION: Hide this parameter from the help message and documentation +**Description:** +!!! example "Non-standard key" + +A boolean JSON flag that instructs anything using the schema that this is an unimportant parameter. + +Typically used to keep the pipeline docs / UIs uncluttered with common parameters which are not used by the majority of users. +For example, `--plaintext_email` and `--monochrome_logs`. + +```json +"hidden": true +``` ###### `mimetype` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | + +**Description:** MIME type for a file path. Setting this value informs downstream tools about what _kind_ of file is expected. + +Should only be set when `format` is `file-path`. -**Description:** NON STANDARD OPTION: The MIME type of the parameter value +- See a [list of common MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) -###### The following properties are required +```json +{ + "type": "string", + "format": "file-path", + "mimetype": "text/csv" +} +``` + +###### The following properties are required - type - description @@ -600,46 +858,34 @@ Must be one of: | | | | ------------------------- | ------------------------------------------------------------------------------------------------------------ | | **Type** | `object` | -| **Required** | No | | **Additional properties** | [Each additional property must conform to the schema](#defs_pattern1_dependentRequired_additionalProperties) | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ----------------------------------------------------------- | ------- | --------------- | ---------- | ---------- | ----------------- | -| - [](#defs_pattern1_dependentRequired_additionalProperties) | No | array of string | No | - | - | +| Property | Type | +| ----------------------------------------------------------- | --------------- | +| - [](#defs_pattern1_dependentRequired_additionalProperties) | array of string | ##### `additionalProperties` -| | | -| ------------ | ----------------- | -| **Type** | `array of string` | -| **Required** | No | -| **Default** | `[]` | - -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | True | -| **Additional items** | False | -| **Tuple validation** | See below | +| | | +| ----------- | ----------------- | +| **Type** | `array of string` | +| **Default** | `[]` | | Each item of this array must be | Description | | ----------------------------------------------------------------------------------------- | ----------- | | [additionalProperties items](#defs_pattern1_dependentRequired_additionalProperties_items) | - | -###### additionalProperties items +###### additionalProperties items -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ## `properties` | | | | ------------------------- | --------------------------------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | | **Same definition as** | [properties](#defs_pattern1_properties) | @@ -648,72 +894,50 @@ Must be one of: | | | | ------------------------- | ---------------------------------------------------------------------------------------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | [Each additional property must conform to the schema](#dependentRequired_additionalProperties) | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| --------------------------------------------- | ------- | --------------- | ---------- | ---------- | ----------------- | -| - [](#dependentRequired_additionalProperties) | No | array of string | No | - | - | +| Property | Type | +| --------------------------------------------- | --------------- | +| - [](#dependentRequired_additionalProperties) | array of string | ### `additionalProperties` -| | | -| ------------ | ----------------- | -| **Type** | `array of string` | -| **Required** | No | -| **Default** | `[]` | - -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | True | -| **Additional items** | False | -| **Tuple validation** | See below | +| | | +| ----------- | ----------------- | +| **Type** | `array of string` | +| **Default** | `[]` | | Each item of this array must be | Description | | --------------------------------------------------------------------------- | ----------- | | [additionalProperties items](#dependentRequired_additionalProperties_items) | - | -#### additionalProperties items +#### additionalProperties items -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ## `allOf` **Title:** Combine definition groups -| | | -| ------------ | ----------------- | -| **Type** | `array of object` | -| **Required** | No | - -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | False | -| **Additional items** | False | -| **Tuple validation** | See below | - -| Each item of this array must be | Description | -| ------------------------------- | ----------- | -| [allOf items](#allOf_items) | - | +| | | +| ------------------------------- | ----------------- | +| **Type** | `array of object` | +| Each item of this array must be | Description | +| ------------------------------- | ----------- | +| [allOf items](#allOf_items) | - | -### allOf items +### allOf items | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| -------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | -| + [$ref](#allOf_items_ref) | No | string | No | - | - | +| Property | Type | +| -------------------------- | ------ | +| + [$ref](#allOf_items_ref) | string | #### `$ref` diff --git a/docs/schemas/plugin/v1/schema.md b/docs/schemas/plugin/v1/schema.md index 2443928..89d8f3d 100644 --- a/docs/schemas/plugin/v1/schema.md +++ b/docs/schemas/plugin/v1/schema.md @@ -5,40 +5,28 @@ | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | **Description:** Schema for Nextflow plugin specs -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ----------------------------- | ------- | ----- | ---------- | ---------- | ----------------- | -| - [definitions](#definitions) | No | array | No | - | - | +| Property | Type | +| ----------------------------- | ----- | +| - [definitions](#definitions) | array | ## `definitions` -| | | -| ------------ | ------- | -| **Type** | `array` | -| **Required** | No | - -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | False | -| **Additional items** | False | -| **Tuple validation** | See below | - +| | | +| --------------------------------------- | ----------- | +| **Type** | `array` | | Each item of this array must be | Description | | --------------------------------------- | ----------- | | [definitions items](#definitions_items) | - | -### definitions items +### definitions items | | | | ------------------------- | ---------------- | | **Type** | `combining` | -| **Required** | No | | **Additional properties** | Any type allowed | | Any of(Option) | @@ -51,21 +39,19 @@ | | | | ------------------------- | -------------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/config_scope | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------ | ------- | ---------------- | ---------- | ---------- | ----------------- | -| - [type](#definitions_items_anyOf_i0_type) | No | enum (of string) | No | - | - | -| - [spec](#definitions_items_anyOf_i0_spec) | No | object | No | - | - | +| Property | Type | +| ------------------------------------------ | ---------------- | +| - [type](#definitions_items_anyOf_i0_type) | enum (of string) | +| - [spec](#definitions_items_anyOf_i0_spec) | object | ##### `type` -| | | -| ------------ | ------------------ | -| **Type** | `enum (of string)` | -| **Required** | No | +| | | +| -------- | ------------------ | +| **Type** | `enum (of string)` | Must be one of: @@ -76,54 +62,40 @@ Must be one of: | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | -| - [name](#definitions_items_anyOf_i0_spec_name) | No | string | No | - | - | -| - [description](#definitions_items_anyOf_i0_spec_description) | No | string | No | - | - | -| - [children](#definitions_items_anyOf_i0_spec_children) | No | array | No | - | - | +| Property | Type | +| ------------------------------------------------------------- | ------ | +| - [name](#definitions_items_anyOf_i0_spec_name) | string | +| - [description](#definitions_items_anyOf_i0_spec_description) | string | +| - [children](#definitions_items_anyOf_i0_spec_children) | array | ###### `name` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `description` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `children` -| | | -| ------------ | ------- | -| **Type** | `array` | -| **Required** | No | - -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | False | -| **Additional items** | False | -| **Tuple validation** | See below | - +| | | +| ----------------------------------------------------------------- | ----------- | +| **Type** | `array` | | Each item of this array must be | Description | | ----------------------------------------------------------------- | ----------- | | [children items](#definitions_items_anyOf_i0_spec_children_items) | - | -###### children items +###### children items | | | | ------------------------- | ---------------- | | **Type** | `combining` | -| **Required** | No | | **Additional properties** | Any type allowed | | Any of(Option) | @@ -136,7 +108,6 @@ Must be one of: | | | | ------------------------- | --------------------------------------------------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | | **Same definition as** | [definitions_items_anyOf_i0](#definitions_items_anyOf_i0) | @@ -145,21 +116,19 @@ Must be one of: | | | | ------------------------- | --------------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/config_option | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ----------------------------------------------------------------------- | ------- | ---------------- | ---------- | ---------- | ----------------- | -| - [type](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_type) | No | enum (of string) | No | - | - | -| - [spec](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec) | No | object | No | - | - | +| Property | Type | +| ----------------------------------------------------------------------- | ---------------- | +| - [type](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_type) | enum (of string) | +| - [spec](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec) | object | ###### `type` -| | | -| ------------ | ------------------ | -| **Type** | `enum (of string)` | -| **Required** | No | +| | | +| -------- | ------------------ | +| **Type** | `enum (of string)` | Must be one of: @@ -170,56 +139,50 @@ Must be one of: | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------------------------------------------ | ------- | ------ | ---------- | ---------- | ----------------- | -| - [name](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_name) | No | string | No | - | - | -| - [description](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_description) | No | string | No | - | - | -| - [type](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_type) | No | string | No | - | - | +| Property | Type | +| ------------------------------------------------------------------------------------------ | ------ | +| - [name](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_name) | string | +| - [description](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_description) | string | +| - [type](#definitions_items_anyOf_i0_spec_children_items_anyOf_i1_spec_type) | string | ###### `name` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `description` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `type` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | #### `function` | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/function | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------ | ------- | ---------------- | ---------- | ---------- | ----------------- | -| - [type](#definitions_items_anyOf_i1_type) | No | enum (of string) | No | - | - | -| - [spec](#definitions_items_anyOf_i1_spec) | No | object | No | - | - | +| Property | Type | +| ------------------------------------------ | ---------------- | +| - [type](#definitions_items_anyOf_i1_type) | enum (of string) | +| - [spec](#definitions_items_anyOf_i1_spec) | object | ##### `type` -| | | -| ------------ | ------------------ | -| **Type** | `enum (of string)` | -| **Required** | No | +| | | +| -------- | ------------------ | +| **Type** | `enum (of string)` | Must be one of: @@ -232,82 +195,65 @@ Must be one of: | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ------------------------------------------------------------- | ------- | --------------- | ---------- | ---------- | ----------------- | -| - [name](#definitions_items_anyOf_i1_spec_name) | No | string | No | - | - | -| - [description](#definitions_items_anyOf_i1_spec_description) | No | string | No | - | - | -| - [returnType](#definitions_items_anyOf_i1_spec_returnType) | No | string | No | - | - | -| - [parameters](#definitions_items_anyOf_i1_spec_parameters) | No | array of object | No | - | - | +| Property | Type | +| ------------------------------------------------------------- | --------------- | +| - [name](#definitions_items_anyOf_i1_spec_name) | string | +| - [description](#definitions_items_anyOf_i1_spec_description) | string | +| - [returnType](#definitions_items_anyOf_i1_spec_returnType) | string | +| - [parameters](#definitions_items_anyOf_i1_spec_parameters) | array of object | ###### `name` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `description` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `returnType` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `parameters` -| | | -| ------------ | ----------------- | -| **Type** | `array of object` | -| **Required** | No | - -| | Array restrictions | -| -------------------- | ------------------ | -| **Min items** | N/A | -| **Max items** | N/A | -| **Items unicity** | False | -| **Additional items** | False | -| **Tuple validation** | See below | - -| Each item of this array must be | Description | -| --------------------------------------------------------------------- | ----------- | -| [parameters items](#definitions_items_anyOf_i1_spec_parameters_items) | - | +| | | +| --------------------------------------------------------------------- | ----------------- | +| **Type** | `array of object` | +| Each item of this array must be | Description | +| --------------------------------------------------------------------- | ----------- | +| [parameters items](#definitions_items_anyOf_i1_spec_parameters_items) | - | -###### parameters items +###### parameters items | | | | ------------------------- | ---------------- | | **Type** | `object` | -| **Required** | No | | **Additional properties** | Any type allowed | -| Property | Pattern | Type | Deprecated | Definition | Title/Description | -| ---------------------------------------------------------------- | ------- | ------ | ---------- | ---------- | ----------------- | -| - [name](#definitions_items_anyOf_i1_spec_parameters_items_name) | No | string | No | - | - | -| - [type](#definitions_items_anyOf_i1_spec_parameters_items_type) | No | string | No | - | - | +| Property | Type | +| ---------------------------------------------------------------- | ------ | +| - [name](#definitions_items_anyOf_i1_spec_parameters_items_name) | string | +| - [type](#definitions_items_anyOf_i1_spec_parameters_items_type) | string | ###### `name` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | ###### `type` -| | | -| ------------ | -------- | -| **Type** | `string` | -| **Required** | No | +| | | +| -------- | -------- | +| **Type** | `string` | --- diff --git a/pipeline/v1/schema.json b/pipeline/v1/schema.json index 49cd090..a46de3b 100644 --- a/pipeline/v1/schema.json +++ b/pipeline/v1/schema.json @@ -32,6 +32,7 @@ }, "$defs": { "title": "Parameter groups", + "description": "A slightly strange use of a JSON schema standard that we use for Nextflow schema is `$defs`.\n\nJSON schema can group variables together in an `object`, but then the validation expects this structure to exist in the data that it is validating.\nIn reality, we have a very long \"flat\" list of parameters, all at the top level of `params.foo`.\n\nIn order to give some structure to log outputs, documentation and so on, we group parameters into `$defs`.\nEach `def` is an object with a title, description and so on.\nHowever, as they are under `$defs` scope they are effectively ignored by the validation and so their nested nature is not a problem.\nWe then bring the contents of each definition object back to the \"flat\" top level for validation using a series of `allOf` statements at the end of the schema,\nwhich reference the specific definition keys.", "type": "object", "patternProperties": { "^.*$": { @@ -53,7 +54,8 @@ "type": "string" }, "required": { - "type": "array" + "type": "array", + "description": "Any parameters that _must_ be specified should be set as `required` in the schema.\n\n!!! tip\n\n Make sure you do set `null` as a default value for the parameter, otherwise it will have a value even if not supplied by the pipeline user and the required property will have no effect.\n\nThis is not done with a property key like other things described below, but rather by naming\nthe parameter in the `required` array in the definition object / top-level object.\n\nFor more information, see the [JSON schema documentation](https://json-schema.org/understanding-json-schema/reference/object.html#required-properties)." }, "properties": { "$ref": "#/$defs/parameterOptions" @@ -134,7 +136,7 @@ "description": "Allowed standard JSON Schema properties.", "properties": { "type": { - "description": "The type of the parameter value. Can be one or more of these: `['integer', 'boolean', 'number', 'string', 'null']`", + "description": "Variable type, taken from the [JSON schema keyword vocabulary](https://json-schema.org/understanding-json-schema/reference/type.html):\n\n- `string`\n- `number` (float)\n- `integer`\n- `boolean` (true / false)\n- `object` (currently only supported for file validation, see Nested parameters)\n- `array` (currently only supported for file validation, see Nested parameters)\n\nValidation checks that the supplied parameter matches the expected type, and will fail with an error if not.\n\nThis JSON schema type is _not_ supported:\n\n- `null`", "anyOf": [ { "$ref": "#/$defs/typeAnnotation" }, { @@ -145,7 +147,7 @@ }, "format": { "type": "string", - "description": "The format of a parameter value with the 'string' type. This is used for additional validation on the structure of the value.", + "description": "Formats can be used to give additional validation checks against `string` values for certain properties.\n\n!!! example \"Non-standard key (values)\"\n\n The `format` key is a [standard JSON schema key](https://json-schema.org/understanding-json-schema/reference/string.html#format),\n however we primarily use it for validating file / directory path operations with non-standard schema values.\n\nExample usage is as follows:\n\n```json\n{\n \"type\": \"string\",\n \"format\": \"file-path\"\n}\n```\n\nThe available `format` types are below:\n\n`file-path`\n: States that the provided value is a file. Does not check its existence, but it does check if the path is not a directory.\n\n`directory-path`\n: States that the provided value is a directory. Does not check its existence, but if it exists, it does check that the path is not a file.\n\n`path`\n: States that the provided value is a path (file or directory). Does not check its existence.\n\n`file-path-pattern`\n: States that the provided value is a glob pattern that will be used to fetch files. Checks that the pattern is valid and that at least one file is found.", "enum": [ "file-path", "directory-path", @@ -163,15 +165,15 @@ "type": "string", "format": "regex", "minLength": 1, - "description": "Check a parameter value of 'string' type against a regex pattern" + "description": "Regular expression which the string must match in order to pass validation.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/string.html#regular-expressions)\n for details.\n- Use for help with writing regular expressions.\n\nFor example, this pattern only validates if the supplied string ends in `.fastq`, `.fq`, `.fastq.gz` or `.fq.gz`:\n\n```json\n{\n \"type\": \"string\",\n \"pattern\": \".*.f(ast)?q(.gz)?$\"\n}\n```" }, "description": { "type": "string", - "description": "The description of the current parameter" + "description": "A short description of what the parameter does, written in markdown.\nPrinted in docs and terminal help text.\nShould be maximum one short sentence." }, "default": { "$ref": "#/$defs/allTypes", - "description": "Specifies a default value to use for this parameter" + "description": "Default value for the parameter.\n\nShould match the `type` and validation patterns set for the parameter in other fields.\n\n!!! tip\n\n If no default should be set, completely omit this key from the schema.\n Do not set it as an empty string, or `null`.\n\n However, parameters with no defaults _should_ be set to `null` within your Nextflow config file.\n\n!!! note\n\n When creating a schema using `nf-core schema build`, this field will be automatically created based\n on the default value defined in the pipeline config files.\n\n Generally speaking, the two should always be kept in sync to avoid unexpected problems and usage errors.\n In some rare cases, this may not be possible (for example, a dynamic groovy expression cannot be encoded in JSON),\n in which case try to specify as \"sensible\" a default within the schema as possible." }, "examples": { "type": "array", @@ -182,31 +184,31 @@ }, "deprecated": { "type": "boolean", - "description": "States that the parameter is deprecated. Please provide a nice deprecation message using 'errorMessage'" + "description": "!!! example \"Extended key\"\n\nA boolean JSON flag that instructs anything using the schema that this parameter/field is deprecated and should not be used. This can be useful to generate messages telling the user that a parameter has changed between versions.\n\nJSON schema states that this is an informative key only, but in [nf-schema](https://nextflow-io.github.io/nf-schema/latest/) this will cause a validation error if the parameter/field is used.\n\n!!! tip\n\n Using the [`errorMessage`](#errormessage) keyword can be useful to provide more information about the deprecation and what to use instead." }, "minLength": { "$ref": "#/$defs/nonNegativeInteger", - "description": "The minimum length a 'string' parameter value should be" + "description": "Specify a minimum / maximum string length with `minLength` and `maxLength`.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/string.html#length)\n for details.\n\n```json\n{\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 3\n}\n```" }, "maxLength": { "$ref": "#/$defs/nonNegativeInteger", - "description": "The maximum length a 'string' parameter value should be" + "description": "Specify a minimum / maximum string length with `minLength` and `maxLength`.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/string.html#length)\n for details.\n\n```json\n{\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 3\n}\n```" }, "minimum": { "type": "number", - "description": "The mimimum value an 'integer' or 'number' parameter value should be" + "description": "Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range)\n for details.\n\n> If x is the value being validated, the following must hold true:\n>\n> - `x` ≥ `minimum`\n> - `x` ≤ `maximum`\n\n```json\n{\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n}\n```\n\n!!! note\n\n The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys.\n Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys.\n However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them." }, "exclusiveMinimum": { "type": "number", - "description": "The exclusive mimimum value an 'integer' or 'number' parameter value should be" + "description": "Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range)\n for details.\n\n> If x is the value being validated, the following must hold true:\n>\n> - `x` ≥ `minimum`\n> - `x` ≤ `maximum`\n\n```json\n{\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n}\n```\n\n!!! note\n\n The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys.\n Because [nf-schema](https://nextflow-io.github.io/nf-schema/latest/) uses stock JSON schema validation libraries, these _should_ work for validating keys.\n However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them." }, "maximum": { "type": "number", - "description": "The maximum value an 'integer' or 'number' parameter value should be" + "description": "Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range)\n for details.\n\n> If x is the value being validated, the following must hold true:\n>\n> - `x` ≥ `minimum`\n> - `x` ≤ `maximum`\n\n```json\n{\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n}\n```\n\n!!! note\n\n The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys.\n Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys.\n However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them." }, "exclusiveMaximum": { "type": "number", - "description": "The exclusive maximum value an 'integer' or 'number' parameter value should be" + "description": "Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/numeric.html#range)\n for details.\n\n> If x is the value being validated, the following must hold true:\n>\n> - `x` ≥ `minimum`\n> - `x` ≤ `maximum`\n\n```json\n{\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100\n}\n```\n\n!!! note\n\n The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys.\n Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys.\n However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them." }, "multipleOf": { "type": "number", @@ -218,7 +220,7 @@ "items": { "$ref": "#/$defs/allTypes" }, - "description": "The parameter value should be one of the values specified in this enum array" + "description": "An array of enumerated values: the parameter must match one of these values exactly to pass validation.\n\n- See the [JSON schema docs](https://json-schema.org/understanding-json-schema/reference/generic.html#enumerated-values)\n for details.\n- Available for strings, numbers and integers.\n\n```json\n{\n \"enum\": [\"red\", \"amber\", \"green\"]\n}\n```" }, "const": { "$ref": "#/$defs/allTypes", @@ -233,34 +235,34 @@ "errorMessage": { "type": "string", "minLength": 1, - "description": "NON STANDARD OPTION: The custom error message to display in case validation against this parameter fails. Can also be used as a deprecation message if 'deprecated' is true" + "description": "\n!!! example \"Non-standard key\"\n\nIf validation fails, an error message is printed to the terminal, so that the end user knows what to fix.\nHowever, these messages are not always very clear - especially to newcomers.\n\nTo improve this experience, pipeline developers can set a custom `errorMessage` for a given parameter in a the schema.\nIf validation fails, this `errorMessage` is printed after the original error message to guide the pipeline users to an easier solution.\n\nFor example, instead of printing:\n\n```\n* --input (samples.yml): \"samples.yml\" does not match regular expression [^\\S+\\.csv$]\n```\n\nWe can set\n\n```json\n\"input\": {\n \"type\": \"string\",\n \"pattern\": \"^\\S+\\.csv$\",\n \"errorMessage\": \"File name must end in '.csv' cannot contain spaces\"\n}\n```\n\nand get:\n\n```\n* --input (samples.yml): \"samples.yml\" does not match regular expression [^\\S+\\.csv$] (File name must end in '.csv' cannot contain spaces)\n```" }, "exists": { "type": "boolean", - "description": "NON STANDARD OPTION: Check if a file exists. This parameter value needs to be a `string` type with one of these formats: `['path', 'file-path', 'directory-path', 'file-path-pattern']`" + "description": "When a format is specified for a value, you can provide the key `exists` set to true in order to validate that the provided path exists. Set this to `false` to validate that the path does not exist.\n\nExample usage is as follows:\n\n```json\n{\n \"type\": \"string\",\n \"format\": \"file-path\",\n \"exists\": true\n}\n```\n\n!!! note\n\n If the parameter is an S3, Azure or Google Cloud URI path, this validation is ignored.\n\n!!! warning\n\n Make sure to only use the `exists` keyword in combination with any file path format. Using `exists` on a normal string will assume that it's a file and will probably fail unexpectedly." }, "schema": { "type": "string", "minLength": 1, "pattern": "\\.json$", - "description": "NON STANDARD OPTION: Check the given file against a schema passed to this keyword. Will only work when type is `string` and format is `path` or `file-path`" + "description": "Path to a JSON schema file used to validate _the supplied file_.\n\nShould only be set when `format` is `file-path`.\n\n!!! tip\n\n Setting this field is key to working with sample sheet validation and channel generation, as described in the sample sheet section of the [nf-schema docs](https://nextflow-io.github.io/nf-schema/latest/nextflow_schema/sample_sheet_schema_specification/).\n\nThese schema files are typically stored in the pipeline `assets` directory, but can be anywhere.\n\n```json\n{\n \"type\": \"string\",\n \"format\": \"file-path\",\n \"schema\": \"assets/foo_schema.json\"\n}\n```\n\n!!! note\n\n If the parameter is set to `null`, `false` or an empty string, this validation is ignored. The file won't be validated." }, "help_text": { "type": "string", - "description": "NON STANDARD OPTION: A more detailed help text" + "description": "\n!!! example \"Non-standard key\"\n\nA longer text with usage help for the parameter, written in markdown.\nCan include newlines with multiple paragraphs and more complex markdown structures.\n\nTypically hidden by default in documentation and interfaces, unless explicitly clicked / requested." }, "fa_icon": { "type": "string", "pattern": "^fa", - "description": "NON STANDARD OPTION: A font awesome icon to use in the nf-core parameter documentation" + "description": "\n!!! example \"Non-standard key\"\n\nA text identifier corresponding to an icon from [Font Awesome](https://fontawesome.com/).\nUsed for easier visual navigation of documentation and pipeline interfaces.\n\nShould be the font-awesome class names, for example:\n\n```json\n\"fa_icon\": \"fas fa-file-csv\"\n```" }, "hidden": { "type": "boolean", - "description": "NON STANDARD OPTION: Hide this parameter from the help message and documentation" + "description": "\n!!! example \"Non-standard key\"\n\nA boolean JSON flag that instructs anything using the schema that this is an unimportant parameter.\n\nTypically used to keep the pipeline docs / UIs uncluttered with common parameters which are not used by the majority of users.\nFor example, `--plaintext_email` and `--monochrome_logs`.\n\n```json\n\"hidden\": true\n```" }, "mimetype": { "type": "string", - "description": "NON STANDARD OPTION: The MIME type of the parameter value", + "description": "MIME type for a file path. Setting this value informs downstream tools about what _kind_ of file is expected.\n\nShould only be set when `format` is `file-path`.\n\n- See a [list of common MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)\n\n```json\n{\n \"type\": \"string\",\n \"format\": \"file-path\",\n \"mimetype\": \"text/csv\"\n}\n```", "deprecated": true, "errorMessage": "The 'mimetype' keyword is deprecated. Use 'pattern' or 'format' instead." } From 2738412e66e3f5e06d37102cc54541137ecf56e5 Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 14 Jan 2026 12:40:21 +0100 Subject: [PATCH 18/20] fix tables --- docs/schemas/pipeline/v1/schema.md | 239 +++++++++++++++++------------ docs/schemas/plugin/v1/schema.md | 132 ++++++++++------ generate_schema_docs.py | 7 - 3 files changed, 225 insertions(+), 153 deletions(-) diff --git a/docs/schemas/pipeline/v1/schema.md b/docs/schemas/pipeline/v1/schema.md index 1cc8c7d..b10736b 100644 --- a/docs/schemas/pipeline/v1/schema.md +++ b/docs/schemas/pipeline/v1/schema.md @@ -5,6 +5,7 @@ | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | **Description:** Schema to validate Nextflow pipeline input specs @@ -91,6 +92,7 @@ Specific value: `"object"` | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | **Description:** A slightly strange use of a JSON schema standard that we use for Nextflow schema is `$defs`. @@ -117,6 +119,7 @@ which reference the specific definition keys. | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | Property | Type | @@ -151,24 +154,28 @@ Specific value: `"object"` #### `fa_icon` -| | | -| --------------------------------- | --------------------------------------------------- | -| **Type** | `string` | -| Restrictions | | -| --------------------------------- | --------------------------------------------------- | -| **Must match regular expression** | `^fa` [Test](https://regex101.com/?regex=%5Efa) | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | + +| Restrictions | | +| --------------------------------- | ----------------------------------------------- | +| **Must match regular expression** | `^fa` [Test](https://regex101.com/?regex=%5Efa) | #### `description` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | #### `required` -| | | -| -------- | ------- | -| **Type** | `array` | +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | **Description:** Any parameters that _must_ be specified should be set as `required` in the schema. @@ -203,6 +210,7 @@ For more information, see the [JSON schema documentation](https://json-schema.or | | | | ------------------------- | ---------------- | | **Type** | `combining` | +| **Required** | No | | **Additional properties** | Any type allowed | | All of(Requirement) | @@ -215,6 +223,7 @@ For more information, see the [JSON schema documentation](https://json-schema.or | | | | ------------------------- | ------------------------ | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/standardKeywords | @@ -244,6 +253,7 @@ For more information, see the [JSON schema documentation](https://json-schema.or | | | | ------------------------- | ---------------- | | **Type** | `combining` | +| **Required** | No | | **Additional properties** | Any type allowed | **Description:** Variable type, taken from the [JSON schema keyword vocabulary](https://json-schema.org/understanding-json-schema/reference/type.html): @@ -252,8 +262,8 @@ For more information, see the [JSON schema documentation](https://json-schema.or - `number` (float) - `integer` - `boolean` (true / false) -- `object` (currently only supported for file validation, see Nested parameters) -- `array` (currently only supported for file validation, see Nested parameters) +- `object` (currently only supported for file validation) +- `array` (currently only supported for file validation) Validation checks that the supplied parameter matches the expected type, and will fail with an error if not. @@ -271,6 +281,7 @@ This JSON schema type is _not_ supported: | | | | -------------- | ---------------------- | | **Type** | `enum (of string)` | +| **Required** | No | | **Defined in** | #/$defs/typeAnnotation | Must be one of: @@ -283,9 +294,11 @@ Must be one of: ###### `item 1` -| | | -| ------------------------------------------------------------------------------------ | ----------- | -| **Type** | `array` | +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + | Each item of this array must be | Description | | ------------------------------------------------------------------------------------ | ----------- | | [typeAnnotation](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i1_items) | - | @@ -295,13 +308,15 @@ Must be one of: | | | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------- | | **Type** | `enum (of string)` | +| **Required** | No | | **Same definition as** | [defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i0](#defs_pattern1_properties_pattern1_pattern2_i0_type_anyOf_i0) | ###### `format` -| | | -| -------- | ------------------ | -| **Type** | `enum (of string)` | +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | **Description:** Formats can be used to give additional validation checks against `string` values for certain properties. @@ -348,10 +363,11 @@ Must be one of: ###### `pattern` -| | | -| ---------- | -------- | -| **Type** | `string` | -| **Format** | `regex` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | +| **Format** | `regex` | **Description:** Regular expression which the string must match in order to pass validation. @@ -374,9 +390,10 @@ For example, this pattern only validates if the supplied string ends in `.fastq` ###### `description` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | **Description:** A short description of what the parameter does, written in markdown. Printed in docs and terminal help text. @@ -387,6 +404,7 @@ Should be maximum one short sentence. | | | | -------------- | ------------------------------------------ | | **Type** | `integer, boolean, string, number or null` | +| **Required** | No | | **Defined in** | #/$defs/allTypes | **Description:** Default value for the parameter. @@ -411,9 +429,10 @@ Should match the `type` and validation patterns set for the parameter in other f ###### `examples` -| | | -| -------- | ------- | -| **Type** | `array` | +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | **Description:** A list of examples for the current parameter @@ -426,19 +445,21 @@ Should match the `type` and validation patterns set for the parameter in other f | | | | ---------------------- | ----------------------------------------------------------------- | | **Type** | `integer, boolean, string, number or null` | +| **Required** | No | | **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | ###### `deprecated` -| | | -| -------- | --------- | -| **Type** | `boolean` | +| | | +| ------------ | --------- | +| **Type** | `boolean` | +| **Required** | No | **Description:** !!! example "Extended key" A boolean JSON flag that instructs anything using the schema that this parameter/field is deprecated and should not be used. This can be useful to generate messages telling the user that a parameter has changed between versions. -JSON schema states that this is an informative key only, but in `nf-schema` this will cause a validation error if the parameter/field is used. +JSON schema states that this is an informative key only, but in [nf-schema](https://nextflow-io.github.io/nf-schema/latest/) this will cause a validation error if the parameter/field is used. !!! tip @@ -449,6 +470,7 @@ JSON schema states that this is an informative key only, but in `nf-schema` this | | | | -------------- | -------------------------- | | **Type** | `integer` | +| **Required** | No | | **Defined in** | #/$defs/nonNegativeInteger | **Description:** Specify a minimum / maximum string length with `minLength` and `maxLength`. @@ -473,6 +495,7 @@ JSON schema states that this is an informative key only, but in `nf-schema` this | | | | ---------------------- | --------------------------------------------------------------------- | | **Type** | `integer` | +| **Required** | No | | **Same definition as** | [minLength](#defs_pattern1_properties_pattern1_pattern2_i0_minLength) | **Description:** Specify a minimum / maximum string length with `minLength` and `maxLength`. @@ -490,9 +513,10 @@ JSON schema states that this is an informative key only, but in `nf-schema` this ###### `minimum` -| | | -| -------- | -------- | -| **Type** | `number` | +| | | +| ------------ | -------- | +| **Type** | `number` | +| **Required** | No | **Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. @@ -520,9 +544,10 @@ JSON schema states that this is an informative key only, but in `nf-schema` this ###### `exclusiveMinimum` -| | | -| -------- | -------- | -| **Type** | `number` | +| | | +| ------------ | -------- | +| **Type** | `number` | +| **Required** | No | **Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. @@ -545,14 +570,15 @@ JSON schema states that this is an informative key only, but in `nf-schema` this !!! note The JSON schema doc also mention `exclusiveMinimum`, `exclusiveMaximum` and `multipleOf` keys. - Because nf-schema uses stock JSON schema validation libraries, these _should_ work for validating keys. + Because [nf-schema](https://nextflow-io.github.io/nf-schema/latest/) uses stock JSON schema validation libraries, these _should_ work for validating keys. However, they are not officially supported within the Nextflow schema ecosystem and so some interfaces may not recognise them. ###### `maximum` -| | | -| -------- | -------- | -| **Type** | `number` | +| | | +| ------------ | -------- | +| **Type** | `number` | +| **Required** | No | **Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. @@ -580,9 +606,10 @@ JSON schema states that this is an informative key only, but in `nf-schema` this ###### `exclusiveMaximum` -| | | -| -------- | -------- | -| **Type** | `number` | +| | | +| ------------ | -------- | +| **Type** | `number` | +| **Required** | No | **Description:** Specify a minimum / maximum value for an integer or float number length with `minimum` and `maximum`. @@ -610,17 +637,19 @@ JSON schema states that this is an informative key only, but in `nf-schema` this ###### `multipleOf` -| | | -| -------- | -------- | -| **Type** | `number` | +| | | +| ------------ | -------- | +| **Type** | `number` | +| **Required** | No | **Description:** The 'integer' or 'number' parameter value should be a multiple of this value ###### `enum` -| | | -| -------- | ------- | -| **Type** | `array` | +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | **Description:** An array of enumerated values: the parameter must match one of these values exactly to pass validation. @@ -643,6 +672,7 @@ JSON schema states that this is an informative key only, but in `nf-schema` this | | | | ---------------------- | ----------------------------------------------------------------- | | **Type** | `integer, boolean, string, number or null` | +| **Required** | No | | **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | ###### `const` @@ -650,6 +680,7 @@ JSON schema states that this is an informative key only, but in `nf-schema` this | | | | ---------------------- | ----------------------------------------------------------------- | | **Type** | `integer, boolean, string, number or null` | +| **Required** | No | | **Same definition as** | [default](#defs_pattern1_properties_pattern1_pattern2_i0_default) | **Description:** The parameter value should be equal to this value @@ -659,6 +690,7 @@ JSON schema states that this is an informative key only, but in `nf-schema` this | | | | ------------------------- | ---------------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/customKeywords | @@ -676,9 +708,10 @@ JSON schema states that this is an informative key only, but in `nf-schema` this ###### `errorMessage` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | **Description:** !!! example "Non-standard key" @@ -717,9 +750,10 @@ and get: ###### `exists` -| | | -| -------- | --------- | -| **Type** | `boolean` | +| | | +| ------------ | --------- | +| **Type** | `boolean` | +| **Required** | No | **Description:** When a format is specified for a value, you can provide the key `exists` set to true in order to validate that the provided path exists. Set this to `false` to validate that the path does not exist. @@ -743,9 +777,10 @@ Example usage is as follows: ###### `schema` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | **Description:** Path to a JSON schema file used to validate _the supplied file_. @@ -753,7 +788,7 @@ Should only be set when `format` is `file-path`. !!! tip - Setting this field is key to working with sample sheet validation and channel generation, as described in the next section of the nf-schema docs. + Setting this field is key to working with sample sheet validation and channel generation, as described in the sample sheet section of the [nf-schema docs](https://nextflow-io.github.io/nf-schema/latest/nextflow_schema/sample_sheet_schema_specification/). These schema files are typically stored in the pipeline `assets` directory, but can be anywhere. @@ -776,9 +811,10 @@ These schema files are typically stored in the pipeline `assets` directory, but ###### `help_text` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | **Description:** !!! example "Non-standard key" @@ -790,9 +826,10 @@ Typically hidden by default in documentation and interfaces, unless explicitly c ###### `fa_icon` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | **Description:** !!! example "Non-standard key" @@ -812,9 +849,10 @@ Should be the font-awesome class names, for example: ###### `hidden` -| | | -| -------- | --------- | -| **Type** | `boolean` | +| | | +| ------------ | --------- | +| **Type** | `boolean` | +| **Required** | No | **Description:** !!! example "Non-standard key" @@ -830,9 +868,10 @@ For example, `--plaintext_email` and `--monochrome_logs`. ###### `mimetype` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | **Description:** MIME type for a file path. Setting this value informs downstream tools about what _kind_ of file is expected. @@ -858,6 +897,7 @@ Should only be set when `format` is `file-path`. | | | | ------------------------- | ------------------------------------------------------------------------------------------------------------ | | **Type** | `object` | +| **Required** | No | | **Additional properties** | [Each additional property must conform to the schema](#defs_pattern1_dependentRequired_additionalProperties) | | Property | Type | @@ -866,10 +906,11 @@ Should only be set when `format` is `file-path`. ##### `additionalProperties` -| | | -| ----------- | ----------------- | -| **Type** | `array of string` | -| **Default** | `[]` | +| | | +| ------------ | ----------------- | +| **Type** | `array of string` | +| **Required** | No | +| **Default** | `[]` | | Each item of this array must be | Description | | ----------------------------------------------------------------------------------------- | ----------- | @@ -877,15 +918,17 @@ Should only be set when `format` is `file-path`. ###### additionalProperties items -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ## `properties` | | | | ------------------------- | --------------------------------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | **Same definition as** | [properties](#defs_pattern1_properties) | @@ -894,6 +937,7 @@ Should only be set when `format` is `file-path`. | | | | ------------------------- | ---------------------------------------------------------------------------------------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | [Each additional property must conform to the schema](#dependentRequired_additionalProperties) | | Property | Type | @@ -902,10 +946,11 @@ Should only be set when `format` is `file-path`. ### `additionalProperties` -| | | -| ----------- | ----------------- | -| **Type** | `array of string` | -| **Default** | `[]` | +| | | +| ------------ | ----------------- | +| **Type** | `array of string` | +| **Required** | No | +| **Default** | `[]` | | Each item of this array must be | Description | | --------------------------------------------------------------------------- | ----------- | @@ -913,26 +958,30 @@ Should only be set when `format` is `file-path`. #### additionalProperties items -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ## `allOf` **Title:** Combine definition groups -| | | -| ------------------------------- | ----------------- | -| **Type** | `array of object` | -| Each item of this array must be | Description | -| ------------------------------- | ----------- | -| [allOf items](#allOf_items) | - | +| | | +| ------------ | ----------------- | +| **Type** | `array of object` | +| **Required** | No | + +| Each item of this array must be | Description | +| ------------------------------- | ----------- | +| [allOf items](#allOf_items) | - | ### allOf items | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | Property | Type | diff --git a/docs/schemas/plugin/v1/schema.md b/docs/schemas/plugin/v1/schema.md index 89d8f3d..754ba8b 100644 --- a/docs/schemas/plugin/v1/schema.md +++ b/docs/schemas/plugin/v1/schema.md @@ -5,6 +5,7 @@ | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | **Description:** Schema for Nextflow plugin specs @@ -15,9 +16,11 @@ ## `definitions` -| | | -| --------------------------------------- | ----------- | -| **Type** | `array` | +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + | Each item of this array must be | Description | | --------------------------------------- | ----------- | | [definitions items](#definitions_items) | - | @@ -27,6 +30,7 @@ | | | | ------------------------- | ---------------- | | **Type** | `combining` | +| **Required** | No | | **Additional properties** | Any type allowed | | Any of(Option) | @@ -39,6 +43,7 @@ | | | | ------------------------- | -------------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/config_scope | @@ -49,9 +54,10 @@ ##### `type` -| | | -| -------- | ------------------ | -| **Type** | `enum (of string)` | +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | Must be one of: @@ -62,6 +68,7 @@ Must be one of: | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | Property | Type | @@ -72,21 +79,25 @@ Must be one of: ###### `name` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `description` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `children` -| | | -| ----------------------------------------------------------------- | ----------- | -| **Type** | `array` | +| | | +| ------------ | ------- | +| **Type** | `array` | +| **Required** | No | + | Each item of this array must be | Description | | ----------------------------------------------------------------- | ----------- | | [children items](#definitions_items_anyOf_i0_spec_children_items) | - | @@ -96,6 +107,7 @@ Must be one of: | | | | ------------------------- | ---------------- | | **Type** | `combining` | +| **Required** | No | | **Additional properties** | Any type allowed | | Any of(Option) | @@ -108,6 +120,7 @@ Must be one of: | | | | ------------------------- | --------------------------------------------------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | **Same definition as** | [definitions_items_anyOf_i0](#definitions_items_anyOf_i0) | @@ -116,6 +129,7 @@ Must be one of: | | | | ------------------------- | --------------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/config_option | @@ -126,9 +140,10 @@ Must be one of: ###### `type` -| | | -| -------- | ------------------ | -| **Type** | `enum (of string)` | +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | Must be one of: @@ -139,6 +154,7 @@ Must be one of: | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | Property | Type | @@ -149,27 +165,31 @@ Must be one of: ###### `name` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `description` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `type` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | #### `function` | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | **Defined in** | #/$defs/function | @@ -180,9 +200,10 @@ Must be one of: ##### `type` -| | | -| -------- | ------------------ | -| **Type** | `enum (of string)` | +| | | +| ------------ | ------------------ | +| **Type** | `enum (of string)` | +| **Required** | No | Must be one of: @@ -195,6 +216,7 @@ Must be one of: | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | Property | Type | @@ -206,36 +228,42 @@ Must be one of: ###### `name` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `description` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `returnType` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `parameters` -| | | -| --------------------------------------------------------------------- | ----------------- | -| **Type** | `array of object` | -| Each item of this array must be | Description | -| --------------------------------------------------------------------- | ----------- | -| [parameters items](#definitions_items_anyOf_i1_spec_parameters_items) | - | +| | | +| ------------ | ----------------- | +| **Type** | `array of object` | +| **Required** | No | + +| Each item of this array must be | Description | +| --------------------------------------------------------------------- | ----------- | +| [parameters items](#definitions_items_anyOf_i1_spec_parameters_items) | - | ###### parameters items | | | | ------------------------- | ---------------- | | **Type** | `object` | +| **Required** | No | | **Additional properties** | Any type allowed | | Property | Type | @@ -245,15 +273,17 @@ Must be one of: ###### `name` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | ###### `type` -| | | -| -------- | -------- | -| **Type** | `string` | +| | | +| ------------ | -------- | +| **Type** | `string` | +| **Required** | No | --- diff --git a/generate_schema_docs.py b/generate_schema_docs.py index 1cf13b98..a4146fd 100644 --- a/generate_schema_docs.py +++ b/generate_schema_docs.py @@ -35,13 +35,6 @@ def clean_headings(markdown: str) -> str: flags=re.MULTILINE ) - # Remove "Required | No" table rows - markdown = re.sub( - r'^\|\s*\*\*Required\*\*\s*\|\s*No\s*\|\s*$\n', - '', - markdown, - flags=re.MULTILINE - ) return markdown From 0db7707fab325874596ee28f4a91e4a26e2eab04 Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 14 Jan 2026 12:40:32 +0100 Subject: [PATCH 19/20] fix description --- pipeline/v1/schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline/v1/schema.json b/pipeline/v1/schema.json index a46de3b..2325ecb 100644 --- a/pipeline/v1/schema.json +++ b/pipeline/v1/schema.json @@ -136,7 +136,7 @@ "description": "Allowed standard JSON Schema properties.", "properties": { "type": { - "description": "Variable type, taken from the [JSON schema keyword vocabulary](https://json-schema.org/understanding-json-schema/reference/type.html):\n\n- `string`\n- `number` (float)\n- `integer`\n- `boolean` (true / false)\n- `object` (currently only supported for file validation, see Nested parameters)\n- `array` (currently only supported for file validation, see Nested parameters)\n\nValidation checks that the supplied parameter matches the expected type, and will fail with an error if not.\n\nThis JSON schema type is _not_ supported:\n\n- `null`", + "description": "Variable type, taken from the [JSON schema keyword vocabulary](https://json-schema.org/understanding-json-schema/reference/type.html):\n\n- `string`\n- `number` (float)\n- `integer`\n- `boolean` (true / false)\n- `object` (currently only supported for file validation)\n- `array` (currently only supported for file validation)\n\nValidation checks that the supplied parameter matches the expected type, and will fail with an error if not.\n\nThis JSON schema type is _not_ supported:\n\n- `null`", "anyOf": [ { "$ref": "#/$defs/typeAnnotation" }, { From 31f3ec154a1ab67a524bd7a0aaa699c270329c8b Mon Sep 17 00:00:00 2001 From: mashehu Date: Wed, 14 Jan 2026 13:53:04 +0100 Subject: [PATCH 20/20] update index page --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 0bee4aa..2b6c4fc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,5 +11,5 @@ Welcome to the Nextflow Schemas documentation. This repository contains JSON sch This repository provides two main schemas: -- **[Pipeline Input Schema](schemas/v1/pipeline-input.md)**: Validates Nextflow pipeline input specifications, including parameter definitions, validation rules, and parameter grouping -- **[Plugin Schema](schemas/v1/plugin.md)**: Validates Nextflow plugin specifications, including configuration scopes and function definitions +- **[Pipeline Schema](schemas/pipeline/v1/schema)**: Validates Nextflow pipeline input specifications, including parameter definitions, validation rules, and parameter grouping +- **[Plugin Schema](schemas/plugin/v1/schema)**: Validates Nextflow plugin specifications, including configuration scopes and function definitions