Skip to content

Commit 39584da

Browse files
authored
Merge pull request #474 from OP-TED/feature/TED-1224
XPATHs coverage to support Mapping Remarks
2 parents 8e50c6c + 30a517d commit 39584da

4 files changed

Lines changed: 64 additions & 13 deletions

File tree

ted_sws/core/model/manifestation.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class XPATHCoverageValidationResultBase(PropertyBaseModel):
155155
xpath_covered: Optional[List[str]] = []
156156
xpath_not_covered: Optional[List[str]] = []
157157
xpath_extra: Optional[List[str]] = []
158+
remarked_xpaths: Optional[List[str]] = []
158159
coverage: Optional[float]
159160
conceptual_coverage: Optional[float]
160161

ted_sws/mapping_suite_processor/adapters/conceptual_mapping_reader.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def _read_conceptual_mapping_rules(cls, df: pd.DataFrame) -> List[ConceptualMapp
147147
return rules
148148

149149
@classmethod
150-
def _read_conceptual_mapping_remarks(cls, df: pd.DataFrame) -> List[ConceptualMappingRemark]:
150+
def _read_conceptual_mapping_remarks(cls, df: pd.DataFrame, base_xpath: str) -> List[ConceptualMappingRemark]:
151151
"""
152152
153153
:param df:
@@ -161,7 +161,11 @@ def _read_conceptual_mapping_remarks(cls, df: pd.DataFrame) -> List[ConceptualMa
161161
remark = ConceptualMappingRemark()
162162
remark.standard_form_field_id = cls._read_pd_value(row[RULES_SF_FIELD_ID])
163163
remark.standard_form_field_name = cls._read_pd_value(row[RULES_SF_FIELD_NAME])
164-
remark.field_xpath = cls._read_list_from_pd_multiline_value(row[RULES_FIELD_XPATH])
164+
remarked_xpaths = cls._read_list_from_pd_multiline_value(row[RULES_FIELD_XPATH])
165+
if remarked_xpaths:
166+
remark.field_xpath = []
167+
for remarked_xpath in remarked_xpaths:
168+
remark.field_xpath.append(cls.xpath_with_base(remarked_xpath, base_xpath))
165169
remarks.append(remark)
166170
return remarks
167171

@@ -273,7 +277,7 @@ def mapping_suite_read_conceptual_mapping(cls, conceptual_mappings_file_path: Pa
273277
conceptual_mapping.metadata = metadata
274278
conceptual_mapping.rules = cls._read_conceptual_mapping_rules(dfs[CONCEPTUAL_MAPPINGS_RULES_SHEET_NAME])
275279
conceptual_mapping.mapping_remarks = cls._read_conceptual_mapping_remarks(
276-
dfs[CONCEPTUAL_MAPPINGS_REMARKS_SHEET_NAME])
280+
dfs[CONCEPTUAL_MAPPINGS_REMARKS_SHEET_NAME], base_xpath=metadata.base_xpath)
277281
conceptual_mapping.resources = cls._read_conceptual_mapping_resources(
278282
dfs[CONCEPTUAL_MAPPINGS_RESOURCES_SHEET_NAME])
279283
conceptual_mapping.rml_modules = cls._read_conceptual_mapping_rml_modules(

ted_sws/notice_validator/adapters/xpath_coverage_runner.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class CoverageRunner:
2525
mapping_suite: MappingSuite
2626
mapping_suite_id: str
2727
conceptual_xpaths: Set[str] = set()
28+
conceptual_remarked_xpaths: Set[str] = set()
2829
conceptual_xpath_data: Dict[str, ConceptualMappingXPATH] = {}
2930
base_xpath: str
3031

@@ -41,6 +42,13 @@ def notice_xpaths(self, notice: Notice) -> List[str]:
4142
return notice.xml_metadata.unique_xpaths
4243

4344
def init_xpath_data(self, conceptual_mapping: ConceptualMapping):
45+
for cm_xpath in conceptual_mapping.mapping_remarks:
46+
for xpath in cm_xpath.field_xpath:
47+
self.conceptual_remarked_xpaths.add(xpath)
48+
self.conceptual_xpath_data[xpath] = ConceptualMappingXPATH(
49+
xpath=xpath,
50+
form_field=f"{cm_xpath.standard_form_field_id} - {cm_xpath.standard_form_field_name}"
51+
)
4452
for cm_xpath in conceptual_mapping.xpaths:
4553
self.conceptual_xpaths.add(cm_xpath.xpath)
4654
self.conceptual_xpath_data[cm_xpath.xpath] = cm_xpath
@@ -63,10 +71,13 @@ def find_notice_by_xpath(cls, notice_xpaths: XPathDict, xpath: str) -> Dict[str,
6371
notice_hit: Dict[str, int] = {k: v.count(xpath) for k, v in sorted(notice_xpaths.items()) if xpath in v}
6472
return notice_hit
6573

74+
def get_all_conceptual_xpaths(self) -> Set[str]:
75+
return self.conceptual_remarked_xpaths | self.conceptual_xpaths
76+
6677
def xpath_assertions(self, notice_xpaths: XPathDict,
6778
xpaths_list: List[str]) -> List[XPATHCoverageValidationAssertion]:
6879
xpath_assertions = []
69-
for xpath in self.conceptual_xpaths:
80+
for xpath in self.get_all_conceptual_xpaths():
7081
xpath_assertion = XPATHCoverageValidationAssertion()
7182
xpath_data = self.conceptual_xpath_data[xpath]
7283
form_field = xpath_data.form_field
@@ -85,8 +96,10 @@ def validate_xpath_coverage_report(self, report: XPATHCoverageValidationReport,
8596
validation_result: XPATHCoverageValidationResult = XPATHCoverageValidationResult()
8697
validation_result.xpath_assertions = self.xpath_assertions(notice_xpaths, xpaths_list)
8798
validation_result.xpath_covered = sorted(list(self.conceptual_xpaths & unique_notice_xpaths))
88-
validation_result.xpath_not_covered = sorted(list(unique_notice_xpaths - self.conceptual_xpaths))
89-
validation_result.xpath_extra = sorted(list(self.conceptual_xpaths - unique_notice_xpaths))
99+
all_conceptual_xpaths = self.get_all_conceptual_xpaths()
100+
validation_result.xpath_not_covered = sorted(list(unique_notice_xpaths - all_conceptual_xpaths))
101+
validation_result.xpath_extra = sorted(list(all_conceptual_xpaths - unique_notice_xpaths))
102+
validation_result.remarked_xpaths = sorted(list(self.conceptual_remarked_xpaths))
90103
unique_notice_xpaths_len = len(unique_notice_xpaths)
91104
xpath_covered_len = len(validation_result.xpath_covered)
92105
conceptual_xpaths_len = len(self.conceptual_xpaths)
@@ -139,4 +152,3 @@ def html_report(cls, report: XPATHCoverageValidationReport, metadata: dict = Non
139152
data[TEMPLATE_METADATA_KEY] = metadata
140153
html_report = TEMPLATES.get_template(XPATH_COVERAGE_REPORT_TEMPLATE).render(data)
141154
return html_report
142-

ted_sws/notice_validator/resources/templates/xpath_coverage_report.jinja2

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@
6969
[data-role=collapsible] .ui-collapsible-content {
7070
padding: 10px;
7171
}
72+
73+
hr {
74+
margin: 12px 0;
75+
height: 5PX;
76+
background: #ccc;
77+
border: 0;
78+
}
7279
</style>
7380
</head>
7481
<body>
@@ -113,7 +120,7 @@
113120
{% if validation_result.xpath_assertions|length > 0 %}
114121
<hr>
115122
<h2>XPATH Assertions</h2>
116-
<table class="display" data-order='[[0, "asc"]]'>
123+
<table class="display results" data-order='[[0, "asc"]]'>
117124
<thead>
118125
<tr>
119126
<th>Form Field</th>
@@ -145,8 +152,8 @@
145152
{% endif %}
146153
{% if validation_result.xpath_covered|length > 0 %}
147154
<hr>
148-
<h2>XPATHs covered by Conceptual Mapping</h2>
149-
<table class="display" data-order='[[0, "asc"]]'>
155+
<h2>XPATHs covered in the "Rules" of Conceptual Mapping</h2>
156+
<table class="display summary" data-order='[[0, "asc"]]'>
150157
<thead>
151158
<tr>
152159
<th>XPATH</th>
@@ -161,10 +168,28 @@
161168
</tbody>
162169
</table>
163170
{% endif %}
171+
{% if validation_result.remarked_xpaths|length > 0 %}
172+
<hr>
173+
<h2>XPATHs covered in the "Mapping Remarks" of Conceptual Mapping</h2>
174+
<table class="display summary" data-order='[[0, "asc"]]'>
175+
<thead>
176+
<tr>
177+
<th>XPATH</th>
178+
</tr>
179+
</thead>
180+
<tbody>
181+
{% for xpath in validation_result.remarked_xpaths %}
182+
<tr>
183+
<td class="break-word">{{ xpath }}</td>
184+
</tr>
185+
{% endfor %}
186+
</tbody>
187+
</table>
188+
{% endif %}
164189
{% if validation_result.xpath_not_covered|length > 0 %}
165190
<hr>
166191
<h2>XPATHs not covered by Conceptual Mapping</h2>
167-
<table class="display" data-order='[[0, "asc"]]'>
192+
<table class="display summary" data-order='[[0, "asc"]]'>
168193
<thead>
169194
<tr>
170195
<th>XPATH</th>
@@ -182,7 +207,7 @@
182207
{% if validation_result.xpath_extra|length > 0 %}
183208
<hr>
184209
<h2>Extra XPATHs in Conceptual Mapping</h2>
185-
<table class="display" data-order='[[0, "asc"]]'>
210+
<table class="display summary" data-order='[[0, "asc"]]'>
186211
<thead>
187212
<tr>
188213
<th>XPATH</th>
@@ -214,7 +239,7 @@
214239
$c.attr("data-state", $c.attr("data-state") == "collapsed" ? "expanded" : "collapsed");
215240
return false;
216241
});
217-
$("table.display").DataTable({
242+
$("table.display.results").DataTable({
218243
dom: 'B<"clear">lfiprtip',
219244
buttons: [],
220245
"lengthMenu": [[5, 15, 30, -1], [5, 15, 30, "All"]],
@@ -227,6 +252,15 @@
227252
]
228253
});
229254
255+
$("table.display.summary").DataTable({
256+
dom: 'B<"clear">lfiprtip',
257+
buttons: [],
258+
"lengthMenu": [[5, 15, 30, -1], [5, 15, 30, "All"]],
259+
"pageLength": 15,
260+
responsive: {
261+
details: true
262+
}
263+
});
230264
});
231265
232266
</script>

0 commit comments

Comments
 (0)