Skip to content

Commit

Permalink
feat: add parameter value origin field to parameters
Browse files Browse the repository at this point in the history
Signed-off-by: Alejandro Jose Leiva Palomo <[email protected]>
  • Loading branch information
AleJo2995 committed Oct 19, 2023
1 parent 45eda01 commit f9aca20
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 2 deletions.
46 changes: 46 additions & 0 deletions tests/trestle/core/commands/author/profile_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1300,3 +1300,49 @@ def test_profile_generate_assesment_objectives(tmp_trestle_dir: pathlib.Path, mo
monkeypatch.setattr(sys, 'argv', test_args)

assert Trestle().run() == 0


def test_profile_generate_assemble_param_value_origin(tmp_trestle_dir: pathlib.Path, monkeypatch: MonkeyPatch) -> None:
"""Test the profile markdown generator."""
_, assembled_prof_dir, _, markdown_path = setup_profile_generate(tmp_trestle_dir, 'simple_test_profile.json')
yaml_header_path = test_utils.YAML_TEST_DATA_PATH / 'good_simple.yaml'
ac_path = markdown_path / 'ac'

# convert resolved profile catalog to markdown then assemble it after adding an item to a control
# generate, edit, assemble
test_args = f'trestle author profile-generate -n {prof_name} -o {md_name} -rs NeededExtra'.split( # noqa E501
)
test_args.extend(['-y', str(yaml_header_path)])
test_args.extend(['-s', all_sections_str])
monkeypatch.setattr(sys, 'argv', test_args)

assert Trestle().run() == 0

fc = test_utils.FileChecker(ac_path)

assert Trestle().run() == 0

assert fc.files_unchanged()

md_path = markdown_path / 'ac' / 'ac-1.md'
assert md_path.exists()
md_api = MarkdownAPI()
header, tree = md_api.processor.process_markdown(md_path)

assert header
header[const.SET_PARAMS_TAG]['ac-1_prm_1'][const.PARAM_VALUE_ORIGIN] = 'coming from xyz corporate policy'

md_api.write_markdown_with_header(md_path, header, tree.content.raw_text)

# assemble based on set_parameters_flag
test_args = f'trestle author profile-assemble -n {prof_name} -m {md_name} -o {assembled_prof_name}'.split()
test_args.append('-sp')
assembled_prof_dir.mkdir()
monkeypatch.setattr(sys, 'argv', test_args)
assert Trestle().run() == 0

profile, _ = ModelUtils.load_model_for_class(tmp_trestle_dir, 'my_assembled_prof',
prof.Profile, FileContentType.JSON)

# grabs first parameter in line and test out the value
assert profile.modify.set_parameters[0].param_value_origin == 'coming from xyz corporate policy'
2 changes: 2 additions & 0 deletions trestle/common/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,8 @@

GUIDELINES = 'guidelines'

PARAM_VALUE_ORIGIN = 'param-value-origin'

LABEL = 'label'

SECTIONS_TAG = TRESTLE_TAG + 'sections'
Expand Down
6 changes: 6 additions & 0 deletions trestle/common/model_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,11 @@ def dict_to_parameter(param_dict: Dict[str, Any]) -> common.Parameter:
if const.AGGREGATES in param_dict:
# removing aggregates as this is prop just informative in markdown
param_dict.pop(const.AGGREGATES)
param_value_origin = None
if const.PARAM_VALUE_ORIGIN in param_dict:
param_value_origin = param_dict[const.PARAM_VALUE_ORIGIN]
# removing param-value-origin as this is prop don´t have any value
param_dict.pop(const.PARAM_VALUE_ORIGIN)
if const.ALT_IDENTIFIER in param_dict:
# removing alt-identifier as this is prop just informative in markdown
param_dict.pop(const.ALT_IDENTIFIER)
Expand All @@ -639,6 +644,7 @@ def dict_to_parameter(param_dict: Dict[str, Any]) -> common.Parameter:
param_dict.pop('ns')
param = common.Parameter(**param_dict)
param.props = none_if_empty(props)
param.param_value_origin = param_value_origin
return param

@staticmethod
Expand Down
4 changes: 3 additions & 1 deletion trestle/core/catalog/catalog_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ def _construct_set_parameters_dict(
# pull only the values from the actual control dict
# all the other elements are from the profile set_param
new_dict[const.VALUES] = orig_dict.get(const.VALUES, None)
new_dict[const.PARAM_VALUE_ORIGIN] = None
new_dict[const.GUIDELINES] = orig_dict.get(const.GUIDELINES, None)
if new_dict[const.VALUES] is None:
new_dict.pop(const.VALUES)
Expand Down Expand Up @@ -197,7 +198,8 @@ def _construct_set_parameters_dict(
const.AGGREGATES,
const.ALT_IDENTIFIER,
const.DISPLAY_NAME,
const.PROFILE_VALUES
const.PROFILE_VALUES,
const.PARAM_VALUE_ORIGIN
)
ordered_dict = {k: new_dict[k] for k in key_order if k in new_dict.keys()}
set_param_dict[param_id] = ordered_dict
Expand Down
3 changes: 2 additions & 1 deletion trestle/core/commands/author/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,8 @@ def _replace_modify_set_params(
label=param.label,
values=param.values,
select=param.select,
props=param.props
props=param.props,
param_value_origin=param.param_value_origin
)
)
if profile.modify.set_parameters != new_set_params:
Expand Down
1 change: 1 addition & 0 deletions trestle/oscal/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -1626,6 +1626,7 @@ class Config:
values: Optional[List[constr(regex=r'^\S(.*\S)?$')]] = Field(None)
select: Optional[ParameterSelection] = None
remarks: Optional[str] = None
param_value_origin: Optional[str] = None


class OriginActor(OscalBaseModel):
Expand Down
1 change: 1 addition & 0 deletions trestle/oscal/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ class Config:
guidelines: Optional[List[common.ParameterGuideline]] = Field(None)
values: Optional[List[constr(regex=r'^\S(.*\S)?$')]] = Field(None)
select: Optional[common.ParameterSelection] = None
param_value_origin: Optional[str] = Field(None, alias='parameter-value-origin')


class Remove(OscalBaseModel):
Expand Down

0 comments on commit f9aca20

Please sign in to comment.