Development Procedures (czech)

Tento dokument popisuje postupy používané pri vývoji aplikace

Adresářová struktura

  • doc - Dokumentace

  • resources - Zdroje, které nejsou součástí aplikace

  • src/JobsScheduler - Modul pro vzdálené spouštění výpočtů

  • src/LayerEditor - Modul pro zobrazení a úpravu vrstev

  • src/LayerEditor - Modul pro úpravu konfiguračních souborů

  • src/lib - Modul s knihovnami používanými ostatními moduly

  • testing - Automatické testy

Kontrola kódu

Pro kontrolu se používá pyLint. V hlavním adresáři každého modulu je soubor pylintrc, v kterém se píší pravidla pro vyjímky. Další vyjímky je možné napsat na začátek souboru, nebo nad vyjmutý řádek. Pravidla pro tyto vyjímky budou vznikat během vývoje a budou zapisovány do samostatného souboru.

Bohužel s kontrolou kódu nemám zkušenosti a některé požadavky vyplynou až během vývoje. Proto zde popíši oblasti, na které by jsem se chtěl při kontrole kódu zaměřit a to co nekontrolovat vyplyne z porovnání poměru režie/přínos. To co nebude odpovídat mé představě o programování vyřadím. Bohužel zatím mám spíše dojem, že to nabízenými nástroji nedokáži udělat dostatečně adresně, aby zůstalo zachováno i co se mi líbí. Přehled pylintem kontrolovaných oblastí (lze použít pro vypnutí testu) je zde.

Odsazení

V Pythonu asi nezbytnost.

prázné znaky na konci řádků

Je to dost otrava
  • zjistit zda to může něčemu vadit

  • zjistit zda to něco neumí udělat automaticky

Pravidla psaní kódu

Jednotná pravidla psaní kódu jsou hezká a asi i něco zvýší přehlednost kódu. Sice to není nijak zvlášt důležité, ale předpokládám že po několika kontrolách pylintem přejdou do krve a nebudou moc zdržovat.

Pylint používá konvenci PEP 0008

Konvence pojmenování souborů, tříd, proměnných …

Pylint pro kontrolu názvů používá tuto konvenci. O tomto platí to samé jako o předcházejícím. Mě nedělá problém číst kód napsaný jakoukoliv konvencí, spíš jí mám problém udržet. Doufám že pomocí pylintu bude můj kód, co se týká jednotnosti pojmenování, konzistentní. Škoda že to neumí hledat české názvy.

Kontrola použití lokální proměnné (_xxx) jiného modulu

Python nemá žádnou přímou cestu jak schovat proměnnou. (Jedině jí dát do souboru který je schovaný pomocí __init__.py) Osobně si myslím že bez nějaký formy zapouzdření to větším projektu nejde. Proto bych poprosil o důsledné rozlišení a označování lokálních proměnných pomocí _. A doufám že chybu protected-access (W0212): Access to a protected member ... nikde neuvidím. Jen kromě testů, kde je testování lokálních proměnných praktické.

Starý styl vytvoření třídy

super-on-old-class (E1002)
  • s někým se poradit a zjistit co to dělá

Dokumentace

Dokumentace je psaná v reStructuredText a do finální podoby generována pomocí sphinx. reStructuredText je docstring formát a sphinx pak umožnuje dodat pěkné formátování textu a vygenerovat požadovaný formát dokumentu. Generovat celou vývojářskou je možné z adresáře doc/ pomocí make a požadovaného formátu. Například:

make html

Dokumentace se skládá z uživatelské příručky, organizačních pokynů pro vývoj (v adresáři doc/organization) a z dokumentace samotných zdrojových kódů. Ta je automaticky generována po jednotlivých GeoMop modulech pomocí sphinx modulu sphinx-apidoc příkazem umístěným v Makefile.

sphinx není úplně jednoduchý nástroj na osvojení a je primárně určený na psaní dokumentace obecně. Naopak jako nástroj pro generování dokumentace ze zdrojových kódů není ideální a má mnoho much. Ale alternativy již nejsou zrovna aktivně vyvíjený a sphinx následně můžeme použít i na psaní uživatelské dokumentace.

Generování dokumentace při push

Pro automatické generování dokumentace lze využít git hook pre-push. Skript, který vygeneruje a pushne vytvořenou dokumentaci je umísťen v adresáři resources/development. Pro použití je potřeba ho po naklonování repozitáře přesunout mezi git hooks, které se mají vykonat.

cp resources/development/pre-push .git/hooks/
chmod +x .git/hooks/pre-push

Testování kódu po sobě

Kód je nutné otestova kompletně a pokud víme že ovlivní i jiné části programu, pak i ty. Tam kde jsou psané kompletní testy stačí zběžně, v jiném případě by mělo být testování kompletnější.

Testování - automatické testy

Pro psaní automatických testů je použit pyTest. Testy je možné lokálně spustit z testing adresáře příkazem:

RunTests.sh

UI testy qt částí aplikace je možné dělat pomocí qt knihovny QTest (Jen Qt dokumentace). Testování je popsáno v tomto článku.

V budoucnu je třeba spouštět testy automaticky po každém poslání do gitu nejlépe na deployi ve virtuálním prostředí.

Co se musí aut. testovat:
  • přítomnost souboru v prostředí (z každého souboru zavolat nějakou funkci)

  • pokud je kód souboru závislý na nějakém resourci, knihově, nebo na něčem jiném, pak otestovat jejich přítomnost (zavolat část kódu, která danou závislost načte, nebo kde proběhne inicializace)

  • pokud jde o qt třídu, která obsahuje signál, pak otestovat signál

Co je dobré aut. testovat:
  • Psaní automatických testů může být činnost, jež ušetří mnoho práce v budoucnosti, naopak muže být i velmi časově náročné a výsledek nevalný. Něco se testuje lépe a něco hůře. Na každém z nás je aby našel tu hranici, kde je to výhoddné.

  • Některý kód vede na něco jako úplné testy. Například implementujeme-li něco, co se může během vývoje (přidávání nové vlastnosti) lehce rozbít. Přičemž lze relativně lehce otestovat, že se nezměnila již nainplementovaná část. Pokud tomu tak je, určitě se o takovýto test pokusit. Do popisu třídy se pak poznačí, že jsou k ní k dispozici úplné testy

Požadavky na vývojový PC

Vše je psané pro Linux. Pokud by se mělo vyvíjet i na window, je nutné tam nainstalovat maketool a asi napsat nějaké alternativy k sh skriptům, ale ten je použit jen pro testy. Pokud by se našel někdo, kdo by chtěl vyvíjet na windows, je to v zásadě vítané, ale bude to znamenat vyřešit a zdokumentovat instalaci prostředí a přidání alternativních skriptů.

Požadavky:
  • Python3 (včetně pip)

  • PyQt5 (včetně QScintilla a QWebKit)

Instalace Python závislostí

Pro vývoj i běh se doporučuje používat virtuální prostředí, více viz uživatelská dokumentace. Pro instalaci závislostí potřebných k vývoji aplikace lze použít následující příkaz:

pip install -r requirements-development.txt

IDE

Je možné používat IDE dle uvážení. Projektové soubory se do Gitem neverzují. Každý je zodpovědný za to aby mu to fungovalo na jeho Počítači.

Možnosti:
  • Eclipse + PyDev - netestoval jsem, eclipse nemám rád

  • PyCharm - měl problémy s qt a nenašel jsem rychle přijatelné řešení , ale jinak docela dobré

  • Eric IDE - není s ním úplně jednoduché začít vyvíjet, ale když si na něj člověk zvykne … . Tento nástroj budu používat asi já, takže budu schopný poradit a asi v něm půjde i generovat z docstringů i bublinková nápověda pro náš kód.

Build

  • rozhodnout jaké instalační balíčky a systémy podporovat a dopsat