|
Note
|
Da PySignalduino noch in aktiver Entwicklung ist, können sich Code-Strukturen und APIs schnell ändern. Bitte synchronisieren Sie Ihren Fork regelmäßig mit dem upstream-Repository. |
Beiträge zum Projekt sind willkommen!
-
Fork & Clone: Projekt forken und lokal klonen.
-
Branch: Feature-Branch erstellen (
git checkout -b feature/mein-feature). -
Entwicklung: Änderungen implementieren.
-
Tests: Sicherstellen, dass alle Tests bestehen (
pytest). -
Pull Request: PR auf GitHub öffnen.
Das Projekt verwendet poetry für die Abhängigkeitsverwaltung. Installieren Sie die Entwicklungsabhängigkeiten mit:
link:../examples/bash/install_dev_deps.sh[role=include]Oder verwenden Sie poetry install (falls Poetry konfiguriert ist).
Die wichtigsten Entwicklungsabhängigkeiten sind:
-
pytest– Testframework -
pytest-mock– Mocking-Unterstützung -
pytest-asyncio– Asyncio-Testunterstützung -
pytest-cov– Code-Coverage -
aiomqtt– Asynchrone MQTT-Client-Bibliothek (für Tests gemockt)
Das Projekt folgt PEP 8. Verwenden Sie black für automatische Formatierung und ruff für Linting.
link:../examples/bash/format_code.sh[role=include]Es gibt keine strikte CI-Prüfung, aber konsistenter Stil wird erwartet.
Für alle AsciiDoc-Dateien im docs/ Verzeichnis ist die Regel "Ein Satz pro Zeile" verpflichtend.
Dies erleichtert die Überprüfung von Änderungen mittels git diff.
|
Important
|
Jeder Satz muss auf einer neuen Zeile beginnen.
Ein Satz endet typischerweise mit einem Punkt ( |
Das Projekt nutzt pytest. Stellen Sie sicher, dass requirements-dev.txt installiert ist.
link:../examples/bash/run_pytest.sh[role=include]Für spezifische Testmodule:
link:../examples/bash/run_specific_tests.sh[role=include]Seit der Migration zu asyncio (Version 0.9.0) sind alle Tests asynchron und verwenden pytest-asyncio. Testfunktionen müssen mit @pytest.mark.asyncio dekoriert sein und async def verwenden.
Beispiel:
link:../../tests/test_controller.py[role=include]Verwenden Sie AsyncMock aus unittest.mock, um asynchrone Methoden zu mocken. Achten Sie darauf, asynchrone Kontextmanager (aenter, aexit) korrekt zu mocken.
link:../../tests/conftest.py[role=include]In Fixtures (siehe tests/conftest.py) werden Transport- und MQTT-Client-Mocks bereitgestellt.
Coverage-Bericht generieren:
link:../examples/bash/coverage_report.sh[role=include]Der Bericht wird im Verzeichnis htmlcov/ erstellt.
-
Verwenden Sie
async/awaitfür alle E/A-Operationen. -
Vermeiden Sie blockierende Aufrufe (z.B.
time.sleep, synchrones Lesen/Schreiben) in asynchronen Kontexten. Nutzen Sie stattdessenasyncio.sleep. -
Nutzen Sie asynchrone Iteratoren (
async for) und Kontextmanager (async with), wo passend.
-
Verwenden Sie
asyncio.Queuefür die Kommunikation zwischen Tasks. -
Achten Sie auf korrekte Behandlung von
Queue.task_done()undawait queue.join(). -
Setzen Sie angemessene Timeouts, um Deadlocks zu vermeiden.
-
Fangen Sie
asyncio.CancelledErrorin Tasks, um saubere Beendigung zu ermöglichen. -
Verwenden Sie
asyncio.TimeoutErrorfür Timeouts beiasyncio.wait_for. -
Protokollieren Sie Ausnahmen mit
logger.exceptioninexcept-Blöcken.
-
Implementieren Sie
aenter/aexitfür Ressourcen, die geöffnet/geschlossen werden müssen (Transport, MQTT-Client). -
Stellen Sie sicher, dass
aexitauch bei Ausnahmen korrekt aufgeräumt wird.
-
Vermeiden Sie das Erstellen zu vieler gleichzeitiger Tasks; nutzen Sie
asyncio.gathermit angemessener Begrenzung. -
Verwenden Sie
asyncio.create_taskfür Hintergrundtasks, aber behalten Sie Referenzen, um sie später abbrechen zu können.
-
Vor dem Einreichen: Stellen Sie sicher, dass Ihr Branch auf dem neuesten Stand von
mainist und alle Tests bestehen. -
Beschreibung: Geben Sie im PR eine klare Beschreibung der Änderungen, des Problems und der Lösung an.
-
Review: Mindestens ein Maintainer muss den PR reviewen und genehmigen.
-
Merge: Nach Genehmigung wird der PR gemergt (Squash-Merge bevorzugt).
-
❏ Tests hinzugefügt/aktualisiert und alle bestehenden Tests bestehen.
-
❏ Code folgt PEP 8 (Black/Ruff).
-
❏ Dokumentation aktualisiert (falls nötig).
-
❏ Keine neuen Warnungen oder Fehler im Linter.
-
❏ Changelog aktualisiert (optional, wird vom Maintainer übernommen).
Für AI‑Agenten, die Code oder Systemkonfigurationen ändern, gelten zusätzliche verbindliche Vorgaben. Jede Änderung muss eine vollständige Analyse der Auswirkungen auf die zugehörige Dokumentation und die Testsuite umfassen.
Die detaillierten Richtlinien sind in AGENTS.md dokumentiert. Die wichtigsten Pflichten sind:
-
Dokumentationspflicht: Die Dokumentation muss synchron zu allen vorgenommenen Änderungen aktualisiert werden. Betroffen sind das
docs/‑Verzeichnis, Inline‑Kommentare, Docstrings, README.md und andere Markdown‑Dateien. -
Test‑Pflicht: Bestehende Tests sind zu überprüfen und anzupassen; bei Bedarf sind neue Tests zu erstellen, um eine vollständige Testabdeckung der neuen oder modifizierten Logik zu gewährleisten.
-
Verbindlichkeit: Diese Praxis ist für jede Änderung verbindlich und nicht verhandelbar. Ein Commit, der die Dokumentation oder Tests nicht entsprechend anpasst, ist unzulässig.
Vor dem Commit ist die Checkliste in AGENTS.md (Abschnitt „Mandatory Documentation and Test Maintenance“) abzuarbeiten.
Falls Sie ein neues Funkprotokoll hinzufügen möchten:
-
Fügen Sie die Definition in
sd_protocols/protocols.jsonhinzu. -
Implementieren Sie die Dekodierungsmethode in der entsprechenden Mixin-Klasse (
ManchesterMixin,PostdemodulationMixin, etc.). -
Schreiben Sie Tests für das Protokoll in
tests/test_manchester_protocols.pyoder ähnlich. -
Dokumentieren Sie das Protokoll in
docs/03_protocol_reference/protocol_details.adoc.
Weitere Details finden Sie in der Architektur-Dokumentation (architecture.adoc).