%global _empty_manifest_terminate_build 0 Name: python-ajsonapi Version: 0.9.4 Release: 1 Summary: Asynchronous JSON API License: MIT License URL: https://gitlab.com/rvdg/ajsonapi Source0: https://mirrors.nju.edu.cn/pypi/web/packages/0e/7a/bd50927abb1a937b8c55fd4673b82c8b1bb91622f9c946e5dc71439928d2/ajsonapi-0.9.4.tar.gz BuildArch: noarch Requires: python3-asyncio Requires: python3-aiohttp Requires: python3-asyncpg %description # ajsonapi: asynchronous JSON API ![coverage](https://gitlab.com/rvdg/ajsonapi/badges/master/coverage.svg?job=coverage) ## What is it? *ajsonapi* is a Python package for creating a [JSON API][json-api] web server backed by a database from a user-provided object model. ## How to specify an object model? Let's look at a simple object model specification. ```python # model.py from ajsonapi import (JSON_API, OneToManyRelationship, ManyToOneRelationship, Attribute, String) class Persons(JSON_API): name = Attribute(String) articles = OneToManyRelationship('Articles', rfkey='person_id') class Articles(JSON_API): title = Attribute(String) author = ManyToOneRelationship('Persons', lfkey='person_id') ``` This model contains two class definitions: `Persons` and `Articles`. A person has a name and can author zero of more articles. An article has a title and has exactly one author (who is a person). The only parts in the model that may be unobvious are the `lfkey` and `rfkey` parameters in the relationship definitions. They are abbreviations for *local foreign key* and *remote foreign key*, respectively. Ajsonapi uses these parameters to identify that `Persons.articles` and `Articles.author` are each other's reverse relationship and to persist objects and their relationships in the database. For a more elaborate (albeit abstract) object model see [ajsonapi's model for functional testing][functest-model]. ## How to create a web server? ```python # app.py from aiohttp.web import run_app from ajsonapi import Application import model # Or directly include the above code snippet async def make_app(): app = Application() await app.connect_database('postgresql://user:password@localhost:5432/db') await app.create_tables() app.add_json_api_routes() return app.app run_app(make_app()) ``` ## What does ajsonapi provide? From the above six line model, ajsonapi creates a web server that supports the following eighteen operations (combinations of HTTP method and URI) as described by the [JSON API specification][json-api-spec]. ``` GET, POST /persons GET, PATCH, DELETE /persons/{id} GET, POST, PATCH, DELETE /persons/{id}/relationships/articles GET /persons/{id}/articles GET, POST /articles GET, PATCH, DELETE /articles/{id} GET, PATCH /articles/{id}/relationships/author GET /articles/{id}/author ``` All `GET` operations that return a collection support the `?include`, `?fields`, `?filter`, `?sort`, and `?page` query parameters. All objects created and manipulated through the web server are persisted in a Postgres database by ajsonapi. ## Where to get it? ```sh pip install ajsonapi ``` [json-api]: https://jsonapi.org [json-api-spec]: https://jsonapi.org/format [functest-model]: https://gitlab.com/rvdg/ajsonapi/blob/master/ajsonapi/functests/model.py %package -n python3-ajsonapi Summary: Asynchronous JSON API Provides: python-ajsonapi BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-ajsonapi # ajsonapi: asynchronous JSON API ![coverage](https://gitlab.com/rvdg/ajsonapi/badges/master/coverage.svg?job=coverage) ## What is it? *ajsonapi* is a Python package for creating a [JSON API][json-api] web server backed by a database from a user-provided object model. ## How to specify an object model? Let's look at a simple object model specification. ```python # model.py from ajsonapi import (JSON_API, OneToManyRelationship, ManyToOneRelationship, Attribute, String) class Persons(JSON_API): name = Attribute(String) articles = OneToManyRelationship('Articles', rfkey='person_id') class Articles(JSON_API): title = Attribute(String) author = ManyToOneRelationship('Persons', lfkey='person_id') ``` This model contains two class definitions: `Persons` and `Articles`. A person has a name and can author zero of more articles. An article has a title and has exactly one author (who is a person). The only parts in the model that may be unobvious are the `lfkey` and `rfkey` parameters in the relationship definitions. They are abbreviations for *local foreign key* and *remote foreign key*, respectively. Ajsonapi uses these parameters to identify that `Persons.articles` and `Articles.author` are each other's reverse relationship and to persist objects and their relationships in the database. For a more elaborate (albeit abstract) object model see [ajsonapi's model for functional testing][functest-model]. ## How to create a web server? ```python # app.py from aiohttp.web import run_app from ajsonapi import Application import model # Or directly include the above code snippet async def make_app(): app = Application() await app.connect_database('postgresql://user:password@localhost:5432/db') await app.create_tables() app.add_json_api_routes() return app.app run_app(make_app()) ``` ## What does ajsonapi provide? From the above six line model, ajsonapi creates a web server that supports the following eighteen operations (combinations of HTTP method and URI) as described by the [JSON API specification][json-api-spec]. ``` GET, POST /persons GET, PATCH, DELETE /persons/{id} GET, POST, PATCH, DELETE /persons/{id}/relationships/articles GET /persons/{id}/articles GET, POST /articles GET, PATCH, DELETE /articles/{id} GET, PATCH /articles/{id}/relationships/author GET /articles/{id}/author ``` All `GET` operations that return a collection support the `?include`, `?fields`, `?filter`, `?sort`, and `?page` query parameters. All objects created and manipulated through the web server are persisted in a Postgres database by ajsonapi. ## Where to get it? ```sh pip install ajsonapi ``` [json-api]: https://jsonapi.org [json-api-spec]: https://jsonapi.org/format [functest-model]: https://gitlab.com/rvdg/ajsonapi/blob/master/ajsonapi/functests/model.py %package help Summary: Development documents and examples for ajsonapi Provides: python3-ajsonapi-doc %description help # ajsonapi: asynchronous JSON API ![coverage](https://gitlab.com/rvdg/ajsonapi/badges/master/coverage.svg?job=coverage) ## What is it? *ajsonapi* is a Python package for creating a [JSON API][json-api] web server backed by a database from a user-provided object model. ## How to specify an object model? Let's look at a simple object model specification. ```python # model.py from ajsonapi import (JSON_API, OneToManyRelationship, ManyToOneRelationship, Attribute, String) class Persons(JSON_API): name = Attribute(String) articles = OneToManyRelationship('Articles', rfkey='person_id') class Articles(JSON_API): title = Attribute(String) author = ManyToOneRelationship('Persons', lfkey='person_id') ``` This model contains two class definitions: `Persons` and `Articles`. A person has a name and can author zero of more articles. An article has a title and has exactly one author (who is a person). The only parts in the model that may be unobvious are the `lfkey` and `rfkey` parameters in the relationship definitions. They are abbreviations for *local foreign key* and *remote foreign key*, respectively. Ajsonapi uses these parameters to identify that `Persons.articles` and `Articles.author` are each other's reverse relationship and to persist objects and their relationships in the database. For a more elaborate (albeit abstract) object model see [ajsonapi's model for functional testing][functest-model]. ## How to create a web server? ```python # app.py from aiohttp.web import run_app from ajsonapi import Application import model # Or directly include the above code snippet async def make_app(): app = Application() await app.connect_database('postgresql://user:password@localhost:5432/db') await app.create_tables() app.add_json_api_routes() return app.app run_app(make_app()) ``` ## What does ajsonapi provide? From the above six line model, ajsonapi creates a web server that supports the following eighteen operations (combinations of HTTP method and URI) as described by the [JSON API specification][json-api-spec]. ``` GET, POST /persons GET, PATCH, DELETE /persons/{id} GET, POST, PATCH, DELETE /persons/{id}/relationships/articles GET /persons/{id}/articles GET, POST /articles GET, PATCH, DELETE /articles/{id} GET, PATCH /articles/{id}/relationships/author GET /articles/{id}/author ``` All `GET` operations that return a collection support the `?include`, `?fields`, `?filter`, `?sort`, and `?page` query parameters. All objects created and manipulated through the web server are persisted in a Postgres database by ajsonapi. ## Where to get it? ```sh pip install ajsonapi ``` [json-api]: https://jsonapi.org [json-api-spec]: https://jsonapi.org/format [functest-model]: https://gitlab.com/rvdg/ajsonapi/blob/master/ajsonapi/functests/model.py %prep %autosetup -n ajsonapi-0.9.4 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-ajsonapi -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Fri May 05 2023 Python_Bot - 0.9.4-1 - Package Spec generated