A validations framework for doing quality control in studios.

Related tags

Command-line checks
Overview

Untitled Checks Framework

Overview

This framework is designed to provide a system to write checks for studio work. This includes validating assets (rigs, geometry, surfacing, etc), shots (animation, lighting, simulation, etc), and whatever a studio would need to validate. It provides a simple API with a rich result type that provides all the information to let a user know why a check failed and what they need to do to fix it. It also supports fixing issues if the issue can be fixed by the computer.

Features

  • A Rust, C, and Python 3 API
  • Automatically fixing issues
  • Marking checks with whether they are skippable or not.
  • Exposing the result of checks in a user interface.

Requirements

  • Rust: 1.66 or later (This is not the guaranteed minimum supported Rust version)

Install

cd /to/your/project
cargo add --git https://github.com/scott-wilson/checks.git

Design

Status

The status is a machine readable part of the result.

  • Pending: The check has not been run yet. This is a useful status in user interfaces to let users know that the checks are ready to be run.
  • Skipped: The check has been skipped due to previous checks that this one depends on failing.
  • Passed: The test has passed.
  • Warning: The test has found things that might be an issue. However, this can still be treated the same as Passed.
  • Failed: The test has found an issue with the object. This can be treated as Passed if the result allows skipping this test.
  • SystemError: An issue with the test has happened. Either functionality it depends on has an error, or there is an issue with the test or test runner. Assume that the result of the test is invalid, and never allow the test to pass.

Item

The item is a wrapper around the cause of a result. For example, if an asset must be named a certain way, and an object under the asset is named wrong, then the result can return the offending object as an item. The item wrapper is only important for user interfaces, because it forces all types to be sortable and displayable. For example, a file object may not have any knowledge of the file path that created the file object, but the item wrapper could be extended to include the file path with the file object. The item also includes a hint that can tell a user interface what the type represents. For example, if the type of data in an item is a string, but the string represents a scene path, then the user interface could select the scene objects when the items are selected in the check UI.

Result

The result type contains information about what is the status of the check, a human readable description of the result, the items that caused the result, whether the result is fixable or skippable, error information for SystemErrors and timing information for the check and auto-fix.

Check

A check is a unit of validation. For example, a check could be validating that the asset is named correctly, textures exist, all parameters are set to their defaults, etc. It is recommended that a check will only check one thing at a time. For example, if an asset needs to be named correctly, the textures need to exist, and the parameters are all defaults, then these should be three separate checks. However, there might be checks that will all have to do the same work in order to do their work. For example, if there are checks to make sure that textures are the correct resolution, and other checks to make sure the textures are the right types (8 bit intergers, 32 bit floats, etc), then both set of checks would need to open the files, and therefore validate that the files exist. The solution to this issue is left up to the team implementing the checks.

Runner

Check Runner

The runner takes a check and produces the result. It is also responsible for making sure the check is in a valid state (returning a system error if it is not), and producing timing information about the check for diagnostics.

Auto-Fix Runner

The auto-fix runner is similar to the check runner, but it will run the auto-fix method for the check. The auto-fix runner should be run after the check runner, and only if the check runner's result says that the result supports fixing. After it has attempted fixing the issue, it will run the check again and return a result to validate that the fix actually fixed the issue or not.

Wishlist

  • A unique name for the package Issue
  • To have the Python package named the same as the Rust package. (Currently, the Python package is called pycheck.) Issue
  • A C++ API (using the C API as a base) Issue
  • A scheduler to manage running the checks and returning results. This could also include having checks depend on other checks. Issue
  • Test discovery for situations where a context is given (a character rig for project XYZ or animating the shot ABC_010), and a list of checks are produced, ready to be ran. Issue
  • A Qt GUI Issue
  • Blender integration Issue
  • Gaffer integration Issue
  • Natron integration Issue
  • Houdini integration Issue
  • Katana integration Issue
  • Maya integration Issue
  • Nuke integration Issue
Comments
  • Bump bindings/c/corrosion from `e3d8d20` to `aac8772`

    Bump bindings/c/corrosion from `e3d8d20` to `aac8772`

    Bumps bindings/c/corrosion from e3d8d20 to aac8772.

    Commits
    • aac8772 Fix PROFILE documentation
    • 430b3cf Fix generator debug message
    • 204927a Output Error if IMPORTED_CRATES is selected with CORROSION_NATIVE_TOOLING
    • 44749a9 Add parameter to corrosion_import_crate to return list of added targets (#312)
    • 34473df Allow overriding the cargo profile per target
    • 7940cab tests: Add option to pass through arguments
    • See full diff in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    meta dependencies 
    opened by dependabot[bot] 0
  • Bump hypothesis from 6.61.0 to 6.65.1 in /bindings/python

    Bump hypothesis from 6.61.0 to 6.65.1 in /bindings/python

    Bumps hypothesis from 6.61.0 to 6.65.1.

    Release notes

    Sourced from hypothesis's releases.

    Hypothesis for Python - version 6.65.1

    This release improves the pretty-printing of enums in falsifying examples, so that they print as their full identifier rather than their repr.

    The canonical version of these notes (with links) is on readthedocs.

    Hypothesis for Python - version 6.65.0

    Hypothesis now reports some failing inputs by showing the call which constructed an object, rather than the repr of the object. This can be helpful when the default repr does not include all relevant details, and will unlock further improvements in a future version.

    For now, we capture calls made via "builds()", and via SearchStrategy.map().

    The canonical version of these notes (with links) is on readthedocs.

    Hypothesis for Python - version 6.64.0

    The Ghostwritter will now include type annotations on tests for type- annotated code. If you want to force this to happen (or not happen), pass a boolean to the new "annotate=" argument to the Python functions, or the "--[no-]annotate" CLI flag.

    Thanks to Nicolas Ganz for this new feature!

    The canonical version of these notes (with links) is on readthedocs.

    Hypothesis for Python - version 6.63.0

    "range_indexes()" now accepts a "name=" argument, to generate named "pandas.RangeIndex" objects.

    Thanks to Sam Watts for this new feature!

    The canonical version of these notes (with links) is on readthedocs.

    Hypothesis for Python - version 6.62.1

    This patch tweaks "xps.arrays()" internals to improve PyTorch compatibility. Specifically, "torch.full()" does not accept integers as the shape argument (n.b. technically "size" in torch), but such behaviour is expected in internal code, so we copy the "torch" module and patch in a working "full()" function.

    The canonical version of these notes (with links) is on readthedocs.

    Hypothesis for Python - version 6.62.0

    A classic error when testing is to write a test function that can never fail, even on inputs that aren't allowed or manually provided. By analogy to the design pattern of:

    ... (truncated)

    Commits
    • caf1775 Bump hypothesis-python version to 6.65.1 and update changelog
    • 519ad35 Merge pull request #3561 from HypothesisWorks/DRMacIver/pretty-print-enums
    • b2f7e6d Add missing release file
    • 77b0bbb Define a pretty printer for enums
    • 39e3fba Bump hypothesis-python version to 6.65.0 and update changelog
    • 6191745 De-flake test
    • c56d069 Merge pull request #3540 from Zac-HD/creation-reprs
    • 406eb02 Bump hypothesis-python version to 6.64.0 and update changelog
    • 3f545a6 Merge pull request #3548 from ThunderKey/feature/add-annotations-to-ghostwriter
    • ae85e0e Merge pull request #3553 from HypothesisWorks/create-pull-request/patch
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump pytest from 7.2.0 to 7.2.1 in /bindings/python

    Bump pytest from 7.2.0 to 7.2.1 in /bindings/python

    Bumps pytest from 7.2.0 to 7.2.1.

    Release notes

    Sourced from pytest's releases.

    7.2.1

    pytest 7.2.1 (2023-01-13)

    Bug Fixes

    • #10452: Fix 'importlib.abc.TraversableResources' deprecation warning in Python 3.12.
    • #10457: If a test is skipped from inside a fixture, the test summary now shows the test location instead of the fixture location.
    • #10506: Fix bug where sometimes pytest would use the file system root directory as rootdir <rootdir>{.interpreted-text role="ref"} on Windows.
    • #10607: Fix a race condition when creating junitxml reports, which could occur when multiple instances of pytest execute in parallel.
    • #10641: Fix a race condition when creating or updating the stepwise plugin's cache, which could occur when multiple xdist worker nodes try to simultaneously update the stepwise plugin's cache.
    Commits
    • 1ae778f Prepare release version 7.2.1
    • cb07711 Merge pull request #10656 from pytest-dev/backport-10641-to-7.2.x
    • 9440702 Merge pull request #10657 from pytest-dev/backport-10640-to-7.2.x
    • e8055c1 [7.2.x] Fix regen tox environment
    • f22fbbf [7.2.x] Dont update cache from xdist worker
    • 211d08e Merge pull request #10638 from pytest-dev/backport-10607-to-7.2.x
    • a6f85a0 [7.2.x] Mitigate directory creation race condition
    • 08d0dd0 Merge pull request #10637 from pytest-dev/backport-10632-to-7.2.x
    • 405fd15 [7.2.x] Fix tests pygments 2.14.0
    • c16315f Merge pull request #10586 from nicoddemus/backport-10578
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Improve project security

    Improve project security

    • [ ] Set up security policy
    • [ ] Enable vulnerability reporting
    • [ ] Set up code scanning on GitHub
    • [ ] Set up secret scanning alerts
    • [ ] Have security db scanner CI jobs run on a daily or weekly basis (for example, cargo-audit)
    meta 
    opened by scott-wilson 0
  • Update the status enum to not treat skipped checks as passed.

    Update the status enum to not treat skipped checks as passed.

    Things to update:

    • [ ] Rust: Remove the Status::Skipped from the Status.has_passed method.
    • [ ] Rust: Update docs.
    • [ ] Rust: Update tests
    • [ ] C: Update tests.
    • [ ] Python: Update tests.
    good first issue lang-rust lang-python lang-c lang-cpp 
    opened by scott-wilson 0
  • Open Standard for Check Results

    Open Standard for Check Results

    One thing that might be interesting would be a standard format for defining result data from checks.

    For example, let's say we have a check that returns if a + b == c. The result type would output the following data (if exported to json).

    {
        "check": "APlusBEqualsCCheck",
        "status": "passed",
        "message": "A + B == C",
        "items": [
            {
                "value": [1, 2, 3],
                "type_hint": "a_b_c",
            }
        ],
        "check_duration": 123.456,
        "fix_duration": 0.0,
        "can_fix": false,
        "can_skip": false
    }
    

    A use case for this would be if checks ran on the farm, and outputted the Json data to a database for a web dashboard for production to review.

    This is similar to the JUnit XML format, but that format does not contain the rich amount of data that the checks framework supports, so could be insufficient. It would be a good idea to see what's already out there and see if it would be better to use a format that already exists, or create a new one.

    Lastly, there's still some open questions for the design:

    • Should the format be for just the results, or results, checks, checks relationships (due to the scheduler), input data, etc?
    • Json, XML, etc? Json is a strong candidate, since it is used everywhere. We would probably want to use a standard for the schema (for example, jsonschema).
    meta 
    opened by scott-wilson 0
  • Add support for Async in bindings

    Add support for Async in bindings

    The Rust library supports Async, but the bindings currently don't. If possible, we should add async support for...

    • [x] Python
    • [ ] C (what library is recommended for async?)
    • [ ] C++ (what library is recommended for async?)
    lang-python lang-c lang-cpp 
    opened by scott-wilson 0
  • Find the minimum supported Rust version

    Find the minimum supported Rust version

    It is generally a good idea to note what is the version of Rust that is supported by the project. We could either say "the current compiler is now the minimum (1.66 as of writing), and go from there", "the current is always the minimum supported", or go through the different versions to find out where the tests and compiling breaks, then call the version after that the latest supported version.

    meta lang-rust 
    opened by scott-wilson 0
  • Adhere to the VFX Reference Platform

    Adhere to the VFX Reference Platform

    We're planning on having the package used in studios, so we should make sure that we follow the VFX reference platform.

    TODO:

    • [ ] Figure out what years we want to support for each release. For example, Latest year + 4?
    • [ ] Add tests to guarantee the minimum supported year.
    ci meta 
    opened by scott-wilson 0
Owner
Scott Wilson
Scott Wilson
Bracket QOS - a Quality of Service/Experience server system writtin in Rust. Derived from the excellent LibreQOS Project.

Bracket QOS - Open Source Edition This project is based on the excellent LibreQOS project. It is hoped that this can be useful for the upstream projec

Herbert 12 Dec 2, 2022
Enhance low quality images and videos using AI technology.

Real ESRGAN GUI Real ESRGAN GUI is a simple and minimal GUI for xinntao's Real-ESRGAN This allows you to enhance low quality images and videos using A

null 20 Dec 21, 2022
Tight Model format is a lossy 3D model format focused on reducing file size as much as posible without decreasing visual quality of the viewed model or read speeds.

What is Tight Model Format The main goal of the tmf project is to provide a way to save 3D game assets compressed in such a way, that there are no not

null 59 Mar 6, 2023
turbocommit is a Rust-based CLI tool that generates high-quality git commit messages in accordance with the Conventional Commits specification, using OpenAI's

turbocommit is a Rust-based CLI tool that generates high-quality git commit messages in accordance with the Conventional Commits specification, using OpenAI's `gpt-3.5-turbo` language model. It is easy to use and a cost-effective way to keep git commit history at a higher quality, helping developers stay on track with their work.

Sett 16 Mar 26, 2023
A quality of life package for Anchor.

anchor-cereal A quality of life package for Anchor made to support the Solana ecosystem. Currently, it allows you to serialize a struct containing an

✨ amelia chen ✨ 24 Feb 9, 2023
A command and control framework written in rust.

Tempest Tempest is a command and control framework written in 100% Rust. blog post: https://teach2breach.io/tempest-intro/ slides: https://teach2breac

Kirk Trychel 275 Oct 23, 2024
A simple program that provides DBus interface to control display temperature and brightness under wayland without flickering

wl-gammarelay-rs Like wl-gammarelay, but written in rust, runs on a single thread, has three times less SLOC and uses DBus (for simplicity). Dbus inte

Max Verevkin 33 Nov 23, 2022
A simple tui to view & control docker containers

oxker A simple tui to view & control docker containers Built in Rust, making heavy use of tui-rs & Bollard Download & install See releases download &

Jack Wills 119 Dec 28, 2022
A tool to control the fan speed by monitoring the temperature of CPU via IPMI.

ipmi-fan-control A tool to control the fan speed by monitoring the temperature of CPU via IPMI. Why Our Dell R730 server's iDRAC is not works as expec

yinheli 9 Dec 29, 2022
A simple interactive OSC (Open Sound Control) debugger for terminal

oscd, a simple interactive OSC debugger for the terminal by using nom as a lexer/parser, oscd offers auto type casting and support sending multiple osc arguments.

Karnpapon Boonput 5 Oct 19, 2022
A command line tool to control the power state of Valve Base Stations 2.0.

lighthousectl A command line tool to control the power state of Valve Base Stations 2.0. Usage Scan All Base Stations It scans endlessly. You can stop

KOBA789 11 Aug 9, 2022
A bit like tee, a bit like script, but all with a fake tty. Lets you remote control and watch a process

teetty teetty is a wrapper binary to execute a command in a pty while providing remote control facilities. This allows logging the stdout of a process

Armin Ronacher 259 Jan 3, 2023
A GUI Fan control utility for Linux.

TuxTempMaster For now I'm gonna use this README to write the status of the project Important note This program is not gonna do any black magic. If you

Obscurely 12 Dec 23, 2022
EVA ICS v4 is a new-generation Industrial-IoT platform for Industry-4.0 automated control systems.

EVA ICS v4 EVA ICS® v4 is a new-generation Industrial-IoT platform for Industry-4.0 automated control systems. The world-first and only Enterprise aut

EVA ICS 25 Feb 1, 2023
job control from anywhere!

job-security - job control from anywhere! job-security is a tool that lets you put your running programs into background, then bring them to the foreg

Yuxuan Shui 15 Apr 23, 2023
A version control system implemented from scratch in Rust.

Version Control An experiment to write a version control system from scratch in Rust. CLI Usage Usage: revtool <COMMAND> Commands: init initia

Samuel Schlesinger 3 May 3, 2023
Fast KubeJS script manager. Includes version control and compatibility with KJSPKG packages.

CarbonJS A KubeJS script manager Features ?? Super fast ⚙️ Version control ?? Constantly new scripts being added ✅ Easy to use ?? Compatibility with K

Krzysztof Poręba 3 May 9, 2023
A money tracker: Your income and expenses at your control

NixBucks A simple budgeting app Install If you are on Linux, you can download the Appimage from the latest release (click here). Otherwise, you can in

Marcos Gutiérrez Alonso 3 Sep 25, 2023
REC2 (Rusty External Command and Control) is client and server tool allowing auditor to execute command from VirusTotal and Mastodon APIs written in Rust. 🦀

Information: REC2 is an old personal project (early 2023) that I didn't continue development on. It's part of a list of projects that helped me to lea

Quentin Texier (g0h4n) 104 Oct 7, 2023