Ten dokument zawiera propozycje refaktoryzacji projektu WAPRO Network Mock w celu poprawy jakości kodu, utrzymywalności i testowalności.
Plik scripts/webenv.py zawiera ~1200 linii kodu z osadzonym HTML, CSS i JavaScript w zmiennej HTML_TEMPLATE. To utrudnia:
Wyodrębnić zasoby do osobnych plików:
scripts/
├── webenv.py # Tylko logika serwera
└── webenv_assets/
├── index.html # Szablon HTML
├── webenv.css # Style CSS
└── webenv.js # Logika JavaScript
# webenv.py - po refaktoryzacji
def load_template():
assets_dir = Path(__file__).parent / 'webenv_assets'
html = (assets_dir / 'index.html').read_text()
css = (assets_dir / 'webenv.css').read_text()
js = (assets_dir / 'webenv.js').read_text()
return html.replace('', css).replace('', js)
Pliki zebra-printer-1/zebra_mock.py i zebra-printer-2/zebra_mock.py zawierają osadzony HTML w render_template_string().
Użyć Flask templates:
zebra-printer-1/
├── zebra_mock.py
└── templates/
└── index.html
Konfiguracja drukarek ZEBRA_1_ do ZEBRA_6_ jest zduplikowana w:
.env / .env.exampledocker-compose.ymlStworzyć generator konfiguracji:
# scripts/generate_zebra_config.py
def generate_zebra_config(count=6, base_port=9100, base_web_port=8091):
"""Generuje konfigurację dla N drukarek Zebra"""
config = {}
for i in range(1, count + 1):
prefix = f"ZEBRA_{i}_"
config[f"{prefix}ENABLED"] = "true"
config[f"{prefix}SOCKET_PORT"] = "9100"
config[f"{prefix}EXTERNAL_SOCKET_PORT"] = str(base_port + i - 1)
config[f"{prefix}EXTERNAL_WEB_PORT"] = str(base_web_port + i - 1)
# ...
return config
Testy są rozproszone w różnych formatach:
scripts/test-e2e.sh - bashscripts/test-webenv.sh - bashtest-runner/tests/*.py - pytestUjednolicić podejście:
Opcja A: Wszystko w pytest
# tests/e2e/test_webenv.py
import pytest
import requests
class TestWebEnv:
def test_page_loads(self, webenv_url):
response = requests.get(webenv_url)
assert response.status_code == 200
Opcja B: Bash dla szybkich smoke testów, pytest dla szczegółowych
Pliki Python nie mają type hints, co utrudnia:
Dodać type hints do kluczowych funkcji:
# Przed
def load_env_file(path):
with open(path) as f:
return f.read()
# Po
def load_env_file(path: str | Path) -> str:
with open(path) as f:
return f.read()
scripts/discover.py ma długie funkcje i mieszaną odpowiedzialność.
Podzielić na moduły:
scripts/
├── discover.py # CLI entry point
└── discovery/
├── __init__.py
├── scanner.py # NetworkScanner class
├── zebra.py # ZebraDiscovery
├── mssql.py # MSSQLDiscovery
└── output.py # Formatowanie wyników
Kontenery nie mają zdefiniowanych health checks, co utrudnia:
Dodać healthcheck do każdego serwisu:
# docker-compose.yml
services:
rpi-server:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Brak automatycznej walidacji kodu przed commitem.
Dodać .pre-commit-config.yaml:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-json
- repo: https://github.com/psf/black
rev: 23.3.0
hooks:
- id: black
- repo: https://github.com/pycqa/flake8
rev: 6.0.0
hooks:
- id: flake8
| Priorytet | Zadanie | Czas |
|---|---|---|
| 🔴 Wysoki | Wyodrębnienie HTML/CSS/JS z webenv.py | 2-3h |
| 🟡 Średni | Wyodrębnienie HTML z zebra_mock.py | 1-2h |
| 🟡 Średni | Centralizacja konfiguracji Zebra | 2h |
| 🟡 Średni | Health checks w docker-compose | 1h |
| 🟡 Średni | Pre-commit hooks | 30min |
| 🟢 Niski | Ujednolicenie testów E2E | 4-6h |
| 🟢 Niski | Type hints | 2-3h |
| 🟢 Niski | Refaktoryzacja discover.py | 3-4h |
Łączny szacowany czas: ~16-22h
webenv.py (najwyższy priorytet)