Skip to main content
  _     _ _             _             
(_)   (_|_)           (_)            
 _     _ _  ___   ____ _ ____  _____ 
| |   | | |/ _ \ / ___) |  _ \(____ |
 \ \ / /| | |_| | |   | | | | / ___ |
  \___/ |_|\___/|_|   |_|_| |_\_____|
                                     
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-generate to 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, Auto descriptors 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)

Source distribution for viorina 2025.7.8
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)

Table of built distributions (wheels) for viorina 2025.7.8
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

2025.7.8 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page