Skip to content

Commit

Permalink
Add more functions to support precondition check and update markdown …
Browse files Browse the repository at this point in the history
…generator (#33)

Signed-off-by: hoangtungdinh <[email protected]>
  • Loading branch information
hoangtungdinh authored Sep 11, 2024
1 parent ad77fc6 commit 7c1825e
Show file tree
Hide file tree
Showing 3 changed files with 211 additions and 13 deletions.
39 changes: 33 additions & 6 deletions qc_baselib/result.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from dataclasses import dataclass
from typing import Union, List, Set
from lxml import etree
from .models import IssueSeverity, result
from .models import IssueSeverity, StatusType, result
import logging

REPORT_OUTPUT_FORMAT = "xqar"
Expand Down Expand Up @@ -119,13 +119,12 @@ def write_markdown_doc(self, markdown_file_path: str) -> None:
bundle_text += f"# Checker bundle: {bundle.name}\n\n"
bundle_text += f"* Build version: {bundle.version}\n"
bundle_text += f"* Description: {bundle.description}\n"
bundle_text += f"* Summary: {bundle.summary}\n"

bundle_text += "\n"
bundle_text += f"## Parameters\n\n"
param_text = ""
for param in bundle.params:
param_text += f"* {param.name}: \n"
param_text += f"* {param.name} \n"

if len(param_text) == 0:
param_text += f"* None\n"
Expand All @@ -139,7 +138,6 @@ def write_markdown_doc(self, markdown_file_path: str) -> None:
checker_text += "\n"
checker_text += f"### {checker.checker_id}\n\n"
checker_text += f"* Description: {checker.description}\n"
checker_text += f"* Summary: {checker.summary}\n"

checker_text += f"* Addressed rules:\n"
rule_text = ""
Expand Down Expand Up @@ -428,7 +426,7 @@ def add_domain_specific_info(
issue.domain_specific_info.append(domain_specific_tag)

def set_checker_status(
self, checker_bundle_name: str, checker_id: str, status: result.StatusType
self, checker_bundle_name: str, checker_id: str, status: StatusType
) -> None:
bundle = self._get_checker_bundle(checker_bundle_name=checker_bundle_name)
checker = self._get_checker(bundle=bundle, checker_id=checker_id)
Expand Down Expand Up @@ -560,11 +558,40 @@ def get_issues_by_rule_uid(self, rule_uid: str) -> List[result.IssueType]:

return rule_issues

def has_at_least_one_issue_from_rules(self, rule_uid_set: Set[str]) -> bool:
def has_issue_in_rules(self, rule_uid_set: Set[str]) -> bool:
for bundle in self._report_results.checker_bundles:
for checker in bundle.checkers:
for issue in checker.issues:
if issue.rule_uid in rule_uid_set:
return True

return False

def has_issue_in_checkers(self, check_id_set: Set[str]) -> bool:
for bundle in self._report_results.checker_bundles:
for checker in bundle.checkers:
if checker.checker_id in check_id_set and len(checker.issues) > 0:
return True

return False

def all_checkers_completed_without_issue(self, check_id_set: Set[str]) -> bool:
checker_id_map = dict()
for checker_id in check_id_set:
checker_id_map[checker_id] = False

for bundle in self._report_results.checker_bundles:
for checker in bundle.checkers:
if (
checker.checker_id in check_id_set
and checker.status == StatusType.COMPLETED
and len(checker.issues) == 0
):
checker_id_map[checker.checker_id] = True

result = True

for _, checker_result in checker_id_map.items():
result = result and checker_result

return result
2 changes: 0 additions & 2 deletions tests/data/result_markdown_docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

* Build version: 0.0.1
* Description: Example checker bundle
* Summary: Tested example checkers

## Parameters

Expand All @@ -21,6 +20,5 @@
### TestChecker

* Description: Test checker
* Summary: Executed evaluation
* Addressed rules:
* test.com:qc:1.0.0:qwerty.qwerty
183 changes: 178 additions & 5 deletions tests/test_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -647,7 +647,7 @@ def test_markdown_docs_output():
os.remove(TEST_MARKDOWN_DOC_OUTPUT_PATH)


def test_has_at_least_one_issue_from_rules() -> None:
def test_has_issue_in_rules() -> None:
result_report = Result()

result_report.register_checker_bundle(
Expand Down Expand Up @@ -707,27 +707,200 @@ def test_has_at_least_one_issue_from_rules() -> None:
)

assert (
result_report.has_at_least_one_issue_from_rules(
result_report.has_issue_in_rules(
{"test.com:qc:1.0.0:third.rule", "test.com:qc:1.0.0:fourth.rule"}
)
== False
)

assert (
result_report.has_at_least_one_issue_from_rules(
result_report.has_issue_in_rules(
{"test.com:qc:1.0.0:first.rule", "test.com:qc:1.0.0:fourth.rule"}
)
== True
)

assert (
result_report.has_at_least_one_issue_from_rules(
result_report.has_issue_in_rules(
{"test.com:qc:1.0.0:second.rule", "test.com:qc:1.0.0:fourth.rule"}
)
== True
)

assert result_report.has_at_least_one_issue_from_rules({}) == False
assert result_report.has_issue_in_rules({}) == False


def test_has_issue_in_checkers() -> None:
result_report = Result()

result_report.register_checker_bundle(
name="TestBundle",
build_date="2024-05-31",
description="Example checker bundle",
version="0.0.1",
summary="Tested example checkers",
)

result_report.register_checker(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
description="Test checker",
summary="Executed evaluation",
)

rule_uid_1 = result_report.register_rule(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
emanating_entity="test.com",
standard="qc",
definition_setting="1.0.0",
rule_full_name="first.rule",
)

result_report.register_issue(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
description="Issue found at odr",
level=IssueSeverity.INFORMATION,
rule_uid=rule_uid_1,
)

result_report.register_checker(
checker_bundle_name="TestBundle",
checker_id="SecondChecker",
description="Test checker",
summary="Executed evaluation",
)

result_report.register_rule(
checker_bundle_name="TestBundle",
checker_id="SecondChecker",
emanating_entity="test.com",
standard="qc",
definition_setting="1.0.0",
rule_full_name="second.rule",
)

assert (
result_report.has_issue_in_checkers({"SecondChecker", "ThirdChecker"}) == False
)

assert (
result_report.has_issue_in_checkers({"FirstChecker", "SecondChecker"}) == True
)

assert result_report.has_issue_in_checkers({"FirstChecker", "ThirdChecker"}) == True

assert result_report.has_issue_in_checkers({}) == False


def test_all_checkers_completed_without_issue() -> None:
result_report = Result()

result_report.register_checker_bundle(
name="TestBundle",
build_date="2024-05-31",
description="Example checker bundle",
version="0.0.1",
)

result_report.register_checker(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
description="",
)

result_report.register_checker(
checker_bundle_name="TestBundle",
checker_id="SecondChecker",
description="",
)

assert result_report.all_checkers_completed_without_issue({"ThirdChecker"}) == False

assert (
result_report.all_checkers_completed_without_issue(
{"FirstChecker", "SecondChecker"}
)
== False
)

result_report.set_checker_status(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
status=StatusType.COMPLETED,
)

assert result_report.all_checkers_completed_without_issue({"FirstChecker"}) == True
assert (
result_report.all_checkers_completed_without_issue(
{"FirstChecker", "SecondChecker"}
)
== False
)

result_report.set_checker_status(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
status=StatusType.SKIPPED,
)

assert result_report.all_checkers_completed_without_issue({"FirstChecker"}) == False

result_report.set_checker_status(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
status=StatusType.ERROR,
)

assert result_report.all_checkers_completed_without_issue({"FirstChecker"}) == False

result_report.set_checker_status(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
status=StatusType.COMPLETED,
)

result_report.set_checker_status(
checker_bundle_name="TestBundle",
checker_id="SecondChecker",
status=StatusType.COMPLETED,
)

assert (
result_report.all_checkers_completed_without_issue(
{"FirstChecker", "SecondChecker"}
)
== True
)

rule_uid_1 = result_report.register_rule(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
emanating_entity="test.com",
standard="qc",
definition_setting="1.0.0",
rule_full_name="first.rule",
)

result_report.register_issue(
checker_bundle_name="TestBundle",
checker_id="FirstChecker",
description="Issue found at odr",
level=IssueSeverity.INFORMATION,
rule_uid=rule_uid_1,
)

assert (
result_report.all_checkers_completed_without_issue(
{"FirstChecker", "SecondChecker"}
)
== False
)

assert result_report.all_checkers_completed_without_issue({"FirstChecker"}) == False
assert result_report.all_checkers_completed_without_issue({"SecondChecker"}) == True
assert result_report.all_checkers_completed_without_issue({}) == True


def test_registration_without_summary() -> None:
Expand Down

0 comments on commit 7c1825e

Please sign in to comment.