OP-3951 - updated validator to use special pattern

Handles numbers (version, instance number) in file names.
This commit is contained in:
Petr Kalis 2023-03-23 18:09:11 +01:00
parent 4d53e4f5fb
commit 3860fe3692

View file

@ -1,3 +1,8 @@
import os.path
import clique
import re
import pyblish.api
@ -7,6 +12,11 @@ class ValidateSequenceFrames(pyblish.api.InstancePlugin):
The files found in the folder are checked against the startFrame and
endFrame of the instance. If the first or last file is not
corresponding with the first or last frame it is flagged as invalid.
Used regular expression pattern handles numbers in the file names
(eg "Main_beauty.v001.1001.exr", "Main_beauty_v001.1001.exr",
"Main_beauty.1001.1001.exr") but not numbers behind frames (eg.
"Main_beauty.1001.v001.exr")
"""
order = pyblish.api.ValidatorOrder
@ -15,20 +25,31 @@ class ValidateSequenceFrames(pyblish.api.InstancePlugin):
hosts = ["shell"]
def process(self, instance):
representations = instance.data.get("representations")
for repr in representations:
if isinstance(repr["files"], str):
repr["files"] = [repr["files"]]
collection = instance[0]
self.log.info(collection)
_, ext = os.path.splitext(repr["files"][0])
pattern = r"\D?(?P<index>(?P<padding>0*)\d+){}$".format(
re.escape(ext))
patterns = [pattern]
frames = list(collection.indexes)
collections, remainder = clique.assemble(
repr["files"], minimum_items=1, patterns=patterns)
current_range = (frames[0], frames[-1])
required_range = (instance.data["frameStart"],
instance.data["frameEnd"])
assert not remainder, "Must not have remainder"
assert len(collections) == 1, "Must detect single collection"
collection = collections[0]
frames = list(collection.indexes)
if current_range != required_range:
raise ValueError("Invalid frame range: {0} - "
"expected: {1}".format(current_range,
required_range))
current_range = (frames[0], frames[-1])
required_range = (instance.data["frameStart"],
instance.data["frameEnd"])
missing = collection.holes().indexes
assert not missing, "Missing frames: %s" % (missing,)
if current_range != required_range:
raise ValueError(f"Invalid frame range: {current_range} - "
f"expected: {required_range}")
missing = collection.holes().indexes
assert not missing, "Missing frames: %s" % (missing,)