summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--python-ajsonapi.spec369
-rw-r--r--sources1
3 files changed, 371 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..d12e5ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
+
+![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 <Python_Bot@openeuler.org> - 0.9.4-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..bb7e860
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+25cb83e3ee1060c58a531cb1f72cc960 ajsonapi-0.9.4.tar.gz