summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-31 07:57:38 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-31 07:57:38 +0000
commit4a08c6640e7ea53a8b46d7cd9e4cf0a3a107ef84 (patch)
treebef19caebd747005228f5cddad184e992bd444f4
parent0dafc8cfceac18b07f5cda055d52ccc94e54cb09 (diff)
automatic import of python-aio-odoorpc-base
-rw-r--r--.gitignore1
-rw-r--r--python-aio-odoorpc-base.spec627
-rw-r--r--sources1
3 files changed, 629 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..e6a3f37 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/aio-odoorpc-base-3.0.4.tar.gz
diff --git a/python-aio-odoorpc-base.spec b/python-aio-odoorpc-base.spec
new file mode 100644
index 0000000..7a3e1eb
--- /dev/null
+++ b/python-aio-odoorpc-base.spec
@@ -0,0 +1,627 @@
+%global _empty_manifest_terminate_build 0
+Name: python-aio-odoorpc-base
+Version: 3.0.4
+Release: 1
+Summary: Fast, simple Odoo RPC package with sync and async functions to pilot Odoo's jsonrpc API. Check aio-odoorpc for a higher-level, friendlier interface.
+License: CC0-1.0
+URL: https://github.com/mbello/aio-odoorpc-base
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/43/ab/0b47d94fb35e08d96dc17b6b29cfff056361650d3cf8477eff885b16b425/aio-odoorpc-base-3.0.4.tar.gz
+BuildArch: noarch
+
+
+%description
+## Base functions to pilot Odoo's jsonrpc API (aio-odoorpc-base)
+
+### Description:
+This python package implements a **complete** set of methods to access
+Odoo's external API (using jsonrpc rather than xmlrpc).
+
+It offers an almost-exact mirror of Odoo's external API, even parameter names are the same.
+It is 'almost-exact' because 'execute' is skipped in favor of 'execute_kw' only and the
+It is 'almost-exact' because 'execute' is skipped in favor of 'execute_kw' only and the
+API methods from the 'db' service: 'list', 'drop', 'dump', 'rename', 'restore' are here
+implemented with names 'list_databases', 'drop_database', 'dump_database', 'rename_database'
+and 'restore_database' respectively.
+
+The 'documentation' offered by this package is mostly in the form of proper type
+annotations so that you have a better idea of what kind of data each API method expects.
+Other than that, developers are recommended to go study Odoo's external API by reading the
+source code at (https://github.com/odoo/odoo/tree/master/odoo/service). The three API services
+'object', 'common' and 'db' are implemented there in files model.py, common.py and db.py
+respectively. On each of these python files, a 'dispatch' method is implemented for the service
+in question. The methods available on the external service api are usually those prefixed with
+'exp_' in the method name, with the exception of the 'object' service which only exposes
+'execute' and 'execute_kw'.
+
+All functions offered by this package are available in both async and sync versions.
+
+Odoo's API methods implemented:
+- about
+- authenticate
+- change_admin_password
+- create_database
+- db_exist
+- drop_database
+- dump_database
+- duplicate_database
+- execute_kw
+- list_countries
+- list_databases
+- list_lang
+- login
+- migrate_databases
+- rename_database
+- restore_database
+- server_version
+- version
+
+All methods take as first 2 parameters:
+- **http_client**: a callable or an instance of a compatible http_client (it must implement a 'post'
+ method that accepts a 'url' and a 'json' parameter. Packages 'requests', 'httpx' and 'aiohttp' are
+ compatible).
+ If http_client is a callable, it will be called with a dict as the post payload and must return a
+ response object with a '.json()' method that may be synchronous or asynchronous (when using the async
+ functions). It must return a dict or dict-like object representing the reponse.
+
+- **url**: the complete URL of your Odoo's jsonrpc endpoint. Usually something like
+ 'https://odoo.acme.com/jsonrpc' or 'https://odoo.acme.com:8443/jsonrpc'.
+
+Remaining parameters on each method are those expected by Odoo's external API, with identical names
+as you will find on Odoo's source code. The method 'jsonrpc' is the low-level method in this package that
+actually does all the HTTP calls for all implemented methods.
+
+By default, when you issue 'from aio_odoorpc_base import ...' you will be importing the async methods.
+If you want the sync methods you must import from 'aio_odoorpc_base.sync'. You may also use
+'aio_odoorpc_base.aio' if you prefer to be explicit on whether you are importing sync or async code.
+
+
+### aio-odoorpc: a higher-level API
+
+In practice, you may notice that 99% of the time you will be calling the 'execute_kw' method
+which is what allows you to deal with Odoo's models, reading and writing actual business data
+via the model methods 'search', 'read', 'search_read', 'search_count', 'write', 'create', etc.
+While this package only offers you a bare 'execute_kw' method and a helper 'execute_kwargs',
+the higher-level package 'aio-odoorpc' expands over this one adding higher-level objects and methods
+(such as 'search', 'read', 'search_read', 'search_count', 'write', 'create', etc) to consume those
+model methods through calls to 'execute_kw' external API method.
+
+
+### No dependencies:
+No dependency is not a promise, just a preference. It may change in the future, but only if for very
+good reason. Here, are free to use whatever HTTP Client library you want.
+
+I am willing to make modifications in the code in order to support other http client solutions,
+just get in touch (use the project's github repository for that).
+
+While it would be easier if this package shipped with a specific http client dependency, it should be
+noted that having the possibility to reuse HTTP sessions is a great opportunity to improve the
+speed of your running code. Also, it is possible that your project is already using some http client
+library and here you have the opportunity to use it.
+
+Remember that you must use an async http client library if you are going to use the async functions,
+or use a synchronous http client library if you are going to use the sync function.
+
+### Python HTTP Client packages known to be compatible:
+- sync-only: 'requests'
+- async-only: 'aiohttp'
+- sync and async: 'httpx'
+
+### Motivation:
+The package 'odoorpc' is the most used and better maintained package to let you easily consume Odoo's
+external API. It has lots of functionality, good documentation, a large user base and was developed
+by people that are very experienced with Odoo in general and big contributors to the Odoo Community.
+In other words, if you are taking your first steps and do not need an async interface now, start with
+odoorpc.
+
+However, for my needs, once I was developing Odoo integrations that needed to make hundreds of calls
+to the Odoo API to complete a single job, I began to sorely miss an async interface as well as more
+control over the HTTP client used (I wished for HTTP2 support and connection polling/reuse).
+
+Also, as I understood Odoo's external API, it started to sound like 'odoorpc' was too big for a task
+too simple. For instance, most of the time (like 99,99% of the time), you will be calling to a single
+jsonrpc method called 'execute_kw'. It is the same call over and over just changing the payload which
+itself is a simple json.
+
+So I decided to develop a new package myself, made it async-first and tryed to keep it as simple as
+possible. Also, I decided to split it in two, a very simple base package (this one) with only methods
+that mirror those in Odoo's external API and another one 'aio-odoorpc' that adds another layer to
+implement Odoo's model methods like 'search', 'search_read', 'read', etc. as well as an object model
+to instantiate a class once and then make simple method invocation with few parameters to access
+what you need.
+
+
+### Useful tips about Odoo's external API:
+
+- The 'login' call is really only a lookup of the user_id (an int) of a user given a
+ database name, user/login name and password. If you are using this RPC client over and over in your
+ code, maybe even calling from a stateless cloud service, you should consider finding out the
+ user id (uid) of the user and pass the uid instead of the username to the constructor of AsyncOdooRPC.
+ This way, you do not need to call the login() RPC method to retrieve the uid, saving a RPC call;
+
+- The uid mentioned above is not a session-like id. It is really only the database id of the user
+ and it never expires. There is really no 'login' or 'session initiation' step required to access
+ Odoo's external API if you know the uid from the beginning;
+
+
+### Other things to know about this module:
+- It ships will a good suite of tests that run against an OCA runbot instance;
+
+- Asyncio is a python3 thing, so no python2 support;
+
+- Type hints are used everywhere;
+
+- This package uses jsonrpc only (no xmlrpc). There is a lack of async xmlrpc tooling and
+ jsonrpc is considered the best RPC protocol in Odoo (faster, more widely used);
+
+- The synchronous version of the code is generated automatically from the asynchronous code, so at
+ least for now the effort to maintain both is minimal.
+
+- I am willing to take patches and to add other contributors to this project. Feel free to get in touch,
+ the github page is the best place to interact with the project and the project's author;
+
+- I only develop and run code in Linux environments, if you find a bug under other OS I am happy
+ to take patches but I will not myself spend time looking into these eventual bugs;
+
+
+### Usage
+
+Ok, so let's start with some examples. I will omit the event_loop logic, I assume that if you want
+to use an async module you already have that sorted out yourself or through a framework like FastAPI.
+
+All examples below could also be called using the synchronous OdooRPC object, but without the
+'await' syntax.
+
+I recommend that you check the tests folder for many more examples. Also, the codebase is very very short,
+do refer to it as well.
+
+```
+from aio_odoorpc_base.aio import login, execute_kw
+from aio_odoorpc_base.helpers import execute_kwargs
+import httpx
+
+url = 'https://odoo.acme.com/jsonrpc'
+
+async with httpx.AsyncClient() as client:
+ uid = await login(http_client=client, url=url, db='acme', login='demo', password='demo')
+ kwargs = execute_kwargs(fields=['partner_id', 'date_order', 'amount_total'],
+ limit=1000, offset=0, order='amount_total DESC')
+ data = await execute_kw(http_client=client,
+ url=url,
+ db='acme',
+ uid=uid,
+ password='demo',
+ obj='sale.order',
+ method='search_read',
+ args=[],
+ kw=kwargs)
+```
+
+
+%package -n python3-aio-odoorpc-base
+Summary: Fast, simple Odoo RPC package with sync and async functions to pilot Odoo's jsonrpc API. Check aio-odoorpc for a higher-level, friendlier interface.
+Provides: python-aio-odoorpc-base
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-aio-odoorpc-base
+## Base functions to pilot Odoo's jsonrpc API (aio-odoorpc-base)
+
+### Description:
+This python package implements a **complete** set of methods to access
+Odoo's external API (using jsonrpc rather than xmlrpc).
+
+It offers an almost-exact mirror of Odoo's external API, even parameter names are the same.
+It is 'almost-exact' because 'execute' is skipped in favor of 'execute_kw' only and the
+It is 'almost-exact' because 'execute' is skipped in favor of 'execute_kw' only and the
+API methods from the 'db' service: 'list', 'drop', 'dump', 'rename', 'restore' are here
+implemented with names 'list_databases', 'drop_database', 'dump_database', 'rename_database'
+and 'restore_database' respectively.
+
+The 'documentation' offered by this package is mostly in the form of proper type
+annotations so that you have a better idea of what kind of data each API method expects.
+Other than that, developers are recommended to go study Odoo's external API by reading the
+source code at (https://github.com/odoo/odoo/tree/master/odoo/service). The three API services
+'object', 'common' and 'db' are implemented there in files model.py, common.py and db.py
+respectively. On each of these python files, a 'dispatch' method is implemented for the service
+in question. The methods available on the external service api are usually those prefixed with
+'exp_' in the method name, with the exception of the 'object' service which only exposes
+'execute' and 'execute_kw'.
+
+All functions offered by this package are available in both async and sync versions.
+
+Odoo's API methods implemented:
+- about
+- authenticate
+- change_admin_password
+- create_database
+- db_exist
+- drop_database
+- dump_database
+- duplicate_database
+- execute_kw
+- list_countries
+- list_databases
+- list_lang
+- login
+- migrate_databases
+- rename_database
+- restore_database
+- server_version
+- version
+
+All methods take as first 2 parameters:
+- **http_client**: a callable or an instance of a compatible http_client (it must implement a 'post'
+ method that accepts a 'url' and a 'json' parameter. Packages 'requests', 'httpx' and 'aiohttp' are
+ compatible).
+ If http_client is a callable, it will be called with a dict as the post payload and must return a
+ response object with a '.json()' method that may be synchronous or asynchronous (when using the async
+ functions). It must return a dict or dict-like object representing the reponse.
+
+- **url**: the complete URL of your Odoo's jsonrpc endpoint. Usually something like
+ 'https://odoo.acme.com/jsonrpc' or 'https://odoo.acme.com:8443/jsonrpc'.
+
+Remaining parameters on each method are those expected by Odoo's external API, with identical names
+as you will find on Odoo's source code. The method 'jsonrpc' is the low-level method in this package that
+actually does all the HTTP calls for all implemented methods.
+
+By default, when you issue 'from aio_odoorpc_base import ...' you will be importing the async methods.
+If you want the sync methods you must import from 'aio_odoorpc_base.sync'. You may also use
+'aio_odoorpc_base.aio' if you prefer to be explicit on whether you are importing sync or async code.
+
+
+### aio-odoorpc: a higher-level API
+
+In practice, you may notice that 99% of the time you will be calling the 'execute_kw' method
+which is what allows you to deal with Odoo's models, reading and writing actual business data
+via the model methods 'search', 'read', 'search_read', 'search_count', 'write', 'create', etc.
+While this package only offers you a bare 'execute_kw' method and a helper 'execute_kwargs',
+the higher-level package 'aio-odoorpc' expands over this one adding higher-level objects and methods
+(such as 'search', 'read', 'search_read', 'search_count', 'write', 'create', etc) to consume those
+model methods through calls to 'execute_kw' external API method.
+
+
+### No dependencies:
+No dependency is not a promise, just a preference. It may change in the future, but only if for very
+good reason. Here, are free to use whatever HTTP Client library you want.
+
+I am willing to make modifications in the code in order to support other http client solutions,
+just get in touch (use the project's github repository for that).
+
+While it would be easier if this package shipped with a specific http client dependency, it should be
+noted that having the possibility to reuse HTTP sessions is a great opportunity to improve the
+speed of your running code. Also, it is possible that your project is already using some http client
+library and here you have the opportunity to use it.
+
+Remember that you must use an async http client library if you are going to use the async functions,
+or use a synchronous http client library if you are going to use the sync function.
+
+### Python HTTP Client packages known to be compatible:
+- sync-only: 'requests'
+- async-only: 'aiohttp'
+- sync and async: 'httpx'
+
+### Motivation:
+The package 'odoorpc' is the most used and better maintained package to let you easily consume Odoo's
+external API. It has lots of functionality, good documentation, a large user base and was developed
+by people that are very experienced with Odoo in general and big contributors to the Odoo Community.
+In other words, if you are taking your first steps and do not need an async interface now, start with
+odoorpc.
+
+However, for my needs, once I was developing Odoo integrations that needed to make hundreds of calls
+to the Odoo API to complete a single job, I began to sorely miss an async interface as well as more
+control over the HTTP client used (I wished for HTTP2 support and connection polling/reuse).
+
+Also, as I understood Odoo's external API, it started to sound like 'odoorpc' was too big for a task
+too simple. For instance, most of the time (like 99,99% of the time), you will be calling to a single
+jsonrpc method called 'execute_kw'. It is the same call over and over just changing the payload which
+itself is a simple json.
+
+So I decided to develop a new package myself, made it async-first and tryed to keep it as simple as
+possible. Also, I decided to split it in two, a very simple base package (this one) with only methods
+that mirror those in Odoo's external API and another one 'aio-odoorpc' that adds another layer to
+implement Odoo's model methods like 'search', 'search_read', 'read', etc. as well as an object model
+to instantiate a class once and then make simple method invocation with few parameters to access
+what you need.
+
+
+### Useful tips about Odoo's external API:
+
+- The 'login' call is really only a lookup of the user_id (an int) of a user given a
+ database name, user/login name and password. If you are using this RPC client over and over in your
+ code, maybe even calling from a stateless cloud service, you should consider finding out the
+ user id (uid) of the user and pass the uid instead of the username to the constructor of AsyncOdooRPC.
+ This way, you do not need to call the login() RPC method to retrieve the uid, saving a RPC call;
+
+- The uid mentioned above is not a session-like id. It is really only the database id of the user
+ and it never expires. There is really no 'login' or 'session initiation' step required to access
+ Odoo's external API if you know the uid from the beginning;
+
+
+### Other things to know about this module:
+- It ships will a good suite of tests that run against an OCA runbot instance;
+
+- Asyncio is a python3 thing, so no python2 support;
+
+- Type hints are used everywhere;
+
+- This package uses jsonrpc only (no xmlrpc). There is a lack of async xmlrpc tooling and
+ jsonrpc is considered the best RPC protocol in Odoo (faster, more widely used);
+
+- The synchronous version of the code is generated automatically from the asynchronous code, so at
+ least for now the effort to maintain both is minimal.
+
+- I am willing to take patches and to add other contributors to this project. Feel free to get in touch,
+ the github page is the best place to interact with the project and the project's author;
+
+- I only develop and run code in Linux environments, if you find a bug under other OS I am happy
+ to take patches but I will not myself spend time looking into these eventual bugs;
+
+
+### Usage
+
+Ok, so let's start with some examples. I will omit the event_loop logic, I assume that if you want
+to use an async module you already have that sorted out yourself or through a framework like FastAPI.
+
+All examples below could also be called using the synchronous OdooRPC object, but without the
+'await' syntax.
+
+I recommend that you check the tests folder for many more examples. Also, the codebase is very very short,
+do refer to it as well.
+
+```
+from aio_odoorpc_base.aio import login, execute_kw
+from aio_odoorpc_base.helpers import execute_kwargs
+import httpx
+
+url = 'https://odoo.acme.com/jsonrpc'
+
+async with httpx.AsyncClient() as client:
+ uid = await login(http_client=client, url=url, db='acme', login='demo', password='demo')
+ kwargs = execute_kwargs(fields=['partner_id', 'date_order', 'amount_total'],
+ limit=1000, offset=0, order='amount_total DESC')
+ data = await execute_kw(http_client=client,
+ url=url,
+ db='acme',
+ uid=uid,
+ password='demo',
+ obj='sale.order',
+ method='search_read',
+ args=[],
+ kw=kwargs)
+```
+
+
+%package help
+Summary: Development documents and examples for aio-odoorpc-base
+Provides: python3-aio-odoorpc-base-doc
+%description help
+## Base functions to pilot Odoo's jsonrpc API (aio-odoorpc-base)
+
+### Description:
+This python package implements a **complete** set of methods to access
+Odoo's external API (using jsonrpc rather than xmlrpc).
+
+It offers an almost-exact mirror of Odoo's external API, even parameter names are the same.
+It is 'almost-exact' because 'execute' is skipped in favor of 'execute_kw' only and the
+It is 'almost-exact' because 'execute' is skipped in favor of 'execute_kw' only and the
+API methods from the 'db' service: 'list', 'drop', 'dump', 'rename', 'restore' are here
+implemented with names 'list_databases', 'drop_database', 'dump_database', 'rename_database'
+and 'restore_database' respectively.
+
+The 'documentation' offered by this package is mostly in the form of proper type
+annotations so that you have a better idea of what kind of data each API method expects.
+Other than that, developers are recommended to go study Odoo's external API by reading the
+source code at (https://github.com/odoo/odoo/tree/master/odoo/service). The three API services
+'object', 'common' and 'db' are implemented there in files model.py, common.py and db.py
+respectively. On each of these python files, a 'dispatch' method is implemented for the service
+in question. The methods available on the external service api are usually those prefixed with
+'exp_' in the method name, with the exception of the 'object' service which only exposes
+'execute' and 'execute_kw'.
+
+All functions offered by this package are available in both async and sync versions.
+
+Odoo's API methods implemented:
+- about
+- authenticate
+- change_admin_password
+- create_database
+- db_exist
+- drop_database
+- dump_database
+- duplicate_database
+- execute_kw
+- list_countries
+- list_databases
+- list_lang
+- login
+- migrate_databases
+- rename_database
+- restore_database
+- server_version
+- version
+
+All methods take as first 2 parameters:
+- **http_client**: a callable or an instance of a compatible http_client (it must implement a 'post'
+ method that accepts a 'url' and a 'json' parameter. Packages 'requests', 'httpx' and 'aiohttp' are
+ compatible).
+ If http_client is a callable, it will be called with a dict as the post payload and must return a
+ response object with a '.json()' method that may be synchronous or asynchronous (when using the async
+ functions). It must return a dict or dict-like object representing the reponse.
+
+- **url**: the complete URL of your Odoo's jsonrpc endpoint. Usually something like
+ 'https://odoo.acme.com/jsonrpc' or 'https://odoo.acme.com:8443/jsonrpc'.
+
+Remaining parameters on each method are those expected by Odoo's external API, with identical names
+as you will find on Odoo's source code. The method 'jsonrpc' is the low-level method in this package that
+actually does all the HTTP calls for all implemented methods.
+
+By default, when you issue 'from aio_odoorpc_base import ...' you will be importing the async methods.
+If you want the sync methods you must import from 'aio_odoorpc_base.sync'. You may also use
+'aio_odoorpc_base.aio' if you prefer to be explicit on whether you are importing sync or async code.
+
+
+### aio-odoorpc: a higher-level API
+
+In practice, you may notice that 99% of the time you will be calling the 'execute_kw' method
+which is what allows you to deal with Odoo's models, reading and writing actual business data
+via the model methods 'search', 'read', 'search_read', 'search_count', 'write', 'create', etc.
+While this package only offers you a bare 'execute_kw' method and a helper 'execute_kwargs',
+the higher-level package 'aio-odoorpc' expands over this one adding higher-level objects and methods
+(such as 'search', 'read', 'search_read', 'search_count', 'write', 'create', etc) to consume those
+model methods through calls to 'execute_kw' external API method.
+
+
+### No dependencies:
+No dependency is not a promise, just a preference. It may change in the future, but only if for very
+good reason. Here, are free to use whatever HTTP Client library you want.
+
+I am willing to make modifications in the code in order to support other http client solutions,
+just get in touch (use the project's github repository for that).
+
+While it would be easier if this package shipped with a specific http client dependency, it should be
+noted that having the possibility to reuse HTTP sessions is a great opportunity to improve the
+speed of your running code. Also, it is possible that your project is already using some http client
+library and here you have the opportunity to use it.
+
+Remember that you must use an async http client library if you are going to use the async functions,
+or use a synchronous http client library if you are going to use the sync function.
+
+### Python HTTP Client packages known to be compatible:
+- sync-only: 'requests'
+- async-only: 'aiohttp'
+- sync and async: 'httpx'
+
+### Motivation:
+The package 'odoorpc' is the most used and better maintained package to let you easily consume Odoo's
+external API. It has lots of functionality, good documentation, a large user base and was developed
+by people that are very experienced with Odoo in general and big contributors to the Odoo Community.
+In other words, if you are taking your first steps and do not need an async interface now, start with
+odoorpc.
+
+However, for my needs, once I was developing Odoo integrations that needed to make hundreds of calls
+to the Odoo API to complete a single job, I began to sorely miss an async interface as well as more
+control over the HTTP client used (I wished for HTTP2 support and connection polling/reuse).
+
+Also, as I understood Odoo's external API, it started to sound like 'odoorpc' was too big for a task
+too simple. For instance, most of the time (like 99,99% of the time), you will be calling to a single
+jsonrpc method called 'execute_kw'. It is the same call over and over just changing the payload which
+itself is a simple json.
+
+So I decided to develop a new package myself, made it async-first and tryed to keep it as simple as
+possible. Also, I decided to split it in two, a very simple base package (this one) with only methods
+that mirror those in Odoo's external API and another one 'aio-odoorpc' that adds another layer to
+implement Odoo's model methods like 'search', 'search_read', 'read', etc. as well as an object model
+to instantiate a class once and then make simple method invocation with few parameters to access
+what you need.
+
+
+### Useful tips about Odoo's external API:
+
+- The 'login' call is really only a lookup of the user_id (an int) of a user given a
+ database name, user/login name and password. If you are using this RPC client over and over in your
+ code, maybe even calling from a stateless cloud service, you should consider finding out the
+ user id (uid) of the user and pass the uid instead of the username to the constructor of AsyncOdooRPC.
+ This way, you do not need to call the login() RPC method to retrieve the uid, saving a RPC call;
+
+- The uid mentioned above is not a session-like id. It is really only the database id of the user
+ and it never expires. There is really no 'login' or 'session initiation' step required to access
+ Odoo's external API if you know the uid from the beginning;
+
+
+### Other things to know about this module:
+- It ships will a good suite of tests that run against an OCA runbot instance;
+
+- Asyncio is a python3 thing, so no python2 support;
+
+- Type hints are used everywhere;
+
+- This package uses jsonrpc only (no xmlrpc). There is a lack of async xmlrpc tooling and
+ jsonrpc is considered the best RPC protocol in Odoo (faster, more widely used);
+
+- The synchronous version of the code is generated automatically from the asynchronous code, so at
+ least for now the effort to maintain both is minimal.
+
+- I am willing to take patches and to add other contributors to this project. Feel free to get in touch,
+ the github page is the best place to interact with the project and the project's author;
+
+- I only develop and run code in Linux environments, if you find a bug under other OS I am happy
+ to take patches but I will not myself spend time looking into these eventual bugs;
+
+
+### Usage
+
+Ok, so let's start with some examples. I will omit the event_loop logic, I assume that if you want
+to use an async module you already have that sorted out yourself or through a framework like FastAPI.
+
+All examples below could also be called using the synchronous OdooRPC object, but without the
+'await' syntax.
+
+I recommend that you check the tests folder for many more examples. Also, the codebase is very very short,
+do refer to it as well.
+
+```
+from aio_odoorpc_base.aio import login, execute_kw
+from aio_odoorpc_base.helpers import execute_kwargs
+import httpx
+
+url = 'https://odoo.acme.com/jsonrpc'
+
+async with httpx.AsyncClient() as client:
+ uid = await login(http_client=client, url=url, db='acme', login='demo', password='demo')
+ kwargs = execute_kwargs(fields=['partner_id', 'date_order', 'amount_total'],
+ limit=1000, offset=0, order='amount_total DESC')
+ data = await execute_kw(http_client=client,
+ url=url,
+ db='acme',
+ uid=uid,
+ password='demo',
+ obj='sale.order',
+ method='search_read',
+ args=[],
+ kw=kwargs)
+```
+
+
+%prep
+%autosetup -n aio-odoorpc-base-3.0.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-aio-odoorpc-base -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Wed May 31 2023 Python_Bot <Python_Bot@openeuler.org> - 3.0.4-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..b9ce46b
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+6f0e44408fd0e4ffccbf306ab24b12ac aio-odoorpc-base-3.0.4.tar.gz