A test-authoring, test-running, and test-sharing CLI for university programming assignments.
Project description
Morvix
A test-authoring, test-running, and test-sharing CLI for university programming assignments.
Most courses don't hand out test suites, so students end up writing their own: they build test cases from their own solution, run their program against them, and share the cases on GitHub so classmates can check their code too. Morvix automates that whole loop - building, running, and sharing these self-made test harnesses - quickly and consistently, across languages and platforms.
It's an honest tool. The "expected answers" come from one student's own solution, so passing every test does not prove a solution is correct - it proves it agrees with that one reference on the cases tried. Morvix says so plainly (it's baked into every package's README) and makes the real signal - lots of independent solutions agreeing - easy to see.
Morvix is not an online judge, not a grading server, and not an AI tool. It runs locally and offline. Linux and macOS are the primary targets; Windows works on a best-effort basis.
Install
pip install morvix # or, from a clone:
pip install .
Needs Python 3.9+. The only dependencies are prompt_toolkit and rich. The runner that ships
inside shared packages is pure standard library, so whoever you share with needs nothing but
Python 3.
Quick start (the Author)
Run morvix with no arguments to open the interactive shell (live autocomplete, history, a status
bar), or use any command one-shot from your normal shell. What you can do one way is identical the
other way.
cd my-assignment
morvix init # create a project here (guided)
morvix config cpp # how to build/run your language
morvix import solution.cpp # the solution under test
morvix reference solution.cpp # it also defines the expected answers
morvix gen --random --count 100 # generate inputs from the built-in shapes
morvix gen --expected # compute answers by running the reference
morvix run --all # build, run, judge - with a live table
morvix runner new full # a named, shareable run profile
morvix package --zip # bundle it up to share (your source is left out)
Quick start (the Receiver)
You got a package from a classmate. You don't need Morvix at all:
unzip their-tests.zip && cd their-tests
./run.sh my_solution.cpp # builds your code, runs every test, reports
If you do have Morvix, open it in the unpacked directory and you get the rich view - browse the tests, re-run selectively, and diff your per-case results against the author's.
What's in the box
- Languages: C, C++, NASM, Python, Java, Rust - each a small adapter. Adding one is one file.
- Execution models:
stdio,library(link & assert),args,file,interactive. - Comparison: byte-exact, whitespace-insensitive, float-tolerant, hash, a custom checker, and expected exit status / crash - combinable per case.
- Limits & checks: wall/CPU time, peak memory (approximate), hard memory caps, output caps, and an optional valgrind memory-correctness pass.
- Generation: a built-in random-shape library, custom generators, stress testing against a brute force, and crash-case candidates.
- Sharing: zip / tar / tar.gz / tar.xz packages with an auto-generated README and a manifest.
- Workflows: record a sequence of commands and replay it on the next assignment.
These three axes - language, execution model, comparison - are kept independent, so they never multiply against each other. That's the design decision everything else hangs on.
Design
The full design is in documentation.md: the architecture, every command, the file formats, and the reasoning behind each choice.
License
MIT (c) Krzysztof Adamczyk
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file morvix-0.1.0.tar.gz.
File metadata
- Download URL: morvix-0.1.0.tar.gz
- Upload date:
- Size: 152.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4418b079cfed7dc49839aafd98fef9d5143bc4378ba3a49e75d00b2be8c70ef9
|
|
| MD5 |
75c49ceb8d8dfa1068498ef6393fb700
|
|
| BLAKE2b-256 |
6f3c93b57bf4d826d3f369a6bfe5dd4bac5676a9f14e26d5ace2e6574c3e3e02
|
Provenance
The following attestation bundles were made for morvix-0.1.0.tar.gz:
Publisher:
publish.yml on Krzysztof-Ad/morvix
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
morvix-0.1.0.tar.gz -
Subject digest:
4418b079cfed7dc49839aafd98fef9d5143bc4378ba3a49e75d00b2be8c70ef9 - Sigstore transparency entry: 1722366321
- Sigstore integration time:
-
Permalink:
Krzysztof-Ad/morvix@d1765b94fb2aab957b59dffe45becb2aad3b6e7a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Krzysztof-Ad
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d1765b94fb2aab957b59dffe45becb2aad3b6e7a -
Trigger Event:
release
-
Statement type:
File details
Details for the file morvix-0.1.0-py3-none-any.whl.
File metadata
- Download URL: morvix-0.1.0-py3-none-any.whl
- Upload date:
- Size: 124.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d13117ebd796093b633401e6f5684fd7d4a210529f7ebcf6b3089815dd8e571
|
|
| MD5 |
cdf1711d524b93e4d8fdc2d38e36a3ce
|
|
| BLAKE2b-256 |
ad0485b9b851748824db70a2cbf6f00271c619992efa5fe4a27fb37f9bec1d05
|
Provenance
The following attestation bundles were made for morvix-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Krzysztof-Ad/morvix
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
morvix-0.1.0-py3-none-any.whl -
Subject digest:
9d13117ebd796093b633401e6f5684fd7d4a210529f7ebcf6b3089815dd8e571 - Sigstore transparency entry: 1722366440
- Sigstore integration time:
-
Permalink:
Krzysztof-Ad/morvix@d1765b94fb2aab957b59dffe45becb2aad3b6e7a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Krzysztof-Ad
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d1765b94fb2aab957b59dffe45becb2aad3b6e7a -
Trigger Event:
release
-
Statement type: