blacksheep


Nameblacksheep JSON
Version 2.0.7 PyPI version JSON
download
home_page
SummaryFast web framework for Python asyncio
upload_time2024-02-17 09:31:44
maintainer
docs_urlNone
author
requires_python>=3.7
license
keywords blacksheep web framework asyncio
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![Build](https://github.com/Neoteroi/BlackSheep/workflows/Main/badge.svg)](https://github.com/Neoteroi/BlackSheep/actions)
[![pypi](https://img.shields.io/pypi/v/BlackSheep.svg?color=blue)](https://pypi.org/project/BlackSheep/)
[![versions](https://img.shields.io/pypi/pyversions/blacksheep.svg)](https://github.com/robertoprevato/blacksheep)
[![codecov](https://codecov.io/gh/Neoteroi/BlackSheep/branch/master/graph/badge.svg?token=Nzi29L0Eg1)](https://codecov.io/gh/Neoteroi/BlackSheep)
[![license](https://img.shields.io/github/license/Neoteroi/blacksheep.svg)](https://github.com/Neoteroi/blacksheep/blob/main/LICENSE) [![Join the chat at https://gitter.im/Neoteroi/BlackSheep](https://badges.gitter.im/Neoteroi/BlackSheep.svg)](https://gitter.im/Neoteroi/BlackSheep?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![documentation](https://img.shields.io/badge/📖-docs-purple)](https://www.neoteroi.dev/blacksheep/)

# BlackSheep
BlackSheep is an asynchronous web framework to build event based web
applications with Python. It is inspired by
[Flask](https://palletsprojects.com/p/flask/), [ASP.NET
Core](https://docs.microsoft.com/en-us/aspnet/core/), and the work by [Yury
Selivanov](https://magic.io/blog/uvloop-blazing-fast-python-networking/).

<p align="left">
  <a href="#blacksheep"><img width="320" height="271" src="https://www.neoteroi.dev/blacksheep/img/blacksheep.png" alt="Black Sheep"></a>
</p>

```bash
pip install blacksheep
```

---

```python
from datetime import datetime

from blacksheep import Application, get


app = Application()

@get("/")
async def home():
    return f"Hello, World! {datetime.utcnow().isoformat()}"

```

## Getting started using the CLI ✨

BlackSheep offers a CLI to bootstrap new projects rapidly.
To try it, first install the `blacksheep-cli` package:

```bash
pip install blacksheep-cli
```

Then use the `blacksheep create` command to bootstrap a project
using one of the supported templates.

![blacksheep create command](https://gist.githubusercontent.com/RobertoPrevato/38a0598b515a2f7257c614938843b99b/raw/67d15ba337de94c2f50d980a7b8924a747259254/blacksheep-create-demo.gif)

The CLI includes a help, and supports custom templates, using the
same sources supported by `Cookiecutter`.

## Getting started with the documentation

The documentation offers getting started tutorials:
* [Getting started:
  basics](https://www.neoteroi.dev/blacksheep/getting-started/)
* [Getting started: the MVC project
  template](https://www.neoteroi.dev/blacksheep/mvc-project-template/)

These project templates can be used to start new applications faster:

* [MVC project
  template](https://github.com/Neoteroi/BlackSheepMVC)
* [Empty project
  template](https://github.com/Neoteroi/BlackSheepEmptyProject)

## Requirements

[Python](https://www.python.org): any version listed in the project's
classifiers. The current list is:

[![versions](https://img.shields.io/pypi/pyversions/blacksheep.svg)](https://github.com/robertoprevato/blacksheep)


BlackSheep belongs to the category of
[ASGI](https://asgi.readthedocs.io/en/latest/) web frameworks, so it requires
an ASGI HTTP server to run, such as [uvicorn](http://www.uvicorn.org/), or
[hypercorn](https://pgjones.gitlab.io/hypercorn/). For example, to use it with
uvicorn:

```bash
$ pip install uvicorn
```

To run an application like in the example above, use the methods provided by
the ASGI HTTP Server:

```bash
# if the BlackSheep app is defined in a file `server.py`

$ uvicorn server:app
```

To run for production, refer to the documentation of the chosen ASGI server
(i.e. for [uvicorn](https://www.uvicorn.org/#running-with-gunicorn)).

## Automatic bindings and dependency injection
BlackSheep supports automatic binding of values for request handlers, by type
annotation or by conventions. See [more
here](https://www.neoteroi.dev/blacksheep/requests/).

```python
from dataclasses import dataclass

from blacksheep import Application, FromJSON, FromQuery, get, post


app = Application()


@dataclass
class CreateCatInput:
    name: str


@post("/api/cats")
async def example(data: FromJSON[CreateCatInput]):
    # in this example, data is bound automatically reading the JSON
    # payload and creating an instance of `CreateCatInput`
    ...


@get("/:culture_code/:area")
async def home(culture_code, area):
    # in this example, both parameters are obtained from routes with
    # matching names
    return f"Request for: {culture_code} {area}"


@get("/api/products")
def get_products(
    page: int = 1,
    size: int = 30,
    search: str = "",
):
    # this example illustrates support for implicit query parameters with
    # default values
    # since the source of page, size, and search is not specified and no
    # route parameter matches their name, they are obtained from query string
    ...


@get("/api/products2")
def get_products2(
    page: FromQuery[int] = FromQuery(1),
    size: FromQuery[int] = FromQuery(30),
    search: FromQuery[str] = FromQuery(""),
):
    # this example illustrates support for explicit query parameters with
    # default values
    # in this case, parameters are explicitly read from query string
    ...

```

It also supports [dependency
injection](https://www.neoteroi.dev/blacksheep/dependency-injection/), a
feature that provides a consistent and clean way to use dependencies in request
handlers.

## Generation of OpenAPI Documentation
[Generation of OpenAPI Documentation](https://www.neoteroi.dev/blacksheep/openapi/).

## Strategies to handle authentication and authorization
BlackSheep implements strategies to handle authentication and authorization.
These features are documented here:

* [Authentication](https://www.neoteroi.dev/blacksheep/authentication/)
* [Authorization](https://www.neoteroi.dev/blacksheep/authorization/)

```python
app.use_authentication()\
    .add(ExampleAuthenticationHandler())


app.use_authorization()\
    .add(AdminsPolicy())


@auth("admin")
@get("/")
async def only_for_admins():
    ...


@auth()
@get("/")
async def only_for_authenticated_users():
    ...
```

Since version `1.2.1`, BlackSheep implements:

* [Built-in support for OpenID Connect authentication](https://www.neoteroi.dev/blacksheep/authentication/#oidc)
* [Built-in support for JWT Bearer authentication](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)

Meaning that it is easy to integrate with services such as:
* [Auth0](https://auth0.com)
* [Azure Active Directory](https://azure.microsoft.com/en-us/services/active-directory/)
* [Azure Active Directory B2C](https://docs.microsoft.com/en-us/azure/active-directory-b2c/overview)
* [Okta](https://www.okta.com)

Refer to the documentation and to [BlackSheep-Examples](https://github.com/Neoteroi/BlackSheep-Examples)
for more details and examples.

## Web framework features

* [ASGI compatibility](https://www.neoteroi.dev/blacksheep/asgi/)
* [Routing](https://www.neoteroi.dev/blacksheep/routing/)
* Request handlers can be [defined as
  functions](https://www.neoteroi.dev/blacksheep/request-handlers/), or [class
  methods](https://www.neoteroi.dev/blacksheep/controllers/)
* [Middlewares](https://www.neoteroi.dev/blacksheep/middlewares/)
* [WebSocket](https://www.neoteroi.dev/blacksheep/websocket/)
* [Server-Sent Events (SSE)](https://www.neoteroi.dev/blacksheep/server-sent-events/)
* [Built-in support for dependency
  injection](https://www.neoteroi.dev/blacksheep/dependency-injection/)
* [Support for automatic binding of route and query parameters to request
  handlers methods
  calls](https://www.neoteroi.dev/blacksheep/getting-started/#handling-route-parameters)
* [Strategy to handle
  exceptions](https://www.neoteroi.dev/blacksheep/application/#configuring-exceptions-handlers)
* [Strategy to handle authentication and
  authorization](https://www.neoteroi.dev/blacksheep/authentication/)
* [Built-in support for OpenID Connect authentication using OIDC
  discovery](https://www.neoteroi.dev/blacksheep/authentication/#oidc)
* [Built-in support for JWT Bearer authentication using OIDC discovery and
  other sources of
  JWKS](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)
* [Handlers
  normalization](https://www.neoteroi.dev/blacksheep/request-handlers/)
* [Serving static
  files](https://www.neoteroi.dev/blacksheep/static-files/)
* [Integration with
  Jinja2](https://www.neoteroi.dev/blacksheep/templating/)
* [Support for serving SPAs that use HTML5 History API for client side
  routing](https://www.neoteroi.dev/blacksheep/static-files/#how-to-serve-spas-that-use-html5-history-api)
* [Support for automatic generation of OpenAPI
  Documentation](https://www.neoteroi.dev/blacksheep/openapi/)
* [Strategy to handle CORS settings](https://www.neoteroi.dev/blacksheep/cors/)
* [Sessions](https://www.neoteroi.dev/blacksheep/sessions/)
* Support for automatic binding of `dataclasses` and
  [`pydantic`](https://pydantic-docs.helpmanual.io) models to handle the
  request body payload expected by request handlers
* [`TestClient` class to simplify testing of applications](https://www.neoteroi.dev/blacksheep/testing/)
* [Anti Forgery validation](https://www.neoteroi.dev/blacksheep/anti-request-forgery) to protect against Cross-Site Request Forgery (XSRF/CSRF) attacks

## Client features

BlackSheep includes an HTTP Client.

**Example:**
```python
import asyncio

from blacksheep.client import ClientSession


async def client_example():
    async with ClientSession() as client:
        response = await client.get("https://docs.python.org/3/")
        text = await response.text()
        print(text)


asyncio.run(client_example())
```

## Supported platforms and runtimes
* Python: all versions included in the build matrix
* Ubuntu
* Windows 10
* macOS

## Documentation
Please refer to the [documentation website](https://www.neoteroi.dev/blacksheep/).

## Communication
[BlackSheep community in Gitter](https://gitter.im/Neoteroi/BlackSheep).

## Branches
The _main_ branch contains the currently developed version, which is version 2. The _v1_ branch contains version 1 of the web framework, for bugs fixes
and maintenance.

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "blacksheep",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "blacksheep,web framework,asyncio",
    "author": "",
    "author_email": "Roberto Prevato <roberto.prevato@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/33/83/d96bbc907a8c34272b1ae052b6e95fd3f38329198fc8e6a9a3a790091cf5/blacksheep-2.0.7.tar.gz",
    "platform": null,
    "description": "[![Build](https://github.com/Neoteroi/BlackSheep/workflows/Main/badge.svg)](https://github.com/Neoteroi/BlackSheep/actions)\n[![pypi](https://img.shields.io/pypi/v/BlackSheep.svg?color=blue)](https://pypi.org/project/BlackSheep/)\n[![versions](https://img.shields.io/pypi/pyversions/blacksheep.svg)](https://github.com/robertoprevato/blacksheep)\n[![codecov](https://codecov.io/gh/Neoteroi/BlackSheep/branch/master/graph/badge.svg?token=Nzi29L0Eg1)](https://codecov.io/gh/Neoteroi/BlackSheep)\n[![license](https://img.shields.io/github/license/Neoteroi/blacksheep.svg)](https://github.com/Neoteroi/blacksheep/blob/main/LICENSE) [![Join the chat at https://gitter.im/Neoteroi/BlackSheep](https://badges.gitter.im/Neoteroi/BlackSheep.svg)](https://gitter.im/Neoteroi/BlackSheep?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![documentation](https://img.shields.io/badge/\ud83d\udcd6-docs-purple)](https://www.neoteroi.dev/blacksheep/)\n\n# BlackSheep\nBlackSheep is an asynchronous web framework to build event based web\napplications with Python. It is inspired by\n[Flask](https://palletsprojects.com/p/flask/), [ASP.NET\nCore](https://docs.microsoft.com/en-us/aspnet/core/), and the work by [Yury\nSelivanov](https://magic.io/blog/uvloop-blazing-fast-python-networking/).\n\n<p align=\"left\">\n  <a href=\"#blacksheep\"><img width=\"320\" height=\"271\" src=\"https://www.neoteroi.dev/blacksheep/img/blacksheep.png\" alt=\"Black Sheep\"></a>\n</p>\n\n```bash\npip install blacksheep\n```\n\n---\n\n```python\nfrom datetime import datetime\n\nfrom blacksheep import Application, get\n\n\napp = Application()\n\n@get(\"/\")\nasync def home():\n    return f\"Hello, World! {datetime.utcnow().isoformat()}\"\n\n```\n\n## Getting started using the CLI \u2728\n\nBlackSheep offers a CLI to bootstrap new projects rapidly.\nTo try it, first install the `blacksheep-cli` package:\n\n```bash\npip install blacksheep-cli\n```\n\nThen use the `blacksheep create` command to bootstrap a project\nusing one of the supported templates.\n\n![blacksheep create command](https://gist.githubusercontent.com/RobertoPrevato/38a0598b515a2f7257c614938843b99b/raw/67d15ba337de94c2f50d980a7b8924a747259254/blacksheep-create-demo.gif)\n\nThe CLI includes a help, and supports custom templates, using the\nsame sources supported by `Cookiecutter`.\n\n## Getting started with the documentation\n\nThe documentation offers getting started tutorials:\n* [Getting started:\n  basics](https://www.neoteroi.dev/blacksheep/getting-started/)\n* [Getting started: the MVC project\n  template](https://www.neoteroi.dev/blacksheep/mvc-project-template/)\n\nThese project templates can be used to start new applications faster:\n\n* [MVC project\n  template](https://github.com/Neoteroi/BlackSheepMVC)\n* [Empty project\n  template](https://github.com/Neoteroi/BlackSheepEmptyProject)\n\n## Requirements\n\n[Python](https://www.python.org): any version listed in the project's\nclassifiers. The current list is:\n\n[![versions](https://img.shields.io/pypi/pyversions/blacksheep.svg)](https://github.com/robertoprevato/blacksheep)\n\n\nBlackSheep belongs to the category of\n[ASGI](https://asgi.readthedocs.io/en/latest/) web frameworks, so it requires\nan ASGI HTTP server to run, such as [uvicorn](http://www.uvicorn.org/), or\n[hypercorn](https://pgjones.gitlab.io/hypercorn/). For example, to use it with\nuvicorn:\n\n```bash\n$ pip install uvicorn\n```\n\nTo run an application like in the example above, use the methods provided by\nthe ASGI HTTP Server:\n\n```bash\n# if the BlackSheep app is defined in a file `server.py`\n\n$ uvicorn server:app\n```\n\nTo run for production, refer to the documentation of the chosen ASGI server\n(i.e. for [uvicorn](https://www.uvicorn.org/#running-with-gunicorn)).\n\n## Automatic bindings and dependency injection\nBlackSheep supports automatic binding of values for request handlers, by type\nannotation or by conventions. See [more\nhere](https://www.neoteroi.dev/blacksheep/requests/).\n\n```python\nfrom dataclasses import dataclass\n\nfrom blacksheep import Application, FromJSON, FromQuery, get, post\n\n\napp = Application()\n\n\n@dataclass\nclass CreateCatInput:\n    name: str\n\n\n@post(\"/api/cats\")\nasync def example(data: FromJSON[CreateCatInput]):\n    # in this example, data is bound automatically reading the JSON\n    # payload and creating an instance of `CreateCatInput`\n    ...\n\n\n@get(\"/:culture_code/:area\")\nasync def home(culture_code, area):\n    # in this example, both parameters are obtained from routes with\n    # matching names\n    return f\"Request for: {culture_code} {area}\"\n\n\n@get(\"/api/products\")\ndef get_products(\n    page: int = 1,\n    size: int = 30,\n    search: str = \"\",\n):\n    # this example illustrates support for implicit query parameters with\n    # default values\n    # since the source of page, size, and search is not specified and no\n    # route parameter matches their name, they are obtained from query string\n    ...\n\n\n@get(\"/api/products2\")\ndef get_products2(\n    page: FromQuery[int] = FromQuery(1),\n    size: FromQuery[int] = FromQuery(30),\n    search: FromQuery[str] = FromQuery(\"\"),\n):\n    # this example illustrates support for explicit query parameters with\n    # default values\n    # in this case, parameters are explicitly read from query string\n    ...\n\n```\n\nIt also supports [dependency\ninjection](https://www.neoteroi.dev/blacksheep/dependency-injection/), a\nfeature that provides a consistent and clean way to use dependencies in request\nhandlers.\n\n## Generation of OpenAPI Documentation\n[Generation of OpenAPI Documentation](https://www.neoteroi.dev/blacksheep/openapi/).\n\n## Strategies to handle authentication and authorization\nBlackSheep implements strategies to handle authentication and authorization.\nThese features are documented here:\n\n* [Authentication](https://www.neoteroi.dev/blacksheep/authentication/)\n* [Authorization](https://www.neoteroi.dev/blacksheep/authorization/)\n\n```python\napp.use_authentication()\\\n    .add(ExampleAuthenticationHandler())\n\n\napp.use_authorization()\\\n    .add(AdminsPolicy())\n\n\n@auth(\"admin\")\n@get(\"/\")\nasync def only_for_admins():\n    ...\n\n\n@auth()\n@get(\"/\")\nasync def only_for_authenticated_users():\n    ...\n```\n\nSince version `1.2.1`, BlackSheep implements:\n\n* [Built-in support for OpenID Connect authentication](https://www.neoteroi.dev/blacksheep/authentication/#oidc)\n* [Built-in support for JWT Bearer authentication](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)\n\nMeaning that it is easy to integrate with services such as:\n* [Auth0](https://auth0.com)\n* [Azure Active Directory](https://azure.microsoft.com/en-us/services/active-directory/)\n* [Azure Active Directory B2C](https://docs.microsoft.com/en-us/azure/active-directory-b2c/overview)\n* [Okta](https://www.okta.com)\n\nRefer to the documentation and to [BlackSheep-Examples](https://github.com/Neoteroi/BlackSheep-Examples)\nfor more details and examples.\n\n## Web framework features\n\n* [ASGI compatibility](https://www.neoteroi.dev/blacksheep/asgi/)\n* [Routing](https://www.neoteroi.dev/blacksheep/routing/)\n* Request handlers can be [defined as\n  functions](https://www.neoteroi.dev/blacksheep/request-handlers/), or [class\n  methods](https://www.neoteroi.dev/blacksheep/controllers/)\n* [Middlewares](https://www.neoteroi.dev/blacksheep/middlewares/)\n* [WebSocket](https://www.neoteroi.dev/blacksheep/websocket/)\n* [Server-Sent Events (SSE)](https://www.neoteroi.dev/blacksheep/server-sent-events/)\n* [Built-in support for dependency\n  injection](https://www.neoteroi.dev/blacksheep/dependency-injection/)\n* [Support for automatic binding of route and query parameters to request\n  handlers methods\n  calls](https://www.neoteroi.dev/blacksheep/getting-started/#handling-route-parameters)\n* [Strategy to handle\n  exceptions](https://www.neoteroi.dev/blacksheep/application/#configuring-exceptions-handlers)\n* [Strategy to handle authentication and\n  authorization](https://www.neoteroi.dev/blacksheep/authentication/)\n* [Built-in support for OpenID Connect authentication using OIDC\n  discovery](https://www.neoteroi.dev/blacksheep/authentication/#oidc)\n* [Built-in support for JWT Bearer authentication using OIDC discovery and\n  other sources of\n  JWKS](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)\n* [Handlers\n  normalization](https://www.neoteroi.dev/blacksheep/request-handlers/)\n* [Serving static\n  files](https://www.neoteroi.dev/blacksheep/static-files/)\n* [Integration with\n  Jinja2](https://www.neoteroi.dev/blacksheep/templating/)\n* [Support for serving SPAs that use HTML5 History API for client side\n  routing](https://www.neoteroi.dev/blacksheep/static-files/#how-to-serve-spas-that-use-html5-history-api)\n* [Support for automatic generation of OpenAPI\n  Documentation](https://www.neoteroi.dev/blacksheep/openapi/)\n* [Strategy to handle CORS settings](https://www.neoteroi.dev/blacksheep/cors/)\n* [Sessions](https://www.neoteroi.dev/blacksheep/sessions/)\n* Support for automatic binding of `dataclasses` and\n  [`pydantic`](https://pydantic-docs.helpmanual.io) models to handle the\n  request body payload expected by request handlers\n* [`TestClient` class to simplify testing of applications](https://www.neoteroi.dev/blacksheep/testing/)\n* [Anti Forgery validation](https://www.neoteroi.dev/blacksheep/anti-request-forgery) to protect against Cross-Site Request Forgery (XSRF/CSRF) attacks\n\n## Client features\n\nBlackSheep includes an HTTP Client.\n\n**Example:**\n```python\nimport asyncio\n\nfrom blacksheep.client import ClientSession\n\n\nasync def client_example():\n    async with ClientSession() as client:\n        response = await client.get(\"https://docs.python.org/3/\")\n        text = await response.text()\n        print(text)\n\n\nasyncio.run(client_example())\n```\n\n## Supported platforms and runtimes\n* Python: all versions included in the build matrix\n* Ubuntu\n* Windows 10\n* macOS\n\n## Documentation\nPlease refer to the [documentation website](https://www.neoteroi.dev/blacksheep/).\n\n## Communication\n[BlackSheep community in Gitter](https://gitter.im/Neoteroi/BlackSheep).\n\n## Branches\nThe _main_ branch contains the currently developed version, which is version 2. The _v1_ branch contains version 1 of the web framework, for bugs fixes\nand maintenance.\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "Fast web framework for Python asyncio",
    "version": "2.0.7",
    "project_urls": {
        "Bug Tracker": "https://github.com/Neoteroi/BlackSheep/issues",
        "Homepage": "https://github.com/Neoteroi/BlackSheep"
    },
    "split_keywords": [
        "blacksheep",
        "web framework",
        "asyncio"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0b7f50b1d37f7418d14687d896bd662f27b6d3892b7d5b47dae93bf59db2bc8f",
                "md5": "ea51f849524ba6cbf9d7ffdddf14b20d",
                "sha256": "7d707010d71f9a7d048966cac9f8e21eb772c7a04b54755ae9a2e51b3e888bea"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp310-cp310-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ea51f849524ba6cbf9d7ffdddf14b20d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 1767293,
            "upload_time": "2024-02-17T09:31:14",
            "upload_time_iso_8601": "2024-02-17T09:31:14.582830Z",
            "url": "https://files.pythonhosted.org/packages/0b/7f/50b1d37f7418d14687d896bd662f27b6d3892b7d5b47dae93bf59db2bc8f/blacksheep-2.0.7-cp310-cp310-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "21a6dbc51a9b92ff645e8b23878c1c86ff2f5c3190070641394726f918e71a03",
                "md5": "900466c5dbf8c6986d0befc523477c5a",
                "sha256": "b0ef73603ccbb08cb161078f174be059c7ab6881534899891b76a46afde81f00"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "900466c5dbf8c6986d0befc523477c5a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 4434005,
            "upload_time": "2024-02-17T09:31:17",
            "upload_time_iso_8601": "2024-02-17T09:31:17.334745Z",
            "url": "https://files.pythonhosted.org/packages/21/a6/dbc51a9b92ff645e8b23878c1c86ff2f5c3190070641394726f918e71a03/blacksheep-2.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "12c8ab532dfd0d5ae78811a83e3a2b12227f238e3097ef779c0230bbe814ee15",
                "md5": "c95d1cb151136c8308cf6e6ba98971e6",
                "sha256": "dd97981fb7e9ee22416df14a17cb88307202e49d90ce5fdd9f99d531c3eb3c2a"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c95d1cb151136c8308cf6e6ba98971e6",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 1690455,
            "upload_time": "2024-02-17T09:31:19",
            "upload_time_iso_8601": "2024-02-17T09:31:19.069456Z",
            "url": "https://files.pythonhosted.org/packages/12/c8/ab532dfd0d5ae78811a83e3a2b12227f238e3097ef779c0230bbe814ee15/blacksheep-2.0.7-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "52682854610aea9fe317df6675a27c9d286f5b1073b5eb903c93956e8f422f6e",
                "md5": "7f7199b105eb547de3ed25a4b913b938",
                "sha256": "676285158a3d3bdd77e5bf48805e6359d86ef718ad21895ad239c7f32b11e110"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp311-cp311-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "7f7199b105eb547de3ed25a4b913b938",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 2378373,
            "upload_time": "2024-02-17T09:31:21",
            "upload_time_iso_8601": "2024-02-17T09:31:21.124926Z",
            "url": "https://files.pythonhosted.org/packages/52/68/2854610aea9fe317df6675a27c9d286f5b1073b5eb903c93956e8f422f6e/blacksheep-2.0.7-cp311-cp311-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "021355a7d82f3937e5da7f8d5487444f0c134c37d5b27e3f0d56825f9b0969bf",
                "md5": "4e120adf7a6c6dd476272543eb4985bb",
                "sha256": "bcee81f0238ee5c10c7fc4d45a8a49cd012188ab9756c695922aa79c73cd1f5c"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4e120adf7a6c6dd476272543eb4985bb",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 4725162,
            "upload_time": "2024-02-17T09:31:23",
            "upload_time_iso_8601": "2024-02-17T09:31:23.351665Z",
            "url": "https://files.pythonhosted.org/packages/02/13/55a7d82f3937e5da7f8d5487444f0c134c37d5b27e3f0d56825f9b0969bf/blacksheep-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c7cf7b61f88592c9793746f603de0fe55b3364fc0ca35edf9ce4e77912e836a7",
                "md5": "15a2f3c6e8664b86fa762ceec9754c26",
                "sha256": "aff0e2503c5fc7237475533d788153c01acaf4d00bb7a0a62d7fcb526ed6ec62"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "15a2f3c6e8664b86fa762ceec9754c26",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 1693640,
            "upload_time": "2024-02-17T09:31:25",
            "upload_time_iso_8601": "2024-02-17T09:31:25.439327Z",
            "url": "https://files.pythonhosted.org/packages/c7/cf/7b61f88592c9793746f603de0fe55b3364fc0ca35edf9ce4e77912e836a7/blacksheep-2.0.7-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8e6f05b6ac2820626d8124c5d055242c678252f630ea1755ee021e9f348415f2",
                "md5": "1e477e1953cf36353f7a8f10acdeaf3d",
                "sha256": "36f5c7cd30b36bc076aed972ba68645acde0af59e6c2a5b6ab301bc27ec7a01e"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp312-cp312-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "1e477e1953cf36353f7a8f10acdeaf3d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.7",
            "size": 2345836,
            "upload_time": "2024-02-17T09:31:27",
            "upload_time_iso_8601": "2024-02-17T09:31:27.597100Z",
            "url": "https://files.pythonhosted.org/packages/8e/6f/05b6ac2820626d8124c5d055242c678252f630ea1755ee021e9f348415f2/blacksheep-2.0.7-cp312-cp312-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1c3b721bf625b7ccb3360b6fd95fc333cf044f01e3c6980fbce6022519bc59b5",
                "md5": "a0a87b5b9f036fef9c5edfc792f361f5",
                "sha256": "7d451f4c18d7af1852ee6cc52ab7a0bb0c435d1d6cd6c22d4238d229400c25b8"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a0a87b5b9f036fef9c5edfc792f361f5",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.7",
            "size": 5124462,
            "upload_time": "2024-02-17T09:31:29",
            "upload_time_iso_8601": "2024-02-17T09:31:29.635461Z",
            "url": "https://files.pythonhosted.org/packages/1c/3b/721bf625b7ccb3360b6fd95fc333cf044f01e3c6980fbce6022519bc59b5/blacksheep-2.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e79ee8b55a70b30b576397d9a48fceadf492c7a98c0dc171048be03976be7ecd",
                "md5": "864b67c5d82522a30be720280142218b",
                "sha256": "fb2594c101241d4a983085667898a6f43024024d9722f8a3df16150f4bdd5d39"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "864b67c5d82522a30be720280142218b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.7",
            "size": 1686440,
            "upload_time": "2024-02-17T09:31:31",
            "upload_time_iso_8601": "2024-02-17T09:31:31.990198Z",
            "url": "https://files.pythonhosted.org/packages/e7/9e/e8b55a70b30b576397d9a48fceadf492c7a98c0dc171048be03976be7ecd/blacksheep-2.0.7-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4ee51d21aa11ed8108765f11649a19f4d670154447a4d9ef58598d66e570e5a5",
                "md5": "35a95c345f356faead025017b3d69f90",
                "sha256": "f02abc213aa95f8d8453609b3e601da785f11712396a65f3945e5b9b66d20f1b"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp38-cp38-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "35a95c345f356faead025017b3d69f90",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 1769668,
            "upload_time": "2024-02-17T09:31:34",
            "upload_time_iso_8601": "2024-02-17T09:31:34.701706Z",
            "url": "https://files.pythonhosted.org/packages/4e/e5/1d21aa11ed8108765f11649a19f4d670154447a4d9ef58598d66e570e5a5/blacksheep-2.0.7-cp38-cp38-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4bc69e23b4816983188c5567f274ef1d5788f698efd1d5b8762246f4459ca48b",
                "md5": "9d94e99c456eb8120d6d37da582f190c",
                "sha256": "fb826d920e5fc75e44f36de36b59b891d2c34004091083f8525c2373d0d4cf75"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9d94e99c456eb8120d6d37da582f190c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 4688101,
            "upload_time": "2024-02-17T09:31:36",
            "upload_time_iso_8601": "2024-02-17T09:31:36.395113Z",
            "url": "https://files.pythonhosted.org/packages/4b/c6/9e23b4816983188c5567f274ef1d5788f698efd1d5b8762246f4459ca48b/blacksheep-2.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ffb149f6e740f769c3065fc7573f45392bc44bf15835bf9b4863c2ca6749a24f",
                "md5": "0062ac9ee27f958d129b761b880f797d",
                "sha256": "2f4cc63f9f18c56ae349d2f03c991fbc5affc6b871674c407b60d574be8683a6"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0062ac9ee27f958d129b761b880f797d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 1692707,
            "upload_time": "2024-02-17T09:31:38",
            "upload_time_iso_8601": "2024-02-17T09:31:38.584437Z",
            "url": "https://files.pythonhosted.org/packages/ff/b1/49f6e740f769c3065fc7573f45392bc44bf15835bf9b4863c2ca6749a24f/blacksheep-2.0.7-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "07c4a21c1f9a0716c4ed08882abda80b38dfcad5c493bc3502d19adba0ba4293",
                "md5": "68d21d41d8da4526b67be53249b58325",
                "sha256": "f0a8036eb9475d9387da6b9d21470e22a1acd5da17ea973f0e5f378846f2344d"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp39-cp39-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "68d21d41d8da4526b67be53249b58325",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 1768568,
            "upload_time": "2024-02-17T09:31:40",
            "upload_time_iso_8601": "2024-02-17T09:31:40.007911Z",
            "url": "https://files.pythonhosted.org/packages/07/c4/a21c1f9a0716c4ed08882abda80b38dfcad5c493bc3502d19adba0ba4293/blacksheep-2.0.7-cp39-cp39-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e57c5870a2061acdd659e72e769a06f6cbd725bbcb3789c7f94b79a101df8fd2",
                "md5": "c2280ab55423823248d6e736230511ed",
                "sha256": "81cf3c2adab437f1d8e25c54b9920434b47db78463a46108dfacc429bd52b286"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c2280ab55423823248d6e736230511ed",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 4442401,
            "upload_time": "2024-02-17T09:31:41",
            "upload_time_iso_8601": "2024-02-17T09:31:41.483509Z",
            "url": "https://files.pythonhosted.org/packages/e5/7c/5870a2061acdd659e72e769a06f6cbd725bbcb3789c7f94b79a101df8fd2/blacksheep-2.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b6e936b180b14d53ff014272460a25fca2353e414aa5de457fd3f646e20107ca",
                "md5": "962b1c4218a848cb2b9bc87ca92f1483",
                "sha256": "cc6ab2376aa76189dd4c6e588e97aa67843d5df7ee95f8d4b8255d6fc1deab52"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "962b1c4218a848cb2b9bc87ca92f1483",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 1692628,
            "upload_time": "2024-02-17T09:31:42",
            "upload_time_iso_8601": "2024-02-17T09:31:42.973232Z",
            "url": "https://files.pythonhosted.org/packages/b6/e9/36b180b14d53ff014272460a25fca2353e414aa5de457fd3f646e20107ca/blacksheep-2.0.7-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3383d96bbc907a8c34272b1ae052b6e95fd3f38329198fc8e6a9a3a790091cf5",
                "md5": "db44ba3e464392c6d78a01cf9254a86c",
                "sha256": "ae192809c1e42de5a0d6230f1238d027641a8d889a4a9fb5349b7980f74afd88"
            },
            "downloads": -1,
            "filename": "blacksheep-2.0.7.tar.gz",
            "has_sig": false,
            "md5_digest": "db44ba3e464392c6d78a01cf9254a86c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 1172541,
            "upload_time": "2024-02-17T09:31:44",
            "upload_time_iso_8601": "2024-02-17T09:31:44.980230Z",
            "url": "https://files.pythonhosted.org/packages/33/83/d96bbc907a8c34272b1ae052b6e95fd3f38329198fc8e6a9a3a790091cf5/blacksheep-2.0.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-02-17 09:31:44",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Neoteroi",
    "github_project": "BlackSheep",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "blacksheep"
}
        
Elapsed time: 4.33352s