# Repo for bachelor SOI-tool

## Forutsetninger

* `Python 3.7`
* `Pip 20.0`
* Windows 10 eller Ubuntu 18.04. Merk at flesteparten av gruppen arbeider på Windows 10

## Oppsett med virtual environment

```bash
# initialiser virtual environment
python -m venv venv
# aktiver virtual environment (Windows)
./venv/Scripts/activate
# aktiver virtual environment (Ubuntu, ikke testet)
./venv/bin/activate
# sikre at venv har riktige versjoner av kritiske innebygde pakker
# (kanskje unødvendig)
# dette blir gjort fordi default gir pip-18, som gir errormeldinger.
# Se https://bugs.python.org/issue30628
python -m pip install pip=='20.0' setuptools=='45.2' wheel=='0.34'
# installer pakker
pip install -r requirements.txt
# ...jobb med koden...
# for å deaktivere virtual environment
deactivate
```

## Linting

Sjekk av kodekvalitet gjøres med scriptet "CodeQualityCheck" i script-mappa, og er skrevet i Powershell(.ps1) og Bash(.sh). Scriptet kjører Pylint og Flake8 med tilhørende konfigurasjonsfiler, Pydocstyle med numpy-konvensjon og Bandit på Python-filer. 

Scriptet godtar kommandolinjeargumenter: .py-fil(er), mappe(r) eller en blanding av disse. Uten argumenter vil scriptet sjekke alle .py-filer.

Terminal kjøres fra root. Sjekk:

* Alle .py-filer: `.\scripts\CodeQualityCheck.ps1` eller `./scripts/CodeQualityCheck.sh`

* Spesifikk(e) .py: `.\scripts\CodeQualityCheck.ps1 filEn.py filTo.py`

* Alle .py i mappe(r): `.\scripts\CodeQualityCheck.ps1 mappeEn mappeTo`

* Blanding: `.\scripts\CodeQualityCheck.ps1 mappeEn mappeTo\fil.py`

## Testing

Tester er skrevet med `unittest` modulen, og ligger i mappen `test`.

* For å kjøre alle tester: `python -m unittest`
* For å kjøre en enkelt test modul (fil i `test` mappen): `python -m unittest test.<navnet_til_modulen>`
* For å kjøre en enkelt test metode (fil i `test` mappen): `python -m unittest test.<navnet_til_modulen>.<navnet til klassen>.<navnet til metoden>`

## Generering av kodedokumentasjon

Gjøres med pdoc3:

* `pdoc3 --html --output-dir .\docs .\soitool\main.py`

* Uten kildekode: `pdoc3 --html --config show_source_code=False --output-dir .\docs\ .\soitool\main.py`

Autogenerert docs: http://bachelor-paa-bittet.pages.stud.idi.ntnu.no/soitool/

## Om `Dockerfile`

Docker image som brukes i `.gitlab-ci.yml` er bygget med filen `Dockerfile` og er lastet opp som `morkolai/soitool-ci`. Docker image inneholder alle avhengigheter til prosjektet. Følgende prosedyre brukes for å oppdatere image. Dette må gjøres når `requirements.txt` endrer seg.

```bash
docker build -t morkolai/soitool-ci .
docker login
docker push morkolai/soitool-ci
```

## Arbeidsmetode

### Bruk av `git`

Arbeid skal ikke skje direkte på `master` branch. For hver oppgave en vil utføre skal en ny branch lages, og denne må senere merges inn ved hjelp av en "Merge Request". Gjennomgang av dette er lagt fram under:

```bash
# ny branch
git branch <branch navn>
# hoppe til eksisterende branch
git checkout <branch navn>
# ..jobb med koden..
git add <...>
git commit -m "..."
# push til gitlab
git push origin <branch navn>
```

Merging til master skal skje via Merge Requests i GitLab.

#### Om arbeid utføres på feil branch

`git stash` kan brukes for å lagre endringer i et "stash". Deretter kan en hoppe til riktig branch med `git checkout <branch navn>`, og kjøre `git stash pop`.

#### Ved feil commit melding

Om det er siste commit som er problemet, og den ikke har blitt pushet opp, kan en gjøre følgende for å endre commit-melding

```
git commit --amend
```

Om en vil endre tidligere commits eller endringen har blitt pushet opp: rop om hjelp!

> "When in danger or in doubt, rUn in circles, scream and shout"

### Hvordan skrive tester

Hver modul burde testes. I praksis vil dette si at hver fil under `soitool/` med navn `X.py` burde ha en tilsvarende fil under `test/` med navn `test_X.py`.

Ved GUI-testing av modulære dialoger (dialoger som stopper eksekvering av hovedvindu) foretrekkes fremgangsmåten som demonstreres i `test\test_main.py`, hvor testfunksjoner kjøres med `singleShot`. Antall millisekunder testen skal vente før testfunksjoner kjøres kan stilles inn for tregere maskiner.

*TODO* hvordan skrive GUI tester.