https://github.com/bitnom/expectations
Asynchronous expectations (Jobs/tasks) for future events.
https://github.com/bitnom/expectations
Last synced: 9 months ago
JSON representation
Asynchronous expectations (Jobs/tasks) for future events.
- Host: GitHub
- URL: https://github.com/bitnom/expectations
- Owner: bitnom
- License: mit
- Created: 2021-02-06T11:26:21.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-02-06T11:37:28.000Z (over 5 years ago)
- Last Synced: 2025-02-04T13:24:23.618Z (over 1 year ago)
- Language: Python
- Size: 33.2 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Expectations for Python
**Asynchronous expectations (Jobs/tasks) for future events.**
If client user sends a message to server, a new eid is generated and sent with the message. If server sends back a message
with an eid, the eid is checked against our expectations. If eid matches an expectation, that expectation's callback
will run. If server sends a message without an eid, no expectations will be checked.
## Installation
Pypi package is present.
`pip install expectations`
## Implementation
**Important steps are marked 1-4.**
```python
import asyncio
import os
import json
import aiohttp
from expectations import Expector, eidgen
HOST = os.getenv('HOST', '127.0.0.1')
PORT = int(os.getenv('PORT', 1339))
URL = f'http://{HOST}:{PORT}/ws'
def my_expected_proc(data): # Simple function we will use as our expectation callback.
print('Processed expectation:', data)
async def main():
session = aiohttp.ClientSession()
expector = Expector() # 1: Get setup.
async with session.ws_connect(URL) as ws:
async for msg in ws:
try:
server_message = msg.data.rstrip()
j = json.loads(server_message)
if 'eid' in j:
# 4: See if incoming eid from server matches any of our expectations.
expected = await expector.check_expectations(j['eid'], server_message)
if expected:
# Give expected callback a second to process (For demo purposes; so it runs before prompt)
await asyncio.sleep(1000)
else:
raise Exception(f'Unexpected message from server: {msg}')
except Exception as ex:
print(ex)
finally:
await prompt_and_send(ws, expector)
if msg.type in (aiohttp.WSMsgType.CLOSED,
aiohttp.WSMsgType.ERROR):
break
async def prompt_and_send(ws, expector):
user_msg = input('Type a message to send to the server: ')
if user_msg == 'exit':
print('Exiting!')
raise SystemExit(0)
eid = eidgen() # 2: Create new expectation ID (eid).
await expector.expect(eid, my_expected_proc) # 3: Create new expectation using eid and any callback function.
await ws.send_str(json.dumps({
'method': user_msg,
'eid': eid # eid is sent with msg (For demo). If we get this eid back later, the expectation callback will run.
}))
if __name__ == '__main__':
print('Type "exit" to quit')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
```
**MIT License**