This commit is contained in:
Iliyan Angelov
2025-09-19 11:58:53 +03:00
parent 306b20e24a
commit 6b247e5b9f
11423 changed files with 1500615 additions and 778 deletions

View File

@@ -0,0 +1,30 @@
Copyright © 2011-present, Encode OSS Ltd.
Copyright © 2019-2021, T. Franzel <tfranzel@gmail.com>, Cashlink Technologies GmbH.
Copyright © 2021-present, T. Franzel <tfranzel@gmail.com>.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,359 @@
Metadata-Version: 2.1
Name: drf-spectacular
Version: 0.28.0
Summary: Sane and flexible OpenAPI 3 schema generation for Django REST framework
Home-page: https://github.com/tfranzel/drf-spectacular
Author: T. Franzel
Author-email: tfranzel@gmail.com
License: BSD
Project-URL: Source, https://github.com/tfranzel/drf-spectacular
Project-URL: Documentation, https://drf-spectacular.readthedocs.io
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 2.2
Classifier: Framework :: Django :: 3.2
Classifier: Framework :: Django :: 4.0
Classifier: Framework :: Django :: 4.1
Classifier: Framework :: Django :: 4.2
Classifier: Framework :: Django :: 5.0
Classifier: Framework :: Django :: 5.1
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Documentation
Classifier: Topic :: Software Development :: Code Generators
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: Django>=2.2
Requires-Dist: djangorestframework>=3.10.3
Requires-Dist: uritemplate>=2.0.0
Requires-Dist: PyYAML>=5.1
Requires-Dist: jsonschema>=2.6.0
Requires-Dist: inflection>=0.3.1
Requires-Dist: typing-extensions; python_version < "3.10"
Provides-Extra: offline
Requires-Dist: drf-spectacular-sidecar; extra == "offline"
Provides-Extra: sidecar
Requires-Dist: drf-spectacular-sidecar; extra == "sidecar"
===============
drf-spectacular
===============
|build-status| |codecov| |docs| |pypi-version| |pypi-dl|
Sane and flexible `OpenAPI`_ (`3.0.3`_ & `3.1`_) schema generation for `Django REST framework`_.
This project has 3 goals:
1. Extract as much schema information from DRF as possible.
2. Provide flexibility to make the schema usable in the real world (not only toy examples).
3. Generate a schema that works well with the most popular client generators.
The code is a heavily modified fork of the
`DRF OpenAPI generator <https://github.com/encode/django-rest-framework/blob/master/rest_framework/schemas/openapi.py/>`_,
which is/was lacking all of the below listed features.
Features
- Serializers modelled as components. (arbitrary nesting and recursion supported)
- `@extend_schema <https://drf-spectacular.readthedocs.io/en/latest/drf_spectacular.html#drf_spectacular.utils.extend_schema>`_ decorator for customization of APIView, Viewsets, function-based views, and ``@action``
- additional parameters
- request/response serializer override (with status codes)
- polymorphic responses either manually with ``PolymorphicProxySerializer`` helper or via ``rest_polymorphic``'s PolymorphicSerializer)
- ... and more customization options
- Authentication support (DRF natives included, easily extendable)
- Custom serializer class support (easily extendable)
- ``SerializerMethodField()`` type via type hinting or ``@extend_schema_field``
- i18n support
- Tags extraction
- Request/response/parameter examples
- Description extraction from ``docstrings``
- Vendor specification extensions (``x-*``) in info, operations, parameters, components, and security schemes
- Sane fallbacks
- Sane ``operation_id`` naming (based on path)
- Schema serving with ``SpectacularAPIView`` (Redoc and Swagger-UI views are also available)
- Optional input/output serializer component split
- Callback operations
- OpenAPI 3.1 support (via setting ``OAS_VERSION``)
- Included support for:
- `django-polymorphic <https://github.com/django-polymorphic/django-polymorphic>`_ / `django-rest-polymorphic <https://github.com/apirobot/django-rest-polymorphic>`_
- `SimpleJWT <https://github.com/jazzband/djangorestframework-simplejwt>`_
- `DjangoOAuthToolkit <https://github.com/jazzband/django-oauth-toolkit>`_
- `djangorestframework-jwt <https://github.com/jpadilla/django-rest-framework-jwt>`_ (tested fork `drf-jwt <https://github.com/Styria-Digital/django-rest-framework-jwt>`_)
- `dj-rest-auth <https://github.com/iMerica/dj-rest-auth>`_ (maintained fork of `django-rest-auth <https://github.com/Tivix/django-rest-auth>`_)
- `djangorestframework-camel-case <https://github.com/vbabiy/djangorestframework-camel-case>`_ (via postprocessing hook ``camelize_serializer_fields``)
- `django-filter <https://github.com/carltongibson/django-filter>`_
- `drf-nested-routers <https://github.com/alanjds/drf-nested-routers>`_
- `djangorestframework-recursive <https://github.com/heywbj/django-rest-framework-recursive>`_
- `djangorestframework-dataclasses <https://github.com/oxan/djangorestframework-dataclasses>`_
- `django-rest-framework-gis <https://github.com/openwisp/django-rest-framework-gis>`_
- `Pydantic (>=2.0) <https://github.com/pydantic/pydantic>`_
For more information visit the `documentation <https://drf-spectacular.readthedocs.io/>`_.
License
-------
Provided by `T. Franzel <https://github.com/tfranzel>`_. `Licensed under 3-Clause BSD <https://github.com/tfranzel/drf-spectacular/blob/master/LICENSE>`_.
Requirements
------------
- Python >= 3.7
- Django (2.2, 3.2, 4.0, 4.1, 4.2, 5.0)
- Django REST Framework (3.10.3, 3.11, 3.12, 3.13, 3.14, 3.15)
Installation
------------
Install using ``pip``\ ...
.. code:: bash
$ pip install drf-spectacular
then add drf-spectacular to installed apps in ``settings.py``
.. code:: python
INSTALLED_APPS = [
# ALL YOUR APPS
'drf_spectacular',
]
and finally register our spectacular AutoSchema with DRF.
.. code:: python
REST_FRAMEWORK = {
# YOUR SETTINGS
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}
drf-spectacular ships with sane `default settings <https://drf-spectacular.readthedocs.io/en/latest/settings.html>`_
that should work reasonably well out of the box. It is not necessary to
specify any settings, but we recommend to specify at least some metadata.
.. code:: python
SPECTACULAR_SETTINGS = {
'TITLE': 'Your Project API',
'DESCRIPTION': 'Your project description',
'VERSION': '1.0.0',
'SERVE_INCLUDE_SCHEMA': False,
# OTHER SETTINGS
}
.. _self-contained-ui-installation:
Self-contained UI installation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Certain environments have no direct access to the internet and as such are unable
to retrieve Swagger UI or Redoc from CDNs. `drf-spectacular-sidecar`_ provides
these static files as a separate optional package. Usage is as follows:
.. code:: bash
$ pip install drf-spectacular[sidecar]
.. code:: python
INSTALLED_APPS = [
# ALL YOUR APPS
'drf_spectacular',
'drf_spectacular_sidecar', # required for Django collectstatic discovery
]
SPECTACULAR_SETTINGS = {
'SWAGGER_UI_DIST': 'SIDECAR', # shorthand to use the sidecar instead
'SWAGGER_UI_FAVICON_HREF': 'SIDECAR',
'REDOC_DIST': 'SIDECAR',
# OTHER SETTINGS
}
Release management
^^^^^^^^^^^^^^^^^^
*drf-spectacular* deliberately stays below version *1.x.x* to signal that every
new version may potentially break you. For production we strongly recommend pinning the
version and inspecting a schema diff on update.
With that said, we aim to be extremely defensive w.r.t. breaking API changes. However,
we also acknowledge the fact that even slight schema changes may break your toolchain,
as any existing bug may somehow also be used as a feature.
We define version increments with the following semantics. *y-stream* increments may contain
potentially breaking changes to both API and schema. *z-stream* increments will never break the
API and may only contain schema changes that should have a low chance of breaking you.
Take it for a spin
------------------
Generate your schema with the CLI:
.. code:: bash
$ ./manage.py spectacular --color --file schema.yml
$ docker run -p 80:8080 -e SWAGGER_JSON=/schema.yml -v ${PWD}/schema.yml:/schema.yml swaggerapi/swagger-ui
If you also want to validate your schema add the ``--validate`` flag. Or serve your schema directly
from your API. We also provide convenience wrappers for ``swagger-ui`` or ``redoc``.
.. code:: python
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
urlpatterns = [
# YOUR PATTERNS
path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
# Optional UI:
path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]
Usage
-----
*drf-spectacular* works pretty well out of the box. You might also want to set some metadata for your API.
Just create a ``SPECTACULAR_SETTINGS`` dictionary in your ``settings.py`` and override the defaults.
Have a look at the `available settings <https://drf-spectacular.readthedocs.io/en/latest/settings.html>`_.
The toy examples do not cover your cases? No problem, you can heavily customize how your schema will be rendered.
Customization by using ``@extend_schema``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Most customization cases should be covered by the ``extend_schema`` decorator. We usually get
pretty far with specifying ``OpenApiParameter`` and splitting request/response serializers, but
the sky is the limit.
.. code:: python
from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample
from drf_spectacular.types import OpenApiTypes
class AlbumViewset(viewset.ModelViewset):
serializer_class = AlbumSerializer
@extend_schema(
request=AlbumCreationSerializer,
responses={201: AlbumSerializer},
)
def create(self, request):
# your non-standard behaviour
return super().create(request)
@extend_schema(
# extra parameters added to the schema
parameters=[
OpenApiParameter(name='artist', description='Filter by artist', required=False, type=str),
OpenApiParameter(
name='release',
type=OpenApiTypes.DATE,
location=OpenApiParameter.QUERY,
description='Filter by release date',
examples=[
OpenApiExample(
'Example 1',
summary='short optional summary',
description='longer description',
value='1993-08-23'
),
...
],
),
],
# override default docstring extraction
description='More descriptive text',
# provide Authentication class that deviates from the views default
auth=None,
# change the auto-generated operation name
operation_id=None,
# or even completely override what AutoSchema would generate. Provide raw Open API spec as Dict.
operation=None,
# attach request/response examples to the operation.
examples=[
OpenApiExample(
'Example 1',
description='longer description',
value=...
),
...
],
)
def list(self, request):
# your non-standard behaviour
return super().list(request)
@extend_schema(
request=AlbumLikeSerializer,
responses={204: None},
methods=["POST"]
)
@extend_schema(description='Override a specific method', methods=["GET"])
@action(detail=True, methods=['post', 'get'])
def set_password(self, request, pk=None):
# your action behaviour
...
More customization
^^^^^^^^^^^^^^^^^^
Still not satisfied? You want more! We still got you covered.
Visit `customization <https://drf-spectacular.readthedocs.io/en/latest/customization.html>`_ for more information.
Testing
-------
Install testing requirements.
.. code:: bash
$ pip install -r requirements.txt
Run with runtests.
.. code:: bash
$ ./runtests.py
You can also use the excellent `tox`_ testing tool to run the tests
against all supported versions of Python and Django. Install tox
globally, and then simply run:
.. code:: bash
$ tox
.. _Django REST framework: https://www.django-rest-framework.org/
.. _OpenAPI: https://swagger.io/
.. _3.0.3: https://spec.openapis.org/oas/v3.0.3
.. _3.1: https://spec.openapis.org/oas/v3.1.0
.. _tox: https://tox.wiki/
.. _drf-spectacular-sidecar: https://github.com/tfranzel/drf-spectacular-sidecar
.. |build-status| image:: https://github.com/tfranzel/drf-spectacular/actions/workflows/ci.yml/badge.svg
:target: https://github.com/tfranzel/drf-spectacular/actions/workflows/ci.yml
.. |pypi-version| image:: https://img.shields.io/pypi/v/drf-spectacular.svg
:target: https://pypi.org/project/drf-spectacular/
.. |codecov| image:: https://codecov.io/gh/tfranzel/drf-spectacular/branch/master/graph/badge.svg
:target: https://codecov.io/gh/tfranzel/drf-spectacular
.. |docs| image:: https://readthedocs.org/projects/drf-spectacular/badge/
:target: https://drf-spectacular.readthedocs.io/
.. |pypi-dl| image:: https://img.shields.io/pypi/dm/drf-spectacular
:target: https://pypi.org/project/drf-spectacular/

View File

@@ -0,0 +1,83 @@
drf_spectacular-0.28.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
drf_spectacular-0.28.0.dist-info/LICENSE,sha256=QYOFgQ6OE21kX9uZ9cPYrBpSTI4Eli12oKzinGUAGVM,1646
drf_spectacular-0.28.0.dist-info/METADATA,sha256=IoV3VfI6NuzMMmUsJeqi3CTvGjL8_JGQXulINYhh_Rw,14218
drf_spectacular-0.28.0.dist-info/RECORD,,
drf_spectacular-0.28.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
drf_spectacular-0.28.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
drf_spectacular-0.28.0.dist-info/top_level.txt,sha256=hQTyZgYWQaodX0YT-ugk6FZUaeg6dzSGF0l5peXNs8k,16
drf_spectacular/__init__.py,sha256=cV5prtSsCfRXCGRgZjJjxh7KPRrZr_fKRPIJw8pLziI,133
drf_spectacular/__pycache__/__init__.cpython-312.pyc,,
drf_spectacular/__pycache__/apps.cpython-312.pyc,,
drf_spectacular/__pycache__/authentication.cpython-312.pyc,,
drf_spectacular/__pycache__/checks.cpython-312.pyc,,
drf_spectacular/__pycache__/drainage.cpython-312.pyc,,
drf_spectacular/__pycache__/extensions.cpython-312.pyc,,
drf_spectacular/__pycache__/generators.cpython-312.pyc,,
drf_spectacular/__pycache__/helpers.cpython-312.pyc,,
drf_spectacular/__pycache__/hooks.cpython-312.pyc,,
drf_spectacular/__pycache__/openapi.cpython-312.pyc,,
drf_spectacular/__pycache__/plumbing.cpython-312.pyc,,
drf_spectacular/__pycache__/renderers.cpython-312.pyc,,
drf_spectacular/__pycache__/serializers.cpython-312.pyc,,
drf_spectacular/__pycache__/settings.cpython-312.pyc,,
drf_spectacular/__pycache__/types.cpython-312.pyc,,
drf_spectacular/__pycache__/utils.cpython-312.pyc,,
drf_spectacular/__pycache__/views.cpython-312.pyc,,
drf_spectacular/apps.py,sha256=zDCZJ3QNHLVtN2SIyNm_1s4QOAMmHOesS6X7YjZgS5k,212
drf_spectacular/authentication.py,sha256=ldCdXPZRSEDbqSx4zaGn46aeciyz3AiaiyF_HBMoWdM,1234
drf_spectacular/checks.py,sha256=9aszmP_N0uyJqByBXZ_dK-laq0ljEZaCrBbDp3O8OGk,999
drf_spectacular/contrib/__init__.py,sha256=poIlUpgG6NhGu7NTwNR6AhGjin6p0JhAAt6St1fVxx0,354
drf_spectacular/contrib/__pycache__/__init__.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/django_filters.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/django_oauth_toolkit.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/djangorestframework_camel_case.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/knox_auth_token.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/pydantic.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_auth.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_framework.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_framework_dataclasses.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_framework_gis.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_framework_jwt.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_framework_recursive.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_framework_simplejwt.cpython-312.pyc,,
drf_spectacular/contrib/__pycache__/rest_polymorphic.cpython-312.pyc,,
drf_spectacular/contrib/django_filters.py,sha256=tp6kc7fxc2-a-LgxEs5pNrKxlFocjF81KSiaAoHBidw,13785
drf_spectacular/contrib/django_oauth_toolkit.py,sha256=8MOIQ4vU_cxe28S-py9QzwJaN8eFc-EGBe_96wm6cEg,2366
drf_spectacular/contrib/djangorestframework_camel_case.py,sha256=aA6KdHthYNtvbV1wWWwLmjmtobPTXhrpLjSxu_gDyv0,2617
drf_spectacular/contrib/knox_auth_token.py,sha256=hbAk57CMEb4aYXZT_Ed5C-CGqtLDaPS8Iu5mXozr0vQ,495
drf_spectacular/contrib/pydantic.py,sha256=oiFP-hOT2DFOCOiC2_8X_ep7UcH9YSVVL-nigD-WITQ,2244
drf_spectacular/contrib/rest_auth.py,sha256=oft9cRhik-PCHvDHJx-RjkCuDVnoUpjF0SmUxuvEuKs,5689
drf_spectacular/contrib/rest_framework.py,sha256=UGr8dNgQvwTn97hdi9s1uxXynfmBd5FqqXL1h05Ev4U,1213
drf_spectacular/contrib/rest_framework_dataclasses.py,sha256=FTCllwxuZztjwWVzjS3tDWnXuVLaQ_3CJuWFjFKEiLs,1876
drf_spectacular/contrib/rest_framework_gis.py,sha256=hEilPs8R3E4N3o3PwqQFL4hvnJ0RS4kLurTIjO_528Y,7906
drf_spectacular/contrib/rest_framework_jwt.py,sha256=sOiFPnh2p0DP-a7ukETgXrkjWEHrUTCfOmmkxZ1SLF8,609
drf_spectacular/contrib/rest_framework_recursive.py,sha256=RG8O7i-rq3AdqgBOcHckhjLmdPEg9fKbjo2-dx80deA,652
drf_spectacular/contrib/rest_framework_simplejwt.py,sha256=twBKYZWG4ZOycKOL3AwmUeJM1MWws4kHgrQ-q6HbDLw,3637
drf_spectacular/contrib/rest_polymorphic.py,sha256=TQcHzIWTZDFXdDSbL7xUAU-jZKUoeb2PCPNQI08Pwzs,3510
drf_spectacular/drainage.py,sha256=DEjmZyT4Hm6AIrv2-0dQWt9S74lR8N4fAYgx8KuUciY,7398
drf_spectacular/extensions.py,sha256=F0X8jNF7r4TKPn60gvKKEcZplQU4wqTWFEhgrRR0QfE,6325
drf_spectacular/generators.py,sha256=4sD2FcLGUSduSMS-n0yRAxAIDF-xBs-eqvl6DLqrGo4,13104
drf_spectacular/helpers.py,sha256=oScO_1VuXQKEWqWLoWtVzKMJg5pzDUEN69SbHvHHXL8,1369
drf_spectacular/hooks.py,sha256=FofG394vvHTpUHFEjf6d9mdr55bsIHY99odjpXdCQVI,10126
drf_spectacular/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
drf_spectacular/management/__pycache__/__init__.cpython-312.pyc,,
drf_spectacular/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
drf_spectacular/management/commands/__pycache__/__init__.cpython-312.pyc,,
drf_spectacular/management/commands/__pycache__/spectacular.cpython-312.pyc,,
drf_spectacular/management/commands/spectacular.py,sha256=jVoZ5Ln0Rk1KDjrQ7WnWlNEBPdiZ2Q3byEZr9HWBnyA,3907
drf_spectacular/openapi.py,sha256=0IgoALjRYyBun7wz9i96tXW9llGKgSj9WLR3G4tTAnA,76364
drf_spectacular/plumbing.py,sha256=zKSBstjWsb55wBk5cLNBWWNY9qZtsDTSpeFyDtRY1qk,57366
drf_spectacular/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
drf_spectacular/renderers.py,sha256=VM0l-roiJr77l1a7Rga7z_uXIxzpXEjR1hRVDIbjF-Y,2997
drf_spectacular/serializers.py,sha256=xZU0ww6esXeOgB4-Y53-omTpbUywF2QOio9tKBugfjU,4456
drf_spectacular/settings.py,sha256=q3L4eKyz1XSXNCsUDllq2kU_oMTEIN6a66B-1t9kJWw,14136
drf_spectacular/templates/drf_spectacular/redoc.html,sha256=lzNZBn6Ca0-CnYnm6cE0fJSX2YQhKXkjR8nCO6BNeBY,1118
drf_spectacular/templates/drf_spectacular/swagger_ui.html,sha256=TR4ZUxdVBxCkHUhr1LlJavmT5YRY-ABfWhu1MZZ-3Eg,924
drf_spectacular/templates/drf_spectacular/swagger_ui.js,sha256=0Mjhaxp1Z6LSd9_9rULHQlf43O6paVHRWPFdD8w-ct8,3804
drf_spectacular/types.py,sha256=fFIajFqzo5P__vhZ6ejDPpad1H8kdTLLAlw0Ih8DLRU,7684
drf_spectacular/utils.py,sha256=1fWFscRdyu3womDhRDUFHILjmGFeHg75EPo47UksQEE,29939
drf_spectacular/validation/__init__.py,sha256=zBRkiLGrMbkFmIPIWyixVEL1dOO4a-Lt29-spyM4ltA,1446
drf_spectacular/validation/__pycache__/__init__.cpython-312.pyc,,
drf_spectacular/validation/openapi_3_0_schema.json,sha256=Q9qfIPZwU17pohQYXQZqh5ZklCDM_ZQil49RtSgaVkg,35816
drf_spectacular/validation/openapi_3_1_schema.json,sha256=Bk8Gm_pfHwdvs8ORXvjlD64-sPry8yn-5ta2GcGfsQw,34246
drf_spectacular/views.py,sha256=cZsbyWz-KVoiD49il_kNvE3QFT92k4Z8dBDy39GahI8,12159

View File

@@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: setuptools (75.6.0)
Root-Is-Purelib: true
Tag: py3-none-any