Skip to main content

Python package to convert txt files into zip folder that can be uploaded to Ilias to create question pools.

Project description

iliasqc

PyPI version conda-forge version Tests License: MIT Dependabot

Python package to convert structured text files into ILIAS-compatible question pool zip archives. Supports single/multiple choice and gap-fill question types, plus automated quiz combination generation.

This package is based on Kaffeedrache/Tiqi.

Features

  • Multiple question types: Single choice, multiple choice, and gap-fill questions
  • QTI 1.2 compliant: Generates ILIAS-compatible XML format
  • Python API: Use programmatically in your Python code
  • CLI tool: Convert files from the command line
  • Template generator: Create question file templates with examples
  • Quiz combinations: Generate multiple pools and find optimal combinations to reach target point totals

Installation

pip

pip install iliasqc

conda / mamba (conda-forge)

conda install -c conda-forge iliasqc
# or
mamba install -c conda-forge iliasqc

Question File Format

Questions are defined in .txt files with special syntax:

# TITLE: My Question Pool
# DESCRIPTION: A collection of questions

[t][s] Single Choice Question @1
Question text goes here.
_ Correct answer
- Incorrect answer
- Another wrong answer

[t][m] Multiple Choice Question @2
Which options are correct?
- Wrong answer
_ Correct answer 1
_ Correct answer 2
- Wrong again

[t][g] Gap-Fill Question @1
The capital of France is [gap]Paris[/gap].
The capital of Germany is [gap]Berlin[/gap].

Syntax Reference

Marker Description
[t] Question start marker (required)
[s] Single choice question
[m] Multiple choice question
[g] Gap-fill question
_ Correct answer (for MC questions)
- Incorrect answer (for MC questions)
[gap]...[/gap] Gap to fill
@N Points for the question (e.g., @2)
# TITLE: Pool title metadata
# DESCRIPTION: Pool description metadata

Usage

Command Line

Convert a question file to ILIAS zip archive:

iliasqc convert questions.txt

Specify custom output path:

iliasqc convert questions.txt -o my_pool.zip

Override title and description:

iliasqc convert questions.txt -t "My Pool" --description "My description"

Filter questions by point value:

iliasqc convert questions.txt -p 2

Quiz Combinations

Generate multiple pools (one per point value) and find combinations to reach a target:

iliasqc combine questions.txt -t 20

This will:

  1. Create separate zip files for each point value found in your questions
  2. Find all valid combinations that sum to 20 points
  3. Display a table showing the combinations ranked by balance
  4. Export a CSV file with the combinations

Options:

  • -t, --target: Target total points (required)
  • -o, --output: Output directory (default: same as input file)
  • -c, --combinations: Maximum number of combinations to show (default: 10)
  • --csv-only: Only output CSV, skip the table display

Example output:

Quiz Combinations for 20.0 Points
======================================================================

Available Pools:
  - My Pool (5 points): 8 questions
  - My Pool (4 points): 12 questions
  - My Pool (2 points): 15 questions

──────────────────────────────────────────────────────────────────────
Rank  Questions  Balance  Combination
──────────────────────────────────────────────────────────────────────

1     5          ●●●●     2x My Pool (5 points) + 5x My Pool (2 points)
2     4          ●●●○     5x My Pool (4 points)
3     6          ●●●○     3x My Pool (4 points) + 5x My Pool (2 points)
──────────────────────────────────────────────────────────────────────

Tip: Lower balance score = more diverse quiz

Generated 3 pools:
  - My Pool_2pt_pool.zip: 15 questions
  - My Pool_4pt_pool.zip: 12 questions
  - My Pool_5pt_pool.zip: 8 questions

Export as QTI XML (without creating zip archive):

iliasqc qti questions.txt -o output.xml

Generate a question template file:

iliasqc template -o my_template.txt

Generate template without examples:

iliasqc template -o basic_template.txt --no-examples

Python API

from iliasqc import txt_to_zip, txt_to_qti, generate_template

# Convert to ILIAS zip archive
output_path = txt_to_zip("questions.txt")
print(f"Created: {output_path}")

# Convert to QTI XML only
xml_path = txt_to_qti("questions.txt", "output.xml")
print(f"Created: {xml_path}")

# Generate a template
template_path = generate_template("my_template.txt")
print(f"Created template: {template_path}")

Quiz Combination API

from iliasqc import (
    generate_quiz_combinations,
    generate_pools_by_points,
    find_combinations,
    format_combinations_table,
    export_combinations_csv,
)

# Generate pools and find combinations (full pipeline)
pools, combinations = generate_quiz_combinations(
    "questions.txt",
    target_points=20,
    output_dir=".",
)

# Or use individual functions
pools = generate_pools_by_points("questions.txt")
combinations = find_combinations(pools, target_points=20)

# Format as a text table
table = format_combinations_table(combinations, pools, target_points=20)
print(table)

# Export to CSV
csv_path = export_combinations_csv(".", combinations, target_points=20)

Development

git clone https://github.com/famosab/iliasqc.git
cd iliasqc
pip install -e ".[dev]"

Running Tests

Run all tests:

pytest tests/

Run with coverage:

pytest tests/ --cov=iliasqc --cov-report=term-missing

Code Quality

Run linting checks:

ruff check src/ tests/
ruff format --check src/ tests/

Fix linting issues automatically:

ruff check --fix src/ tests/
ruff format src/ tests/

Continuous Integration

The project uses GitHub Actions for automated testing. The CI pipeline runs on every push and pull request, testing against Python 3.12, 3.13, and 3.14.

License

MIT – see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

iliasqc-0.1.0.tar.gz (24.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

iliasqc-0.1.0-py3-none-any.whl (20.6 kB view details)

Uploaded Python 3

File details

Details for the file iliasqc-0.1.0.tar.gz.

File metadata

  • Download URL: iliasqc-0.1.0.tar.gz
  • Upload date:
  • Size: 24.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for iliasqc-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6d7541db40c22d0ac7371f7af9989d0257068be9d94ecd8f3067d6b02ba45323
MD5 db95777e528863b648e8cbef3a2af2a4
BLAKE2b-256 8eb3133e199a00a9d47bf452546edd84550e57b3d98dd6ba373361321a676748

See more details on using hashes here.

Provenance

The following attestation bundles were made for iliasqc-0.1.0.tar.gz:

Publisher: release-please.yml on famosab/iliasqc

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file iliasqc-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: iliasqc-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for iliasqc-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1b4788e5c73dff7da46b001788bced55e1523de6d50135cfd8243f34466a1b4e
MD5 b1041938d000d8086d7308459370d462
BLAKE2b-256 6f99e9d9726260eabda8dfacb01f6f48c1f0a359d064e30d4823e1633eeaae1d

See more details on using hashes here.

Provenance

The following attestation bundles were made for iliasqc-0.1.0-py3-none-any.whl:

Publisher: release-please.yml on famosab/iliasqc

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page