# WApi: Library to simplify api development
[![PyPI version](https://badge.fury.io/py/whaox-wapi.svg)](https://badge.fury.io/py/whaox-wapi)
## Libraries used:
* [jsons](https://github.com/ramonhagenaars/jsons)
* [requests](https://github.com/psf/requests)
* [aiohttp](https://github.com/aio-libs/aiohttp)
## Features
* Routes
* Serialization
* Asynchrony
* Request Params
* Smart substitution
## Installation
You can install the latest version with the command:
```commandline
pip install whaox-wapi
```
## • Routes
> You can create paths as you like, splitting your api-client into modules
```python
@Route("https://example.com")
class WApi:
service = Service()
@Route("/wapi")
class Service:
@Route("/path")
@GET("/")
def get(self): pass
@POST("/path")
def post(self): pass
```
```python
wapi = WApi()
wapi.service.get()
# eq
requests.get("https://example.com/wapi/path")
```
## • Serialization
> The library deserializes the received data according to the type that you specify in the `_T` parameter of the decorator.
>
> NOTE: The specified type must be json serializable - these are the base types and classes marked with the `@dataclass` annotation
```python
@dataclass
class Person:
name: str
@Route("https://example.com")
class WApi:
@GET("/person", _T=Person)
def person(self) -> Person: pass
@GET("/people", _T=List[Person])
def people(self) -> List[Person]: pass
```
```python
api = WApi()
person = api.person()
print(person.name)
>>> "John"
```
## • Asynchrony
> You can make the query asynchronous simply by adding an `async` keyword.
```python
@Route("https://example.com")
class WApi:
@GET("/person")
async def person(self): pass
```
```python
person = await api.person(params={"id": 1})
```
## • Request Params
> You can flexibly add parameters to request passing relevant attributes.
```python
@dataclass
class GetPersonRequest:
id: int
@dataclass
class CreatePersonRequest:
name: str
@Route("https://example.com")
class WApi:
@POST("/person")
def create_person(self, body: dict): pass
@Route("/person")
@GET("/")
def person(self, params: GetPersonRequest | dict): pass
```
```python
api.person(params={"id": 1})
api.create_person(body={"name": "john"})
# or
api.person(params=GetPersonRequest(1))
api.create_person(params=CreatePersonRequest("john"))
```
### • • Smart substitution
> The library understands what variables you used during formatting and will not substitute them into the path parameters.
```python
@dataclass
class GetPersonRequest:
id: int
preview: bool
@Route("https://example.com")
class WApi:
@Route("/person")
@GET("/{id}")
def person(self, params: GetPersonRequest): pass
```
```python
person = api.person(params=GetPersonRequest(1, true))
# eq
person = requests.get("https://example.com/person/1?preview=true")
```
Raw data
{
"_id": null,
"home_page": "https://github.com/topanim/WApi",
"name": "whaox-wapi",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "python, web, api, requests, aiohttp, post, get, put, patch, delete, rest",
"author": "WHAOX",
"author_email": "gorogannisan641@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/cd/72/36b1ab74b72858c8ed973db6695742eec7879b3a36be3130066acbb49d28/whaox-wapi-1.1.6.tar.gz",
"platform": null,
"description": "\r\n# WApi: Library to simplify api development\r\n\r\n[![PyPI version](https://badge.fury.io/py/whaox-wapi.svg)](https://badge.fury.io/py/whaox-wapi)\r\n\r\n## Libraries used:\r\n* [jsons](https://github.com/ramonhagenaars/jsons)\r\n* [requests](https://github.com/psf/requests)\r\n* [aiohttp](https://github.com/aio-libs/aiohttp)\r\n\r\n## Features\r\n\r\n* Routes\r\n* Serialization\r\n* Asynchrony\r\n* Request Params\r\n\t* Smart substitution\r\n\r\n## Installation\r\n\r\n You can install the latest version with the command:\r\n \r\n```commandline\r\npip install whaox-wapi\r\n```\r\n\r\n## \u2022 Routes\r\n\r\n> You can create paths as you like, splitting your api-client into modules\r\n\r\n```python\r\n\r\n@Route(\"https://example.com\")\r\nclass WApi:\r\n service = Service()\r\n\r\n@Route(\"/wapi\")\r\nclass Service:\r\n\r\n @Route(\"/path\")\r\n @GET(\"/\")\r\n def get(self): pass\t\r\n\r\n @POST(\"/path\")\r\n def post(self): pass\r\n```\r\n\r\n```python \r\nwapi = WApi()\r\nwapi.service.get()\r\n# eq\r\nrequests.get(\"https://example.com/wapi/path\")\r\n```\r\n\r\n## \u2022 Serialization\r\n\r\n> The library deserializes the received data according to the type that you specify in the `_T` parameter of the decorator. \r\n> \r\n> NOTE: The specified type must be json serializable - these are the base types and classes marked with the `@dataclass` annotation\r\n\r\n```python\r\n\r\n@dataclass\r\nclass Person:\r\n name: str\r\n\r\n@Route(\"https://example.com\")\r\nclass WApi:\r\n\r\n @GET(\"/person\", _T=Person)\r\n def person(self) -> Person: pass\r\n\r\n @GET(\"/people\", _T=List[Person])\r\n def people(self) -> List[Person]: pass\r\n\r\n```\r\n\r\n```python\r\napi = WApi()\r\nperson = api.person()\r\n\r\nprint(person.name)\r\n>>> \"John\"\r\n```\r\n\r\n## \u2022 Asynchrony\r\n\r\n> You can make the query asynchronous simply by adding an `async` keyword.\r\n\r\n```python\r\n@Route(\"https://example.com\")\r\nclass WApi:\r\n\r\n @GET(\"/person\")\r\n async def person(self): pass\r\n\r\n```\r\n```python\r\nperson = await api.person(params={\"id\": 1})\r\n```\r\n\r\n## \u2022 Request Params\r\n\r\n> You can flexibly add parameters to request passing relevant attributes.\r\n\r\n```python\r\n@dataclass\r\nclass GetPersonRequest:\r\n id: int\r\n \r\n@dataclass\r\nclass CreatePersonRequest:\r\n name: str\r\n\r\n\r\n@Route(\"https://example.com\")\r\nclass WApi:\r\n\r\n @POST(\"/person\")\r\n def create_person(self, body: dict): pass\r\n\t\r\n @Route(\"/person\") \r\n @GET(\"/\")\r\n def person(self, params: GetPersonRequest | dict): pass\r\n\r\n```\r\n```python\r\napi.person(params={\"id\": 1})\r\napi.create_person(body={\"name\": \"john\"})\r\n# or\r\napi.person(params=GetPersonRequest(1))\r\napi.create_person(params=CreatePersonRequest(\"john\"))\r\n```\r\n\r\n\r\n### \u2022 \u2022 Smart substitution\r\n\r\n> The library understands what variables you used during formatting and will not substitute them into the path parameters.\r\n\r\n```python\r\n@dataclass\r\nclass GetPersonRequest:\r\n id: int\r\n preview: bool\r\n\r\n@Route(\"https://example.com\")\r\nclass WApi:\r\n\r\n @Route(\"/person\")\r\n @GET(\"/{id}\")\r\n def person(self, params: GetPersonRequest): pass\r\n```\r\n\r\n```python\r\nperson = api.person(params=GetPersonRequest(1, true))\r\n# eq\r\nperson = requests.get(\"https://example.com/person/1?preview=true\")\r\n```\r\n\r\n",
"bugtrack_url": null,
"license": "MIT LICENSE, see LICENSE file",
"summary": "Web-Library for Python",
"version": "1.1.6",
"project_urls": {
"Homepage": "https://github.com/topanim/WApi"
},
"split_keywords": [
"python",
" web",
" api",
" requests",
" aiohttp",
" post",
" get",
" put",
" patch",
" delete",
" rest"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "cd7236b1ab74b72858c8ed973db6695742eec7879b3a36be3130066acbb49d28",
"md5": "4a406afc823a1fb91db28ba65dbc243a",
"sha256": "7cd368a53c32d1973c3f84bc7dee579de62d5c4cc90edd8478cfd0e2aefa3435"
},
"downloads": -1,
"filename": "whaox-wapi-1.1.6.tar.gz",
"has_sig": false,
"md5_digest": "4a406afc823a1fb91db28ba65dbc243a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 7467,
"upload_time": "2024-06-25T11:32:15",
"upload_time_iso_8601": "2024-06-25T11:32:15.163201Z",
"url": "https://files.pythonhosted.org/packages/cd/72/36b1ab74b72858c8ed973db6695742eec7879b3a36be3130066acbb49d28/whaox-wapi-1.1.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-06-25 11:32:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "topanim",
"github_project": "WApi",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "whaox-wapi"
}