Skip to content

Commit 9bb868d

Browse files
committed
main merge
2 parents 2684c07 + d1e351e commit 9bb868d

22 files changed

Lines changed: 264 additions & 228 deletions

ted_sws/core/model/manifestation.py

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
# Email: costezki.eugen@gmail.com
77

88
""" """
9+
from datetime import datetime
910
from enum import Enum
10-
from typing import List
11+
from typing import List, Union, Optional
1112

12-
from pydantic import BaseModel, Field
13+
from pydantic import Field
1314

1415
from ted_sws.core.model import PropertyBaseModel
1516

@@ -57,10 +58,73 @@ class RDFValidationManifestation(Manifestation):
5758
"""
5859
The validation report
5960
"""
61+
created: str = datetime.now().isoformat()
62+
test_suite_identifier: str
63+
mapping_suite_identifier: str
64+
65+
66+
class SPARQLQuery(PropertyBaseModel):
67+
"""
68+
Stores SPARQL query details
69+
"""
70+
title: Optional[str]
71+
description: Optional[str]
72+
query: str
73+
74+
75+
class SPARQLQueryResult(PropertyBaseModel):
76+
"""
77+
Stores SPARQL query execution result
78+
"""
79+
query: SPARQLQuery
80+
result: Optional[str]
81+
error: Optional[str]
82+
identifier: Optional[str]
83+
84+
85+
class SPARQLTestSuiteValidationReport(RDFValidationManifestation):
86+
"""
87+
Stores execution results for a SPARQL test suite
88+
"""
89+
validation_results: Union[List[SPARQLQueryResult], str]
90+
91+
92+
class QueriedSHACLShapeValidationResult(PropertyBaseModel):
93+
"""
94+
Queried SHACL Validation Report which contains the following variables
95+
?focusNode ?message ?resultPath ?resultSeverity ?sourceConstraintComponent ?sourceShape ?value
96+
"""
97+
conforms: Optional[str]
98+
results_dict: Optional[dict]
99+
error: Optional[str]
100+
identifier: Optional[str]
101+
102+
103+
class SHACLTestSuiteValidationReport(RDFValidationManifestation):
104+
"""
105+
This is validation report for a SHACL test suite that contains json and html representation
106+
"""
107+
validation_results: Union[QueriedSHACLShapeValidationResult, str]
60108

61109

62110
class RDFManifestation(Manifestation):
63111
"""
64112
Transformed manifestation in RDF format
65113
"""
66-
validation: List[RDFValidationManifestation] = []
114+
shacl_validations: List[SHACLTestSuiteValidationReport] = []
115+
sparql_validations: List[SPARQLTestSuiteValidationReport] = []
116+
117+
def add_validation(self, validation: Union[SPARQLTestSuiteValidationReport, SHACLTestSuiteValidationReport]):
118+
if type(validation) == SHACLTestSuiteValidationReport:
119+
shacl_validation: SHACLTestSuiteValidationReport = validation
120+
if shacl_validation not in self.shacl_validations:
121+
self.shacl_validations.append(shacl_validation)
122+
elif type(validation) == SPARQLTestSuiteValidationReport:
123+
sparql_validation: SPARQLTestSuiteValidationReport = validation
124+
if sparql_validation not in self.sparql_validations:
125+
self.sparql_validations.append(sparql_validation)
126+
127+
def is_validated(self) -> bool:
128+
if len(self.shacl_validations) and len(self.sparql_validations):
129+
return True
130+
return False

ted_sws/core/model/notice.py

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
from datetime import datetime
1717
from enum import IntEnum
1818
from functools import total_ordering
19-
from typing import Optional, List
19+
from typing import Optional, List, Union
2020

2121
from pydantic import Field
2222

2323
from ted_sws.core.model import PropertyBaseModel
2424
from ted_sws.core.model.manifestation import METSManifestation, RDFManifestation, XMLManifestation, \
25-
RDFValidationManifestation
25+
RDFValidationManifestation, SPARQLTestSuiteValidationReport, SHACLTestSuiteValidationReport
2626
from ted_sws.core.model.metadata import TEDMetadata, NormalisedMetadata, XMLMetadata
2727

2828

@@ -184,13 +184,23 @@ def mets_manifestation(self) -> METSManifestation:
184184
def get_rdf_validation(self) -> Optional[List[RDFValidationManifestation]]:
185185
if not self.rdf_manifestation:
186186
return None
187-
188-
return self.rdf_manifestation.validation
187+
result = []
188+
for shacl_validation in self.rdf_manifestation.shacl_validations:
189+
result.append(shacl_validation)
190+
for sparql_validation in self.rdf_manifestation.sparql_validations:
191+
result.append(sparql_validation)
192+
return result
189193

190194
def get_distilled_rdf_validation(self) -> Optional[List[RDFValidationManifestation]]:
191195
if not self.distilled_rdf_manifestation:
192196
return None
193-
return self.distilled_rdf_manifestation.validation
197+
result = []
198+
for shacl_validation in self.distilled_rdf_manifestation.shacl_validations:
199+
result.append(shacl_validation)
200+
for sparql_validation in self.distilled_rdf_manifestation.sparql_validations:
201+
result.append(sparql_validation)
202+
203+
return result
194204

195205
def set_preprocessed_xml_manifestation(self, preprocessed_xml_manifestation: XMLManifestation):
196206
"""
@@ -237,25 +247,23 @@ def set_rdf_manifestation(self, rdf_manifestation: RDFManifestation):
237247
if self.rdf_manifestation == rdf_manifestation:
238248
return
239249
self._rdf_manifestation = rdf_manifestation
240-
if not rdf_manifestation.validation:
250+
if (not rdf_manifestation.sparql_validations) and (not rdf_manifestation.shacl_validations):
241251
self.update_status_to(NoticeStatus.TRANSFORMED)
242252
else:
243253
self.update_status_to(NoticeStatus.VALIDATED)
244254

245255
def _check_status_is_validated(self) -> bool:
256+
"""
246257
247-
def _get_number_of_validation_types(validations: List[RDFValidationManifestation]):
248-
unique_validation_types = set([type(validation).__name__ for validation in validations])
249-
return len(unique_validation_types)
250-
258+
:return:
259+
"""
251260
if self._rdf_manifestation and self._distilled_rdf_manifestation:
252-
if self._rdf_manifestation.validation and self._distilled_rdf_manifestation.validation:
253-
if (_get_number_of_validation_types(self._rdf_manifestation.validation) > 1) and (
254-
_get_number_of_validation_types(self._distilled_rdf_manifestation.validation) > 1):
255-
return True
261+
if self._rdf_manifestation.is_validated() and self._distilled_rdf_manifestation.is_validated():
262+
return True
256263
return False
257264

258-
def set_rdf_validation(self, rdf_validation: RDFValidationManifestation):
265+
def set_rdf_validation(self,
266+
rdf_validation: Union[SPARQLTestSuiteValidationReport, SHACLTestSuiteValidationReport]):
259267
"""
260268
Add an RDF validation result to the notice.
261269
If METS package data are available, erase them and reset the state.
@@ -265,23 +273,23 @@ def set_rdf_validation(self, rdf_validation: RDFValidationManifestation):
265273
if not self.rdf_manifestation:
266274
raise ValueError("Cannot set the RDF validation of a non-existent RDF manifestation")
267275

268-
for validation in self._rdf_manifestation.validation:
269-
if validation == rdf_validation:
270-
return
276+
self._rdf_manifestation.add_validation(validation=rdf_validation)
271277

272-
self._rdf_manifestation.validation.append(rdf_validation)
273278
if self._check_status_is_validated():
274279
self.update_status_to(NoticeStatus.VALIDATED)
275280

276-
def set_distilled_rdf_validation(self, rdf_validation: RDFValidationManifestation):
277-
if not self.distilled_rdf_manifestation:
281+
def set_distilled_rdf_validation(self, rdf_validation: Union[
282+
SPARQLTestSuiteValidationReport, SHACLTestSuiteValidationReport]):
283+
"""
284+
285+
:param rdf_validation:
286+
:return:
287+
"""
288+
if not self._distilled_rdf_manifestation:
278289
raise ValueError("Cannot set the RDF validation of a non-existent RDF manifestation")
279290

280-
for validation in self._distilled_rdf_manifestation.validation:
281-
if validation == rdf_validation:
282-
return
291+
self._distilled_rdf_manifestation.add_validation(validation=rdf_validation)
283292

284-
self._distilled_rdf_manifestation.validation.append(rdf_validation)
285293
if self._check_status_is_validated():
286294
self.update_status_to(NoticeStatus.VALIDATED)
287295

ted_sws/core/model/validate.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +0,0 @@
1-
#!/usr/bin/python3
2-
3-
# validation.py
4-
# Date: 29/01/2022
5-
# Author: Eugeniu Costetchi
6-
# Email: costezki.eugen@gmail.com
7-
8-
""" """

ted_sws/data_manager/adapters/notice_repository.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,17 @@ def write_large_field(large_field: Manifestation):
7676
write_large_field(notice.distilled_rdf_manifestation)
7777
write_large_field(notice.preprocessed_xml_manifestation)
7878
if notice.rdf_manifestation:
79-
for validation_report in notice.rdf_manifestation.validation:
79+
for validation_report in notice.rdf_manifestation.shacl_validations:
80+
write_large_field(validation_report)
81+
82+
for validation_report in notice.rdf_manifestation.sparql_validations:
8083
write_large_field(validation_report)
8184

8285
if notice.distilled_rdf_manifestation:
83-
for validation_report in notice.distilled_rdf_manifestation.validation:
86+
for validation_report in notice.distilled_rdf_manifestation.shacl_validations:
87+
write_large_field(validation_report)
88+
89+
for validation_report in notice.distilled_rdf_manifestation.sparql_validations:
8490
write_large_field(validation_report)
8591

8692
return notice
@@ -102,10 +108,16 @@ def load_large_field(large_field: Manifestation):
102108
load_large_field(large_field=notice.distilled_rdf_manifestation)
103109
load_large_field(large_field=notice.preprocessed_xml_manifestation)
104110
if notice.rdf_manifestation:
105-
for validation_report in notice.rdf_manifestation.validation:
111+
for validation_report in notice.rdf_manifestation.shacl_validations:
106112
load_large_field(validation_report)
113+
for validation_report in notice.rdf_manifestation.sparql_validations:
114+
load_large_field(validation_report)
115+
107116
if notice.distilled_rdf_manifestation:
108-
for validation_report in notice.distilled_rdf_manifestation.validation:
117+
for validation_report in notice.distilled_rdf_manifestation.shacl_validations:
118+
load_large_field(validation_report)
119+
120+
for validation_report in notice.distilled_rdf_manifestation.sparql_validations:
109121
load_large_field(validation_report)
110122

111123
return notice

ted_sws/notice_validator/entrypoints/cli/cmd_shacl_runner.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
import click
66

77
from ted_sws.core.adapters.cmd_runner import CmdRunner as BaseCmdRunner, DEFAULT_MAPPINGS_PATH, DEFAULT_OUTPUT_PATH
8-
from ted_sws.core.model.manifestation import RDFManifestation
8+
from ted_sws.core.model.manifestation import RDFManifestation, SHACLTestSuiteValidationReport
99
from ted_sws.data_manager.adapters.mapping_suite_repository import MappingSuiteRepositoryInFileSystem
1010
from ted_sws.event_manager.adapters.logger import LOG_INFO_TEXT
11-
from ted_sws.notice_validator.model.shacl_test_suite import SHACLSuiteValidationReport
12-
from ted_sws.notice_validator.services.shacl_test_suite_runner import SHACLTestSuiteRunner, SHACLReportBuilder
11+
from ted_sws.notice_validator.services.shacl_test_suite_runner import SHACLTestSuiteRunner, generate_shacl_report
1312

1413
DEFAULT_RDF_FOLDER = '{mappings_path}/{mapping_suite_id}/' + DEFAULT_OUTPUT_PATH
1514
DEFAULT_TEST_SUITE_REPORT_FOLDER = "test_suite_report"
@@ -57,8 +56,7 @@ def validate(self, rdf_file, base_report_path):
5756
shacl_test_suite=shacl_test_suite,
5857
mapping_suite=self.mapping_suite).execute_test_suite()
5958

60-
report_builder = SHACLReportBuilder(shacl_test_suite_execution=test_suite_execution)
61-
report: SHACLSuiteValidationReport = report_builder.generate_report()
59+
report: SHACLTestSuiteValidationReport = generate_shacl_report(shacl_test_suite_execution=test_suite_execution)
6260

6361
suite_id = shacl_test_suite.identifier
6462
data = report.object_data

ted_sws/notice_validator/entrypoints/cli/cmd_sparql_runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import click
77

88
from ted_sws.core.adapters.cmd_runner import CmdRunner as BaseCmdRunner, DEFAULT_MAPPINGS_PATH, DEFAULT_OUTPUT_PATH
9-
from ted_sws.core.model.manifestation import RDFManifestation, RDFValidationManifestation
9+
from ted_sws.core.model.manifestation import RDFManifestation
1010
from ted_sws.data_manager.adapters.mapping_suite_repository import MappingSuiteRepositoryInFileSystem
1111
from ted_sws.event_manager.adapters.logger import LOG_INFO_TEXT
1212
from ted_sws.notice_validator.services.sparql_test_suite_runner import SPARQLTestSuiteRunner, SPARQLReportBuilder

ted_sws/notice_validator/model/__init__.py

Whitespace-only changes.

ted_sws/notice_validator/model/shacl_test_suite.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

ted_sws/notice_validator/model/sparql_test_suite.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

ted_sws/notice_validator/resources/templates/shacl_shape_validation_results_report.jinja2

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<h2>Report details: </h2>
3030
<ul>
3131
<li>Date created: {{ created }}</li>
32-
<li>SHACL test suite identifier: {{ shacl_test_suite_identifier }}</li>
32+
<li>SHACL test suite identifier: {{ test_suite_identifier }}</li>
3333
<li>Mapping suite identifier: {{ mapping_suite_identifier }}</li>
3434
</ul>
3535
<hr>
@@ -44,18 +44,18 @@
4444
</thead>
4545
<tbody>
4646
<tr>
47-
<td>{{ validation_result.identifier }}</td>
48-
<td{% if validation_result.conforms == "True" %}
49-
class="success"{% endif %}>{{ validation_result.conforms }}</td>
50-
<td>{{ validation_result.error }}</td>
47+
<td>{{ validation_results.identifier }}</td>
48+
<td{% if validation_results.conforms == "True" %}
49+
class="success"{% endif %}>{{ validation_results.conforms }}</td>
50+
<td>{{ validation_results.error }}</td>
5151
</tr>
5252
</tbody>
5353
</table>
5454

55-
{% if validation_result.results_dict %}
55+
{% if validation_results.results_dict %}
5656
<hr>
5757
<h2>Extended results</h2>
58-
<h1>{{ validation_result.identifier }}</h1>
58+
<h1>{{ validation_results.identifier }}</h1>
5959
<table class="display">
6060
<thead class="center aligned">
6161
<tr>
@@ -67,7 +67,7 @@
6767
</tr>
6868
</thead>
6969
<tbody>
70-
{% for biding in validation_result.results_dict.results.bindings %}
70+
{% for biding in validation_results.results_dict.results.bindings %}
7171
<tr>
7272
<td>{{ biding.focusNode.value }}</td>
7373
<td>{{ biding.resultPath.value }}</td>

0 commit comments

Comments
 (0)