profile_resolver
trestle.core.profile_resolver
¤
Create resolved catalog from profile.
logger
¤
Classes¤
ProfileResolver
¤
Class to resolve a catalog given a profile.
Source code in trestle/core/profile_resolver.py
class ProfileResolver():
"""Class to resolve a catalog given a profile."""
@staticmethod
def _extract_inherited_props(res_cat: cat.Catalog) -> Tuple[cat.Catalog, Dict[str, Any]]:
"""
Build the control dict of inherited props.
Args:
The resolved profile catalog with a possible temporary part in each control
Returns:
The temporary parts are removed from each control and a Dict of added props per control_id is returned
Notes:
If an upstream profile adds props to the control they are tracked in a special temporary part in the control
called const.TRESTLE_INHERITED_PROPS_TRACKER. If that part is present in a control its contents should be added
to the dict entry for that control, and the part removed from the control.
"""
prop_dict: Dict[str, Any] = {}
cat_interface = CatalogInterface(res_cat)
for control in cat_interface.get_all_controls_from_dict():
part: com.Part = pop_item_from_list(control.parts, TRESTLE_INHERITED_PROPS_TRACKER, lambda p: p.name)
if part:
props_list: List[Dict[str, Any]] = []
for prop in as_list(part.props):
props_list.append({'name': prop.name, 'value': prop.value})
for sub_part in as_list(part.parts):
for prop in as_list(sub_part.props):
props_list.append({'name': prop.name, 'value': prop.value, 'part_name': sub_part.title})
prop_dict[control.id] = props_list
cat_interface.update_catalog_controls()
clean_res_cat = cat_interface.get_catalog()
return clean_res_cat, prop_dict
@staticmethod
def get_resolved_profile_catalog_and_inherited_props(
trestle_root: pathlib.Path,
profile_path: str,
block_adds: bool = False,
block_params: bool = False,
params_format: Optional[str] = None,
param_rep: ParameterRep = ParameterRep.LEAVE_MOUSTACHE,
show_value_warnings: bool = False,
value_assigned_prefix: Optional[str] = None,
value_not_assigned_prefix: Optional[str] = None
) -> Tuple[cat.Catalog, Optional[Dict[str, Any]]]:
"""
Create the resolved profile catalog given a profile path along with inherited props.
Args:
trestle_root: root directory of the trestle workspace
profile_path: string path or uri of the profile being resolved
block_adds: prevent the application of adds in the final profile
block_params: prevent the application of setparams in the final profile
params_format: optional pattern with dot to wrap the param string, where dot represents the param string
param_rep: desired way to convert params to strings
show_value_warnings: warn if prose references a value that has not been set
value_assigned_prefix: Prefix placed in front of param string if a value was assigned
value_not_assigned_prefix: Prefix placed in front of param string if a value was *not* assigned
Returns:
The resolved profile catalog and a control dict of inherited props
"""
logger.debug(f'get resolved profile catalog and inherited props for {profile_path} via generated Import.')
import_ = prof.Import(href=str(profile_path), include_all={})
# The final Import has change_prose=True to force parameter substitution in the prose only at the last stage.
import_filter = Import(
trestle_root,
import_, [],
True,
block_adds,
block_params,
params_format,
param_rep,
None,
show_value_warnings,
value_assigned_prefix,
value_not_assigned_prefix
)
logger.debug('launch pipeline')
resolved_profile_catalog = next(import_filter.process())
resolved_profile_catalog, inherited_props = ProfileResolver._extract_inherited_props(resolved_profile_catalog)
return resolved_profile_catalog, inherited_props
@staticmethod
def get_resolved_profile_catalog(
trestle_root: pathlib.Path,
profile_path: str,
block_adds: bool = False,
block_params: bool = False,
params_format: Optional[str] = None,
param_rep: ParameterRep = ParameterRep.LEAVE_MOUSTACHE,
show_value_warnings: bool = False,
value_assigned_prefix: Optional[str] = None,
value_not_assigned_prefix: Optional[str] = None
) -> cat.Catalog:
"""
Create the resolved profile catalog given a profile path.
Args:
trestle_root: root directory of the trestle workspace
profile_path: string path or uri of the profile being resolved
block_adds: prevent the application of adds in the final profile
block_params: prevent the application of setparams in the final profile
params_format: optional pattern with dot to wrap the param string, where dot represents the param string
param_rep: desired way to convert params to strings
show_value_warnings: warn if prose references a value that has not been set
value_assigned_prefix: Prefix placed in front of param string if a value was assigned
value_not_assigned_prefix: Prefix placed in front of param string if a value was *not* assigned
Returns:
The resolved profile catalog
"""
logger.debug(f'get resolved profile catalog for {profile_path} via generated Import.')
resolved_profile_catalog, _ = ProfileResolver.get_resolved_profile_catalog_and_inherited_props(
trestle_root,
profile_path,
block_adds,
block_params,
params_format,
param_rep,
show_value_warnings,
value_assigned_prefix,
value_not_assigned_prefix
)
return resolved_profile_catalog
Methods¤
get_resolved_profile_catalog(trestle_root, profile_path, block_adds=False, block_params=False, params_format=None, param_rep=<ParameterRep.LEAVE_MOUSTACHE: 0>, show_value_warnings=False, value_assigned_prefix=None, value_not_assigned_prefix=None)
staticmethod
¤
Create the resolved profile catalog given a profile path.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
trestle_root |
Path |
root directory of the trestle workspace |
required |
profile_path |
str |
string path or uri of the profile being resolved |
required |
block_adds |
bool |
prevent the application of adds in the final profile |
False |
block_params |
bool |
prevent the application of setparams in the final profile |
False |
params_format |
Optional[str] |
optional pattern with dot to wrap the param string, where dot represents the param string |
None |
param_rep |
ParameterRep |
desired way to convert params to strings |
<ParameterRep.LEAVE_MOUSTACHE: 0> |
show_value_warnings |
bool |
warn if prose references a value that has not been set |
False |
value_assigned_prefix |
Optional[str] |
Prefix placed in front of param string if a value was assigned |
None |
value_not_assigned_prefix |
Optional[str] |
Prefix placed in front of param string if a value was not assigned |
None |
Returns:
Type | Description |
---|---|
Catalog |
The resolved profile catalog |
Source code in trestle/core/profile_resolver.py
@staticmethod
def get_resolved_profile_catalog(
trestle_root: pathlib.Path,
profile_path: str,
block_adds: bool = False,
block_params: bool = False,
params_format: Optional[str] = None,
param_rep: ParameterRep = ParameterRep.LEAVE_MOUSTACHE,
show_value_warnings: bool = False,
value_assigned_prefix: Optional[str] = None,
value_not_assigned_prefix: Optional[str] = None
) -> cat.Catalog:
"""
Create the resolved profile catalog given a profile path.
Args:
trestle_root: root directory of the trestle workspace
profile_path: string path or uri of the profile being resolved
block_adds: prevent the application of adds in the final profile
block_params: prevent the application of setparams in the final profile
params_format: optional pattern with dot to wrap the param string, where dot represents the param string
param_rep: desired way to convert params to strings
show_value_warnings: warn if prose references a value that has not been set
value_assigned_prefix: Prefix placed in front of param string if a value was assigned
value_not_assigned_prefix: Prefix placed in front of param string if a value was *not* assigned
Returns:
The resolved profile catalog
"""
logger.debug(f'get resolved profile catalog for {profile_path} via generated Import.')
resolved_profile_catalog, _ = ProfileResolver.get_resolved_profile_catalog_and_inherited_props(
trestle_root,
profile_path,
block_adds,
block_params,
params_format,
param_rep,
show_value_warnings,
value_assigned_prefix,
value_not_assigned_prefix
)
return resolved_profile_catalog
get_resolved_profile_catalog_and_inherited_props(trestle_root, profile_path, block_adds=False, block_params=False, params_format=None, param_rep=<ParameterRep.LEAVE_MOUSTACHE: 0>, show_value_warnings=False, value_assigned_prefix=None, value_not_assigned_prefix=None)
staticmethod
¤
Create the resolved profile catalog given a profile path along with inherited props.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
trestle_root |
Path |
root directory of the trestle workspace |
required |
profile_path |
str |
string path or uri of the profile being resolved |
required |
block_adds |
bool |
prevent the application of adds in the final profile |
False |
block_params |
bool |
prevent the application of setparams in the final profile |
False |
params_format |
Optional[str] |
optional pattern with dot to wrap the param string, where dot represents the param string |
None |
param_rep |
ParameterRep |
desired way to convert params to strings |
<ParameterRep.LEAVE_MOUSTACHE: 0> |
show_value_warnings |
bool |
warn if prose references a value that has not been set |
False |
value_assigned_prefix |
Optional[str] |
Prefix placed in front of param string if a value was assigned |
None |
value_not_assigned_prefix |
Optional[str] |
Prefix placed in front of param string if a value was not assigned |
None |
Returns:
Type | Description |
---|---|
Tuple[trestle.oscal.catalog.Catalog, Optional[Dict[str, Any]]] |
The resolved profile catalog and a control dict of inherited props |
Source code in trestle/core/profile_resolver.py
@staticmethod
def get_resolved_profile_catalog_and_inherited_props(
trestle_root: pathlib.Path,
profile_path: str,
block_adds: bool = False,
block_params: bool = False,
params_format: Optional[str] = None,
param_rep: ParameterRep = ParameterRep.LEAVE_MOUSTACHE,
show_value_warnings: bool = False,
value_assigned_prefix: Optional[str] = None,
value_not_assigned_prefix: Optional[str] = None
) -> Tuple[cat.Catalog, Optional[Dict[str, Any]]]:
"""
Create the resolved profile catalog given a profile path along with inherited props.
Args:
trestle_root: root directory of the trestle workspace
profile_path: string path or uri of the profile being resolved
block_adds: prevent the application of adds in the final profile
block_params: prevent the application of setparams in the final profile
params_format: optional pattern with dot to wrap the param string, where dot represents the param string
param_rep: desired way to convert params to strings
show_value_warnings: warn if prose references a value that has not been set
value_assigned_prefix: Prefix placed in front of param string if a value was assigned
value_not_assigned_prefix: Prefix placed in front of param string if a value was *not* assigned
Returns:
The resolved profile catalog and a control dict of inherited props
"""
logger.debug(f'get resolved profile catalog and inherited props for {profile_path} via generated Import.')
import_ = prof.Import(href=str(profile_path), include_all={})
# The final Import has change_prose=True to force parameter substitution in the prose only at the last stage.
import_filter = Import(
trestle_root,
import_, [],
True,
block_adds,
block_params,
params_format,
param_rep,
None,
show_value_warnings,
value_assigned_prefix,
value_not_assigned_prefix
)
logger.debug('launch pipeline')
resolved_profile_catalog = next(import_filter.process())
resolved_profile_catalog, inherited_props = ProfileResolver._extract_inherited_props(resolved_profile_catalog)
return resolved_profile_catalog, inherited_props
handler: python