Skip to content

profile_resolver

trestle.core.profile_resolver ¤

Create resolved catalog from profile.

Attributes¤

logger = logging.getLogger(__name__) module-attribute ¤

Classes¤

ProfileResolver ¤

Class to resolve a catalog given a profile.

Source code in trestle/core/profile_resolver.py
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
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
Functions¤
get_resolved_profile_catalog(trestle_root, profile_path, block_adds=False, block_params=False, params_format=None, param_rep=ParameterRep.LEAVE_MOUSTACHE, 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

LEAVE_MOUSTACHE
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
@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, 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

LEAVE_MOUSTACHE
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[Catalog, Optional[Dict[str, Any]]]

The resolved profile catalog and a control dict of inherited props

Source code in trestle/core/profile_resolver.py
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
@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

Functions¤

handler: python