pyopenapi-gen


Namepyopenapi-gen JSON
Version 0.10.2 PyPI version JSON
download
home_pageNone
SummaryModern, async-first Python client generator for OpenAPI specifications with advanced cycle detection and unified type resolution
upload_time2025-07-17 12:38:09
maintainerNone
docs_urlNone
authorNone
requires_python<4.0.0,>=3.12
licenseMIT
keywords api async client code-generation enterprise generator http openapi python rest swagger type-safe
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # PyOpenAPI Generator

[![Python](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://python.org)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

**Modern, enterprise-grade Python client generator for OpenAPI specifications.**

PyOpenAPI Generator creates async-first, strongly-typed Python clients from OpenAPI specs. Built for production use with advanced cycle detection, unified type resolution, and zero runtime dependencies.

## πŸš€ Why PyOpenAPI Generator?

### Modern Python Architecture
- **Async-First**: Built for `async`/`await` with `httpx` for optimal performance
- **Type Safety**: Complete type hints, dataclass models, and mypy compatibility
- **Zero Dependencies**: Generated clients are completely self-contained

### Enterprise-Grade Reliability
- **Advanced Cycle Detection**: Handles complex schemas with circular references
- **Unified Type Resolution**: Consistent, testable type resolution across all components
- **Production Ready**: Comprehensive error handling and robust code generation

### Developer Experience
- **IDE Support**: Rich autocomplete and type checking in modern IDEs
- **Tag Organization**: Operations grouped by OpenAPI tags for intuitive navigation
- **Smart Features**: Auto-detected pagination, response unwrapping, and structured exceptions

## πŸ“¦ Installation

```bash
pip install pyopenapi-gen
```

Or with Poetry:
```bash
poetry add pyopenapi-gen
```

## ⚑ Quick Start

### 1. Generate Your First Client
```bash
pyopenapi-gen openapi.yaml \
  --project-root . \
  --output-package my_api_client
```

### 2. Use the Generated Client
```python
import asyncio
from my_api_client.client import APIClient
from my_api_client.core.config import ClientConfig

async def main():
    config = ClientConfig(base_url="https://api.example.com")
    async with APIClient(config) as client:
        # Type-safe API calls with full IDE support
        users = await client.users.list_users(page=1)
        
        # Automatic pagination
        async for user in client.users.list_users_paginated():
            print(f"User: {user.name}")

asyncio.run(main())
```

## πŸ”§ Configuration Options

### Standalone Client (Default)
```bash
pyopenapi-gen openapi.yaml \
  --project-root . \
  --output-package my_api_client
```
Creates self-contained client with embedded core dependencies.

### Shared Core (Multiple Clients)
```bash
pyopenapi-gen openapi.yaml \
  --project-root . \
  --output-package clients.api_client \
  --core-package clients.core
```
Multiple clients share a single core implementation.

### Additional Options
```bash
--force           # Overwrite without prompting
--no-postprocess  # Skip formatting and type checking
```

## ✨ Key Features

| Feature | Description |
|---------|-------------|
| πŸ”’ **Type Safety** | Complete type hints, dataclass models, and mypy compatibility |
| ⚑ **Async-First** | Built for modern Python `async`/`await` patterns with `httpx` |
| πŸ”Œ **Pluggable Auth** | Bearer, API key, OAuth2, and custom authentication strategies |
| πŸ”„ **Smart Pagination** | Auto-detected cursor/page/offset patterns with async iteration |
| πŸ“¦ **Zero Dependencies** | Generated clients are completely self-contained |
| πŸ›‘οΈ **Robust Parsing** | Advanced cycle detection and graceful handling of complex specs |
| 🎯 **Structured Errors** | Rich exception hierarchy with meaningful error messages |
| 🏷️ **Tag Organization** | Operations grouped by OpenAPI tags for intuitive navigation |

## Generated Client Structure

```
my_api_client/
β”œβ”€β”€ client.py           # Main APIClient with tag-grouped methods
β”œβ”€β”€ core/               # Self-contained runtime dependencies
β”‚   β”œβ”€β”€ config.py       # Configuration management
β”‚   β”œβ”€β”€ http_transport.py # HTTP client abstraction
β”‚   β”œβ”€β”€ exceptions.py   # Error hierarchy
β”‚   └── auth/           # Authentication plugins
β”œβ”€β”€ models/             # Dataclass models from schemas
β”‚   └── user.py
β”œβ”€β”€ endpoints/          # Operation methods grouped by tag
β”‚   └── users.py
└── __init__.py
```

## πŸ” Authentication

PyOpenAPI Generator supports multiple authentication patterns out of the box:

### Bearer Token
```python
from my_api_client.core.auth.plugins import BearerAuth

config = ClientConfig(
    base_url="https://api.example.com",
    auth=BearerAuth("your-token")
)
```

### API Key (Header, Query, or Cookie)
```python
from my_api_client.core.auth.plugins import ApiKeyAuth

config = ClientConfig(
    base_url="https://api.example.com",
    auth=ApiKeyAuth("your-key", location="header", name="X-API-Key")
)
```

### OAuth2 with Refresh
```python
from my_api_client.core.auth.plugins import OAuth2Auth

def refresh_token():
    # Your token refresh logic
    return "new-token"

config = ClientConfig(
    base_url="https://api.example.com",
    auth=OAuth2Auth("initial-token", refresh_callback=refresh_token)
)
```

### Composite Authentication
```python
from my_api_client.core.auth.base import CompositeAuth
from my_api_client.core.auth.plugins import BearerAuth, HeadersAuth

config = ClientConfig(
    base_url="https://api.example.com",
    auth=CompositeAuth(
        BearerAuth("token"),
        HeadersAuth({"X-Custom-Header": "value"})
    )
)
```

## πŸ“Š Advanced Features

### Pagination Support
```python
# Manual pagination
page = 1
while True:
    users = await client.users.list_users(page=page, limit=20)
    if not users:
        break
    # Process users
    page += 1

# Automatic pagination (if supported by the API)
async for user in client.users.list_users_paginated():
    print(f"User: {user.name}")
```

### Error Handling
```python
try:
    user = await client.users.get_user(user_id=123)
except client.exceptions.UserNotFoundError as e:
    print(f"User not found: {e.detail}")
except client.exceptions.ClientError as e:
    print(f"Client error: {e}")
except client.exceptions.ServerError as e:
    print(f"Server error: {e}")
```

### Response Unwrapping
Many APIs wrap responses in a `data` field. PyOpenAPI Generator automatically detects and unwraps these patterns:

```python
# API returns: {"data": {"id": 1, "name": "John"}, "meta": {...}}
# Your code receives: User(id=1, name="John")
user = await client.users.get_user(user_id=1)
print(user.name)  # "John"
```

## 🚧 Known Limitations

Some OpenAPI features have simplified implementations. Contributions welcome!

| Limitation | Current Behavior |
|------------|------------------|
| **Parameter Serialization** | Uses HTTP client defaults instead of OpenAPI `style`/`explode` |
| **Complex Multipart** | Basic file upload support; complex schemas simplified |
| **Response Headers** | Only response body returned, headers ignored |
| **Parameter Defaults** | Schema defaults not applied to method signatures |

> πŸ’‘ **Contributing**: See our [Contributing Guide](CONTRIBUTING.md) to help enhance OpenAPI specification coverage!

## πŸ—οΈ Architecture

PyOpenAPI Generator uses a sophisticated three-stage pipeline designed for enterprise-grade reliability:

```mermaid
graph TD
    A[OpenAPI Spec] --> B[Loading Stage]
    B --> C[Intermediate Representation]
    C --> D[Unified Type Resolution]
    D --> E[Visiting Stage]
    E --> F[Python Code AST]
    F --> G[Emitting Stage]
    G --> H[Generated Files]
    H --> I[Post-Processing]
    I --> J[Final Client Package]
    
    subgraph "Key Components"
        K[Schema Parser]
        L[Cycle Detection]
        M[Reference Resolution]
        N[Type Service]
        O[Code Emitters]
    end
```

### Why This Architecture?

**Complex Schema Handling**: Modern OpenAPI specs contain circular references, deep nesting, and intricate type relationships. Our architecture handles these robustly.

**Production Ready**: Each stage has clear responsibilities and clean interfaces, enabling comprehensive testing and reliable code generation.

**Extensible**: Plugin-based authentication, customizable type resolution, and modular emitters make the system adaptable to various use cases.

## πŸ“š Documentation

- **[Architecture Guide](docs/architecture.md)** - Deep dive into the system design
- **[Type Resolution](docs/unified_type_resolution.md)** - How types are resolved and generated
- **[Contributing Guide](CONTRIBUTING.md)** - How to contribute to the project
- **[API Reference](docs/)** - Complete API documentation

## 🀝 Contributing

We welcome contributions! PyOpenAPI Generator is designed to be extensible and maintainable.

### Quick Start for Contributors
```bash
# 1. Fork and clone the repository
git clone https://github.com/your-username/pyopenapi-gen.git
cd pyopenapi-gen

# 2. Set up development environment
source .venv/bin/activate  # Activate virtual environment
poetry install --with dev

# 3. Run quality checks
make quality-fix  # Auto-fix formatting and linting
make quality      # Run all quality checks
make test         # Run tests with coverage
```

### Development Workflow
```bash
# Essential commands for development
make quality-fix    # Auto-fix formatting and linting issues
make quality        # Run all quality checks (format, lint, typecheck, security)
make test          # Run tests with 85% coverage requirement
make test-fast     # Run tests, stop on first failure

# Individual quality commands
make format        # Format code with Black
make lint-fix      # Fix linting issues with Ruff
make typecheck     # Type checking with mypy
make security      # Security scanning with Bandit
```

### Release Process
The project uses **automated semantic versioning** with conventional commits:

```bash
# Conventional commit format triggers automatic releases
git commit -m "feat(auth): add OAuth2 support"    # β†’ Minor version bump
git commit -m "fix(parser): resolve memory leak"  # β†’ Patch version bump

# Push to main triggers automatic PyPI release
git push origin main
```

All releases are automatically published to PyPI with generated changelogs. See [Release Management](CLAUDE.md#release-management--semantic-versioning) for complete details.

See our [Contributing Guide](CONTRIBUTING.md) for detailed information on:
- πŸ“‹ Development setup and workflow
- πŸ§ͺ Testing guidelines and standards
- πŸ“– Documentation standards
- πŸ”„ Pull request process
- πŸ—οΈ Architecture and design patterns

## πŸ“„ License

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

Generated clients are self-contained and can be distributed under any license compatible with your project.

## πŸ™ Acknowledgments

- Built with [httpx](https://www.python-httpx.org/) for modern async HTTP
- Type safety with [mypy](https://mypy.readthedocs.io/) strict mode
- Code quality with [Black](https://black.readthedocs.io/) and [Ruff](https://docs.astral.sh/ruff/)
- Visitor pattern for clean, maintainable code generation

---

**Made with ❀️ for the Python community**

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pyopenapi-gen",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0.0,>=3.12",
    "maintainer_email": "Ville Ven\u00e4l\u00e4inen | Mindhive Oy <ville@mindhive.fi>",
    "keywords": "api, async, client, code-generation, enterprise, generator, http, openapi, python, rest, swagger, type-safe",
    "author": null,
    "author_email": "Mindhive Oy <contact@mindhive.fi>",
    "download_url": "https://files.pythonhosted.org/packages/40/24/0af66b618f8f06032fd31e2cdf583856234441923a92c3ec7be45df59991/pyopenapi_gen-0.10.2.tar.gz",
    "platform": null,
    "description": "# PyOpenAPI Generator\n\n[![Python](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://python.org)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\n**Modern, enterprise-grade Python client generator for OpenAPI specifications.**\n\nPyOpenAPI Generator creates async-first, strongly-typed Python clients from OpenAPI specs. Built for production use with advanced cycle detection, unified type resolution, and zero runtime dependencies.\n\n## \ud83d\ude80 Why PyOpenAPI Generator?\n\n### Modern Python Architecture\n- **Async-First**: Built for `async`/`await` with `httpx` for optimal performance\n- **Type Safety**: Complete type hints, dataclass models, and mypy compatibility\n- **Zero Dependencies**: Generated clients are completely self-contained\n\n### Enterprise-Grade Reliability\n- **Advanced Cycle Detection**: Handles complex schemas with circular references\n- **Unified Type Resolution**: Consistent, testable type resolution across all components\n- **Production Ready**: Comprehensive error handling and robust code generation\n\n### Developer Experience\n- **IDE Support**: Rich autocomplete and type checking in modern IDEs\n- **Tag Organization**: Operations grouped by OpenAPI tags for intuitive navigation\n- **Smart Features**: Auto-detected pagination, response unwrapping, and structured exceptions\n\n## \ud83d\udce6 Installation\n\n```bash\npip install pyopenapi-gen\n```\n\nOr with Poetry:\n```bash\npoetry add pyopenapi-gen\n```\n\n## \u26a1 Quick Start\n\n### 1. Generate Your First Client\n```bash\npyopenapi-gen openapi.yaml \\\n  --project-root . \\\n  --output-package my_api_client\n```\n\n### 2. Use the Generated Client\n```python\nimport asyncio\nfrom my_api_client.client import APIClient\nfrom my_api_client.core.config import ClientConfig\n\nasync def main():\n    config = ClientConfig(base_url=\"https://api.example.com\")\n    async with APIClient(config) as client:\n        # Type-safe API calls with full IDE support\n        users = await client.users.list_users(page=1)\n        \n        # Automatic pagination\n        async for user in client.users.list_users_paginated():\n            print(f\"User: {user.name}\")\n\nasyncio.run(main())\n```\n\n## \ud83d\udd27 Configuration Options\n\n### Standalone Client (Default)\n```bash\npyopenapi-gen openapi.yaml \\\n  --project-root . \\\n  --output-package my_api_client\n```\nCreates self-contained client with embedded core dependencies.\n\n### Shared Core (Multiple Clients)\n```bash\npyopenapi-gen openapi.yaml \\\n  --project-root . \\\n  --output-package clients.api_client \\\n  --core-package clients.core\n```\nMultiple clients share a single core implementation.\n\n### Additional Options\n```bash\n--force           # Overwrite without prompting\n--no-postprocess  # Skip formatting and type checking\n```\n\n## \u2728 Key Features\n\n| Feature | Description |\n|---------|-------------|\n| \ud83d\udd12 **Type Safety** | Complete type hints, dataclass models, and mypy compatibility |\n| \u26a1 **Async-First** | Built for modern Python `async`/`await` patterns with `httpx` |\n| \ud83d\udd0c **Pluggable Auth** | Bearer, API key, OAuth2, and custom authentication strategies |\n| \ud83d\udd04 **Smart Pagination** | Auto-detected cursor/page/offset patterns with async iteration |\n| \ud83d\udce6 **Zero Dependencies** | Generated clients are completely self-contained |\n| \ud83d\udee1\ufe0f **Robust Parsing** | Advanced cycle detection and graceful handling of complex specs |\n| \ud83c\udfaf **Structured Errors** | Rich exception hierarchy with meaningful error messages |\n| \ud83c\udff7\ufe0f **Tag Organization** | Operations grouped by OpenAPI tags for intuitive navigation |\n\n## Generated Client Structure\n\n```\nmy_api_client/\n\u251c\u2500\u2500 client.py           # Main APIClient with tag-grouped methods\n\u251c\u2500\u2500 core/               # Self-contained runtime dependencies\n\u2502   \u251c\u2500\u2500 config.py       # Configuration management\n\u2502   \u251c\u2500\u2500 http_transport.py # HTTP client abstraction\n\u2502   \u251c\u2500\u2500 exceptions.py   # Error hierarchy\n\u2502   \u2514\u2500\u2500 auth/           # Authentication plugins\n\u251c\u2500\u2500 models/             # Dataclass models from schemas\n\u2502   \u2514\u2500\u2500 user.py\n\u251c\u2500\u2500 endpoints/          # Operation methods grouped by tag\n\u2502   \u2514\u2500\u2500 users.py\n\u2514\u2500\u2500 __init__.py\n```\n\n## \ud83d\udd10 Authentication\n\nPyOpenAPI Generator supports multiple authentication patterns out of the box:\n\n### Bearer Token\n```python\nfrom my_api_client.core.auth.plugins import BearerAuth\n\nconfig = ClientConfig(\n    base_url=\"https://api.example.com\",\n    auth=BearerAuth(\"your-token\")\n)\n```\n\n### API Key (Header, Query, or Cookie)\n```python\nfrom my_api_client.core.auth.plugins import ApiKeyAuth\n\nconfig = ClientConfig(\n    base_url=\"https://api.example.com\",\n    auth=ApiKeyAuth(\"your-key\", location=\"header\", name=\"X-API-Key\")\n)\n```\n\n### OAuth2 with Refresh\n```python\nfrom my_api_client.core.auth.plugins import OAuth2Auth\n\ndef refresh_token():\n    # Your token refresh logic\n    return \"new-token\"\n\nconfig = ClientConfig(\n    base_url=\"https://api.example.com\",\n    auth=OAuth2Auth(\"initial-token\", refresh_callback=refresh_token)\n)\n```\n\n### Composite Authentication\n```python\nfrom my_api_client.core.auth.base import CompositeAuth\nfrom my_api_client.core.auth.plugins import BearerAuth, HeadersAuth\n\nconfig = ClientConfig(\n    base_url=\"https://api.example.com\",\n    auth=CompositeAuth(\n        BearerAuth(\"token\"),\n        HeadersAuth({\"X-Custom-Header\": \"value\"})\n    )\n)\n```\n\n## \ud83d\udcca Advanced Features\n\n### Pagination Support\n```python\n# Manual pagination\npage = 1\nwhile True:\n    users = await client.users.list_users(page=page, limit=20)\n    if not users:\n        break\n    # Process users\n    page += 1\n\n# Automatic pagination (if supported by the API)\nasync for user in client.users.list_users_paginated():\n    print(f\"User: {user.name}\")\n```\n\n### Error Handling\n```python\ntry:\n    user = await client.users.get_user(user_id=123)\nexcept client.exceptions.UserNotFoundError as e:\n    print(f\"User not found: {e.detail}\")\nexcept client.exceptions.ClientError as e:\n    print(f\"Client error: {e}\")\nexcept client.exceptions.ServerError as e:\n    print(f\"Server error: {e}\")\n```\n\n### Response Unwrapping\nMany APIs wrap responses in a `data` field. PyOpenAPI Generator automatically detects and unwraps these patterns:\n\n```python\n# API returns: {\"data\": {\"id\": 1, \"name\": \"John\"}, \"meta\": {...}}\n# Your code receives: User(id=1, name=\"John\")\nuser = await client.users.get_user(user_id=1)\nprint(user.name)  # \"John\"\n```\n\n## \ud83d\udea7 Known Limitations\n\nSome OpenAPI features have simplified implementations. Contributions welcome!\n\n| Limitation | Current Behavior |\n|------------|------------------|\n| **Parameter Serialization** | Uses HTTP client defaults instead of OpenAPI `style`/`explode` |\n| **Complex Multipart** | Basic file upload support; complex schemas simplified |\n| **Response Headers** | Only response body returned, headers ignored |\n| **Parameter Defaults** | Schema defaults not applied to method signatures |\n\n> \ud83d\udca1 **Contributing**: See our [Contributing Guide](CONTRIBUTING.md) to help enhance OpenAPI specification coverage!\n\n## \ud83c\udfd7\ufe0f Architecture\n\nPyOpenAPI Generator uses a sophisticated three-stage pipeline designed for enterprise-grade reliability:\n\n```mermaid\ngraph TD\n    A[OpenAPI Spec] --> B[Loading Stage]\n    B --> C[Intermediate Representation]\n    C --> D[Unified Type Resolution]\n    D --> E[Visiting Stage]\n    E --> F[Python Code AST]\n    F --> G[Emitting Stage]\n    G --> H[Generated Files]\n    H --> I[Post-Processing]\n    I --> J[Final Client Package]\n    \n    subgraph \"Key Components\"\n        K[Schema Parser]\n        L[Cycle Detection]\n        M[Reference Resolution]\n        N[Type Service]\n        O[Code Emitters]\n    end\n```\n\n### Why This Architecture?\n\n**Complex Schema Handling**: Modern OpenAPI specs contain circular references, deep nesting, and intricate type relationships. Our architecture handles these robustly.\n\n**Production Ready**: Each stage has clear responsibilities and clean interfaces, enabling comprehensive testing and reliable code generation.\n\n**Extensible**: Plugin-based authentication, customizable type resolution, and modular emitters make the system adaptable to various use cases.\n\n## \ud83d\udcda Documentation\n\n- **[Architecture Guide](docs/architecture.md)** - Deep dive into the system design\n- **[Type Resolution](docs/unified_type_resolution.md)** - How types are resolved and generated\n- **[Contributing Guide](CONTRIBUTING.md)** - How to contribute to the project\n- **[API Reference](docs/)** - Complete API documentation\n\n## \ud83e\udd1d Contributing\n\nWe welcome contributions! PyOpenAPI Generator is designed to be extensible and maintainable.\n\n### Quick Start for Contributors\n```bash\n# 1. Fork and clone the repository\ngit clone https://github.com/your-username/pyopenapi-gen.git\ncd pyopenapi-gen\n\n# 2. Set up development environment\nsource .venv/bin/activate  # Activate virtual environment\npoetry install --with dev\n\n# 3. Run quality checks\nmake quality-fix  # Auto-fix formatting and linting\nmake quality      # Run all quality checks\nmake test         # Run tests with coverage\n```\n\n### Development Workflow\n```bash\n# Essential commands for development\nmake quality-fix    # Auto-fix formatting and linting issues\nmake quality        # Run all quality checks (format, lint, typecheck, security)\nmake test          # Run tests with 85% coverage requirement\nmake test-fast     # Run tests, stop on first failure\n\n# Individual quality commands\nmake format        # Format code with Black\nmake lint-fix      # Fix linting issues with Ruff\nmake typecheck     # Type checking with mypy\nmake security      # Security scanning with Bandit\n```\n\n### Release Process\nThe project uses **automated semantic versioning** with conventional commits:\n\n```bash\n# Conventional commit format triggers automatic releases\ngit commit -m \"feat(auth): add OAuth2 support\"    # \u2192 Minor version bump\ngit commit -m \"fix(parser): resolve memory leak\"  # \u2192 Patch version bump\n\n# Push to main triggers automatic PyPI release\ngit push origin main\n```\n\nAll releases are automatically published to PyPI with generated changelogs. See [Release Management](CLAUDE.md#release-management--semantic-versioning) for complete details.\n\nSee our [Contributing Guide](CONTRIBUTING.md) for detailed information on:\n- \ud83d\udccb Development setup and workflow\n- \ud83e\uddea Testing guidelines and standards\n- \ud83d\udcd6 Documentation standards\n- \ud83d\udd04 Pull request process\n- \ud83c\udfd7\ufe0f Architecture and design patterns\n\n## \ud83d\udcc4 License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\nGenerated clients are self-contained and can be distributed under any license compatible with your project.\n\n## \ud83d\ude4f Acknowledgments\n\n- Built with [httpx](https://www.python-httpx.org/) for modern async HTTP\n- Type safety with [mypy](https://mypy.readthedocs.io/) strict mode\n- Code quality with [Black](https://black.readthedocs.io/) and [Ruff](https://docs.astral.sh/ruff/)\n- Visitor pattern for clean, maintainable code generation\n\n---\n\n**Made with \u2764\ufe0f for the Python community**\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Modern, async-first Python client generator for OpenAPI specifications with advanced cycle detection and unified type resolution",
    "version": "0.10.2",
    "project_urls": {
        "Bug Reports": "https://github.com/your-org/pyopenapi-gen/issues",
        "Changelog": "https://github.com/your-org/pyopenapi-gen/blob/main/CHANGELOG.md",
        "Documentation": "https://github.com/your-org/pyopenapi-gen/blob/main/README.md",
        "Homepage": "https://github.com/your-org/pyopenapi-gen",
        "Issues": "https://github.com/your-org/pyopenapi-gen/issues",
        "Repository": "https://github.com/your-org/pyopenapi-gen",
        "Source Code": "https://github.com/your-org/pyopenapi-gen"
    },
    "split_keywords": [
        "api",
        " async",
        " client",
        " code-generation",
        " enterprise",
        " generator",
        " http",
        " openapi",
        " python",
        " rest",
        " swagger",
        " type-safe"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cb44f73a9f77928942a7b5e0724e1539dae42fa221dbfad52c7bd81af0455135",
                "md5": "e26c70e99c3cd7e200e1b6e43f10b223",
                "sha256": "ab5f283fa6e75c3d632c7b4b38939ae60652c40580acf36215a83792b9f1c4a9"
            },
            "downloads": -1,
            "filename": "pyopenapi_gen-0.10.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e26c70e99c3cd7e200e1b6e43f10b223",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0.0,>=3.12",
            "size": 224049,
            "upload_time": "2025-07-17T12:38:07",
            "upload_time_iso_8601": "2025-07-17T12:38:07.551425Z",
            "url": "https://files.pythonhosted.org/packages/cb/44/f73a9f77928942a7b5e0724e1539dae42fa221dbfad52c7bd81af0455135/pyopenapi_gen-0.10.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "40240af66b618f8f06032fd31e2cdf583856234441923a92c3ec7be45df59991",
                "md5": "41f7a65940c63ef192ef0783f79c7df3",
                "sha256": "00ddc22cf74904e5b58f047fbd05d5d5c30b3c69948502103de2403bb4839e39"
            },
            "downloads": -1,
            "filename": "pyopenapi_gen-0.10.2.tar.gz",
            "has_sig": false,
            "md5_digest": "41f7a65940c63ef192ef0783f79c7df3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0.0,>=3.12",
            "size": 622382,
            "upload_time": "2025-07-17T12:38:09",
            "upload_time_iso_8601": "2025-07-17T12:38:09.327766Z",
            "url": "https://files.pythonhosted.org/packages/40/24/0af66b618f8f06032fd31e2cdf583856234441923a92c3ec7be45df59991/pyopenapi_gen-0.10.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-17 12:38:09",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "your-org",
    "github_project": "pyopenapi-gen",
    "github_not_found": true,
    "lcname": "pyopenapi-gen"
}
        
Elapsed time: 2.00830s