4949)
5050from opencolorio_config_aces .utilities import (
5151 attest ,
52+ optional ,
5253 timestamp ,
5354 validate_method ,
5455)
@@ -192,8 +193,7 @@ def clf_transform_to_description(
192193 *OpenColorIO* `Colorspace` or `NamedTransform` description.
193194 """
194195
195- if amf_components is None :
196- amf_components = {}
196+ amf_components = optional (amf_components , {})
197197
198198 description = None
199199 if describe != DescriptionStyle .NONE :
@@ -755,6 +755,7 @@ def generate_config_cg(
755755 describe = DescriptionStyle .SHORT_UNION ,
756756 config_mapping_file_path = PATH_TRANSFORMS_MAPPING_FILE_CG ,
757757 scheme = "Modern 1" ,
758+ additional_filterers = None ,
758759 additional_data = False ,
759760):
760761 """
@@ -803,6 +804,20 @@ def generate_config_cg(
803804 scheme : str, optional
804805 {"Legacy", "Modern 1"},
805806 Naming convention scheme to use.
807+ additional_filterers : dict, optional
808+ Additional filterers to further include or exclude transforms from the
809+ generated config.
810+
811+ .. code-block:: python
812+
813+ {
814+ "any": {},
815+ "all": {
816+ "view_transform_filterers": [lambda x: "D60" not in x["name"]],
817+ "view_filterers": [lambda x: "D60" not in x["view"]],
818+ },
819+ },
820+
806821 additional_data : bool, optional
807822 Whether to return additional data.
808823
@@ -816,6 +831,8 @@ def generate_config_cg(
816831
817832 scheme = validate_method (scheme , ["Legacy" , "Modern 1" ])
818833
834+ additional_filterers = optional (additional_filterers , {"any" : {}, "all" : {}})
835+
819836 LOGGER .info (
820837 'Generating "%s" config...' ,
821838 config_name_cg (dependency_versions ),
@@ -978,42 +995,74 @@ def transform_filterer(transform):
978995 if not aces_transform_id :
979996 continue
980997
981- for data in transform [ "transforms_data" ] :
998+ for data in transform . get ( "transforms_data" , []) :
982999 if aces_transform_id == data .get ("aces_transform_id" ):
9831000 return True
9841001
9851002 return False
9861003
987- def multi_filters (array , filterers ):
988- """Apply given filterers on given array ."""
1004+ def filter_any (array , filterers ):
1005+ """Filter array elements passing any of the filterers ."""
9891006
9901007 filtered = [a for a in array if any (filterer (a ) for filterer in filterers )]
9911008
9921009 return filtered
9931010
994- colorspace_filterers = [implicit_transform_filterer , transform_filterer ]
995- data .colorspaces = multi_filters (data .colorspaces , colorspace_filterers )
1011+ def filter_all (array , filterers ):
1012+ """Filter array elements passing all of the filterers."""
1013+
1014+ filtered = [a for a in array if all (filterer (a ) for filterer in filterers )]
9961015
1016+ return filtered
1017+
1018+ # "Colorspaces" Filtering
1019+ any_colorspace_filterers = [
1020+ implicit_transform_filterer ,
1021+ transform_filterer ,
1022+ * additional_filterers ["any" ].get ("colorspace_filterers" , []),
1023+ ]
1024+ data .colorspaces = filter_any (data .colorspaces , any_colorspace_filterers )
1025+ all_colorspace_filterers = [
1026+ * additional_filterers ["all" ].get ("colorspace_filterers" , [])
1027+ ]
1028+ data .colorspaces = filter_all (data .colorspaces , all_colorspace_filterers )
9971029 LOGGER .info (
9981030 'Filtered "Colorspace" transforms: %s.' ,
9991031 [a ["name" ] for a in data .colorspaces ],
10001032 )
10011033
1002- look_filterers = [implicit_transform_filterer , transform_filterer ]
1003- data .looks = multi_filters (data .looks , look_filterers )
1034+ # "Looks" Filtering
1035+ any_look_filterers = [
1036+ implicit_transform_filterer ,
1037+ transform_filterer ,
1038+ * additional_filterers ["any" ].get ("look_filterers" , []),
1039+ ]
1040+ data .looks = filter_any (data .looks , any_look_filterers )
1041+ all_look_filterers = [* additional_filterers ["all" ].get ("look_filterers" , [])]
1042+ data .looks = filter_all (data .looks , all_look_filterers )
10041043 LOGGER .info ('Filtered "Look" transforms: %s ' , [a ["name" ] for a in data .looks ])
10051044
1006- view_transform_filterers = [
1045+ # "View Transform" Filtering
1046+ any_view_transform_filterers = [
10071047 implicit_transform_filterer ,
10081048 transform_filterer ,
1049+ * additional_filterers ["any" ].get ("view_transform_filterers" , []),
10091050 ]
1010- data .view_transforms = multi_filters (data .view_transforms , view_transform_filterers )
1051+ data .view_transforms = filter_any (
1052+ data .view_transforms , any_view_transform_filterers
1053+ )
1054+ all_view_transform_filterers = [
1055+ * additional_filterers ["all" ].get ("view_transform_filterers" , [])
1056+ ]
1057+ data .view_transforms = filter_all (
1058+ data .view_transforms , all_view_transform_filterers
1059+ )
10111060 LOGGER .info (
10121061 'Filtered "View" transforms: %s.' ,
10131062 [a ["name" ] for a in data .view_transforms ],
10141063 )
10151064
1016- # Views Filtering
1065+ # " Views & Shared Views" Filtering
10171066 display_names = [
10181067 a ["name" ] for a in data .colorspaces if a .get ("family" ) == "Display"
10191068 ]
@@ -1040,22 +1089,37 @@ def view_filterer(transform):
10401089
10411090 return False
10421091
1043- shared_view_filterers = [implicit_view_filterer , view_filterer ]
1044- data .shared_views = multi_filters (data .shared_views , shared_view_filterers )
1092+ # "Shared Views" Filtering
1093+ any_shared_view_filterers = [
1094+ implicit_view_filterer ,
1095+ view_filterer ,
1096+ * additional_filterers ["any" ].get ("shared_view_filterers" , []),
1097+ ]
1098+ data .shared_views = filter_any (data .shared_views , any_shared_view_filterers )
1099+ all_shared_view_filterers = [
1100+ * additional_filterers ["all" ].get ("shared_view_filterers" , [])
1101+ ]
1102+ data .shared_views = filter_all (data .shared_views , all_shared_view_filterers )
10451103 LOGGER .info (
10461104 'Filtered shared "View(s)": %s.' ,
10471105 [a ["view" ] for a in data .shared_views ],
10481106 )
10491107
1050- view_filterers = [implicit_view_filterer , view_filterer ]
1051- data .views = multi_filters (data .views , view_filterers )
1108+ any_view_filterers = [
1109+ implicit_view_filterer ,
1110+ view_filterer ,
1111+ * additional_filterers ["any" ].get ("view_filterers" , []),
1112+ ]
1113+ data .views = filter_any (data .views , any_view_filterers )
1114+ all_view_filterers = [* additional_filterers ["all" ].get ("view_filterers" , [])]
1115+ data .views = filter_all (data .views , all_view_filterers )
10521116 LOGGER .info ('Filtered "View(s)": %s.' , [a ["view" ] for a in data .views ])
10531117
1054- # Active Displays Filtering
1118+ # " Active Displays" Filtering
10551119 data .active_displays = [a for a in data .active_displays if a in display_names ]
10561120 LOGGER .info ("Filtered active displays: %s." , data .active_displays )
10571121
1058- # Active Views Filtering
1122+ # " Active Views" Filtering
10591123 views = [view ["view" ] for view in data .views ]
10601124 data .active_views = [view for view in data .active_views if view in views ]
10611125 LOGGER .info ("Filtered active views: %s." , data .active_views )
@@ -1238,24 +1302,10 @@ def view_filterer(transform):
12381302 dependency_versions = dependency_versions ,
12391303 additional_data = True ,
12401304 )
1241- # TODO: Pickling "PyOpenColorIO.ColorSpace" fails on early "PyOpenColorIO"
1242- # versions.
1305+
12431306 try :
12441307 serialize_config_data (
12451308 data , build_directory / config_basename .replace ("ocio" , "json" )
12461309 )
12471310 except TypeError as error :
12481311 logging .critical (error )
1249-
1250- if dependency_versions .ocio .minor <= 3 :
1251- config = ocio .Config .CreateFromFile ( # pyright:ignore
1252- str (build_directory / config_basename )
1253- )
1254- view_transforms = list (config .getViewTransforms ())
1255- view_transforms = [view_transforms [- 1 ], * view_transforms [:- 1 ]]
1256- config .clearViewTransforms ()
1257- for view_transform in view_transforms :
1258- config .addViewTransform (view_transform )
1259-
1260- with open (build_directory / config_basename , "w" ) as file :
1261- file .write (config .serialize ())
0 commit comments