DuniterPy issueshttps://git.duniter.org/clients/python/duniterpy/-/issues2021-07-03T10:27:48+02:00https://git.duniter.org/clients/python/duniterpy/-/issues/148Deprecate BMA API2021-07-03T10:27:48+02:00MoulDeprecate BMA API- [ ] Set deprecation warnings in earliest possible version
- [ ] Remove BMA related code once major clients (Silkaj) completely migrated away from it. This means GVA provides at least the same requestable datas as BMA has.
- [ ] #135: A...- [ ] Set deprecation warnings in earliest possible version
- [ ] Remove BMA related code once major clients (Silkaj) completely migrated away from it. This means GVA provides at least the same requestable datas as BMA has.
- [ ] #135: Add back `R0801` pylint deactivation which was mostly happening on json schemas2.0.0https://git.duniter.org/clients/python/duniterpy/-/issues/144Test blocks are not coherent2021-04-08T16:47:12+02:00matograineTest blocks are not coherentfour blocks used in tests.documents/test_block.py have shorter hashes than they should (as for DUBPv12).
They are meta_ and zeta_brouzouf blocks, so I guess this is a matter of protocol version.
Should we replace these blocks by correct...four blocks used in tests.documents/test_block.py have shorter hashes than they should (as for DUBPv12).
They are meta_ and zeta_brouzouf blocks, so I guess this is a matter of protocol version.
Should we replace these blocks by correct ones ?Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/142verifying_key.verify_document exception if Peer document is not ascii2023-07-08T15:26:41+02:00Vincent Texierverifying_key.verify_document exception if Peer document is not asciiWhen a non ascii Peer document is verified by the function, an exception occur.
The problem is that the document come from Duniter mem_pool and the mem_pool should not accept non ascii documents.
But we can:
- catch the exception and t...When a non ascii Peer document is verified by the function, an exception occur.
The problem is that the document come from Duniter mem_pool and the mem_pool should not accept non ascii documents.
But we can:
- catch the exception and try with utf-8 (not duniter compliant
- return False as if the signature was not correct.
Option 2 is better, as the document is not valid whatever the reason.
See : https://git.duniter.org/clients/python/sakia/-/issues/820
[EDIT] 04/03/2021 Version 0.61.0
Trying to catch the exception failed because non ascii endpoint fail when creating the Peer Document instance. HOST_REGEXP fail on non ascii endpoint.
So, as we do not know which endpoint cause the bug, put the issue in backlog, waiting for future p2p scan of peers to failed.Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/131Implement checksum computation2023-06-23T19:51:53+02:00matograineImplement checksum computationChecksum should be part of Duniterpy. It may be implemented as a separate function, or as a part of the SigningKey type.Checksum should be part of Duniterpy. It may be implemented as a separate function, or as a part of the SigningKey type.Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/129Add HD wallet generator feature2023-07-08T15:26:55+02:00Vincent TexierAdd HD wallet generator featureAdd HD wallet generation feature.
Follow the [RFC0015](https://git.duniter.org/documents/rfcs/blob/hd_wallet/rfc/0015_Dubp_HD_Wallet.md) of the Duniter Project.
Some documentation:
https://coinsutra.com/hd-wallets-deterministic-wallet...Add HD wallet generation feature.
Follow the [RFC0015](https://git.duniter.org/documents/rfcs/blob/hd_wallet/rfc/0015_Dubp_HD_Wallet.md) of the Duniter Project.
Some documentation:
https://coinsutra.com/hd-wallets-deterministic-wallet/
https://pypi.org/project/pywallet/Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/126Refactor api.client module to offer url from endpoint2023-07-08T15:27:00+02:00Vincent TexierRefactor api.client module to offer url from endpointIn the api.client module:
* The API instance should be injected as a dependency in the Client instance (composition).
* The API class should not be public, so prefix it with an underscore.
* Why API.reverse_url() needs arguments already...In the api.client module:
* The API instance should be injected as a dependency in the Client instance (composition).
* The API class should not be public, so prefix it with an underscore.
* Why API.reverse_url() needs arguments already in conn_handler ?
* As the endpoint can define the scheme for sure, we can withdraw it and get it from the ConnHandler class.
* But for that, the ConnHandler class need to set only one scheme!
* Expose a method to easily get the url of an endpoint (refactor reverse_url of API in public Client class).
If we do that:
* Set only one scheme (with http, https, ws, wss) in ConnHandler class
We can do that:
* Get the api url from the connhandler without giving any scheme.Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/125Add examples to create a transaction that the sender can get back after a delay2023-07-08T15:27:06+02:00Vincent TexierAdd examples to create a transaction that the sender can get back after a delaySakia 0.51.x added support for transaction with refund after one week.
Add duniterpy examples to do the same, step by step, with code.Sakia 0.51.x added support for transaction with refund after one week.
Add duniterpy examples to do the same, step by step, with code.Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/117Refactor all code using hexagonal architecture2023-07-08T15:27:16+02:00Vincent TexierRefactor all code using hexagonal architectureI think that [the hexagonal architecture](https://blog.octo.com/en/hexagonal-architecture-three-principles-and-an-implementation-example/) will fit well in this library.
Let's just think about …
[The exact same article](https://blog.oc...I think that [the hexagonal architecture](https://blog.octo.com/en/hexagonal-architecture-three-principles-and-an-implementation-example/) will fit well in this library.
Let's just think about …
[The exact same article](https://blog.octo.com/architecture-hexagonale-trois-principes-et-un-exemple-dimplementation/) for French readers.Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/116Make Duniter's and Cesium V1’s PubSec format compatible2021-08-09T16:06:54+02:00matograineMake Duniter's and Cesium V1’s PubSec format compatibleFollowing https://git.duniter.org/clients/python/silkaj/issues/274
For now, Duniterpy only accepts PubSec files in V1 format. We would like to make it accept Duniter's PubSec format as well:
Duniter:
```
pub: "BdanxHdwRRzCXZpiqvTVTX4gy...Following https://git.duniter.org/clients/python/silkaj/issues/274
For now, Duniterpy only accepts PubSec files in V1 format. We would like to make it accept Duniter's PubSec format as well:
Duniter:
```
pub: "BdanxHdwRRzCXZpiqvTVTX4gyyh6qFTYjeCWCkLwDifx"
sec: "2CNFWPJEi9oy9RQYpDYmPvFsRbaQQBzi6n4McqQsJmYQ336NL8nsewG7p49SVa6bgEwKzmB1pMtD7SmnxD2EM5LA"
```
Cesium V1:
```
Type: PubSec
Version: 1
pub: BdanxHdwRRzCXZpiqvTVTX4gyyh6qFTYjeCWCkLwDifx
sec: 2CNFWPJEi9oy9RQYpDYmPvFsRbaQQBzi6n4McqQsJmYQ336NL8nsewG7p49SVa6bgEwKzmB1pMtD7SmnxD2EM5LA
```
the matching regex would be `(^pub: (\")?([1-9A-HJ-NP-Za-km-z]{43,44})(\")?\nsec: (\")?([1-9A-HJ-NP-Za-km-z]{87,90})(\")?)`Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/110Block.from_signed_raw() usage is not obvious2020-12-10T21:51:10+01:00MoulBlock.from_signed_raw() usage is not obviousParsing a block is not obvious. You have to append to the raw part, the signature and a `\n` to make it work:
```python
block = await bma_client(bma.blockchain.block, block_number)
block = Block.from_signed_raw(block["raw"] + block["sig...Parsing a block is not obvious. You have to append to the raw part, the signature and a `\n` to make it work:
```python
block = await bma_client(bma.blockchain.block, block_number)
block = Block.from_signed_raw(block["raw"] + block["signature"] + "\n")
```
I thought, `from_signed_raw(block["raw"])` was broken, but I found it used this way in Sakia.
We should address this.
Will it be fixed with GVA?
Do we want to implement a `from_json()` in the meantime?Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/109DuniterPy should not parse the result of a failed request2020-11-30T15:10:40+01:00MoulDuniterPy should not parse the result of a failed requestDuniterPy should not try to parse the result of a request with an HTTP error:
https://forum.duniter.org/t/remuneration-des-contributeurs-au-projet-duniter/4995/52?u=moul
Here, you can see `jsonschema` failing to parse the result of a 4...DuniterPy should not try to parse the result of a request with an HTTP error:
https://forum.duniter.org/t/remuneration-des-contributeurs-au-projet-duniter/4995/52?u=moul
Here, you can see `jsonschema` failing to parse the result of a 429 error:
```bash
Traceback (most recent call last):
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 141, in requests_get
error_data = parse_error(await response.text())
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 65, in parse_error
raise jsonschema.ValidationError("Could not parse json : {0}".format(str(e)))
jsonschema.exceptions.ValidationError: Could not parse json : Expecting value: line 1 column 1 (char 0)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/inso/.pyenv/versions/silkaj-3.7/bin/silkaj", line 23, in <module>
cli(obj={})
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/tools.py", line 70, in wrapper
return loop.run_until_complete(f(*args, **kwargs))
File "/home/inso/.pyenv/versions/3.7.0/lib/python3.7/asyncio/base_events.py", line 568, in run_until_complete
return future.result()
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/tx.py", line 99, in send_transaction
key, issuer_pubkey, tx_amount, outputAddresses, comment, outputbackchange
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/tx.py", line 237, in handle_intermediaries_transactions
OutputbackChange,
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/tx.py", line 277, in generate_and_send_transaction
OutputbackChange,
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/tx.py", line 307, in generate_transaction_document
head_block = await HeadBlock().head_block
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/network_tools.py", line 244, in get_head
return await client(blockchain.current)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/bma/blockchain.py", line 392, in current
return await client.get(MODULE + '/current', schema=BLOCK_SCHEMA)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 231, in get
response = await client.requests_get(url_path, **params)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 144, in requests_get
raise ValueError('status code != 200 => %d (%s)' % (response.status, (await response.text())))
ValueError: status code != 200 => 429 (Error)
ERROR:asyncio:Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7fd385bca8d0>
ERROR:asyncio:Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x7fd385b07888>, 4002.554372885)]']
connector: <aiohttp.connector.TCPConnector object at 0x7fd385bca9e8>
Traceback (most recent call last):
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 141, in requests_get
error_data = parse_error(await response.text())
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 65, in parse_error
raise jsonschema.ValidationError("Could not parse json : {0}".format(str(e)))
jsonschema.exceptions.ValidationError: Could not parse json : Expecting value: line 1 column 1 (char 0)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/inso/.pyenv/versions/silkaj-3.7/bin/silkaj", line 23, in <module>
cli(obj={})
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/tools.py", line 70, in wrapper
return loop.run_until_complete(f(*args, **kwargs))
File "/home/inso/.pyenv/versions/3.7.0/lib/python3.7/asyncio/base_events.py", line 568, in run_until_complete
return future.result()
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/tx.py", line 68, in send_transaction
pubkey_amount = await get_amount_from_pubkey(issuer_pubkey)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/money.py", line 117, in get_amount_from_pubkey
listinput, amount = await get_sources(pubkey)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/silkaj/money.py", line 128, in get_sources
sources = await client(tx.sources, pubkey)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/bma/tx.py", line 236, in sources
return await client.get(MODULE + '/sources/%s' % pubkey, schema=SOURCES_SCHEMA)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 231, in get
response = await client.requests_get(url_path, **params)
File "/home/inso/.pyenv/versions/3.7.0/envs/silkaj-3.7/lib/python3.7/site-packages/duniterpy/api/client.py", line 144, in requests_get
raise ValueError('status code != 200 => %d (%s)' % (response.status, (await response.text())))
ValueError: status code != 200 => 429 (Error)
ERROR:asyncio:Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f51690d3978>
ERROR:asyncio:Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x7f516900e888>, 4003.371805189)]']
connector: <aiohttp.connector.TCPConnector object at 0x7f51690d38d0>
```Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/89Handle exceptions helper in IDE or with an external tool2022-07-07T10:36:38+02:00Vincent TexierHandle exceptions helper in IDE or with an external toolIn PHPStorm, a very usefull feature is to alert when an exception is not handled on a function.
It is a recursive feature, as it scan deep in function calls to let you choose on which level you want to catch the exception.
To help the ...In PHPStorm, a very usefull feature is to alert when an exception is not handled on a function.
It is a recursive feature, as it scan deep in function calls to let you choose on which level you want to catch the exception.
To help the user, the IDE suggest to add an annotation in the function docstring if it raise an exception.
But in Python, this is not as easy :
https://stackoverflow.com/questions/32560116/how-to-list-all-exceptions-a-function-could-raise-in-python-3
May be abandon that, or create a new PEP ? ;-)https://git.duniter.org/clients/python/duniterpy/-/issues/83libsodium: Migrate from libnacl to PyNaCl2023-07-07T20:32:33+02:00Fredlibsodium: Migrate from libnacl to PyNaClI am willing to retrieve Cesium+ member data
1. Installed duniterpy with:
`pip3 install duniterpy`
OK
2. Made my script from example: nano request_cesium_profile.py
```
import asyncio
from duniterpy.api.client import Client
ES_CORE_EN...I am willing to retrieve Cesium+ member data
1. Installed duniterpy with:
`pip3 install duniterpy`
OK
2. Made my script from example: nano request_cesium_profile.py
```
import asyncio
from duniterpy.api.client import Client
ES_CORE_ENDPOINT = "ES_CORE_API g1.data.duniter.fr 443"
ES_USER_ENDPOINT = "ES_USER_API g1.data.duniter.fr 443"
async def main():
"""
Main code (synchronous requests)
"""
# Create Client from endpoint string in Duniter format
client = Client(ES_USER_ENDPOINT)
# prompt entry
# pubkey = input("\nEnter a public key to get the user profile: ")
pubkey = "DsEx1pS33vzYZg4MroyBV9hCw98j1gtHEhwiZ5tK7ech"
# Get the profil of a public key (direct REST GET request)
# print("\nGET user/profile/{0}/_source:".format(pubkey))
response = await client.get('user/profile/{0}/_source'.format(pubkey.strip(' \n')))
print(response)
# Close client aiohttp session
await client.close()
# Latest duniter-python-api is asynchronous and you have to use asyncio, an asyncio loop and a "as" on the data.
# ( https://docs.python.org/3/library/asyncio.html )
asyncio.get_event_loop().run_until_complete(main())
```
python3 request_cesium_profile.py
```
Traceback (most recent call last):
File "request_cesium_profile.py", line 2, in <module>
from duniterpy.api.client import Client
File "/usr/local/lib/python3.5/dist-packages/duniterpy/__init__.py", line 24, in <module>
from . import api, documents, key
File "/usr/local/lib/python3.5/dist-packages/duniterpy/documents/__init__.py", line 10, in <module>
from .crc_pubkey import CRCPubkey
File "/usr/local/lib/python3.5/dist-packages/duniterpy/documents/crc_pubkey.py", line 7, in <module>
from ..helpers import ensure_str
File "/usr/local/lib/python3.5/dist-packages/duniterpy/helpers.py", line 2, in <module>
from libnacl.encode import hex_decode, hex_encode
File "/usr/local/lib/python3.5/dist-packages/libnacl/__init__.py", line 83, in <module>
nacl = _get_nacl()
File "/usr/local/lib/python3.5/dist-packages/libnacl/__init__.py", line 81, in _get_nacl
raise OSError(msg)
OSError: Could not locate nacl lib, searched for libsodium.so, libsodium.so.23, libsodium.so.18, libsodium.so.17, libsodium.so.13, libsodium.so.10, libsodium.so.5, libsodium.so.4,
```
What is wrong?1.3.0https://git.duniter.org/clients/python/duniterpy/-/issues/82Add missing Transaction attributes2021-07-22T19:09:10+02:00MoulAdd missing Transaction attributesAdd missing `Transaction.{blockstampTime,hash,block_number,received}` attributes in a way that it does not destroy the generation of Tx for sending.
As made for `time` attribute in https://git.duniter.org/clients/python/duniterpy/merge_...Add missing `Transaction.{blockstampTime,hash,block_number,received}` attributes in a way that it does not destroy the generation of Tx for sending.
As made for `time` attribute in https://git.duniter.org/clients/python/duniterpy/merge_requests/58/diffs?commit_id=fc30ac27e96da39b2b03d8f14c862017b00e026b.Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/81Three fields missing in bma.tx.history jsonschema2021-04-08T16:34:03+02:00MoulThree fields missing in bma.tx.history jsonschema`blockstampTime`, `locktime`, `blockstamp` are missing from [`bma.tx.history` `jsonschema`](https://git.duniter.org/clients/python/duniterpy/blob/dev/duniterpy/api/bma/tx.py#L28-166):
```json
{
"version": 10,
"lockt...`blockstampTime`, `locktime`, `blockstamp` are missing from [`bma.tx.history` `jsonschema`](https://git.duniter.org/clients/python/duniterpy/blob/dev/duniterpy/api/bma/tx.py#L28-166):
```json
{
"version": 10,
"locktime": 0,
"blockstamp": "214042-0000012B3AA19F9336AC1C75597257DD2C0BBC434721F5590F5F00A00CC06C09",
"blockstampTime": 1555178948,
```Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/80InputSource: implement from_src() and from_output_src() methods2021-03-07T15:37:50+01:00MoulInputSource: implement from_src() and from_output_src() methods- [ ] `InputSource.from_src()`: can be then used in `examples/send_transaction.py`
- [ ] `InputSource.from_output_src()`
- [ ] create `Source` class that `InputSource` and `OutputSource` would inherit?- [ ] `InputSource.from_src()`: can be then used in `examples/send_transaction.py`
- [ ] `InputSource.from_output_src()`
- [ ] create `Source` class that `InputSource` and `OutputSource` would inherit?Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/79Add code helper for sources selection and transaction chain2022-07-07T10:08:46+02:00Vincent TexierAdd code helper for sources selection and transaction chainAdd functions to smartly select sources and chain transactions.
In a lib folder or helper folder.
See pseudo code here (french) : https://forum.duniter.org/t/algorithme-de-selection-des-sources-pour-transactions/5942/2?u=vtexierAdd functions to smartly select sources and chain transactions.
In a lib folder or helper folder.
See pseudo code here (french) : https://forum.duniter.org/t/algorithme-de-selection-des-sources-pour-transactions/5942/2?u=vtexierBackloghttps://git.duniter.org/clients/python/duniterpy/-/issues/64Add automatic p2p multi-nodes requests to spread the load on nodes2023-07-08T15:27:19+02:00Vincent TexierAdd automatic p2p multi-nodes requests to spread the load on nodesDuniterpy should handle multi-nodes requests to share the write load on nodes and to ensure to have the most valid information of the blockchain consensus.
Client should not care about how and where the requests are sent, and all the co...Duniterpy should handle multi-nodes requests to share the write load on nodes and to ensure to have the most valid information of the blockchain consensus.
Client should not care about how and where the requests are sent, and all the complexity should be in the library.
Then, all clients using Duniterpy, will be really p2p clients.
Sakia implementation : https://git.duniter.org/clients/python/sakia/blob/master/src/sakia/services/network.py#L250Backloghttps://git.duniter.org/clients/python/duniterpy/-/issues/57Use Trio library to simplify asyncio or wait for Python 3.8 implementation of...2021-03-07T17:15:24+01:00Vincent TexierUse Trio library to simplify asyncio or wait for Python 3.8 implementation of nurseriesIt begins with a [french article](http://sametmax.com/super-article-invite-sur-trio-que-lauteur-a-oublie-de-titrer/) on the problems behind async/await python implementation.
[Trio](https://trio.readthedocs.io/en/latest/?badge=latest) s...It begins with a [french article](http://sametmax.com/super-article-invite-sur-trio-que-lauteur-a-oublie-de-titrer/) on the problems behind async/await python implementation.
[Trio](https://trio.readthedocs.io/en/latest/?badge=latest) seems to solves the problems nicely, and [trio-asyncio](https://trio-asyncio.readthedocs.io/en/latest/?badge=latest) can be used with aiohttp.
Python 3.8 should include the concept of nurseries. May be we can wait for it...Backlog