_ _ _ _
(_) (_|_) (_)
_ _ _ ___ ____ _ ____ _____
| | | | |/ _ \ / ___) | _ \(____ |
\ \ / /| | |_| | | | | | | / ___ |
\___/ |_|\___/|_| |_|_| |_\_____|
Light-weight minimal API Fuzzer in Python
Viorina is a minimalist, lightweight API-fuzzing tool.
Describe your payload once—Viorina generates compliant, random test data for you.
It stays tiny
- Declarative schemas – Register any model with
@Viorina.payload(FastAPI-style, zero boiler-plate). - Descriptor magic – Python’s descriptor protocol auto-wires parent/child fields, so you don’t have to.
- Accurate text fuzzing – Uses the Rust crate
regex-generateto create strings that match your exact pattern.
Examples
Use @app.payload to register
- Describe your payload structure and call
Viorina.build_dict()at the end
import viorina # For `app = viorina.Viorina()`
from viorina import Auto # For describing schema
app = viorina.Viorina()
# Use `app.payload` to register
@app.payload
class Root: # ... its child node `BranchA` not defined yet ...
BranchA = Auto() # => {"Root": { "BranchA": { ... } } }
Name = "Anji" # => {"Root": { "Name": "Anji", "BranchA": { ... } } }
@app.payload
class BranchA: # ... the node `BranchA` defined later ...
Age = 233 # => { "BranchA": { "Age": 233 } }
p = app.build_dict() # ... build payload
#
# {'Root':
# {'Name': 'Anji',
# 'BranchA': {'Age': 233}
# }
# }
Use descriptors to generate random data for fuzz testing
- Use
Text,Integer,Autodescriptors to generate random mock values
from viorina import Text, Integer, Auto, Viorina
app = Viorina()
@app.payload
class Root:
SomeNode = Auto()
RandomValue = Integer(min_value=233, max_value=235)
@app.payload
class SomeNode:
RandomName = Text(regex=r'[AEIOU][aeiou][rnmlv][aeiou]{2}')
ChildNode = Auto()
RandomValue = Integer(min_value=0, max_value=9)
@app.payload
class ChildNode:
ConstValue: int = 233
if __name__ == "__main__":
import pprint
for _ in range(3):
pprint.pp(app.build_dict())
# Output:
# {'Root': {'RandomValue': 235,
# 'SomeNode': {'RandomName': 'Eolee',
# 'RandomValue': 5,
# 'ChildNode': {'ConstValue': 233}}}}
# {'Root': {'RandomValue': 235,
# 'SomeNode': {'RandomName': 'Aarei',
# 'RandomValue': 7,
# 'ChildNode': {'ConstValue': 233}}}}
# {'Root': {'RandomValue': 234,
# 'SomeNode': {'RandomName': 'Uovai',
# 'RandomValue': 1,
# 'ChildNode': {'ConstValue': 233}}}}
Metadata
Release files for viorina 2025.7.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| viorina-2025.7.8.tar.gz | 8.7 kB | Without provenance | Details for viorina-2025.7.8.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| viorina-2025.7.8-py3-none-any.whl | Python 3 | none | any | Details for viorina-2025.7.8-py3-none-any.whl |
Total release size: 17.6 kB
Release files / viorina-2025.7.8.tar.gz
| Download URL | viorina-2025.7.8.tar.gz |
|---|---|
| Size | 8.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
230ff6ba4e5c1c95c3ce64174f0a17ec2db9a9164272e6c763bbec5bd334e596
|
|
BLAKE2b-256 checksum How to use checksums |
3d2fcf2978f11dacca69c7fa30f2c0ab4a84a9f2a893d20c35485e5e0d4cc5a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Release files / viorina-2025.7.8-py3-none-any.whl
| Download URL | viorina-2025.7.8-py3-none-any.whl |
|---|---|
| Size | 9.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
287032ec512e0823a937165c435b709a8df41984c3b47cce5df70c4f84fe2e01
|
|
BLAKE2b-256 checksum How to use checksums |
470993fbfb33d12987e43baa5007b4d1ec4fe58ad2ad6daaaec2de56b1c2eea6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Security for viorina 2025.7.8
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.