Skip to content

Commit 69932b0

Browse files
authored
Merge pull request #220 from JdeRobot/ci-setup
CI setup
2 parents 39e15a7 + 886be41 commit 69932b0

39 files changed

Lines changed: 672 additions & 407 deletions

.github/workflows/python_lint.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Ensure Python code is linted and formatted, matching the style guide
2+
name: Python Linting
3+
4+
on: [push, pull_request]
5+
6+
jobs:
7+
black-lint:
8+
runs-on: ubuntu-latest
9+
name: Python black Lint
10+
steps:
11+
- uses: actions/checkout@v4
12+
- uses: psf/black@stable
13+
flake8-lint:
14+
runs-on: ubuntu-latest
15+
name: Python flake8 Lint
16+
steps:
17+
- name: Check out source repository
18+
uses: actions/checkout@v3
19+
20+
- name: Set up Python environment
21+
uses: actions/setup-python@v4
22+
with:
23+
python-version: "3.11"
24+
25+
- name: flake8 Lint
26+
uses: py-actions/flake8@v2
27+
with:
28+
ignore: "E701,W503,E203"
29+
exclude: "docs,.idea"
30+
max-line-length: "88"
31+
path: "."
32+
plugins: "flake8-docstrings flake8-black"

manager/comms/consumer.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@
66
import websockets
77
from websockets.server import WebSocketServerProtocol
88

9-
from manager.comms.consumer_message import ManagerConsumerMessage, ManagerConsumerMessageException
9+
from manager.comms.consumer_message import (
10+
ManagerConsumerMessage,
11+
ManagerConsumerMessageException,
12+
)
1013
from manager.ram_logging.log_manager import LogManager
1114

1215
logger = LogManager.logger
1316

17+
1418
class ManagerConsumer:
1519
"""
1620
Robotics Academy websocket consumer
@@ -19,7 +23,6 @@ class ManagerConsumer:
1923
def __init__(self, host, port):
2024
from manager.manager import Manager
2125

22-
2326
"""
2427
Initializes a new ManagerConsumer
2528
@param host: host for connections, '0.0.0.0' to bind all interfaces
@@ -36,7 +39,9 @@ async def reject_connection(self, websocket: WebSocketServerProtocol):
3639
Rejects a connection
3740
@param websocket: websocket
3841
"""
39-
await websocket.close(1008, "This RADI server can't accept more than one connection")
42+
await websocket.close(
43+
1008, "This RADI server can't accept more than one connection"
44+
)
4045

4146
async def handler(self, websocket: WebSocketServerProtocol):
4247
"""
@@ -62,32 +67,40 @@ async def handler(self, websocket: WebSocketServerProtocol):
6267
s = json.loads(websocket_message)
6368
message = ManagerConsumerMessage(**s)
6469
await self.manager.trigger(message.command, data=message.data or None)
65-
response = {"message": f"Exercise state changed to {self.manager.state}"}
70+
response = {
71+
"message": f"Exercise state changed to {self.manager.state}"
72+
}
6673
await websocket.send(str(message.response(response)))
6774
except ManagerConsumerMessageException as e:
6875
await websocket.send(str(e))
6976
except Exception as e:
7077
if message is None:
7178
ex = ManagerConsumerMessageException(message, str(e))
7279
else:
73-
ex = ManagerConsumerMessageException(id=str(uuid4()), message=str(e))
80+
ex = ManagerConsumerMessageException(
81+
id=str(uuid4()), message=str(e)
82+
)
7483
await websocket.send(str(ex))
7584

7685
async def send_message(self, message_data):
7786
if self.client is not None and self.server is not None:
78-
message = ManagerConsumerMessage(id=str(uuid4()), command="state-changed", data=message_data)
87+
message = ManagerConsumerMessage(
88+
id=str(uuid4()), command="state-changed", data=message_data
89+
)
7990
await self.client.send(str(message))
8091

8192
def start(self):
8293
"""
8394
Starts the consumer and listens for connections
8495
"""
8596
self.server = websockets.serve(self.handler, self.host, self.port)
86-
LogManager.logger.debug(f"Websocket server listening in {self.host}:{self.port}")
97+
LogManager.logger.debug(
98+
f"Websocket server listening in {self.host}:{self.port}"
99+
)
87100
asyncio.get_event_loop().run_until_complete(self.server)
88101
asyncio.get_event_loop().run_forever()
89102

90103

91-
if __name__ == '__main__':
92-
consumer = ManagerConsumer('0.0.0.0', 7163)
104+
if __name__ == "__main__":
105+
consumer = ManagerConsumer("0.0.0.0", 7163)
93106
consumer.start()

manager/comms/consumer_message.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class ManagerConsumerMessage(BaseModel):
1414
@param command: message command
1515
@param data: message data (optional)
1616
"""
17+
1718
id: str
1819
command: str
1920
data: Optional[Any] = None
@@ -24,7 +25,7 @@ def response(self, response: Any = None) -> ManagerConsumerMessage:
2425
@param response: response data
2526
@return: the response message as a ManagerConsumerMessage
2627
"""
27-
return ManagerConsumerMessage(id=self.id, command='ack', message=response)
28+
return ManagerConsumerMessage(id=self.id, command="ack", message=response)
2829

2930
def __repr__(self):
3031
return self.json()
@@ -37,11 +38,17 @@ class ManagerConsumerMessageException(BaseException):
3738
def __init__(self, id: str, message: str = None):
3839
super(ManagerConsumerMessageException, self).__init__(message)
3940
self.id = id
40-
self.command = 'error'
41+
self.command = "error"
4142
self.message = message
4243

4344
def consumer_message(self):
44-
return ManagerConsumerMessage(id=self.id, command=self.command, data={'message': self.message})
45+
return ManagerConsumerMessage(
46+
id=self.id, command=self.command, data={"message": self.message}
47+
)
4548

4649
def __str__(self):
47-
return str(ManagerConsumerMessage(id=self.id, command=self.command, data={'message': self.message}))
50+
return str(
51+
ManagerConsumerMessage(
52+
id=self.id, command=self.command, data={"message": self.message}
53+
)
54+
)

manager/comms/new_consumer.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@
44
from uuid import uuid4
55
from datetime import datetime
66

7-
from manager.comms.consumer_message import ManagerConsumerMessageException, ManagerConsumerMessage
7+
from manager.comms.consumer_message import (
8+
ManagerConsumerMessageException,
9+
ManagerConsumerMessage,
10+
)
811
from manager.comms.websocker_server import WebsocketServer
912
from manager.ram_logging.log_manager import LogManager
1013

1114

1215
class Client:
1316
def __init__(self, **kwargs):
14-
self.id = kwargs['id']
15-
self.handler = kwargs['handler']
16-
self.address = kwargs['address']
17+
self.id = kwargs["id"]
18+
self.handler = kwargs["handler"]
19+
self.address = kwargs["address"]
1720

1821

1922
class ManagerConsumer:
@@ -26,16 +29,17 @@ class ManagerConsumer:
2629
def __init__(self, host, port, manager_queue: Queue):
2730
self.host = host
2831
self.port = port
29-
self.server = WebsocketServer(
30-
host=host, port=port, loglevel=logging.INFO)
32+
self.server = WebsocketServer(host=host, port=port, loglevel=logging.INFO)
3133

3234
# Configurar el logger de websocket_server para salida a consola
33-
ws_logger = logging.getLogger('websocket_server.websocket_server')
35+
ws_logger = logging.getLogger("websocket_server.websocket_server")
3436
ws_logger.propagate = False
3537
ws_logger.setLevel(logging.INFO)
3638
ws_logger.handlers.clear()
3739
ws_formatter = logging.Formatter(
38-
"%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] (%(name)s) %(message)s", "%H:%M:%S")
40+
"%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] (%(name)s) %(message)s",
41+
"%H:%M:%S",
42+
)
3943
ws_console_handler = logging.StreamHandler()
4044
ws_console_handler.setFormatter(ws_formatter)
4145
ws_logger.addHandler(ws_console_handler)
@@ -59,28 +63,29 @@ def handle_client_disconnect(self, client, server):
5963
time_string = now.strftime("%H:%M:%S")
6064
print(time_string)
6165
message = ManagerConsumerMessage(
62-
**{'id': str(uuid4()), 'command': 'disconnect'})
66+
**{"id": str(uuid4()), "command": "disconnect"}
67+
)
6368
self.manager_queue.put(message)
6469
self.client = None
6570
self.server.allow_new_connections()
6671

6772
def handle_message_received(self, client, server, websocket_message):
6873
LogManager.logger.info(
69-
f"message received length: {len(websocket_message)} from client {client}")
74+
f"message received length: {len(websocket_message)} from client {client}"
75+
)
7076
LogManager.logger.info(
71-
f"message received: {websocket_message} from client {client}")
77+
f"message received: {websocket_message} from client {client}"
78+
)
7279
message = None
7380
try:
7481
s = json.loads(websocket_message)
7582
message = ManagerConsumerMessage(**s)
7683
self.manager_queue.put(message)
7784
except Exception as e:
7885
if message is not None:
79-
ex = ManagerConsumerMessageException(
80-
id=message.id, message=str(e))
86+
ex = ManagerConsumerMessageException(id=message.id, message=str(e))
8187
else:
82-
ex = ManagerConsumerMessageException(
83-
id=str(uuid4()), message=str(e))
88+
ex = ManagerConsumerMessageException(id=str(uuid4()), message=str(e))
8489
self.server.send_message(client, str(ex))
8590
raise e
8691

@@ -92,7 +97,8 @@ def send_message(self, message_data, command=None):
9297
message = message_data.consumer_message()
9398
else:
9499
message = ManagerConsumerMessage(
95-
id=str(uuid4()), command=command, data=message_data)
100+
id=str(uuid4()), command=command, data=message_data
101+
)
96102

97103
self.server.send_message(self.client, str(message))
98104

manager/comms/thread.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ThreadWithLoggedException(threading.Thread):
1414
Exception is also reachable via <thread>.exception from the main thread.
1515
"""
1616

17-
DIVIDER = "*"*80
17+
DIVIDER = "*" * 80
1818

1919
def __init__(self, *args, **kwargs):
2020
try:
@@ -31,11 +31,14 @@ def run(self):
3131
except Exception as exception:
3232
thread = threading.current_thread()
3333
self.exception = exception
34-
self.logger.exception(f"{self.DIVIDER}\nException in child thread {thread}: {exception}\n{self.DIVIDER}")
34+
self.logger.exception(
35+
f"{self.DIVIDER}\nException in child thread {thread}: {exception}\n{self.DIVIDER}"
36+
)
3537
finally:
3638
del self._target, self._args, self._kwargs
3739

3840

3941
class WebsocketServerThread(ThreadWithLoggedException):
4042
"""Dummy wrapper to make debug messages a bit more readable"""
43+
4144
pass

0 commit comments

Comments
 (0)