diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-ajsonapi.spec | 369 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 371 insertions, 0 deletions
@@ -0,0 +1 @@ +/ajsonapi-0.9.4.tar.gz diff --git a/python-ajsonapi.spec b/python-ajsonapi.spec new file mode 100644 index 0000000..d56062c --- /dev/null +++ b/python-ajsonapi.spec @@ -0,0 +1,369 @@ +%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 + + + +## 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 + + + +## 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 + + + +## 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 <Python_Bot@openeuler.org> - 0.9.4-1 +- Package Spec generated @@ -0,0 +1 @@ +25cb83e3ee1060c58a531cb1f72cc960 ajsonapi-0.9.4.tar.gz |