Browse Source

checkpoint

hosting
Michael Pilosov 2 years ago
parent
commit
c4cf873c48
  1. 37
      README.md
  2. 36
      src/announce_server/decorator.py
  3. 19
      tests/test_announce.py

37
README.md

@ -0,0 +1,37 @@
# Announce Server
A Python library that announces a server to a host.
## Installation
```bash
pip install announce-server
```
## Build
To build the package, run:
```bash
pip install -e .[dev]
pip install -m build
```
## Test
To run the tests, install the package with the `[dev]` option:
```bash
pip install -e .[dev]
pytest
```
## Usage
```python
from announce_server.announce import announce_server
@announce_server(name="server_name", ip="server_ip", port=8000, host_ip="host_server_ip", host_port=5000)
def your_function():
pass
```

36
src/announce_server/decorator.py

@ -44,26 +44,24 @@ async def _announce_server(**kwargs):
await main() await main()
def announce_server(task=None, loop=None, **outer_kwargs): # def announce_server(task=None, loop=None, **outer_kwargs):
if task is None: # if task is None:
return lambda f: announce_server(f, loop=loop, **outer_kwargs) # return lambda f: announce_server(f, loop=loop, **outer_kwargs)
@wraps(task) # @wraps(task)
def wrapper(*args, **kwargs): # async def wrapper(*args, **kwargs):
async def main(*args, **kwargs): # if not asyncio.iscoroutinefunction(task):
if loop is not None: # # If the decorated function is not a coroutine, wrap it in a coroutine
host_block_thread = loop.run_in_executor(None, task) # task = asyncio.coroutine(task)
else: # if loop is not None:
host_block_thread = asyncio.to_thread(task) # host_block_thread = loop.run_in_executor(None, task)
# else:
# host_block_thread = asyncio.to_thread(task)
# Announce the server to the host # # Announce the server to the host
await _announce_server(**outer_kwargs) # await _announce_server(**outer_kwargs)
# Wait for host_block to finish # # Wait for host_block to finish
await host_block_thread # await host_block_thread
if loop is not None: # return wrapper
return loop.create_task(main(*args, **kwargs))
else:
return asyncio.run(main(*args, **kwargs))
return wrapper

19
tests/test_announce.py

@ -1,6 +1,6 @@
import asyncio import asyncio
import sys import sys
from unittest.mock import patch from unittest.mock import patch, MagicMock
if sys.version_info >= (3, 8): if sys.version_info >= (3, 8):
from unittest.mock import AsyncMock from unittest.mock import AsyncMock
@ -9,19 +9,20 @@ else:
import pytest import pytest
from announce_server import _announce_server, announce_server from announce_server.decorator import _announce_server, announce_server
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_announce_server_decorator(event_loop, mocker): # @patch('announce_server.decorator.announce_server', new=MagicMock())
# Mock the _announce_server function to prevent actual connections async def test_announce_server_decorator(mocked_announce_server, event_loop):
mocker.patch("announce_server._announce_server")
# Sample function to be decorated # Sample function to be decorated
async def sample_async_function(): async def sample_async_function():
await asyncio.sleep(1) await asyncio.sleep(1)
return "Hello, world!" return "Hello, world!"
# Mock the _announce_server function to prevent actual connections
mocked_announce_server.return_value = lambda x: x
# Decorate the sample function with announce_server # Decorate the sample function with announce_server
decorated_function = announce_server( decorated_function = announce_server(
name="test_server", name="test_server",
@ -33,17 +34,19 @@ async def test_announce_server_decorator(event_loop, mocker):
)(sample_async_function) )(sample_async_function)
# Run the decorated function # Run the decorated function
task = await decorated_function() coro = asyncio.to_thread(decorated_function)
task = await asyncio.gather(coro)
await asyncio.sleep(1.1) # Sleep slightly longer than sample_async_function await asyncio.sleep(1.1) # Sleep slightly longer than sample_async_function
task.cancel() # Cancel the task task.cancel() # Cancel the task
# Check if the _announce_server function was called with the correct arguments # Check if the _announce_server function was called with the correct arguments
announce_server._announce_server.assert_called_once_with( mocked_announce_server.assert_called_once_with(
name="test_server", name="test_server",
ip="127.0.0.1", ip="127.0.0.1",
port=8000, port=8000,
host_ip="127.0.0.1", host_ip="127.0.0.1",
host_port=5000, host_port=5000,
loop=event_loop,
) )
# Check if the decorated function returns the expected result # Check if the decorated function returns the expected result

Loading…
Cancel
Save