Skip to content

Commit cfc32ef

Browse files
[cueman] Add unit tests and validation for frame operations (AcademySoftwareFoundation#1999)
**Link the Issue(s) this Pull Request is related to.** - AcademySoftwareFoundation#1929 - AcademySoftwareFoundation#1800 **Summarize your change.** Summary: Add comprehensive unit tests for frame-specific operations and implement input validation for stagger, reorder, and frame range operations. Updated documentation to reflect new validation requirements. Changes: 1) Unit tests (`cueman/tests/test_frame_operations.py`) Created comprehensive test suite covering: - Frame eat/kill/retry operations with layer and range filters - Frame state filtering (running, waiting, dead, succeeded) - Frame range parsing and validation - Mark done functionality - Stagger operations with increment validation (positive integers only) - Reorder operations with position validation (FIRST, LAST, REVERSE) - Confirmation prompts for destructive operations - Error handling for invalid inputs 2) Input validation (`cueman/cueman/main.py`) Added validation to ensure: - Stagger increments must be positive integers (rejects 0, negative, non-numeric) - Reorder positions must be FIRST, LAST, or REVERSE - Frame ranges must be valid numeric formats with start < = end 3) Documentation updates Updated documentation across multiple files: - `docs/_docs/reference/tools/cueman.md`: Added validation notes and troubleshooting examples for invalid inputs - `docs/_docs/tutorials/cueman-tutorial.md`: Added validation notes in Frame Manipulation section and error examples - `cueman/cueman_tutorial.md`: Added validation notes for stagger and reorder - `cueman/README.md`: Updated inline comments to reflect requirements 4) Test fixes - Fixed typo in test method name: from `test_done_fundtionality` to `test_done_functionality` - Corrected layer parameter type from string to list in 7 tests to match argparse `nargs="+"` behavior - Updated assertions to expect list values for consistency with actual command-line argument parsing Co-authored-by: Kathy Lee <lee.j.kathy@gmail.com> Co-authored-by: Ramon Figueiredo <rfigueiredo@imageworks.com>
1 parent ca9b210 commit cfc32ef

File tree

6 files changed

+478
-2
lines changed

6 files changed

+478
-2
lines changed

cueman/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,10 @@ cueman -retry job_name -state DEAD
217217
## Frame Manipulation
218218

219219
```bash
220-
# Stagger frames by increment
220+
# Stagger frames by increment (must be positive integer)
221221
cueman -stagger job_name 1-100 5
222222

223-
# Reorder frames
223+
# Reorder frames (position must be FIRST, LAST, or REVERSE)
224224
cueman -reorder job_name 1-100 FIRST
225225
cueman -reorder job_name 50-100 LAST
226226
cueman -reorder job_name 1-100 REVERSE

cueman/cueman/main.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,9 @@ def handleArgs(args):
567567
elif args.stagger:
568568
name, frame_range, increment = args.stagger
569569
try:
570+
if not increment.isdigit() or int(increment) < 1:
571+
logger.error("Error: Increment must be a positive integer.")
572+
sys.exit(1)
570573
job = opencue.api.findJob(name)
571574
layers = args.layer
572575
common.confirm(
@@ -591,6 +594,9 @@ def handleArgs(args):
591594
elif args.reorder:
592595
name, frame_range, position = args.reorder
593596
try:
597+
if position not in ["FIRST", "LAST", "REVERSE"]:
598+
logger.error("Error: Position must be one of FIRST, LAST, or REVERSE.")
599+
sys.exit(1)
594600
job = opencue.api.findJob(name)
595601
layers = args.layer
596602
common.confirm(
@@ -725,6 +731,14 @@ def buildFrameSearch(args):
725731
if args.layer:
726732
s["layer"] = args.layer
727733
if args.range:
734+
if not re.match(r"^\d+$|^\d+-\d+$", args.range):
735+
logger.error("Invalid range format: %s", args.range)
736+
sys.exit(1)
737+
if "-" in args.range:
738+
r = args.range.partition("-")
739+
if r[0] > r[2]:
740+
logger.error("Invalid range format: %s", args.range)
741+
sys.exit(1)
728742
s["range"] = args.range
729743
if args.state:
730744
s["state"] = [common.Convert.strToFrameState(st) for st in args.state]

cueman/cueman_tutorial.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ cueman -stagger job_name 1-100 5
376376
cueman -stagger job_name 1-50 10 -layer sim_layer
377377
```
378378

379+
**Note:** Increment must be a positive integer. Zero, negative, and non-numeric values will be rejected.
380+
379381
### Reorder Frames
380382
Change frame execution order:
381383

@@ -393,6 +395,8 @@ cueman -reorder job_name 1-100 REVERSE
393395
cueman -reorder job_name 1-50 FIRST -layer hero_layer
394396
```
395397

398+
**Note:** Position must be one of: `FIRST`, `LAST`, or `REVERSE`. Other values will be rejected.
399+
396400
## Real-World Scenarios
397401

398402
### Scenario 1: Handling Stuck Frames

0 commit comments

Comments
 (0)