Configuration
Most urnc commands operate on a complete course, containing multiple jupyter notebooks (e.g. urnc student, urnc version or urnc ci).
The exact behaviour of these commands can be configured by editing the config.yaml file in the course root directory. This file is created automatically when you run urnc init for the first time.
An example config.yaml is given in section Example Config. Descriptions for each field are provided in section Configuration Options.
Example Config
name: "URNC Example Course"
version: "1.0.4"
description: "Example course demonstrating the use of URNC (https://github.com/spang-lab/urnc)"
authors:
- {name: "Tobias Schmidt", email: tobias.schmidt331@gmail.com}
- {name: "Michael Huttner", email: michael@mhuttner.com}
git:
student: "https://USERNAME:PASSWORD@github.com/spang-lab/urnc-example-course-public.git"
output_dir: "out"
exclude:
- "config.yaml"
- "README.md"
- "assignments/*"
- {pattern: "!assignments/01*.ipynb", after: "2023-10-02"}
- {pattern: "!assignments/02*.ipynb", after: "2023-10-09"}
convert:
keywords:
assignment: ["Lab", "Assignment"]
skeleton: ["Skeleton"]
solution: ["Solution"]
targets:
- {type: "student", path: "{nb.abspath}"}
- {type: "solution", path: "{nb.absdirpath}_solutions/{nb.name}"}
ignore: []
tags:
solution: "solution"
skeleton: "skeleton"
assignment: "assignment"
assignment-start: "assignment-start"
ignore: "ignore"
no-execute: "no-execute"
jupyter:
version: 1.13.0
links:
- {name: Webpage, url: https://spang-lab.github.io/urnc-example-course}
- {logo: "https://placehold.co/64"}
- {pull_url: https://github.com/spang-lab/urnc-example-course-public.git}
users:
- "mhuttner"
- "tschmidt"
Configuration Options
name
Name of the course as free text.
semester
Semester of the course as free text.
version
Semantic version of the course, e.g., ‘1.0.0’.
description
Description of the course as free text.
git
Dictionary of the following git-related options: student, output_dir, exclude.
student
URL to the public repository where course materials are published for students. The URL must include valid credentials, as it is used by urnc ci to push the processed course materials (e.g., notebooks without solutions). If your main repository is public, we recommend using CI tools like GitLab CI/CD Variables or GitHub Actions Secrets to securely manage credentials and inject them at runtime during pipeline execution.
output_dir
Directory where the processed course materials are stored when calling urnc student or urnc ci. If git.student is provided, the given repository will be cloned into this directory before starting the conversions. It’s highly recommended to add this directory to your .gitignore.
exclude
List of files or directories to exclude from publishing with urnc ci. Each entry is treated as a glob pattern and can be either a string or a dictionary. If you use a dictionary, it must include a pattern field and can optionally include after and until fields to specify time-based conditions. At runtime, entries that meet these time conditions are appended to the .gitignore file in the output_dir, ensuring they are ignored during publishing.
In the example below, the file aaa.md is always ignored. All files in the tmp folder are also ignored, except for tmp/abc.md and tmp/xyz.md. The file tmp/abc.md is not ignored from 2023-10-02 until 2023-10-09, and tmp/xyz.md is not ignored after 2023-10-09.
git:
exclude:
- "aaa.md"
- "tmp/*"
- {pattern: "!tmp/abc.md", after: "2023-10-02", until: "2023-10-09"}
- {pattern: "!tmp/xyz.md", after: "2023-10-09"}
convert
Dictionary of the following conversion-related options: keywords, targets, ignore, and tags.
keywords
Keywords used to categorize lines within each notebook. Currently, the following categories are supported: assignment, skeleton, and solution. Lines matching ^\s*(#{1,6})\s*\b{keyword}\b.*$ start the respective category. Lines matching ^\s*(#{1,6})\s*$ end the current category. Depending on the conversion target, lines of a certain type are either removed, transformed, or left unchanged in the notebook. Example: if you configure solution: "SOL" (i.e. you set the solution keyword to SOL) the following cell would be tagged as solution and lines 2-4 would be removed in the student notebook:
# Enter your solution here # left unchanged
### SOL # gets removed
sum(range(1, 100)) # gets removed
### # gets removed
targets
List of conversion targets created by urnc ci and urnc student.
Each target must be a dictionary with fields type and path.
Field type defines what kind of conversion is performed.
Supported types are: student, solution, execute, clear, fix.
Field path defines where the converted notebooks get saved and can contain placeholder variables.
Conversions of individual notebooks can be tested using the commands shown in the example below:
urnc convert --output student_version.ipynb input_notebook.ipynb
urnc convert --solution solution_version.ipynb input_notebook.ipynb
urnc check --clear input_notebook.ipynb # clears output cells inplace
urnc check --image input_notebook.ipynb # fixes image paths inplace
urnc execute input_notebook.ipynb
ignore
List of glob patterns to ignore during conversion.
This is different from git.exclude, because it suppresses the actual conversion of the notebook, whereas git.exclude only suppresses the publishing of the notebook.
jupyter
Dictionary of the following Jupyter/JupyterHub-related options: version, links, users.
This field is not used by urnc directly, but by the script for generating a JupyterHub server list at runtime.
version
Specifies the version of the image used by JupyterHub.
links
List of links displayed below the course name in the JupyterHub server list.
Each link must be given as a dictionary with a name and url field, except for the following two special cases:
If a dictionary contains a
logofield, that logo will be displayed next to the course name in the JupyterHub server list. Other dictionary fields are ignored in this case.If a dictionary contains a
pull_urlfield, that URL will be used byurnc pullto clone or pull the course repository inside the container before the user is redirected to the JupyterHub server. Other dictionary fields are ignored in this case.
users
List of users allowed to access this profile on the JupyterHub server.