Skip to main content

GitHub Webhooks Framework

Project description

Python GitHub Webhooks Framework

Simple and lightweight micro framework for quick integration with GitHub webhooks.
It's based on FastAPI and pydantic, nothing more!
Async and mypy friendly.

Run CI
PyPI

Installation

Just add github-webhooks-framework package.
Example:

  • pip install github-webhooks-framework
  • poetry add github-webhooks-framework

Example

Create file example.py and copy next code:

import uvicorn
from pydantic import BaseModel

from github_webhooks import create_app
from github_webhooks.schemas import WebhookCommonPayload


# WebhookCommonPayload is based on pydantic.BaseModel
class PullRequestPayload(WebhookCommonPayload):
    class Pull(BaseModel):
        title: str
        url: str
    
    action: str
    pull_request: Pull
    

# Initialize Webhook App
app = create_app()


# Register webhook handler:
#   `pull_request` - name of an event to handle
#   `PullRequestPayload` - webhook payload will be parsed into this model
@app.hooks.register('pull_request', PullRequestPayload)
async def handler(payload: PullRequestPayload) -> None:
    print(f'New pull request {payload.pull_request.title}')
    print(f'  link: {payload.pull_request.url}')
    print(f'  author: {payload.sender.login}')


if __name__ == '__main__':
    # start uvicorn server
    uvicorn.run(app)

Let's have detailed overview.

We start by defining payload Model to parse incoming Pull Request Body.

class PullRequestPayload(WebhookCommonPayload):
    class Pull(BaseModel):
        title: str
        url: str
    
    action: str
    pull_request: Pull

In this example we only want to get action, pull_request.title and pull_request.url from payload.
By subclassing WebhookCommonPayload model will automatically get sender, repository and organization fields.

Next - we are creating ASGI app (based on FastAPI app)

app = create_app()

Optionally we can provide here secret_token Github Webhook secret

app = create_app(secret_token='super-secret-token')

And time to define our handler

@app.hooks.register('pull_request', PullRequestPayload)
async def handler(payload: PullRequestPayload) -> None:
    print(f'New pull request {payload.pull_request.title}')
    print(f'  link: {payload.pull_request.url}')
    print(f'  author: {payload.sender.login}')

We are using here @app.hooks.register deco, which accepts 2 arguments:

  • event: str - name of webhook event
  • payload_cls: pydantic.BaseModel - pydantic model class to parse request, subclassed from pydantic.BaseModel or WebhookCommonPayload.

And our handler function must be any of this signatures:

async def handler(payload: PullRequestPayload) -> None:
    ...
async def handler(payload: PullRequestPayload, headers: WebhookHeaders) -> Optional[str]:
    # `headers` will be WebhookHeaders model with Github Webhook headers parsed.
    ...

And the last - let's launch it.
For example with uvicorn

uvicorn example:app

Webhook will be available on http://localhost:8000/hook

That's it! Now you have a webhook server, which can handle incoming Github Webhook requests.

Project details


Download files

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

Source Distribution

github-webhooks-framework-0.1.11.tar.gz (19.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

github_webhooks_framework-0.1.11-py3-none-any.whl (33.7 kB view details)

Uploaded Python 3

File details

Details for the file github-webhooks-framework-0.1.11.tar.gz.

File metadata

  • Download URL: github-webhooks-framework-0.1.11.tar.gz
  • Upload date:
  • Size: 19.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.9.10 Linux/5.11.0-1028-azure

File hashes

Hashes for github-webhooks-framework-0.1.11.tar.gz
Algorithm Hash digest
SHA256 d2a0402fc2532347513c620a7de328e89f4f3abaa0d21b57a6f46a4d2e0a7abf
MD5 bd0fa9d9a85ce5a2976d634eef046ab9
BLAKE2b-256 233dc5eac245daae4f22b7e31c93e30bc0ab7bc2c6a3472bb6cc690dbe0cfd20

See more details on using hashes here.

File details

Details for the file github_webhooks_framework-0.1.11-py3-none-any.whl.

File metadata

File hashes

Hashes for github_webhooks_framework-0.1.11-py3-none-any.whl
Algorithm Hash digest
SHA256 90627550f65fbac395a4ff45a41e103333a1765b0f104a3ea060c7ab62276f32
MD5 07a5c3c8f1ea6f2acd083e2c23dc93f0
BLAKE2b-256 db87759636e602b5071ecbf0e080dfedb1e2f93fa602a731f342a93bedbab1d8

See more details on using hashes here.

Supported by

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