updating config version validation

- cashing python version validation so it is overwritable by tests
- implementing python compatibility override into tests
- adding tests for ocio v2 filerules
This commit is contained in:
Jakub Jezek 2023-07-10 16:42:52 +02:00
parent 0114993456
commit 9c18402ac7
No known key found for this signature in database
GPG key ID: 730D7C02726179A7
3 changed files with 161 additions and 20 deletions

View file

@ -19,6 +19,7 @@ log = Logger.get_logger(__name__)
class CashedData:
remapping = None
python3compatible = None
@contextlib.contextmanager
@ -118,16 +119,23 @@ def get_imageio_colorspace_from_filepath(
if ext_match and file_match:
colorspace_name = file_rule["colorspace"]
# if no file rule matched, try to get colorspace
# from filepath with OCIO v2 way
# QUESTION: should we override file rules from our settings and
# in ocio v2 only focus on file rules set in config file?
if (
compatibility_check_config_version(config_data["path"], major=2)
and not colorspace_name
):
colorspace_name = get_colorspace_from_filepath(
config_data["path"], path)
if not colorspace_name:
log.info("No imageio file rule matched input path: '{}'".format(
path
))
return None
if compatibility_check_config_version(config_data["path"], major=2):
colorspace_name = get_colorspace_from_filepath(
config_data["path"], path)
# validate matching colorspace with config
if validate and config_data:
validate_imageio_colorspace_in_config(
@ -312,33 +320,39 @@ def get_wrapped_with_subprocess(command_group, command, **kwargs):
def compatibility_check():
"""Making sure PyOpenColorIO is importable"""
if CashedData.python3compatible is not None:
return CashedData.python3compatible
try:
import PyOpenColorIO # noqa: F401
CashedData.python3compatible = True
except ImportError:
return False
CashedData.python3compatible = False
# compatible
return True
return CashedData.python3compatible
def compatibility_check_config_version(config_path, major=1, minor=None):
"""Making sure PyOpenColorIO config version is compatible"""
try:
import PyOpenColorIO as ocio
config = ocio.Config().CreateFromFile(str(config_path))
config_version_major = config.getMajorVersion()
config_version_minor = config.getMinorVersion()
print(config_version_major, config_version_minor)
if not compatibility_check():
# python environment is not compatible with PyOpenColorIO
# needs to be run in subprocess
version_data = get_wrapped_with_subprocess(
"config", "get_version", config_path=config_path
)
# check major version
if config_version_major != major:
return False
# check minor version
if minor and config_version_minor != minor:
return False
from openpype.scripts.ocio_wrapper import _get_version_data
except ImportError:
version_data = _get_version_data(config_path)
# check major version
if version_data["major"] != major:
return False
# check minor version
if minor and version_data["minor"] != minor:
return False
# compatible

View file

@ -184,6 +184,68 @@ def _get_views_data(config_path):
return data_
@config.command(
name="get_version",
help=(
"return major and minor version from config file "
"--config_path input arg is required"
"--out_path input arg is required"
)
)
@click.option("--config_path", required=True,
help="path where to read ocio config file",
type=click.Path(exists=True))
@click.option("--out_path", required=True,
help="path where to write output json file",
type=click.Path())
def get_version(config_path, out_path):
"""Get version of config.
Python 2 wrapped console command
Args:
config_path (str): ocio config file path string
out_path (str): temp json file path string
Example of use:
> pyton.exe ./ocio_wrapper.py config get_version \
--config_path=<path> --out_path=<path>
"""
json_path = Path(out_path)
out_data = _get_version_data(config_path)
with open(json_path, "w") as f_:
json.dump(out_data, f_)
print(f"Config version data are saved to '{json_path}'")
def _get_version_data(config_path):
"""Return major and minor version info.
Args:
config_path (str): path string leading to config.ocio
Raises:
IOError: Input config does not exist.
Returns:
dict: minor and major keys with values
"""
config_path = Path(config_path)
if not config_path.is_file():
raise IOError("Input path should be `config.ocio` file")
config = ocio.Config().CreateFromFile(str(config_path))
return {
"major": config.getMajorVersion(),
"minor": config.getMinorVersion()
}
@colorspace.command(
name="get_colorspace_from_filepath",
help=(
@ -198,7 +260,7 @@ def _get_views_data(config_path):
type=click.Path(exists=True))
@click.option("--filepath", required=True,
help="path to file to get colorspace from",
type=click.Path(exists=True))
type=click.Path())
@click.option("--out_path", required=True,
help="path where to write output json file",
type=click.Path())

View file

@ -185,5 +185,70 @@ class TestPipelineColorspace(TestPipeline):
assert expected_hiero == hiero_file_rules, (
f"Not matching file rules {expected_hiero}")
def test_get_imageio_colorspace_from_filepath_p3(self, project_settings):
"""Test Colorspace from filepath with python 3 compatibility mode
Also test ocio v2 file rules
"""
nuke_filepath = "renderCompMain_baking_h264.mp4"
hiero_filepath = "prerenderCompMain.mp4"
expected_nuke = "Camera Rec.709"
expected_hiero = "Gamma 2.2 Rec.709 - Texture"
nuke_colorspace = colorspace.get_imageio_colorspace_from_filepath(
nuke_filepath,
"nuke",
"test_project",
project_settings=project_settings
)
assert expected_nuke == nuke_colorspace, (
f"Not matching colorspace {expected_nuke}")
hiero_colorspace = colorspace.get_imageio_colorspace_from_filepath(
hiero_filepath,
"hiero",
"test_project",
project_settings=project_settings
)
assert expected_hiero == hiero_colorspace, (
f"Not matching colorspace {expected_hiero}")
def test_get_imageio_colorspace_from_filepath_python2mode(
self, project_settings):
"""Test Colorspace from filepath with python 2 compatibility mode
Also test ocio v2 file rules
"""
nuke_filepath = "renderCompMain_baking_h264.mp4"
hiero_filepath = "prerenderCompMain.mp4"
expected_nuke = "Camera Rec.709"
expected_hiero = "Gamma 2.2 Rec.709 - Texture"
# switch to python 2 compatibility mode
colorspace.CashedData.python3compatible = False
nuke_colorspace = colorspace.get_imageio_colorspace_from_filepath(
nuke_filepath,
"nuke",
"test_project",
project_settings=project_settings
)
assert expected_nuke == nuke_colorspace, (
f"Not matching colorspace {expected_nuke}")
hiero_colorspace = colorspace.get_imageio_colorspace_from_filepath(
hiero_filepath,
"hiero",
"test_project",
project_settings=project_settings
)
assert expected_hiero == hiero_colorspace, (
f"Not matching colorspace {expected_hiero}")
# return to python 3 compatibility mode
colorspace.CashedData.python3compatible = None
test_case = TestPipelineColorspace()