Async interactor for HTTP requests using a template method.
Project description
Simple example
# main.py
import asyncio
import json
from collections.abc import Sequence
from typing import NamedTuple
import httpx
import pydepot
from httperactor import HttpClient, HttpInteractor, Request
class Book(NamedTuple):
title: str
author: str
class State(NamedTuple):
books: tuple[Book, ...]
class StateSubscriber:
def on_state(self, state: State) -> None:
print(f"[StoreSubscriber] on_state called with {state}")
class SetBooksAction(pydepot.Action):
def __init__(self, books: Sequence[Book]):
self.books: Sequence[Book] = books
class SetBooksReducer(pydepot.Reducer[SetBooksAction, State]):
@property
def action_type(self) -> type[SetBooksAction]:
return SetBooksAction
def apply(self, action: SetBooksAction, state: State) -> State:
return State(books=tuple(action.books))
class GetBooksRequest(Request[Sequence[Book]]):
@property
def path(self) -> str:
return "/books"
def map_response(self, response: str) -> Sequence[Book]:
return json.loads(response, object_hook=lambda res: Book(**res))
class GetBooksInteractor(HttpInteractor[httpx.Request, Sequence[Book], State]):
@property
def request(self) -> Request[Sequence[Book]]:
return GetBooksRequest()
def actions(self, response: Sequence[Book]) -> Sequence[pydepot.Action]:
return [SetBooksAction(books=response)]
async def main() -> None:
store = pydepot.Store(initial_state=State(books=()))
store.register(SetBooksReducer())
subscriber = StateSubscriber()
store.subscribe(subscriber)
interactor = GetBooksInteractor(
http_client=HttpClient(httpx.AsyncClient(base_url="http://localhost:5000")),
store=store,
)
await interactor.execute()
if __name__ == "__main__":
asyncio.run(main())
$ curl localhost:5000/books
[
{
"author": "Alice",
"title": "foo"
},
{
"author": "Bob",
"title": "bar"
},
{
"author": "Charlie",
"title": "baz"
}
]
$ python3 main.py
[StoreSubscriber] on_state called with:
State(
books=(
Book(title='foo', author='Alice'),
Book(title='bar', author='Bob'),
Book(title='baz', author='Charlie')
)
)
Installation
Httperactor is available as httperactor
on PyPI:
pip install httperactor
Usage
For detailed quickstart and API reference, visit the Documentation.
License
Copyright (C) 2023 tombartk
This program is free software: you can redistribute it and/or modify it under the terms
of the GNU Affero General Public License as published by the Free Software Foundation,
either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program.
If not, see https://www.gnu.org/licenses/.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
httperactor-0.1.1.tar.gz
(25.7 kB
view details)
Built Distribution
File details
Details for the file httperactor-0.1.1.tar.gz
.
File metadata
- Download URL: httperactor-0.1.1.tar.gz
- Upload date:
- Size: 25.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.24.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2396af11c9b4c573a3447969168da349b276f3644124b71eb1eb8f44d3a2dd0c |
|
MD5 | 16557f46a46c1800a8a8b4dd52ebcec5 |
|
BLAKE2b-256 | 5df0ed09a2c0e8fd9cedc288de4b55af5dbd12424b7c14ec365f5883ea511d44 |
File details
Details for the file httperactor-0.1.1-py3-none-any.whl
.
File metadata
- Download URL: httperactor-0.1.1-py3-none-any.whl
- Upload date:
- Size: 20.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.24.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0a894ecee5a86f052d2c3a163c837870343d3d38ebbec899037936ba09b85085 |
|
MD5 | 230c2bed16b5dd898ae5c5ba7e7bfa28 |
|
BLAKE2b-256 | 15120af73fc6e3de43507da11688e9534ecba1145539a9e1d2bbfb94316a99f4 |