Other tasks: 1, 2, 3, 4, 5, 6, 7.
General notes
Use your GitLab repository to submit your solutions. Please, use exact filenames as specified in the task name.
Please, respect language requirements of individual tasks. For Python, we expect Python 3 as the default (if you really need to use Python 2, use a proper shebang). For shell scripts, we expect that you will use Bash although none of the tasks requires any use of Bashisms for an efficient solution.
Deadline for this set of tasks is 2020-05-15 AoE, it is required to get at least 9 points from this group.
Tasks description
Simple SSG (7 points)
Tasks in this group are actually revolving around a single program that has to be properly prepared for distribution and its implementation completed.
The main program you are about to work on will be written in Python and will serve as a simple static site generator. Here is a huge list of existing SSGs if you are interested in competition.
Your SSG will be extremely simple, though. It will generate all the pages from a single template and no fancy features, such as built-in web server, will be present.
As things are best shown with examples, please clone
teaching/nswi177/2020-summer/upstream/examples
again and move into my_ssg/examples/01
.
Inside templates/main.j2
is a simple template using
Jinja2 engine.
If you know HTML, you should be able to identify a typical web page
template and also note the {{
parts where variable expansion would
be done by Jinja.
Directory content/
then contains source files for web generation.
They all have .md
extensions as they are written in
Markdown with
YAML header.
And in directory out/
we can see how the input Markdown files
were transformed using the Jinja template into final HTML
(note that the files were run through HTML Tidy
before being added to the repository).
Files from static/
directory were copied as-is.
The overall task is then simple: finish the implementation of the Python
program my_ssg
that does the actual conversion.
We expect that the program would be called as
my_ssg generate \
--content content \
--templates templates \
--static static \
--destination out
to generate the output. All the parameters --content
, --templates
,
--static
and --destination
are not required, the defaults are as above.
That is, if you cd
into examples/01
and only execute
../../my_ssg generate
without further parameters, it should work too.
Call to my_ssg version
should print version of your program.
Store your solution in your repository as usual, inside the 04/
folder.
I.e. in 04
directory there will be root of your program directory with
files and dirs like my_ssg, README, run_tests.sh, examples ...
.
We have already implemented a huge portion of the SSG. The skeleton that you have available is able to iterate through all input files and load them. It also parses the YAML header for you.
What is missing is the actual Jinja templating and copying of static files.
We believe that if you are in your first year of studies, you know Python well enough to be able to understand the code quite easily. If you did not have Python in the mandatory courses, you should have at least 3 semesters of programming behind you and reading code in unknown language shall not be a problem for you. In the end, the solution requires about 15 lines of code (honest).
Note that examples from examples/02
does not need to work for you
at the moment.
Some useful hints:
- You will need to add
|markdownify
filter to Jinja for the template to work correctly. - We use argparse for parsing command-line options. This SO thread might be also useful.
- Module shutil might be useful when copying static files.
Tests (4 points)
Add tests to your program to verify that it works as expected.
We do not impose a hard limit on the number of tests but we encourage you
to write unit tests (e.g. to test the |markdownify
filter) as well
as bigger test that would compare the expected output of the whole
program execution.
Note that tests that we have provided use nose as the testing framework. Feel free to switch to a different framework if you are more familiar with another one.
04/requirements.txt
(2 points)
Provide a proper dependency file for Pip so that your program can be easily tested in a virtual environment.
04/setup.py
(2 points)
Provide a setuptools-based installation script for your program.
We expect that after install
step, my_ssg
would be added to some
directory in $PATH
.
Extension (5 points)
Extend your program with support for access to all pages. That is
useful for generating menus, for example.
That can be seen in examples/02
.
Ostatní úlohy: 1, 2, 3, 4, 5, 6, 7.
Obecné požadavky
Úkoly odevzdávejte do Vašeho GitLabového repozitáře. Prosím, dodržujte přesné pojmenování souborů jak je uvedeno u názvu úkolu.
Prosím, dodržujte požadovaný jazyk jednotlivých úloh. Pro úlohy v Pythonu očekáváme použití Pythonu verze 3 (pokud doopravdy potřebujete verzi 2, nezapomeňte na správný shebang). Pro shellové skripty, očekáváme, že budete používat Bash. Nicméně, žádný z úkolů nevyžaduje použití Bashismu pro efektivní řešení.
Deadline pro tuto sadu úloh je 2020-05-15 KnZ, pro úspěšné splnění potřebujete získat alespoň 9 bodů.
Úlohy
Jednoduchý SSG (7 bodů)
Tato sada úloh bude o dokončení implementace jednoduchého programu a jeho správnou přípravu pro distribuci.
Program bude implementován v jazyce Python a bude sloužit jako jednoduchý generátor statických webových stránek. Zde se nachází obsáhlý seznam statických generátorů.
Váš generátor bude extrémně jednoduchý. Bude generovat všechny webové stránky z jediné šablony a nebude obsahovat žádné pokročilé funkce, jako například webový server.
Jelikož jeden příklad vydá za tisíce slov popisu, naklonujte si
teaching/nswi177/2020-summer/upstream/examples
a zanořte se do my_ssg/examples/01
.
V souboru templates/main.j2
je jednoduchá šablona používající Jinja2
engine. Pokud znáte jazyk
HTML, měli byste být schopni identifikovat typickou šablonu webové
stránky s tímp, že části s {{
mají být expandované Jinja
enginem.
Adresář content/
obsahuje zdrojové soubory pro generování web stránky.
Všechny mají příponu .md
, jelikož jsou napsány ve značkovacím jazyce
Markdown spolu s jazykem
YAML v hlavičce.
V adresáři out/
se nachází vytvořené HTML soubory, které vznikly
transformací Jinja šablony.
(Soubory byly zpracovány pomocí HTML
Tidy před přidáním do repositáře.)
Soubory z adresáře static/
jsou zkopírovány bez úprav.
Vaším úkolem je dokončit implementaci Python programu my_ssg
, který
provádí konverzi.
Program se spustí jako
my_ssg generate \
--content content \
--templates templates \
--static static \
--destination out
čímž dojde k vygenerování výstupu. Všechny výše uvedené přepínače nejsou povinné a v případě jejich neuvedení jsou nastaveny na výchozí hodnoty uvedené v příkladu výše.
Tím pádem, pokud jste v adresáři examples/01
a spustíte ../../my_ssg
bez dalších parametrů, bude to fungovat.
my_ssg version
vytiskne číslo verze programu.
Řešení vypracujte jako obvykle ve vašem repozitáři v adresáři 04/
. To
znamená že v adresáři 04
bude kořen vašeho programu se soubory a
adresáři jako my_ssg, README, run_tests.sh, examples ...
.
Valná většina programu je již implementována. Kostra kódu, která je vám k dispozici dokáže projít vstupní soubory a načíst je. Dále také naparsuje YAML hlavičku.
Vaším úkolem je dopsat interpretaci Jinja šablon a kopírování statických souborů.
Jako studenti prvního ročníku znáte Python dostatečně dobře pro pochopení stávajícího kódu. Pokud jste Python neměli jako povinný předmět, máte za sebou 3 semestry programování a číst kód v jiném jazyce by pro vás neměl být problém. Navíc řešení vyžaduje pouze okolo 15 řádek kódu.
Příklady z examples/02
pro splnění této části nemusí fungovat.
Užitečné hintíky:
- Musíte přidat
|markdownify
filter do Jinja , aby správně fungovaly šablony. - V kódu se používá argparse pro parsování příkazové řádky. Tento SO thread může být užitečný.
- Modul shutil je vhodný pro kopírování statický souborů.
Testy (4 body)
Přidejte do vašeho programu testy, které ověří, že program funguje jak má.
Není žádný limit na počet testů, nicméně doporučujeme psát unit testy
(např. pro otestovaní |markdownify
filteru) a zároveň i větší testy,
které porovnají výstup vašeho programu s očekávaným výstupem.
Testy, které používáme my využívají nose jako testovací framework. Klidně můžete použít jiný framework.
04/requirements.txt
(2 body)
Vytvořte soubor se závislostmi pro Pip, aby váš program mohl být jednoduše spuštěn ve virtuálním prostředí.
04/setup.py
(2 body)
Vytvořte instalační skript pro váš program založený na setuptools.
Očekává se, že po provedení install
kroku bude my_ssg
nainstalován do
nějakého adresáře v $PATH
.
Rozšíření (5 bodů)
Rozšiřte váš program o přístup ke všem stránkám. To je užitečné pro
generování menu, které můžete vidět v examples/02
.