# PyOpenAPI Generator
[](https://python.org)
[](https://opensource.org/licenses/MIT)
[](https://github.com/psf/black)
[](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[](https://python.org)\n[](https://opensource.org/licenses/MIT)\n[](https://github.com/psf/black)\n[](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"
}