Merge remote-tracking branch 'origin/feature/909-define-basic-trait-type-using-dataclasses' into feature/911-new-traits-based-integrator

This commit is contained in:
Ondřej Samohel 2024-11-22 18:09:16 +01:00
commit 63fe84553c
No known key found for this signature in database
GPG key ID: 02376E18990A97C6
2 changed files with 38 additions and 2 deletions

View file

@ -4,11 +4,15 @@ from __future__ import annotations
from enum import Enum, auto
from typing import TYPE_CHECKING, ClassVar, Optional
import clique
from pydantic import Field
from .trait import MissingTraitError, TraitBase
if TYPE_CHECKING:
from pathlib import Path
from .content import FileLocations
from .representation import Representation
@ -141,6 +145,21 @@ class Sequence(TraitBase):
except MissingTraitError:
pass
@staticmethod
def get_frame_padding(file_locations: FileLocations) -> int:
"""Get frame padding."""
files: list[Path] = [
file.file_path.as_posix()
for file in file_locations.file_paths
]
src_collections, _ = clique.assemble(files)
src_collection = src_collections[0]
destination_indexes = list(src_collection.indexes)
# Use last frame for minimum padding
# - that should cover both 'udim' and 'frame' minimum padding
return len(str(destination_indexes[-1]))
# Do we need one for drop and non-drop frame?
class SMPTETimecode(TraitBase):
"""SMPTE Timecode trait model."""

View file

@ -15,6 +15,7 @@ from ayon_core.pipeline.traits import (
PixelBased,
Planar,
Representation,
Sequence,
TraitBase,
)
from ayon_core.pipeline.traits.trait import TraitValidationError
@ -358,7 +359,6 @@ def test_file_locations_validation() -> None:
sequence_trait = FrameRanged(
frame_start=1001,
frame_end=1050,
frame_padding=4,
frames_per_second="25"
)
representation.add_trait(sequence_trait)
@ -382,10 +382,27 @@ def test_file_locations_validation() -> None:
invalid_sequence_trait = FrameRanged(
frame_start=1001,
frame_end=1051,
frame_padding=4,
frames_per_second="25"
)
representation.add_trait(invalid_sequence_trait)
with pytest.raises(TraitValidationError):
file_locations_trait.validate(representation)
def test_sequence_get_frame_padding() -> None:
"""Test getting frame padding from FileLocations trait."""
file_locations_list = [
FileLocation(
file_path=Path(f"/path/to/file.{frame}.exr"),
file_size=1024,
file_hash=None,
)
for frame in range(1001, 1051)
]
representation = Representation(name="test", traits=[
FileLocations(file_paths=file_locations_list)
])
assert Sequence.get_frame_padding(
file_locations=representation.get_trait(FileLocations)) == 4