spec-check


Namespec-check JSON
Version 0.1.4 PyPI version JSON
download
home_pageNone
SummaryTools for spec-driven development - validate specifications, test coverage, file structure, and documentation links
upload_time2025-10-30 03:29:32
maintainerNone
docs_urlNone
authorspec-check contributors
requires_python>=3.10
licenseNone
keywords spec specification testing validation linting documentation traceability requirements test-coverage markdown
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # spec-check

[![CI](https://github.com/TradeMe/spec-check/workflows/CI/badge.svg)](https://github.com/TradeMe/spec-check/actions)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)

Tools for spec-driven development - a toolkit for managing and validating project specifications and files.

## Features

### Lint Tool

The `lint` tool validates that all files in your repository match patterns in an allowlist. Think of it as the inverse of `.gitignore` - instead of specifying what to ignore, you specify what files are allowed.

Key features:
- Uses gitignore-style glob patterns for flexible file matching
- Respects `.gitignore` patterns by default
- Supports complex patterns including character classes (e.g., `[0-9]`)
- Validates that all tracked files match at least one allowlist pattern
- Reports unmatched files for easy identification

### Markdown Link Validator

The `check-links` tool validates hyperlinks in markdown files to ensure documentation stays up-to-date and accessible.

Key features:
- Validates internal links (relative paths) resolve correctly
- Checks anchor links point to existing headings
- Validates external URLs are accessible
- Supports private URL patterns that are skipped during validation
- Concurrent external URL checking for performance
- Respects `.gitignore` patterns by default

### Spec Coverage Validator

The `check-coverage` tool ensures 100% traceability between specification requirements and tests.

Key features:
- Extracts requirement IDs from spec files (e.g., REQ-001, NFR-001)
- Validates every requirement has at least one corresponding test
- Reports coverage percentage and uncovered requirements
- Uses pytest markers for machine-readable test-to-requirement linking
- Identifies tests without requirement markers

### Structure Validator

The `check-structure` tool enforces consistent spec-to-test structure alignment.

Key features:
- Verifies each spec file has a corresponding test file or directory
- Supports flexible naming conventions (kebab-case to snake_case)
- Allows unit tests without corresponding specs
- Reports specs without tests
- Ensures consistent project organization

## Installation

### Using uv (recommended)

```bash
uv pip install spec-check
```

### Using pip

```bash
pip install spec-check
```

### Development installation

```bash
# Clone the repository
git clone https://github.com/TradeMe/spec-check.git
cd spec-check

# Install with uv
uv venv
uv pip install -e ".[dev]"
```

## Configuration

spec-check can be configured via `pyproject.toml` for seamless integration with Python projects. This allows you to set default options without needing to pass command-line arguments every time.

### pyproject.toml Configuration

Add a `[tool.spec-check]` section to your `pyproject.toml`:

```toml
[tool.spec-check.lint]
allowlist = ".specallowlist"
use_gitignore = true

[tool.spec-check.check-links]
config = ".speclinkconfig"
timeout = 15
max_concurrent = 5
check_external = true
use_gitignore = true

[tool.spec-check.check-schema]
config = ".specschemaconfig"
use_gitignore = true
```

### Configuration Options

#### Lint Command (`[tool.spec-check.lint]`)
- `allowlist` (string): Path to allowlist file (default: `.specallowlist`)
- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)

#### Check Links Command (`[tool.spec-check.check-links]`)
- `config` (string): Path to config file for private URLs (default: `.speclinkconfig`)
- `timeout` (integer): Timeout for external URL requests in seconds (default: `10`)
- `max_concurrent` (integer): Maximum concurrent external URL requests (default: `10`)
- `check_external` (boolean): Validate external URLs (default: `true`)
- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)

#### Check Schema Command (`[tool.spec-check.check-schema]`)
- `config` (string): Path to schema config file (default: `.specschemaconfig`)
- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)

### Configuration Precedence

Configuration values are resolved in the following order (highest to lowest precedence):

1. **Command-line arguments** (e.g., `--timeout 30`)
2. **pyproject.toml configuration** (e.g., `timeout = 15` in `[tool.spec-check.check-links]`)
3. **Built-in defaults**

This means you can set project defaults in `pyproject.toml` and override them on the command line when needed.

## Usage

### Lint Command

Create a `.specallowlist` file in your project root with gitignore-style patterns:

```
# Documentation
*.md
docs/**/*.rst

# Source code
spec_check/**/*.py
tests/**/*.py

# Configuration files
*.toml
*.yaml
*.yml

# Specs with specific naming convention
specs/research-[0-9][0-9][0-9]-*.md
specs/design-*.md
```

Then run the linter:

```bash
# Lint the current directory
spec-check lint

# Lint a specific directory
spec-check lint /path/to/project

# Use a custom allowlist file
spec-check lint --allowlist .myallowlist

# Don't respect .gitignore patterns
spec-check lint --no-gitignore

# Verbose output
spec-check lint --verbose
```

### Exit Codes

- `0`: All files match the allowlist patterns
- `1`: Some files don't match or an error occurred

This makes it easy to integrate into CI/CD pipelines:

```yaml
# .github/workflows/ci.yml
- name: Validate file allowlist
  run: spec-check lint
```

### Check Links Command

Validate all hyperlinks in your markdown documentation:

```bash
# Check links in current directory
spec-check check-links

# Check links in a specific directory
spec-check check-links /path/to/docs

# Skip external URL validation (faster)
spec-check check-links --no-external

# Use a custom config file for private URLs
spec-check check-links --config .myconfigfile

# Set timeout for external URLs (default: 10 seconds)
spec-check check-links --timeout 30

# Limit concurrent requests (default: 10)
spec-check check-links --max-concurrent 5

# Verbose output
spec-check check-links --verbose
```

#### Private URL Configuration

Create a `.speclinkconfig` file to specify private URL patterns that should not be validated:

```
# Private domains (will skip any URL containing these domains)
internal.company.com
localhost

# Private URL prefixes (exact prefix match)
https://private.example.com/
http://localhost:
http://127.0.0.1:
```

#### What Gets Validated

- **Internal links**: `[text](./file.md)` - checked relative to the markdown file
- **Anchor links**: `[text](#heading)` - validated against headings in the file
- **Cross-file anchors**: `[text](./other.md#section)` - validates both file and heading
- **External URLs**: `[text](https://example.com)` - HTTP request to verify accessibility
- **Private URLs**: URLs matching configured patterns are skipped

#### CI/CD Integration

```yaml
# .github/workflows/ci.yml
- name: Validate documentation links
  run: spec-check check-links --no-external  # Skip external URLs in CI
```

### Check Coverage Command

Ensure all spec requirements have corresponding tests:

```bash
# Check coverage in current directory
spec-check check-coverage

# Check coverage in a specific directory
spec-check check-coverage /path/to/project

# Use custom specs and tests directories
spec-check check-coverage --specs-dir my-specs --tests-dir my-tests
```

#### Marking Tests with Requirements

Use pytest markers to link tests to requirements:

```python
import pytest

@pytest.mark.req("REQ-001")
def test_inline_link_parsing():
    """Test that inline links are parsed correctly."""
    # Test implementation
    assert True

# For tests covering multiple requirements:
@pytest.mark.req("REQ-002", "REQ-003")
def test_reference_style_links():
    """Test reference-style link parsing."""
    # Test implementation
    assert True
```

#### CI/CD Integration

```yaml
# .github/workflows/ci.yml
- name: Validate spec coverage
  run: spec-check check-coverage
```

### Check Structure Command

Validate spec-to-test structure alignment:

```bash
# Check structure in current directory
spec-check check-structure

# Check structure in a specific directory
spec-check check-structure /path/to/project

# Use custom specs and tests directories
spec-check check-structure --specs-dir my-specs --tests-dir my-tests
```

#### Structure Conventions

For a spec file `specs/feature-name.md`, the tool expects either:
- `tests/test_feature_name.py` (single test file)
- `tests/feature_name/` (test directory)

This allows unit tests without corresponding specs while ensuring all specs have requirement tests.

#### CI/CD Integration

```yaml
# .github/workflows/ci.yml
- name: Validate spec structure
  run: spec-check check-structure
```

## Pattern Syntax

The allowlist uses gitignore-style glob patterns:

- `*` - matches any number of characters (except `/`)
- `**` - matches any number of directories
- `?` - matches a single character
- `[abc]` - matches one character in the set
- `[0-9]` - matches one character in the range
- `!pattern` - negates a pattern (matches files that don't match the pattern)

### Examples

```
# Match all Python files
*.py

# Match Python files in src directory and subdirectories
src/**/*.py

# Match numbered specification files
specs/spec-[0-9][0-9][0-9].md

# Match files with specific naming pattern
docs/architecture-*.md
docs/design-*.md

# Match multiple file types
*.{yml,yaml}
```

## Use Cases

1. **Enforce file organization**: Ensure all files follow your project's structure
2. **Validate spec compliance**: Make sure all files match expected patterns
3. **CI/CD validation**: Automatically check that no unexpected files are committed
4. **Documentation enforcement**: Ensure all code files have matching documentation
5. **Naming convention enforcement**: Validate files follow naming standards
6. **Test-to-requirement traceability**: Guarantee 100% requirement coverage with automated validation
7. **Spec-driven development**: Enforce consistent spec-to-test structure for better maintainability
8. **Documentation quality**: Ensure all links in documentation are valid and up-to-date

## Example: Research Paper Repository

```
# .specallowlist
# Papers must follow naming: research-NNN-title.md
papers/research-[0-9][0-9][0-9]-*.md

# Supporting data files
papers/data-[0-9][0-9][0-9]-*.csv
papers/figures-[0-9][0-9][0-9]-*.{png,jpg,svg}

# Project files
*.md
LICENSE
.gitignore
.specallowlist
```

## Development

### Running Tests

```bash
# Activate virtual environment
source .venv/bin/activate

# Run tests
pytest tests/ -v

# Run tests with coverage
pytest tests/ -v --cov=spec_check --cov-report=term-missing
```

### Linting

```bash
# Check code with ruff
ruff check spec_check/ tests/

# Format code with ruff
ruff format spec_check/ tests/
```

### Building

```bash
# Build with flit
uv pip install flit
flit build
```

## Roadmap

Future tools planned for spec-check:

- **spec-graph**: Visualize dependencies between spec files
- **spec-init**: Initialize new spec-driven projects
- **spec-sync**: Keep specs in sync with implementation
- **spec-extract**: Extract requirements from code comments into spec files

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT License - see LICENSE file for details.


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "spec-check",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "spec, specification, testing, validation, linting, documentation, traceability, requirements, test-coverage, markdown",
    "author": "spec-check contributors",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/b4/f4/9a17aa1d15fca79f3c702897e01eee41e367666bf563f9b85a38c2ffe460/spec_check-0.1.4.tar.gz",
    "platform": null,
    "description": "# spec-check\n\n[![CI](https://github.com/TradeMe/spec-check/workflows/CI/badge.svg)](https://github.com/TradeMe/spec-check/actions)\n[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)\n\nTools for spec-driven development - a toolkit for managing and validating project specifications and files.\n\n## Features\n\n### Lint Tool\n\nThe `lint` tool validates that all files in your repository match patterns in an allowlist. Think of it as the inverse of `.gitignore` - instead of specifying what to ignore, you specify what files are allowed.\n\nKey features:\n- Uses gitignore-style glob patterns for flexible file matching\n- Respects `.gitignore` patterns by default\n- Supports complex patterns including character classes (e.g., `[0-9]`)\n- Validates that all tracked files match at least one allowlist pattern\n- Reports unmatched files for easy identification\n\n### Markdown Link Validator\n\nThe `check-links` tool validates hyperlinks in markdown files to ensure documentation stays up-to-date and accessible.\n\nKey features:\n- Validates internal links (relative paths) resolve correctly\n- Checks anchor links point to existing headings\n- Validates external URLs are accessible\n- Supports private URL patterns that are skipped during validation\n- Concurrent external URL checking for performance\n- Respects `.gitignore` patterns by default\n\n### Spec Coverage Validator\n\nThe `check-coverage` tool ensures 100% traceability between specification requirements and tests.\n\nKey features:\n- Extracts requirement IDs from spec files (e.g., REQ-001, NFR-001)\n- Validates every requirement has at least one corresponding test\n- Reports coverage percentage and uncovered requirements\n- Uses pytest markers for machine-readable test-to-requirement linking\n- Identifies tests without requirement markers\n\n### Structure Validator\n\nThe `check-structure` tool enforces consistent spec-to-test structure alignment.\n\nKey features:\n- Verifies each spec file has a corresponding test file or directory\n- Supports flexible naming conventions (kebab-case to snake_case)\n- Allows unit tests without corresponding specs\n- Reports specs without tests\n- Ensures consistent project organization\n\n## Installation\n\n### Using uv (recommended)\n\n```bash\nuv pip install spec-check\n```\n\n### Using pip\n\n```bash\npip install spec-check\n```\n\n### Development installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/TradeMe/spec-check.git\ncd spec-check\n\n# Install with uv\nuv venv\nuv pip install -e \".[dev]\"\n```\n\n## Configuration\n\nspec-check can be configured via `pyproject.toml` for seamless integration with Python projects. This allows you to set default options without needing to pass command-line arguments every time.\n\n### pyproject.toml Configuration\n\nAdd a `[tool.spec-check]` section to your `pyproject.toml`:\n\n```toml\n[tool.spec-check.lint]\nallowlist = \".specallowlist\"\nuse_gitignore = true\n\n[tool.spec-check.check-links]\nconfig = \".speclinkconfig\"\ntimeout = 15\nmax_concurrent = 5\ncheck_external = true\nuse_gitignore = true\n\n[tool.spec-check.check-schema]\nconfig = \".specschemaconfig\"\nuse_gitignore = true\n```\n\n### Configuration Options\n\n#### Lint Command (`[tool.spec-check.lint]`)\n- `allowlist` (string): Path to allowlist file (default: `.specallowlist`)\n- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)\n\n#### Check Links Command (`[tool.spec-check.check-links]`)\n- `config` (string): Path to config file for private URLs (default: `.speclinkconfig`)\n- `timeout` (integer): Timeout for external URL requests in seconds (default: `10`)\n- `max_concurrent` (integer): Maximum concurrent external URL requests (default: `10`)\n- `check_external` (boolean): Validate external URLs (default: `true`)\n- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)\n\n#### Check Schema Command (`[tool.spec-check.check-schema]`)\n- `config` (string): Path to schema config file (default: `.specschemaconfig`)\n- `use_gitignore` (boolean): Respect .gitignore patterns (default: `true`)\n\n### Configuration Precedence\n\nConfiguration values are resolved in the following order (highest to lowest precedence):\n\n1. **Command-line arguments** (e.g., `--timeout 30`)\n2. **pyproject.toml configuration** (e.g., `timeout = 15` in `[tool.spec-check.check-links]`)\n3. **Built-in defaults**\n\nThis means you can set project defaults in `pyproject.toml` and override them on the command line when needed.\n\n## Usage\n\n### Lint Command\n\nCreate a `.specallowlist` file in your project root with gitignore-style patterns:\n\n```\n# Documentation\n*.md\ndocs/**/*.rst\n\n# Source code\nspec_check/**/*.py\ntests/**/*.py\n\n# Configuration files\n*.toml\n*.yaml\n*.yml\n\n# Specs with specific naming convention\nspecs/research-[0-9][0-9][0-9]-*.md\nspecs/design-*.md\n```\n\nThen run the linter:\n\n```bash\n# Lint the current directory\nspec-check lint\n\n# Lint a specific directory\nspec-check lint /path/to/project\n\n# Use a custom allowlist file\nspec-check lint --allowlist .myallowlist\n\n# Don't respect .gitignore patterns\nspec-check lint --no-gitignore\n\n# Verbose output\nspec-check lint --verbose\n```\n\n### Exit Codes\n\n- `0`: All files match the allowlist patterns\n- `1`: Some files don't match or an error occurred\n\nThis makes it easy to integrate into CI/CD pipelines:\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate file allowlist\n  run: spec-check lint\n```\n\n### Check Links Command\n\nValidate all hyperlinks in your markdown documentation:\n\n```bash\n# Check links in current directory\nspec-check check-links\n\n# Check links in a specific directory\nspec-check check-links /path/to/docs\n\n# Skip external URL validation (faster)\nspec-check check-links --no-external\n\n# Use a custom config file for private URLs\nspec-check check-links --config .myconfigfile\n\n# Set timeout for external URLs (default: 10 seconds)\nspec-check check-links --timeout 30\n\n# Limit concurrent requests (default: 10)\nspec-check check-links --max-concurrent 5\n\n# Verbose output\nspec-check check-links --verbose\n```\n\n#### Private URL Configuration\n\nCreate a `.speclinkconfig` file to specify private URL patterns that should not be validated:\n\n```\n# Private domains (will skip any URL containing these domains)\ninternal.company.com\nlocalhost\n\n# Private URL prefixes (exact prefix match)\nhttps://private.example.com/\nhttp://localhost:\nhttp://127.0.0.1:\n```\n\n#### What Gets Validated\n\n- **Internal links**: `[text](./file.md)` - checked relative to the markdown file\n- **Anchor links**: `[text](#heading)` - validated against headings in the file\n- **Cross-file anchors**: `[text](./other.md#section)` - validates both file and heading\n- **External URLs**: `[text](https://example.com)` - HTTP request to verify accessibility\n- **Private URLs**: URLs matching configured patterns are skipped\n\n#### CI/CD Integration\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate documentation links\n  run: spec-check check-links --no-external  # Skip external URLs in CI\n```\n\n### Check Coverage Command\n\nEnsure all spec requirements have corresponding tests:\n\n```bash\n# Check coverage in current directory\nspec-check check-coverage\n\n# Check coverage in a specific directory\nspec-check check-coverage /path/to/project\n\n# Use custom specs and tests directories\nspec-check check-coverage --specs-dir my-specs --tests-dir my-tests\n```\n\n#### Marking Tests with Requirements\n\nUse pytest markers to link tests to requirements:\n\n```python\nimport pytest\n\n@pytest.mark.req(\"REQ-001\")\ndef test_inline_link_parsing():\n    \"\"\"Test that inline links are parsed correctly.\"\"\"\n    # Test implementation\n    assert True\n\n# For tests covering multiple requirements:\n@pytest.mark.req(\"REQ-002\", \"REQ-003\")\ndef test_reference_style_links():\n    \"\"\"Test reference-style link parsing.\"\"\"\n    # Test implementation\n    assert True\n```\n\n#### CI/CD Integration\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate spec coverage\n  run: spec-check check-coverage\n```\n\n### Check Structure Command\n\nValidate spec-to-test structure alignment:\n\n```bash\n# Check structure in current directory\nspec-check check-structure\n\n# Check structure in a specific directory\nspec-check check-structure /path/to/project\n\n# Use custom specs and tests directories\nspec-check check-structure --specs-dir my-specs --tests-dir my-tests\n```\n\n#### Structure Conventions\n\nFor a spec file `specs/feature-name.md`, the tool expects either:\n- `tests/test_feature_name.py` (single test file)\n- `tests/feature_name/` (test directory)\n\nThis allows unit tests without corresponding specs while ensuring all specs have requirement tests.\n\n#### CI/CD Integration\n\n```yaml\n# .github/workflows/ci.yml\n- name: Validate spec structure\n  run: spec-check check-structure\n```\n\n## Pattern Syntax\n\nThe allowlist uses gitignore-style glob patterns:\n\n- `*` - matches any number of characters (except `/`)\n- `**` - matches any number of directories\n- `?` - matches a single character\n- `[abc]` - matches one character in the set\n- `[0-9]` - matches one character in the range\n- `!pattern` - negates a pattern (matches files that don't match the pattern)\n\n### Examples\n\n```\n# Match all Python files\n*.py\n\n# Match Python files in src directory and subdirectories\nsrc/**/*.py\n\n# Match numbered specification files\nspecs/spec-[0-9][0-9][0-9].md\n\n# Match files with specific naming pattern\ndocs/architecture-*.md\ndocs/design-*.md\n\n# Match multiple file types\n*.{yml,yaml}\n```\n\n## Use Cases\n\n1. **Enforce file organization**: Ensure all files follow your project's structure\n2. **Validate spec compliance**: Make sure all files match expected patterns\n3. **CI/CD validation**: Automatically check that no unexpected files are committed\n4. **Documentation enforcement**: Ensure all code files have matching documentation\n5. **Naming convention enforcement**: Validate files follow naming standards\n6. **Test-to-requirement traceability**: Guarantee 100% requirement coverage with automated validation\n7. **Spec-driven development**: Enforce consistent spec-to-test structure for better maintainability\n8. **Documentation quality**: Ensure all links in documentation are valid and up-to-date\n\n## Example: Research Paper Repository\n\n```\n# .specallowlist\n# Papers must follow naming: research-NNN-title.md\npapers/research-[0-9][0-9][0-9]-*.md\n\n# Supporting data files\npapers/data-[0-9][0-9][0-9]-*.csv\npapers/figures-[0-9][0-9][0-9]-*.{png,jpg,svg}\n\n# Project files\n*.md\nLICENSE\n.gitignore\n.specallowlist\n```\n\n## Development\n\n### Running Tests\n\n```bash\n# Activate virtual environment\nsource .venv/bin/activate\n\n# Run tests\npytest tests/ -v\n\n# Run tests with coverage\npytest tests/ -v --cov=spec_check --cov-report=term-missing\n```\n\n### Linting\n\n```bash\n# Check code with ruff\nruff check spec_check/ tests/\n\n# Format code with ruff\nruff format spec_check/ tests/\n```\n\n### Building\n\n```bash\n# Build with flit\nuv pip install flit\nflit build\n```\n\n## Roadmap\n\nFuture tools planned for spec-check:\n\n- **spec-graph**: Visualize dependencies between spec files\n- **spec-init**: Initialize new spec-driven projects\n- **spec-sync**: Keep specs in sync with implementation\n- **spec-extract**: Extract requirements from code comments into spec files\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nMIT License - see LICENSE file for details.\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Tools for spec-driven development - validate specifications, test coverage, file structure, and documentation links",
    "version": "0.1.4",
    "project_urls": {
        "Changelog": "https://github.com/TradeMe/spec-check/releases",
        "Homepage": "https://github.com/TradeMe/spec-check",
        "Issues": "https://github.com/TradeMe/spec-check/issues",
        "Repository": "https://github.com/TradeMe/spec-check"
    },
    "split_keywords": [
        "spec",
        " specification",
        " testing",
        " validation",
        " linting",
        " documentation",
        " traceability",
        " requirements",
        " test-coverage",
        " markdown"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a92ffe894f691d63d777de68d18fa16849a7a5a403774545db9fe41929a3ed4d",
                "md5": "0181db703e1f5db80eb8baf8c8247432",
                "sha256": "7b266efcbdc3a201e1a339cde9387a6aeb61a0025e107e43f3ee1b5805d896fe"
            },
            "downloads": -1,
            "filename": "spec_check-0.1.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "0181db703e1f5db80eb8baf8c8247432",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 63289,
            "upload_time": "2025-10-30T03:29:30",
            "upload_time_iso_8601": "2025-10-30T03:29:30.475458Z",
            "url": "https://files.pythonhosted.org/packages/a9/2f/fe894f691d63d777de68d18fa16849a7a5a403774545db9fe41929a3ed4d/spec_check-0.1.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b4f49a17aa1d15fca79f3c702897e01eee41e367666bf563f9b85a38c2ffe460",
                "md5": "372029c64094aa348a8940b20b298a65",
                "sha256": "8d8e4cee99a678518a6b93d446a69d0acd261e35daf4a70adf7150f1164d1f14"
            },
            "downloads": -1,
            "filename": "spec_check-0.1.4.tar.gz",
            "has_sig": false,
            "md5_digest": "372029c64094aa348a8940b20b298a65",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 220879,
            "upload_time": "2025-10-30T03:29:32",
            "upload_time_iso_8601": "2025-10-30T03:29:32.224318Z",
            "url": "https://files.pythonhosted.org/packages/b4/f4/9a17aa1d15fca79f3c702897e01eee41e367666bf563f9b85a38c2ffe460/spec_check-0.1.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-30 03:29:32",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "TradeMe",
    "github_project": "spec-check",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "spec-check"
}
        
Elapsed time: 1.73533s