
Research
Using Trusted Protocols Against You: Gmail as a C2 Mechanism
Socket uncovers malicious packages on PyPI using Gmail's SMTP protocol for command and control (C2) to exfiltrate data and execute commands.
A package to create, manage, and convert QTI packages for quizzes and assessments in Canvas, Blackboard, Moodle, and LibreTexts ADAPT.
qti_package_maker
is a Python package designed for generating and converting question and test packages in various formats, including IMS QTI (Question & Test Interoperability) v1.2 and v2.1, Blackboard Question Upload format, human-readable text, and HTML self-test formats.
This package is developed for educators, instructional designers, and e-learning professionals working with LMS platforms such as LibreTexts' ADAPT, Canvas, and Blackboard. It provides a unified interface to create and manage assessments that can be imported into these learning management systems.
The package allows users to:
This tool is primarily intended for educators and developers who need to convert, migrate, and generate structured assessments across different learning platforms.
pip
installedpip install qti-package-maker
git clone https://github.com/vosslab/qti_package_maker.git
cd qti_package_maker
pip install -r requirements.txt
QTI Package Maker supports seven essential question types commonly used in assessments. These include Multiple Choice (MC), Multiple Answer (MA), Matching (MATCH), Numerical Entry (NUM), Fill-in-the-Blank (FIB), Multi-Part Fill-in-the-Blank (MULTI_FIB), and Ordered Lists (ORDER). Below is an overview of each type and its required inputs.
Inputs:
question_text
(str): The question prompt.choices_list
(list): A list of answer choices.answer_text
(str): The correct answer.Inputs:
question_text
(str)choices_list
(list)answers_list
(list): A list of correct answers.Inputs:
question_text
(str)prompts_list
(list): Items to be matched.choices_list
(list): Possible matching answers.Inputs:
question_text
(str)answer_float
(float): The correct numerical answer.tolerance_float
(float): Accepted tolerance range.tolerance_message
(bool, default=True): Message for tolerance handling.Inputs:
question_text
(str)answers_list
(list): List of acceptable answers.Inputs:
question_text
(str)answer_map
(dict): A dictionary mapping blank positions to correct answers.Inputs:
question_text
(str)ordered_answers_list
(list): The correct sequence of answers.The package supports multiple output formats via engines. Each engine corresponds to a specific QTI version or alternative export format.
canvas_qti_v1_2
blackboard_qti_v2_1
human_readable
bbq_text_upload
.txt
file that Blackboard can directly uploadhtml_selftest
Engine Name | Can Read | Can Write |
---|---|---|
bbq_text_upload | ✅ | ✅ |
blackboard_qti_v2_1 | ❌ | ✅ |
canvas_qti_v1_2 | ❌ | ✅ |
html_selftest | ❌ | ✅ |
human_readable | ❌ | ✅ |
text2qti | ✅ | ✅ |
Item Type | bbq text upload | blackboard qti v2.1 | canvas qti v1.2 | html selftest | human readable | text2qti |
---|---|---|---|---|---|---|
FIB | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ |
MA | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MATCH | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
MC | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MULTI_FIB | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ |
NUM | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ |
ORDER | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ |
The Blackboard Question Upload (BBQ) text format is currently the only supported input format for qti_package_maker
. This format allows users to write questions in a plain text file and upload them into tests, surveys, and question pools on Blackboard. Once uploaded, the questions can be edited and used like those created directly within the LMS.
Question Type | Format |
---|---|
Multiple Choice (MC) | MC TAB question text TAB answer text TAB correct|incorrect TAB answer two text TAB correct|incorrect |
Multiple Answer (MA) | MA TAB question text TAB answer text TAB correct|incorrect TAB answer two text TAB correct|incorrect |
Ordering (ORD) | ORD TAB question text TAB answer text TAB answer two text |
Matching (MAT) | MAT TAB question text TAB answer text TAB matching text TAB answer two text TAB matching two text |
Fill in the Blank (FIB) | FIB TAB question text TAB answer text TAB answer two text |
Fill in Multiple Blanks (FIB_PLUS) | FIB_PLUS TAB question text TAB variable1 TAB answer1 TAB answer2 TAB TAB variable2 TAB answer3 |
Numeric Response (NUM) | NUM TAB question text TAB answer TAB [optional]tolerance |
For more details, refer to the official Blackboard documentation.
The bbq_converter.py
tool allows converting BBQ text files into multiple output formats. Example usage:
python3 tools/bbq_converter.py -i bbq-my_questions.txt -f qti12
To convert into all available formats:
python3 tools/bbq_converter.py -i bbq-my_questions.txt --all
For available options, use:
python3 tools/bbq_converter.py -h
usage: bbq_converter.py [-h] -i INPUT_FILE [-n QUESTION_LIMIT] [--allow-mixed]
[-f {canvas_qti_v1_2,blackboard_qti_v2_1,human_readable,bbq_text_upload,html_selftest}] [-a]
[-1 [OUTPUT_FORMAT]] [-2 [OUTPUT_FORMAT]] [-r [OUTPUT_FORMAT]] [-b [OUTPUT_FORMAT]] [-s [OUTPUT_FORMAT]]
Convert BBQ file to other formats.
options:
-h, --help show this help message and exit
-i INPUT_FILE, --input INPUT_FILE, --input_file INPUT_FILE
Path to the input BBQ text file.
-n QUESTION_LIMIT, --limit QUESTION_LIMIT, --question_limit QUESTION_LIMIT
Limit the number of input items.
--allow-mixed Allow mixed question types.
-f {canvas_qti_v1_2,blackboard_qti_v2_1,human_readable,bbq_text_upload,html_selftest}, --format {canvas_qti_v1_2,blackboard_qti_v2_1,human_readable,bbq_text_upload,html_selftest}
Set output format (multiple allowed).
-a, --all Enable all output formats.
-1 [OUTPUT_FORMAT], --qti12 [OUTPUT_FORMAT]
Set output format to Canvas QTI v1.2.
-2 [OUTPUT_FORMAT], --qti21 [OUTPUT_FORMAT]
Set output format to Blackboard QTI v2.1.
-r [OUTPUT_FORMAT], --human [OUTPUT_FORMAT]
Set output format to human-readable text.
-b [OUTPUT_FORMAT], --bbq [OUTPUT_FORMAT]
Set output format to Blackboard Question Upload format.
-s [OUTPUT_FORMAT], --html [OUTPUT_FORMAT]
Set output format to HTML self-test.
from qti_package_maker.package_interface import QTIPackageInterface
# Initialize the package with a name
qti_packer = QTIPackageInterface("example_assessment", verbose=True)
# Add a multiple-choice question
qti_packer.add_item("MC", ("What is your favorite color?", ["blue", "red", "yellow"], "blue"))
# Add a multiple-answer question
qti_packer.add_item("MA", ("Which of these are fruits?", ["apple", "carrot", "banana", "broccoli"], ["apple", "banana"]))
# Save as Canvas QTI v1.2
qti_packer.save_package("canvas_qti_v1_2")
# Save as Blackboard QTI v2.1
qti_packer.save_package("blackboard_qti_v2_1")
This will create a Blackboard-compatible QTI v2.1 ZIP file.
Contributions are welcome! Follow these steps to contribute:
git clone https://github.com/YOUR_USERNAME/qti_package_maker.git
cd qti_package_maker
feature-my-update
):
git checkout -b feature-my-update
git add .
git commit -m "Describe your changes here"
git push origin feature-my-update
Moodle Question Format: Canvas
A Moodle plugin that imports questions exported from the Canvas LMS as an XML file into Moodle.
GitHub: https://github.com/jmvedrine/moodle-qformat_canvas
text2qti
A Python tool that converts Markdown-based plain text files into quizzes in QTI format, compatible with Canvas and other educational software.
PyPI: https://pypi.org/project/text2qti/
Blackboard Test Question Generator
An online tool that assists in creating test questions for Blackboard by converting plain text into a format suitable for import.
Website: https://ed.oc.edu/blackboardquizgenerator/
amc2moodle
A Python package that facilitates the conversion of AMC (Auto Multiple Choice) formatted questions into Moodle XML format for easy import.
PyPI: https://pypi.org/project/amc2moodle/
moodle-questions
A Python library designed for manipulating questions in Moodle XML format, enabling programmatic creation and modification of Moodle quizzes.
GitHub: https://github.com/gethvi/moodle-questions
pyAssignment
A Python module for authoring and assessing homework assignments, with capabilities to output assignments to LaTeX and Blackboard quiz formats.
PyPI: https://pypi.org/project/pyassignment/
Copyright © 2025, Dr. Neil Voss
qti_package_maker is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
qti_package_maker is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
See the full license details in the LICENSE file. If not, see http://www.gnu.org/licenses/.
FAQs
A package to create, manage, and convert QTI packages for quizzes and assessments in Canvas, Blackboard, Moodle, and LibreTexts ADAPT.
We found that qti-package-maker demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Socket uncovers malicious packages on PyPI using Gmail's SMTP protocol for command and control (C2) to exfiltrate data and execute commands.
Product
We redesigned Socket's first logged-in page to display rich and insightful visualizations about your repositories protected against supply chain threats.
Product
Automatically fix and test dependency updates with socket fix—a new CLI tool that turns CVE alerts into safe, automated upgrades.