Tato stránka popisuje, jak budou vypadat testy na cvičeních a časem bude obsahovat i popis domácích úloh. Podívejte se prosím na stránku průvodce předmětem, kde najdete podrobnosti o tom, jak funguje hodnocení.

Opakování testů na cvičení

Pokud je hodnocení nějakého z testů na cvičení označeno jako Failed, máte možnost si jeden opravit během zkouškového období. V SISu (modul Termíny zkoušek) jsou již nějaké termíny vypsané, tak se k ním prosím přihlaste normálním způsobem. Můžete se přihlásit na libovolný termín (tedy nezáleží kdo je zkoušející, nemusí to být Váš cvičící).

Pokud máte právě jeden Failed test, tak víme že to je ten, který opakujete. Pokud jich máte jako failed označeno více, pak se Vás zeptáme přímo na místě, který chcete opravovat.

Pokud máte v hodnocení uvedeno Excused absence, můžete opakovat také tento test (ještě nad rámec jedné opravy Failed pokusu). Na termínu se Vás zeptáme, který test chcete opravovat. Pokud potřebujete opakovat více testů, budete muset přijít na více termínů (abyste měli 45 minut na vypracování zadání).

Opakování splněných testů není možné. Prosím nezapisujte se, pokud máte splněné všechny testy. Není co byste si opravovali a pouze budete blokovat místo ostatním studentům! Budeme se pravidelně dívat na kapacitu a případně vypíšeme více termínu, pokud to bude potřeba.

Opakování Domácích úloh není možné.

Testy na cvičení

Toto je rozpis testů na cvičení. Test bude probíhat na začátku cvičení (maximální doba trvání testu je 45 minut).

Týden (datum) Téma Podrobnosti o rozšíření
05 (18. 3. - 22. 3.) T1: Základní skriptování v shellu (roury) Druhý úkol podobného rozsahu
09 (15. 4. - 19. 4.) T2: Používání Git CLI (včetně větvení/spojování a push/pull přes SSH) Složitější větvení
14 (20. 5. - 24. 5.) T3: Sestavovací nástroj make (úprava stávajícího nastavení) Složitější nastavení projektu založeného na make

Očekává se, že se dostavíte na cvičení, na které jste zapsáni.

Pokud potřebujete přijít na jiné cvičení: kontaktujte nás prosím prostřednictvím confidential issue (alespoň týden předem a doložte vaše důvody, prosím, nějakým rozumným způsobem), abychom pro vás mohli najít náhradní termín (upozorňujeme, že účast na cvičeních jiného předmětu nebo návštěva sportovní akce není rozumným důvodem). Pokud se na zkoušku nedostavíte z důvodu nějakých nepředvídatelných okolností, kontaktujte nás prosím co nejdříve (opět prostřednictvím confidential issue). Počítejte s tím, že dodatečný termín se bude pravděpodobně konat ve zkouškovém období.

Pokud jste přihlášeni na zvláštní páteční cvičení, zkontrolujte si tady, prosím, na začátku 5. týdne, zda bude nutné ho rozdělit (tj. zda by polovina studentů potřebovala přijít v 10:40 a druhá polovina v 11:25).

AKTUALIZACE: Momentálně je na páteční cvičení 23bNSWI177x13 přihlášeno více jak 30 studentů. Pokud váš SISový login začíná na [a-k], přijďte, prosím, v 10.40; pokud váš login začíná na [l-z], prosím, přijďte v 11:30.

Aktualizace: Protože účast na pátečním cvičení 23bNSWI177x13 byla skutečně nízká, na tento termín, prosím, přijďte všichni od 10.40. Děkuji!

Test se bude psát na školních počítačích. Ujistěte se, že se tam můžete přihlásit a že máte vše pohodlně nastavené.

Vaše řešení bude odevzdáno prostřednictvím GitLabu nebo jiného Gitového repozitáře: ujistěte se, že umíte provést klonování prostřednictvím příkazové řádky (pro první test v 5. týdnu budete moci použít webové rozhraní GitLabu, ale použití nástrojů CLI je ve skutečnosti jednodušší a všechny potřebné příkazy budete znát ze cvičení 04).

Můžete používat naše webové stránky, off-line manuálové stránky a můžete nahlížet do svých poznámek a řešení příkladů, které jsou součástí našich materiálů.

Nesmíte používat žádná jiná zařízení (mobilní telefony, vlastní notebooky atd.), nahlížet do jiných on-line zdrojů (stroje budou mít stejně omezený přístup k internetu) ani sdělovat své řešení ostatním studentům.

Jinými slovy, testy na cvičení vyžadují, abyste dokázali řešit úkoly samostatně pouze s pomocí technické dokumentace.

Jakýkoli pokus o obejití výše uvedených pravidel (např. pokus o vyhledávání na StackOverflow na mobilním telefonu) znamená okamžité neúspěšné ukončení předmětu.

Pokud zadání nerozumíte, můžete samozřejmě požádat učitele o dovysvětlení. Pokud je zřejmé, že se ubíráte správným směrem a potřebujete jen trochu postrčit, můžeme vám i lehce poradit.

Ukázková úloha (shellové roury)

Napište skript (shellovou rouru), které přečte logy webového serveru a vypíše den s nejvyšším počtem požadavků.

Logy budou ve stejném formátu jako v příkladu na cvičení:

2023-01-05,02:35:05,192.168.18.232,622,https://example.com/charlie.html
2023-01-05,09:01:33,10.87.6.151,100,https://example.com/bravo.html
2023-01-06,17:25:17,52.168.104.245,1033,https://example.com/delta/delta.html

Pro výše uvedená data předpokládáme, že skript vypíše následující na svém výstupu.

2023-01-05

Log dostane skript na standardním vstupu, datum vypište na standardní výstup. Můžete předpokládat, že vstup není nijak poškozený. Nepředpokládejte nic o pořadí vstupních řádek.

Poznámky k úloze na Git CLI

Prosím, podívejte se na informace o pátečním cvičení 23bNSWI177x13 výše.

Očekáváme, že zvládnete následující úlohy pomocí Gitu na příkazové řádce (některé budete muset provádět na vzdáleném stroji linux.ms.mff.cuni.cz).

  • Nastavit si prostředí Gitu (autor a e-mail)
  • Naklonovat repozitář (z gitolite3@linux.ms.mff.cuni.cz nebo z GitLabu nebo obecně přes HTTPS)
  • Vytvořit commit
  • Vytvořit větev
  • Přepínat mezi větvemi
  • Zmergovat větev (a vyřešit případné konflikty)
  • Nahrát změny (větve) na server

Ujistěte se, že můžete klonovat z gitolite3@linux.ms.mff.cuni.cz když jste na školních počítačích. Bude dostupná jen autentikace veřejným klíčem (tj. nahrajte vaše klíče do 05/key.[0-9].pub souborů ve vašem repozitáři - jak je popsáno na cvičení 05 - ještě před zkouškou).

Aktualizace: přidal jsme nový CI job k vašim GitLabovým repozitářům, který by vás měl upozornit na typické problémy s vašimi klíči. Klidně ho můžete spustit i lokálně pomocí ./bin/run_tests.sh misc/keys.

Následující příkaz (nahraďte LOGIN vaším SISovým/Gitlabovým loginem s malými písmeny) to zkontroluje.

ssh -o ForwardAgent=no LOGIN@u-pl1.ms.mff.cuni.cz ssh -T gitolite3@linux.ms.mff.cuni.cz

Měli byste vidět na výstupu něco jako tohle:

hello LOGIN, this is gitolite3@linux running gitolite3 3.6.13-2.fc39 on git 2.44.0

 R W    lab05-LOGIN
 R      lab07-group-sum-ng

Pokud vidíte následující, vaše klíče nejsou v pořádku nastaveny.

(LOGIN@u-pl1.ms.mff.cuni.cz) Password:
Permission denied, please try again.
Permission denied, please try again.
gitolite3@linux.ms.mff.cuni.cz: Permission denied (publickey,password).

Aktualizace k výše uvedenému.

Příkaz se vás nejdříve ptá na SIS/GitLabové heslo, protože se nejdříve přihlašujete ke školnímu počítači v labu. Z něj se pak SSHčkujete na náš server, kde se použije ověření klíčem.

Pokud je váš klíč chráněn frází (passphrase), budete muset z příkazu výše odstranit -T (a možná dokonce přidat -tt k prvnímu SSH, tj. bude to ssh -tt -o ForwardAgent=no ...) [detaily v issue #102].

Klidně si URL gitolite3@linux.ms.mff.cuni.cz uložte někde na místní disk do vašeho $HOME, abyste ho nemuseli ručně opisovat během písemky.

Pokud si do vašeho .bashrc přidáte export giturl=gitolite3@linux.ms.mff.cuni.cz (podobně jako jsme nastavovali $EDITOR), tak budete moci zavolat jen git clone $giturl:lab05 což může nějaký čas ušetřit.

Aktualizace: další možností je nastavit si alias ve vašem ~/.ssh/config nějak takto, což vám umožní klonovat pomocí git clone exam:lab05-LOGIN.

Host exam
    Hostname linux.ms.mff.cuni.cz
    User gitolite3

Písemka se zaměřuje na práci s Gitem. Cílem nebude napsat celý skript ale budete pracovat s repozitářem, ve kterém bude následující skript pro tisk jednoduchý sloupcových grafů v terminálu. Budete v něm ale dělat drobné změny (třeba opravy překlepů), na správné místo v kódu vás ale vždy navedeme.

import argparse
import sys

def parse_config():
    args = argparse.ArgumentParser(description='Console bar plot')
    args.add_argument('--columns', default=60, type=int, metavar='N')
    return args.parse_args()

def load_input(inp):
    values = []
    for line_raw in inp:
        line = line_raw.strip()
        if line.startswith('#') or not line:
            continue
        try:
            val = float(line)
        except ValueError:
            print(f"WARNING: ignoring invalid line '{line}'.", file=sys.stderr)
            continue
        values.append(val)
    return values

def print_barplot(values, scale, symbol):
    for val in values:
        print(symbol * round(val / scale))

def main():
    config = parse_config()
    values = load_input(sys.stdin)
    if not values:
        sys.exit(0)
    coef = max(values) / config.columns
    print_barplot(values, coef, '#')

if __name__ == '__main__':
    main()

Poznámky k úloze na make

Prosím, podívejte se na informace o pátečním cvičení 23bNSWI177x13 výše.

Očekáváme, že zvládnete následující úlohy s Makefile (některé budete muset provádět na vzdáleném stroji linux.ms.mff.cuni.cz).

  • Sestavit projekt (nebo jeho část) pomocí programu make
  • Pochopit dodaný Makefile
  • Provádět úpravy v Makefile
    • Opravit seznam závislostí
    • Opravit příkaz použitý pro daný cíl (target)
    • Sjednotit více pravidel do tzv. vzorových pravidel (pattern rule)
    • Přidat nový cíl do Makefile se správně odvozenými závislostmi

Ujistěte se, že můžete klonovat repozitáře z gitolite3@linux.ms.mff.cuni.cz ze školního počítače (stejně jako pro zkoušku z Gitu). Vizte nápovědu a detaily výše.

Domácí úlohy

Toto je předběžný rozvrh domácích úloh a jejich témat (předpokládáme, že deadline druhé úlohy bude zasahovat do zkouškového období).

Týdny Téma Podrobnosti o rozšíření
07 - 10 T4: Složitější shellový skript Další funkce nad rámec hlavní úlohy
12 - 15 T5: Nastavení projektu (CI, nástroje pro sestavení, Git) Další funkce nad rámec hlavní úlohy

Stejně jako v případě testů na cvičení bude vaše řešení odevzdáno k vyhodnocení prostřednictvím Gitu.

Pro toto řešení můžete použít prakticky všechny dostupné zdroje, včetně manuálových stránek, našich webových stránek, on-line výukových programů nebo služeb, jako je ChatGPT a podobně.

Pokud odněkud kopírujete (nebo kopírujete a upravujete) své řešení (to se týká i odpovědí z nástrojů umělé inteligence), musíte řádně uvést své zdroje. Nemusíte zapisovat použití manuálových stránek nebo webových stránek předmětu.

Bez ohledu na použité zdroje musíte být schopni pochopit a vysvětlit návrh/implementaci svého řešení. Neschopnost vysvětlit své řešení je stejná, jako kdyby nebyla úloha vůbec odevzdána.

Domácí úlohy jsou individuální, tedy je musí řešit každý student samostatně. Diskutovat o svém řešení s kolegy je v pořádku, předkládat jejich práci jako svou je zakázáno.

Úloha T4: shellový skript

Napište generátor webových stránek pro turnaj založený na týmových úkolech.

V turnaji může být libovolný počet týmů a každý tým může zaslat svou implementaci soutěžní úlohy. Implementace je pak vyhodnocena pomocí sady automatizovaných testů a krátký záznam z testů je zkopírován na známé místo.

Vaším úkolem je zpracovat výstupy automatických testů a vygenerovat souhrnnou webovou stránku. Protože vlastní generování HTML není zas až tak zajímavé, úkol se zastaví na hranici generování sady stránek ve formátu Markdown.

Vstupní data budou uložena v adresáři tasks. Každý podadresář odpovídá jedné úloze, vlastní výsledky jsou v souborech pojmenovaných podle názvu týmu s příponou .log.gz (tj. jedná se o prostý textový soubor komprimovaný gzipem). Každý řádek v log souboru začíná buď pass (včetně mezery), nebo fail , nebo jej lze pro naše účely ignorovat.

Předpokládá se, že skript shellu může být (případně) nainstalován v nějakém adresáři na cestě ($PATH), ale data bude vždy číst z aktuálního pracovního adresáře.

Máte vygenerovat celkové pořadí týmů, kde se každý splněný test (tj. řádek začínající na pass ) počítá za jeden bod (a body se sčítají napříč všemi úlohami). A pro každý tým musíte také připravit stránku, kde bude zobrazen rozpis bodů napříč jednotlivými úlohami. Tato stránka bude také odkazovat na původní log soubor (očekává se, že soubor zkopírujete a rozbalíte do stejného adresáře, kde jsou markdown soubory).

Například může strom vstupního adresáře vypadat takto:

tasks/
├── m01
│   ├── alpha.log.gz
│   └── bravo.log.gz
└── m02
    ├── alpha.log.gz
    ├── bravo.log.gz
    └── charlie.log.gz

A obsah souboru tasks/m01/alpha.log.gz může být po dekompresi následující (připomeňme, že nás zajímají pouze řádky pass/fail):

pass Test one
fail Test two
  Extra information about failure.
fail Test three

Data pro náš příklad lze stáhnout (včetně předpokládaného výstupu) z repozitáře s příklady.

Očekáváme, že pak bude vygenerován tento index.md:

# My tournament

 1. bravo (5 points)
 2. alpha (3 points)
 3. charlie (1 points)

A pro každý tým speciální stránka jako je tato:

# Team alpha

+--------------------+--------+--------+--------------------------------------+
| Task               | Passed | Failed | Links                                |
+--------------------+--------+--------+--------------------------------------+
| m01                |      1 |      2 | [Complete log](m01.log).             |
| m02                |      2 |      0 | [Complete log](m02.log).             |
+--------------------+--------+--------+--------------------------------------+

Výstupní adresář bude pak obsahovat následující soubory:

out/
├── index.md
├── team-alpha
│   ├── index.md
│   ├── m01.log
│   └── m02.log
├── team-bravo
│   ├── index.md
│   ├── m01.log
│   └── m02.log
└── team-charlie
    ├── index.md
    ├── m01.log
    └── m02.log

Váš skript musí přijímat argument -o pro předání názvu výstupního adresáře a -t pro zadání alternativního názvu index stránky (místo výchozího My tournament). Váš nástroj musí přijmout obě varianty volání -odirname a -o dirname pro oba argumenty.

Můžete s klidem předpokládat, že názvy týmů a úkolů budou pouze platné C identifikátory (tj. pouze anglická abeceda a čísla bez speciálních znaků). Můžete dále předpokládat, že se názvy úkolů atd. vejdou do výše uvedené tabulky (pokud jde o šířku sloupců).

Očekává se, že budete používat dočasné soubory pro ukládání průběžných výsledků a že úlohu vyřešíte kompletně v shellu.

Nemůžete použít AWK, PERL, Python ani žádný jiný další jazyk; použití sedu je povoleno (ale pravděpodobně není nutné). Nesmíte použít žádné pokročilé funkce jazyka Bash, jako jsou (asociativní) pole nebo konstrukce [[ a (( (použití $(( )), $( ) a test(1) je však povoleno). Jinými slovy, očekáváme, že implementaci budete řešit pomocí konstrukcí a programů, které jste viděli během cvičení (a úloha je taková, že byste ji měli být schopni napsat sami bez cizí pomoci).

Očekáváme, že k odstartování své implementace použijete externí nástroje, ale před odevzdáním musíte rozumět celému skriptu a musíte označit všechny části, které jste osobně nenapsali (a pokud používáte nástroje, jako je ChatGPT, musíte odeslat celý protokol komunikace s tímto nástrojem).

Abychom úlohu přijali, musí být vyřešeny všechny problémy nahlášené Shellcheckem.

Rozšíření

Zkontrolujte, zda existuje soubor config.rc, a načtěte jej: může přepsat název (title) celého turnaje a výstupní (output) adresář (místo výchozího out).

Pokud například soubor config.rc obsahuje následující řádky, pak název v souboru index.md nejvyšší úrovně bude znít # NSWI177 Tournament a vygenerované soubory budou uloženy v adresáři output_md/.

title="NSWI177 Tournament"
output="output_md/"

Tyto hodnoty mohou být stále přepsány přepínači na příkazovém řádku (tj. pořadí je výchozí hodnota pevně zakódovaná ve skriptu, hodnoty v config.rc a přepínače -o a -t).

V každém podadresáři task/* zkontrolujte, zda soubor meta.rc (pokud existuje) neobsahuje řádek name="..", který může obsahovat jiný název úlohy než název adresáře. Tento název bude pak použit ve výše uvedené tabulce. Název nebude používat žádné speciální znaky kromě mezery a pomlčky.

Očekává se, že soubory .rc budou zdrojové soubory shellu a budou obsahovat platné shellové konstrukce. Musíte však zkontrolovat, zda soubor vůbec existuje.

Odevzdání a hodnocení

Odevzdejte svá řešení do podadresáře exam/t04 v repozitáři pro NSWI177.

Skript uložte do souboru exam/t04/tournament.sh (a nerozdělujte jej do více souborů). Při kopírování fragmentů ze stránek, jako je StackOverflow, očekáváme, že je okomentujete přímo v souboru tournament.sh. Komunikaci se stránkami řízenými umělou inteligencí uložte do souboru ai.log (textový soubor s jasně označenými částmi s vašimi vstupy a s odpověďmi).

Pokud vytvoříte další testovací sady dat, neváhejte je uložit do podadresáře demo (podobně jako naše vstupy, tj. např. demo/one/tasks a demo/one/output s očekávaným výstupem).

Poskytujeme pouze základní automatizované testy: můžete si je ale sami rozšířit. Všimněte si, že diff lze použít s -r k porovnání celých podstromů adresářů, což se může hodit při porovnávání vygenerovaného výstupu s tím očekávaným.

Známkování úlohy je pouze uspěl/neuspěl (resp. uspěl s rozšířením). Při hodnocení vaší implementace zkontrolujeme, zda funguje na základních datech a poté zkontrolujeme kvalitu vašeho skriptu kombinací automatických i ručních kontrol. To bude zahrnovat kontroly, zda skript po sobě odstraňuje dočasné soubory, zda náhodně neodstraňuje existující soubory atd. U kvality se podíváme na názvy proměnných, komentáře celkové struktury nebo rozklad na funkce. Implementace vyhoví, pokud je množství těchto problémů v rozumných mezích.

Záměrně neuvádíme vyčerpávající checklist, protože by to vedlo k optimalizaci proti seznamu namísto přemýšlení, jak napsat rozumnou implementaci.

Termín odevzdání je 2024-05-05.

Úloha T5: nastavení projektu

Nastavte CI pro Pythoní projekt a připravte ho na další distribuci.

Očekáváme, že k odstartování své implementace použijete externí nástroje, ale před odevzdáním musíte rozumět celému skriptu a musíte označit všechny části, které jste osobně nenapsali (a pokud používáte nástroje, jako je ChatGPT, musíte odeslat celý protokol komunikace s tímto nástrojem).

Kontext

V této úloze budete pracovat na jednoduchém Pythoním projektu, který je schopen vykreslovat šablony Jinja.

Jako jednoduchý příklad (který také najdete ve složce examples ve vašem repozitáři s projektem) může posloužit následující transformace.

Mějme následující pole (seznam) v JSONu:

[
  {
     "name": "Introduction to Linux",
     "code": "NSWI177",
     "homepage": "https://d3s.mff.cuni.cz/teaching/nswi177/"
  },
  {
     "name": "Operating Systems",
     "code": "NSWI200",
     "homepage": "https://d3s.mff.cuni.cz/teaching/nswi200/"
  }
]

Mějme následující vstupní soubor:

Our courses
===========

Below is a list of (almost) all of our courses.

A budeme mít tuto šablonu. Všimněte si, že řídící struktury šablony používají {% (nebo {%- pokud chceme odstranit okolní prázdné znaky) a {{ pro nahrazování proměnných.

{{ content }}

{%- for course in data -%}
 * [{{ course.name }} ({{ course.code }})]({{ course.homepage }}) {{ NL }}
{%- endfor %}

Očekáváme, že náš šablonovač po spuštění vypíše následující.

Our courses
===========

Below is a list of (almost) all of our courses.

* [Introduction to Linux (NSWI177)](https://d3s.mff.cuni.cz/teaching/nswi177/)
* [Operating Systems (NSWI200)](https://d3s.mff.cuni.cz/teaching/nswi200/)

Zdrojový kód

Zdrojáky výše uvedené implementace jsou pro vás již připravené a brzy budete mít přístup k novému projektu v podstromu teaching/nswi177/2024 na GitLabu, kde budete pracovat.

Nekopírujte tento kód do vašeho obvyklého repozitáře a pracujete jen s repozitářem t05-LOGIN (s výjimkou ai.log jak je zmíněno níže).

Repozitář též obsahuje několik testů. Jsou tam unit testy v Pythonu (používající pytest) a také testy na vyšší úrovni (budeme jim říkat integrační ač je to trochu přehnané) napsané v BATSu.

Spuštění je popsáno v README projektu.

Commitujte pouze soubory, které jsou potřeba. Určitě nemá smysl commitovat adresáře virtual environmentu, podadresáře __pycache__ nebo Pythoní .egg a .whl soubory.

Základní část

Váš hlavní úkol je nastavit tomuto projektu základní CI na GitLabu a připravit ho pro distribuci.

CI musí spustit Pythoní unit testy a skončit chybou při jakémkoliv problému. Přípravou na distribuci míníme to, že po vašich změnách půjde šablonovač nainstalovat pomocí pipu a mít ho dostupný příkazem nswi177-jinja-templater.

Vaším úkolem není projekt dostat na PyPI ale pouze nastavit repozitář na GitLabu.

Jinými slovy, následující příkazy nainstalují šablonovač do nového virtuálního prostředí a spuštění posledního příkazu vypíše krátkou nápovědu k našemu programu (předpokládáme, že jsme v prázdném adresáři, který nijak nesouvisí s klonem projektu).

python3 -m venv templater-venv
. ./templater-venv/bin/activate
pip install git+ssh://git@gitlab.mff.cuni.cz/teaching/nswi177/2024/t05-LOGIN
nswi177-jinja-templater --help

A pro CI očekáváme, že váš projekt bude mít úlohu unittests, která spouští Pythoní testy.

Prosím, dbejte na to, aby se CI job skutečně jmenoval unittests a umístěte veškerou konfiguraci do jediného .gitlab-ci.yml souboru.

CI by mělo používat obraz python:3.12-alpine a měli byste instalovat verze z requirements.txt souboru. Očekáváme, že pytest (a možná další knihovny potřebné pro testy) nebudou v requirements.txt, ale raději uvnitř souboru requirements-dev.txt.

Určitě si všimnete, že testy neprocházejí, protože některé z Jinja filtrů nejsou naimplementovány.

Ale nestrachujte se. Vaše kolegyně Alice je už naimplementovala ve své větvi v repozitáři gitolite3@linux.ms.mff.cuni.cz:t05-alice.

Zaintegrujte (merge) její implementaci do vašeho repozitáře, abyste měli implementaci kompletní.

Mergování je povinnou částí úlohy a očekáváme, že provedete normální merge (možná jen fast-forward) a nikdy neprovedete tzv. rebase.

Pokud jste vše udělali správně, váš CI log bude vypadat zhruba takto (ze zřejmých důvodů jsou použité příkazy rozmazané).

Abychom shrnuli podčásti pro vyřešení základní (povinné) části T05.

  • Přimergujte implementaci od Alice.
  • Nastavte pyproject.toml, setup.cfg a requirements.txt (a requirements-dev.txt) pro projekt t05-login na GitLabu.
  • Nastavit CI na GitLabu tak, aby spouštělo Pythoní testy v úloze (job) unittests.

Rozšíření

Volitelně můžete rozšířit CI tak, aby též spouštělo BATS testy.

Očekáváme, že přidáte nový job nazvaný integrationtests, který nainstaluje daný balíček (takže bude fungovat příkaz nswi177-jinja-templater) a spustí všechny BATS testy z podadresáře tests (jak si asi vzpomínáte, tak pouhé pip install . by mělo zafungovat úplně skvěle).

Budete muset nejdřív doinstalovat bats pomocí apk add (je v pořádku instalovat tento balíček při každém spuštění CI).

Všimněte si, že současná implementace v common.bash volá program pomocí env PYTHONPATH=src python3 -m nswi177.templater – zmeňte volání jen na nswi177-jinja-templater. Také budete muset nahradit volbu --kill-after za -k v příkazu timeout, protože dlouhá varianta není na Alpine podporována.

Množství BATS testů není příliš velké, takže byste také měli přimergovat práce od kolegů Boba a Charlieho do vašeho repozitáře. Jako obvykle, proveďte normální merge a nikoliv rebase při slučování jejich práce.

Bob má repozitář na gitolite3@linux.ms.mff.cuni.cz:t05-bob zatímco Charlie dal svojí kopii na náš web na https://d3s.mff.cuni.cz/f/teaching/nswi177/202324/t05-charlie.git.

V případě konfliktů se ujistěte, že jste je vyřešili rozumně – rozhodně nechcete žádný z testů mazat.

Abychom shrnuli podčásti pro vyřešení (volitelného) rozšíření T05.

  • Přimergujte testy od Boba a Charlieho.
  • Opravte spuštění příkazu v BATS testech.
  • Opravte volání timeout, aby bylo timeout -k 30 "${timeout}" "$@".
  • Přidejte CI job integrationtests, který spustí všechny BATS testy.

Odevzdání a hodnocení

Odevzdejte svá řešení do repozitáři t05-LOGIN na GitLabu.

Budeme kontrolovat, že projekt jde nainstalovat pomocí pip install git+https://gitlab.../t05-LOGIN/ a že vaše konfigurace CI je v pořádku (po všech mergech by se mělo vše zelenat). Zkontrolujeme, že Pythoní kód může být spuštěn pomocí python3 -m src.nswi177.templater po instalaci závislostí skrz pip install -r requirements.txt (nebo pomocí python -m nswi177.templater pokud je přímo samotný balík také nainstalovaný) a že Pytesty mohou být spuštěny po instalaci z requirements-dev.txt.

Při kopírování fragmentů ze stránek, jako je StackOverflow, očekáváme, že je okomentujete přímo v příslušných zdrojácích. Komunikaci se stránkami řízenými umělou inteligencí uložte do souboru exam/t05/ai.log ve vašem obvyklém repozitáři (student-LOGIN), opět jako textový soubor s jasně označenými částmi s vašimi vstupy a s odpověďmi.

Termín odevzdání je 2024-06-16.