Skip to main content

Enhanced Service Gateway

Project description

Enhanced Service Gateway

Enhanced Service Gateway.

Code style: black License Coverage Test PyPi PyVersions


Introduction

ESG is a speed-oriented ASGI server implementation with HTTP/1.1 and WebSockets support.

Is a hard fork of the awesome uvicorn project.

Protocol implementation based on:

  • llhttp - For HTTP payload
  • http-parser - For URL parsing
  • httptools - Clean and fast binding for the previous two. ESG Cython part development started from its forking.

Performance

Speed comparison ESG vs Uvicorn

PS > docker-compose run --rm bench-esg
Running 15s test @ http://esg:8000/
  4 threads and 64 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.15ms  390.13us   9.51ms   92.82%
    Req/Sec     7.47k   455.23     9.39k    68.00%
  445749 requests in 15.01s, 66.32MB read
Requests/sec:  29694.49
Transfer/sec:      4.42MB
PS > docker-compose run --rm bench-uvicorn
Running 15s test @ http://uvicorn:8000/
  4 threads and 64 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     4.03ms    0.85ms  16.28ms   91.16%
    Req/Sec     3.99k   376.72     4.53k    82.67%
  238272 requests in 15.01s, 36.36MB read
Requests/sec:  15874.17
Transfer/sec:      2.42MB

Quickstart

Install using pip:

$ pip install esg[standard]

standart extra will also install:

  • uvloop if applicable to system arch
  • websockets if available *
  • watchgod for development's mode flag --reload
  • PyYAML for using *.yaml config files in --log-config parameter
  • python-dotenv for enabling --env-file parameter functionality
  • colorama for Windows users

*If you want use wsproto instead of websockets you'd need to install it manually

Running simple ASGI application

Create an application, in example.py:

async def app(scope, receive, send):
    assert scope['type'] == 'http'

    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ],
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
        'more_body': False
     })

Run the server:

$ esg example:app

ASGI frameworks

Squall

Squall framework which looks ahead.

High performance API framework.

Starlette

Starlette is a lightweight ASGI framework/toolkit.

It is ideal for building high performance asyncio services, and supports both HTTP and WebSockets.

Django Channels

The ASGI specification was originally designed for use with Django Channels.

Channels is a little different to other ASGI frameworks in that it provides an asynchronous frontend onto a threaded-framework backend. It allows Django to support WebSockets, background tasks, and long-running connections, with application code still running in a standard threaded context.

Quart

Quart is a Flask-like ASGI web framework.

FastAPI

FastAPI is an API framework based on Starlette and Pydantic, heavily inspired by previous server versions of APIStar.

You write your API function parameters with Python 3.6+ type declarations and get automatic data conversion, data validation, OpenAPI schemas (with JSON Schemas) and interactive API documentation UIs.

BlackSheep

BlackSheep is a web framework based on ASGI, inspired by Flask and ASP.NET Core.

Its most distinctive features are built-in support for dependency injection, automatic binding of parameters by request handler's type annotations, and automatic generation of OpenAPI documentation and Swagger UI.

Usage

The ESG command line tool is the easiest way to run your application...

Command line options

$ esg --help
Usage: esg [OPTIONS] APP

Options:
  --host TEXT                     Bind socket to this host.  [default:
                                  127.0.0.1]
  --port INTEGER                  Bind socket to this port.  [default: 8000]
  --uds TEXT                      Bind to a UNIX domain socket.
  --fd INTEGER                    Bind to socket from this file descriptor.
  --reload                        Enable auto-reload.
  --reload-dir PATH               Set reload directories explicitly, instead
                                  of using the current working directory.
  --reload-include TEXT           Set glob patterns to include while watching
                                  for files. Includes '*.py' by default; these
                                  defaults can be overridden in `--reload-
                                  exclude`.
  --reload-exclude TEXT           Set glob patterns to exclude while watching
                                  for files. Includes '.*, .py[cod], .sw.*,
                                  ~*' by default; these defaults can be
                                  overridden in `--reload-include`.
  --reload-delay FLOAT            Delay between previous and next check if
                                  application needs to be. Defaults to 0.25s.
                                  [default: 0.25]
  --workers INTEGER               Number of worker processes. Defaults to the
                                  $WEB_CONCURRENCY environment variable if
                                  available, or 1. Not valid with --reload.
  --loop [auto|asyncio|uvloop]    Event loop implementation.  [default: auto]
  --ws [auto|none|websockets|wsproto]
                                  WebSocket protocol implementation.
                                  [default: auto]
  --ws-max-size INTEGER           WebSocket max size message in bytes
                                  [default: 16777216]
  --ws-ping-interval FLOAT        WebSocket ping interval  [default: 20.0]
  --ws-ping-timeout FLOAT         WebSocket ping timeout  [default: 20.0]
  --lifespan [auto|on|off]        Lifespan implementation.  [default: auto]
  --interface [auto|asgi3|asgi2|wsgi]
                                  Select ASGI3, ASGI2, or WSGI as the
                                  application interface.  [default: auto]
  --env-file PATH                 Environment configuration file.
  --log-config PATH               Logging configuration file. Supported
                                  formats: .ini, .json, .yaml.
  --log-level [critical|error|warning|info|debug|trace]
                                  Log level. [default: info]
  --access-log / --no-access-log  Enable/Disable access log.
  --use-colors / --no-use-colors  Enable/Disable colorized logging.
  --proxy-headers / --no-proxy-headers
                                  Enable/Disable X-Forwarded-Proto,
                                  X-Forwarded-For, X-Forwarded-Port to
                                  populate remote address info.
  --server-header / --no-server-header
                                  Enable/Disable default Server header.
  --date-header / --no-date-header
                                  Enable/Disable default Date header.
  --forwarded-allow-ips TEXT      Comma seperated list of IPs to trust with
                                  proxy headers. Defaults to the
                                  $FORWARDED_ALLOW_IPS environment variable if
                                  available, or '127.0.0.1'.
  --root-path TEXT                Set the ASGI 'root_path' for applications
                                  submounted below a given URL path.
  --limit-concurrency INTEGER     Maximum number of concurrent connections to
                                  allow, before issuing HTTP 503 responses.
  --backlog INTEGER               Maximum number of connections to hold in
                                  backlog
  --limit-max-requests INTEGER    Maximum number of requests to service before
                                  terminating the process.
  --timeout-keep-alive INTEGER    Close Keep-Alive connections if no new data
                                  is received within this timeout.  [default:
                                  5]
  --ssl-keyfile TEXT              SSL key file
  --ssl-certfile TEXT             SSL certificate file
  --ssl-keyfile-password TEXT     SSL keyfile password
  --ssl-version INTEGER           SSL version to use (see stdlib ssl module's)
                                  [default: 17]
  --ssl-cert-reqs INTEGER         Whether client certificate is required (see
                                  stdlib ssl module's)  [default: 0]
  --ssl-ca-certs TEXT             CA certificates file
  --ssl-ciphers TEXT              Ciphers to use (see stdlib ssl module's)
                                  [default: TLSv1]
  --header TEXT                   Specify custom default HTTP response headers
                                  as a Name:Value pair
  --version                       Display the esg version and exit.
  --app-dir TEXT                  Look for APP in the specified directory, by
                                  adding this to the PYTHONPATH. Defaults to
                                  the current working directory.  [default: .]
  --factory                       Treat APP as an application factory, i.e. a
                                  () -> <ASGI app> callable.  [default: False]
  --help                          Show this message and exit.

Running programmatically

To run ESG directly from your application

example.py:

import esg

async def app(scope, receive, send):
    assert scope['type'] == 'http'

    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ],
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
        'more_body': False
     })

if __name__ == "__main__":
    esg.run("example:app", host="127.0.0.1", port=5000, log_level="info")

Running with Gunicorn

Gunicorn is a mature, fully featured server and process manager.

ESG includes a Gunicorn worker class allowing you to run ASGI applications, with all of ESG's performance benefits, while also giving you Gunicorn's fully-featured process management.

This allows you to increase or decrease the number of worker processes on the fly, restart worker processes gracefully, or perform server upgrades without downtime.

For production deployments we recommend using gunicorn with the ESG worker class.

gunicorn example:app -w 4 -k esg.workers.ESGWorker

For more information, see the deployment documentation.

Application factories

The --factory flag allows loading the application from a factory function, rather than an application instance directly. The factory will be called with no arguments and should return an ASGI application.

example.py:

def create_app():
    app = ...
    return app
$ esg --factory example:create_app

The ASGI interface

ESG uses the ASGI specification for interacting with an ASGI application.

The application should expose an async callable which takes three arguments:

  • scope - A dictionary containing information about the incoming connection.
  • receive - A channel on which to receive incoming messages from the server.
  • send - A channel on which to send outgoing messages to the server.

Two common patterns you might use are either function-based applications:

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    ...

Or instance-based applications:

class App:
    async def __call__(self, scope, receive, send):
        assert scope['type'] == 'http'
        ...

app = App()

It's good practice for applications to raise an exception on scope types that they do not handle.

The content of the scope argument, and the messages expected by receive and send depend on the protocol being used.

The format for HTTP messages is described in the ASGI HTTP Message format.

HTTP Scope

An incoming HTTP request might have a connection scope like this:

{
    'type': 'http.request',
    'scheme': 'http',
    'root_path': '',
    'server': ('127.0.0.1', 8000),
    'http_version': '1.1',
    'method': 'GET',
    'path': '/',
    'headers': [
        [b'host', b'127.0.0.1:8000'],
        [b'user-agent', b'curl/7.51.0'],
        [b'accept', b'*/*']
    ]
}

HTTP Messages

The instance coroutine communicates back to the server by sending messages to the send coroutine.

await send({
    'type': 'http.response.start',
    'status': 200,
    'headers': [
        [b'content-type', b'text/plain'],
    ]
})
await send({
    'type': 'http.response.body',
    'body': b'Hello, world!',
})

Requests & responses

Here's an example that displays the method and path used in the incoming request:

async def app(scope, receive, send):
    """
    Echo the method and path back in an HTTP response.
    """
    assert scope['type'] == 'http'

    body = f'Received {scope["method"]} request to {scope["path"]}'
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ]
    })
    await send({
        'type': 'http.response.body',
        'body': body.encode('utf-8'),
    })

Reading the request body

You can stream the request body without blocking the asyncio task pool, by fetching messages from the receive coroutine.

async def read_body(receive):
    """
    Read and return the entire body from an incoming ASGI message.
    """
    body = b''
    more_body = True

    while more_body:
        message = await receive()
        body += message.get('body', b'')
        more_body = message.get('more_body', False)

    return body


async def app(scope, receive, send):
    """
    Echo the request body back in an HTTP response.
    """
    body = await read_body(receive)
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ]
    })
    await send({
        'type': 'http.response.body',
        'body': body,
    })

Streaming responses

You can stream responses by sending multiple http.response.body messages to the send coroutine.

import asyncio


async def app(scope, receive, send):
    """
    Send a slowly streaming HTTP response back to the client.
    """
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ]
    })
    for chunk in [b'Hello', b', ', b'world!']:
        await send({
            'type': 'http.response.body',
            'body': chunk,
            'more_body': True
        })
        await asyncio.sleep(1)
    await send({
        'type': 'http.response.body',
        'body': b'',
    })

Alternative ASGI servers

Uvicorn

The most famous ASGI server. ESG development started from hard-forking of exactly Uvicorn.

Uvicorn has a clean codebase and superior fast performance.

$ pip install uvicorn
$ uvicorn app:App

Daphne

The first ASGI server implementation, originally developed to power Django Channels, is the Daphne webserver.

It is run widely in production, and supports HTTP/1.1, HTTP/2, and WebSockets.

Any of the example applications given here can equally well be run using daphne instead.

$ pip install daphne
$ daphne app:App

Hypercorn

Hypercorn was initially part of the Quart web framework, before being separated out into a standalone ASGI server.

Hypercorn supports HTTP/1.1, HTTP/2, and WebSockets.

$ pip install hypercorn
$ hypercorn app:App

Roadmap

  • Better security setting.
    • Header timeout
    • Body timeout (timeout between calling receive and data arrive)
    • Headers size limit
    • Request body size limit
  • Statistic
  • Cythonized WebSocket protocol

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

esg-0.2.0.tar.gz (198.8 kB view details)

Uploaded Source

Built Distributions

esg-0.2.0-cp310-cp310-win_amd64.whl (305.1 kB view details)

Uploaded CPython 3.10 Windows x86-64

esg-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl (897.0 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

esg-0.2.0-cp310-cp310-musllinux_1_1_aarch64.whl (898.2 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

esg-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (789.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

esg-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (839.8 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

esg-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl (328.5 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

esg-0.2.0-cp310-cp310-macosx_10_9_universal2.whl (448.3 kB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

esg-0.2.0-cp39-cp39-win_amd64.whl (304.5 kB view details)

Uploaded CPython 3.9 Windows x86-64

esg-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl (889.0 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

esg-0.2.0-cp39-cp39-musllinux_1_1_aarch64.whl (889.4 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

esg-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (789.0 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

esg-0.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (835.4 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

esg-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl (328.0 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

esg-0.2.0-cp39-cp39-macosx_10_9_universal2.whl (447.3 kB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file esg-0.2.0.tar.gz.

File metadata

  • Download URL: esg-0.2.0.tar.gz
  • Upload date:
  • Size: 198.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0.tar.gz
Algorithm Hash digest
SHA256 87c50056a0615faca90c33f74ba17d201828283147fd1d9a141348e9ee04166e
MD5 cc0feda547f3f8db5eb631b1bf255c19
BLAKE2b-256 0b1b81d1c7ca43c262d315f0043b515a9716fdedc55379d6c3cc9288cf3aeed8

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: esg-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 305.1 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 597290c030326297ddbeffcedb886e08c67471165fab4a09480d9e971b4703b4
MD5 a0c3505672dd40ff0b494feb763f276f
BLAKE2b-256 984aef8e7e71fde06d098e197a5e472938c9d97eb0fd368ee7aac48f9bce940e

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

  • Download URL: esg-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl
  • Upload date:
  • Size: 897.0 kB
  • Tags: CPython 3.10, musllinux: musl 1.1+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 523359e3597cd3cb464e71d295001a423918fad4031d9695d4d73f0467fe1971
MD5 6b5f538e4098515a7c28a0897eed0e23
BLAKE2b-256 5b9b4a31936d94e0c9890b3574cf74c1b40a5fd5db46bcb3ef3020db6142d481

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

  • Download URL: esg-0.2.0-cp310-cp310-musllinux_1_1_aarch64.whl
  • Upload date:
  • Size: 898.2 kB
  • Tags: CPython 3.10, musllinux: musl 1.1+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 f54681dd70592f2689b64f842033410ed60d6089e46562a8e5a70a31ab86622f
MD5 f88985f821c19c134998de1b437ca8d5
BLAKE2b-256 c3e474d343ac97432e7c0c40f2968304b008a6fc4df426594b911c3001f8bfe6

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for esg-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 554127ad942270b2020a3feaac1ca8b4926819e5320d9be315d9871f0a4a38ce
MD5 bbbb87b22f455690a43ed92fbdf626ae
BLAKE2b-256 900d1a08b09bf06cf385f2d18c58ddb563f002bab98d4a34f3d330adbbca4513

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for esg-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 baec96a11dbf72ea6fd83d7ba0bbdc50089fb331b1c0c1556807dde478f7fc2f
MD5 0e996c419006491a5f0423985a643a78
BLAKE2b-256 727bb43c969d1431f6896675d6e22c16c32d2199c578457932654c81bd786c04

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: esg-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 328.5 kB
  • Tags: CPython 3.10, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7e754470221d7f52cbb3765ca1da3bea0ba3092a86456f8dee502599b8af55a1
MD5 119865c8cea847b798874d83d67016f7
BLAKE2b-256 e36b8ad2a5cf90ed9483af039f11c84bdc6361c77a4f7f18f7cce04d2e6c2bf9

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

  • Download URL: esg-0.2.0-cp310-cp310-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 448.3 kB
  • Tags: CPython 3.10, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 fe2adec2b304a7d816c15211c0ad0506f0ee9bfcbdac14b44acd3ea5705a5c3b
MD5 a74575e1da645c1a19ba81660fd62b29
BLAKE2b-256 797ba58a7dceb297e5dc989c1e55ac1644ded0e5f0d193e53de52d404988444f

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: esg-0.2.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 304.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f00f3f17749de95a6e610d12deebe454a8c9f195388cae8a516a28acbee252d2
MD5 7274bfb6c51030397c1d80a02b435751
BLAKE2b-256 9c65a1ade9214f35ed48454028ceb2fe3a675b7163b4fa7c3bfbb0eb298a29ce

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

  • Download URL: esg-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl
  • Upload date:
  • Size: 889.0 kB
  • Tags: CPython 3.9, musllinux: musl 1.1+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 2d0fd9a1b2e36f13c6dad82e5b521c3f19e47b28faa98a7b823205b94a2f7a78
MD5 70e8f2d2c90977d6e11e175679624438
BLAKE2b-256 128e92e7053fe36ffc6b115daeb236e59e4fde68ab2db7d1fb769984d180e204

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp39-cp39-musllinux_1_1_aarch64.whl.

File metadata

  • Download URL: esg-0.2.0-cp39-cp39-musllinux_1_1_aarch64.whl
  • Upload date:
  • Size: 889.4 kB
  • Tags: CPython 3.9, musllinux: musl 1.1+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 b081355eada992a6bf13c73aec415b79d5d81308a5dc0bb5118decf0ba5d1d51
MD5 e409bbf27053c88a73bd2cb6e89c9419
BLAKE2b-256 41b53eefaaf11747a6e200855196070b2a52501551b23ab6a364f6ae38ad8db0

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for esg-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e0e17dfc9cbbb3c1b43d3fb90d23c56df2278e68b4cd0789616455c2d941e3b8
MD5 a6fc3665b4999bcacd332f7bc47b9648
BLAKE2b-256 c7ad40db2c03578309aa09df3f53e8921fdaf55fef09be1879550828e33711f0

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for esg-0.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 b5a3c4ba8d8108dd20b48b2b1bfef89de212c5051e9f324aff84e6fa2c873b7c
MD5 2bdf7063ca09d92b7f6624667e985b86
BLAKE2b-256 12f98c28af8d70a709a35fee7f5bf9004759a53a184131185cd97fb1d0655b77

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: esg-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 328.0 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 821c867991209c2002e38b31774123085584eb36fa3b11388238f28cda5acf10
MD5 61c552db26cf67f97b603ebf57a3aa83
BLAKE2b-256 66d7487e12622304018bbc02c6b16ea1ac6960c87ba53c2789e772f5a9316ed6

See more details on using hashes here.

File details

Details for the file esg-0.2.0-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

  • Download URL: esg-0.2.0-cp39-cp39-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 447.3 kB
  • Tags: CPython 3.9, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for esg-0.2.0-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3957c2030f11db9f0dbffa998b12fe568039d275bacbd7248b746def60b8d2c6
MD5 98b28ee459ca9f3b704b7f0542121e4b
BLAKE2b-256 add39343e9ff35c7c0e5c27501ee93dba311f3d989954c6f3a93831f31802126

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page