Skip to content

Commit 00ddd8a

Browse files
Merge branch 'main' into feature/TED-1043
2 parents 94b1dcc + c75cf0c commit 00ddd8a

21 files changed

Lines changed: 164 additions & 29 deletions

File tree

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# TED Semantic Web Services
1+
# TED-RDF Conversion Pipeline
22

33
[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=meaningfy-ws_ted-sws&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=meaningfy-ws_ted-sws)
44
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=meaningfy-ws_ted-sws&metric=bugs)](https://sonarcloud.io/summary/new_code?id=meaningfy-ws_ted-sws)
@@ -18,10 +18,10 @@
1818

1919
## Documentation
2020

21-
If you contribute to this projector are simple user please refer to the following project documentation:
21+
This repository is part of the TED Semantic Web Services, aka TED-SWS System. If you would like to contribute to this project, or you are a simple user, please refer to the following project documentation pages:
2222

23-
* [Project documentation ](https://docs.ted.europa.eu/ted-rdf-conversion-pipeline/ted-sws/index.html)
24-
* [GitHub pages with the enterprise architecture (in development)](https://docs.ted.europa.eu/ted-rdf-conversion-pipeline/ted-sws/_attachments/ted-sws-architecture/index.html)
23+
* [Project documentation ](https://docs.ted.europa.eu/rdf-conversion/index.html)
24+
* [GitHub pages with the enterprise architecture (in development)](https://docs.ted.europa.eu/rdf-conversion/_attachments/ted-sws-architecture/index.html)
2525
* [Enterprise architecture model file (in development)](https://drive.google.com/file/d/1YB2dPYe9E9bAR2peVraQaUANS-hXetms/view?usp=sharing)
2626

2727

@@ -30,8 +30,8 @@ Two sets of installation instruction are foreseen: one for the software engineer
3030
The software engineers need these instructions to deploy on a local or a single machine testing server.
3131
The semantic engineers need a set of CLI tools that help develop, validate and publish mapping suites.
3232

33-
* [Demo & Testing installation instructions for software engineers](https://docs.ted.europa.eu/ted-rdf-conversion-pipeline/ted-sws/demo_installation.html)
34-
* [Installation & Usage instructions for the Mapping Suite CLI toolchain](https://docs.ted.europa.eu/ted-rdf-conversion-pipeline/ted-sws/mapping_suite_cli_toolchain.html)
33+
* [Demo & Testing installation instructions for software engineers](https://docs.ted.europa.eu/rdf-conversion/demo_installation.html)
34+
* [Installation & Usage instructions for the Mapping Suite CLI toolchain](https://docs.ted.europa.eu/rdf-conversion/mapping_suite_cli_toolchain.html)
3535

3636
## Contributing
3737

docs/antora/modules/ROOT/nav.adoc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

22
* xref:index.adoc[Home]
33
* link:{attachmentsdir}/ted-sws-architecture/index.html[Preliminary Project Architecture^]
4-
* xref:mapping_suite_cli_toolchain.adoc[Mapping Suite CLI Toolchain]
4+
* xref:mapping_suite_cli_toolchain.adoc[Mapping Suite CLI Toolchain]
5+
* xref:demo_installation.adoc[Instructions for Software Engineers]

docs/antora/modules/ROOT/pages/index.adoc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
= TED-SWS Project documentation
1+
= TED-RDF Conversion Pipeline Documentation
2+
3+
The TED-RDF Conversion Pipeline, which is part of the TED Semantic Web Services, aka TED-SWS system, provides tools an infrastructure to convert TED notices available in XML format into RDF. This conversion pipeline is designed to work with the https://docs.ted.europa.eu/rdf-mapping/index.html[TED-RDF Mappings].
4+
5+
== Quick references for users
26

37
* xref:mapping_suite_cli_toolchain.adoc[Installation and usage instructions for the Mapping Suite CLI toolchain]
48
* link:{attachmentsdir}/ted-sws-architecture/index.html[Preliminary project architecture (in progress)^]

docs/antora/modules/ROOT/pages/mapping_suite_cli_toolchain.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
= Mapping Suite CLI toolchain
22

3-
This set of instructions is prepared fo semantic engineers who intend to work with mapping suites.
3+
This set of instructions is prepared fo semantic engineers who intend to work with mapping suites already available or being developed in the https://docs.ted.europa.eu/rdf-mapping/index.html[TED-RDF Mappings] repository.
44

55
== Installation instructions for semantic engineers
66

ted_sws/core/model/transform.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,37 @@ class ConceptualMappingRMLModule(MappingSuiteComponent):
147147
file_name: Optional[str]
148148

149149

150+
class ConceptualMappingRemark(MappingSuiteComponent):
151+
"""
152+
153+
"""
154+
standard_form_field_id: Optional[str]
155+
standard_form_field_name: Optional[str]
156+
field_xpath: Optional[List[str]]
157+
158+
159+
class ConceptualMappingControlList(MappingSuiteComponent):
160+
"""
161+
162+
"""
163+
field_value: Optional[str]
164+
mapping_reference: Optional[str]
165+
super_type: Optional[str]
166+
xml_path_fragment: Optional[str]
167+
168+
150169
class ConceptualMapping(MappingSuiteComponent):
151170
"""
152171
153172
"""
154173
xpaths: List[ConceptualMappingXPATH] = []
155174
metadata: Optional[ConceptualMappingMetadata]
156175
rules: List[ConceptualMappingRule] = []
176+
mapping_remarks: List[ConceptualMappingRemark] = []
157177
resources: List[ConceptualMappingResource] = []
158178
rml_modules: List[ConceptualMappingRMLModule] = []
179+
cl1_roles: List[ConceptualMappingControlList] = []
180+
cl2_organisations: List[ConceptualMappingControlList] = []
159181

160182

161183
class MappingSuite(MappingSuiteComponent):
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
CONCEPTUAL_MAPPINGS_METADATA_SHEET_NAME = "Metadata"
22
CONCEPTUAL_MAPPINGS_RULES_SHEET_NAME = "Rules"
3+
CONCEPTUAL_MAPPINGS_REMARKS_SHEET_NAME = "Mapping Remarks"
34
CONCEPTUAL_MAPPINGS_RESOURCES_SHEET_NAME = "Resources"
45
CONCEPTUAL_MAPPINGS_RML_MODULES_SHEET_NAME = "RML_Modules"
6+
CONCEPTUAL_MAPPINGS_CL1_ROLES_SHEET_NAME = "CL1 Controlled List of Roles"
7+
CONCEPTUAL_MAPPINGS_CL2_ORGANISATIONS_SHEET_NAME = "CL2 Controlled List for Organis"
58

69
RULES_E_FORM_BT_NAME = 'eForm BT Name (Provisional/Indicative) (O)'
710
RULES_FIELD_XPATH = 'Field XPath (M)'
811
RULES_FIELD_XPATH_CONDITION = 'Field XPath condition (M)'
912
RULES_SF_FIELD_ID = 'Standard Form Field ID (M)'
1013
RULES_SF_FIELD_NAME = 'Standard Form Field Name (M)'
1114
RULES_E_FORM_BT_ID = 'eForm BT-ID (Provisional/Indicative) (O)'
15+
16+
CL_FIELD_VALUE = 'Field Value (in XML)'
17+
CL_MAPPING_REFERENCE = 'Mapping Reference (in ePO)'
18+
CL_SUPERTYPE = 'SuperType'
19+
CL_XML_PATH_FRAGMENT = 'XML PATH Fragment'

ted_sws/mapping_suite_processor/entrypoints/cli/cmd_conceptual_mapping_differ.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44
from pathlib import Path
55

66
import click
7-
from ted_sws.event_manager.adapters.log import LOG_WARN_TEXT
7+
from pydantic.utils import deep_update
88

99
from ted_sws.core.adapters.cmd_runner import CmdRunner as BaseCmdRunner, DEFAULT_MAPPINGS_PATH
10+
from ted_sws.core.model.transform import ConceptualMappingDiff
11+
from ted_sws.event_manager.adapters.log import LOG_WARN_TEXT
1012
from ted_sws.mapping_suite_processor.entrypoints.cli import CONCEPTUAL_MAPPINGS_FILE_TEMPLATE
1113
from ted_sws.mapping_suite_processor.services.conceptual_mapping_differ import \
1214
mapping_suite_diff_files_conceptual_mappings, mapping_suite_diff_repo_conceptual_mappings, \
13-
generate_conceptual_mappings_diff_html_report, transform_conceptual_mappings_diff_data
14-
from ted_sws.core.model.transform import ConceptualMappingDiff
15+
generate_conceptual_mappings_diff_html_report, generate_conceptual_mappings_diff_filename
1516

1617
CMD_NAME = "CMD_CONCEPTUAL_MAPPING_DIFFER"
1718

1819
DEFAULT_REPORT_OUTPUT_FOLDER = "."
19-
DEFAULT_REPORT_FILE_NAME = "conceptual_mappings_diff"
2020

2121
"""
2222
USAGE:
@@ -51,16 +51,27 @@ def __init__(
5151
self.output_folder = output_folder
5252

5353
def _report(self, diff, files: list):
54-
data = diff['data']
55-
report_file_file_name_json = Path(self.output_folder) / (DEFAULT_REPORT_FILE_NAME + ".json")
54+
diff['metadata'] = deep_update(diff['metadata'], {
55+
"branches": self.branches,
56+
"mapping_suite_ids": self.mapping_suite_ids,
57+
"files": files
58+
})
59+
diff_object = ConceptualMappingDiff(**diff)
60+
filename_base = generate_conceptual_mappings_diff_filename(diff_object)
61+
output_path: Path = Path(self.output_folder)
62+
63+
report_file_file_name_json = output_path / (filename_base + ".json")
5664
with open(report_file_file_name_json, 'w+') as report_file:
57-
report_file.write(json.dumps(data, indent=2))
58-
report_file_file_name_html = Path(self.output_folder) / (DEFAULT_REPORT_FILE_NAME + ".html")
65+
report_file.write(json.dumps(diff, indent=2))
66+
67+
report_file_file_name_html = output_path / (filename_base + ".html")
5968
with open(report_file_file_name_html, 'w+') as report_file:
60-
report_file.write(
61-
generate_conceptual_mappings_diff_html_report(
62-
ConceptualMappingDiff(**diff))
63-
)
69+
report_file.write(generate_conceptual_mappings_diff_html_report(diff_object))
70+
71+
self.log(
72+
f"Generated {LOG_WARN_TEXT.format(report_file_file_name_json)}" +
73+
f" and {LOG_WARN_TEXT.format(report_file_file_name_html)} report files" +
74+
f" in \"{LOG_WARN_TEXT.format(self.output_folder)}\" folder.")
6475

6576
@classmethod
6677
def _conceptual_mappings_file_path(cls, mappings_path, mapping_suite_id):

ted_sws/mapping_suite_processor/services/conceptual_mapping_differ.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@
2121
GITHUB_CONCEPTUAL_MAPPINGS_PATH = "{GITHUB_BASE}/raw/{GIT_BRANCH}/mappings/{MAPPING_SUITE_ID}/" + \
2222
MS_TRANSFORM_FOLDER_NAME + "/" + MS_CONCEPTUAL_MAPPING_FILE_NAME
2323

24+
DEFAULT_REPORT_FILE_NAME = "cm_diff"
25+
2426

2527
class ConceptualMappingDiffDataTransformer:
2628
data: dict
2729
tabs: dict = {
2830
"metadata": {},
2931
"rules": {},
32+
"mapping_remarks": {},
3033
"resources": {},
31-
"rml_modules": {}
34+
"rml_modules": {},
35+
"cl1_roles": {},
36+
"cl2_organisations": {}
3237
}
3338
labels: dict
3439

@@ -45,8 +50,11 @@ def init_labels(cls):
4550
"tabs": {
4651
"metadata": "Metadata",
4752
"rules": "Rules",
53+
"mapping_remarks": "Remarks",
4854
"resources": "Resources",
49-
"rml_modules": "RML Modules"
55+
"rml_modules": "RML Modules",
56+
"cl1_roles": "CL1 Roles",
57+
"cl2_organisations": "CL2 Organisations"
5058
},
5159
"actions": {
5260
"set_item_added": "Set Added",
@@ -81,7 +89,11 @@ def init_labels(cls):
8189
"fragment_fingerprint": "Fragment Fingerprint",
8290
"file_name": "File name",
8391
"old_value": "Old value",
84-
"new_value": "New value"
92+
"new_value": "New value",
93+
"field_value": "Field Value (in XML)",
94+
"mapping_reference": "Mapping Reference (in ePO)",
95+
"super_type": "SuperType",
96+
"xml_path_fragment": "XML PATH Fragment"
8597
}
8698
}
8799

@@ -227,3 +239,19 @@ def generate_conceptual_mappings_diff_html_report(diff: ConceptualMappingDiff):
227239
)
228240
html_report = TEMPLATES.get_template(CONCEPTUAL_MAPPINGS_DIFF_HTML_REPORT_TEMPLATE).render(diff)
229241
return html_report
242+
243+
244+
def generate_conceptual_mappings_diff_filename(diff: ConceptualMappingDiff, prefix: str = DEFAULT_REPORT_FILE_NAME,
245+
ext: str = None) -> str:
246+
filename: str = prefix
247+
cm1_metadata: dict = diff.metadata.metadata[0]
248+
if cm1_metadata:
249+
filename += f"_{cm1_metadata['identifier']}_v{cm1_metadata['mapping_version']}"
250+
cm2_metadata: dict = diff.metadata.metadata[1]
251+
if cm2_metadata:
252+
if cm1_metadata:
253+
filename += "_vs"
254+
filename += f"_{cm2_metadata['identifier']}_v{cm2_metadata['mapping_version']}"
255+
if ext:
256+
filename += ext
257+
return filename

ted_sws/mapping_suite_processor/services/conceptual_mapping_reader.py

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
import pandas as pd
66

77
from ted_sws.core.model.transform import ConceptualMapping, ConceptualMappingXPATH, ConceptualMappingMetadata, \
8-
ConceptualMappingResource, ConceptualMappingMetadataConstraints, ConceptualMappingRule, ConceptualMappingRMLModule
8+
ConceptualMappingResource, ConceptualMappingMetadataConstraints, ConceptualMappingRule, ConceptualMappingRMLModule, \
9+
ConceptualMappingRemark, ConceptualMappingControlList
910
from ted_sws.mapping_suite_processor import CONCEPTUAL_MAPPINGS_METADATA_SHEET_NAME, \
1011
CONCEPTUAL_MAPPINGS_RULES_SHEET_NAME, RULES_FIELD_XPATH, RULES_SF_FIELD_ID, RULES_SF_FIELD_NAME, \
1112
CONCEPTUAL_MAPPINGS_RESOURCES_SHEET_NAME, CONCEPTUAL_MAPPINGS_RML_MODULES_SHEET_NAME, RULES_E_FORM_BT_ID, \
12-
RULES_E_FORM_BT_NAME, RULES_FIELD_XPATH_CONDITION
13+
RULES_E_FORM_BT_NAME, RULES_FIELD_XPATH_CONDITION, CONCEPTUAL_MAPPINGS_REMARKS_SHEET_NAME, \
14+
CONCEPTUAL_MAPPINGS_CL2_ORGANISATIONS_SHEET_NAME, CONCEPTUAL_MAPPINGS_CL1_ROLES_SHEET_NAME, CL_MAPPING_REFERENCE, \
15+
CL_SUPERTYPE, CL_FIELD_VALUE, CL_XML_PATH_FRAGMENT
1316
from ted_sws.mapping_suite_processor.services.conceptual_mapping_files_injection import FILE_NAME_KEY
1417
from ted_sws.notice_validator import BASE_XPATH_FIELD
1518

@@ -124,6 +127,25 @@ def _read_conceptual_mapping_rules(df: pd.DataFrame) -> List[ConceptualMappingRu
124127
return rules
125128

126129

130+
def _read_conceptual_mapping_remarks(df: pd.DataFrame) -> List[ConceptualMappingRemark]:
131+
"""
132+
133+
:param df:
134+
:return:
135+
"""
136+
137+
remarks_df = df[0:].copy()
138+
remarks = []
139+
remark: ConceptualMappingRemark
140+
for idx, row in remarks_df.iterrows():
141+
remark = ConceptualMappingRemark()
142+
remark.standard_form_field_id = _read_pd_value(row[RULES_SF_FIELD_ID])
143+
remark.standard_form_field_name = _read_pd_value(row[RULES_SF_FIELD_NAME])
144+
remark.field_xpath = _read_list_from_pd_multiline_value(row[RULES_FIELD_XPATH])
145+
remarks.append(remark)
146+
return remarks
147+
148+
127149
def _read_conceptual_mapping_resources(df: pd.DataFrame) -> List[ConceptualMappingResource]:
128150
"""
129151
@@ -156,6 +178,28 @@ def _read_conceptual_mapping_rml_modules(df: pd.DataFrame) -> List[ConceptualMap
156178
return rml_modules
157179

158180

181+
def _read_conceptual_mapping_control_list(df: pd.DataFrame) -> List[ConceptualMappingControlList]:
182+
"""
183+
184+
:param df:
185+
:return:
186+
"""
187+
188+
df.columns = df.iloc[0]
189+
control_list_df = df[1:].copy()
190+
191+
control_list = []
192+
item: ConceptualMappingControlList
193+
for idx, row in control_list_df.iterrows():
194+
item = ConceptualMappingControlList()
195+
item.field_value = _read_pd_value(row[CL_FIELD_VALUE])
196+
item.mapping_reference = _read_pd_value(row[CL_MAPPING_REFERENCE])
197+
item.super_type = _read_pd_value(row[CL_SUPERTYPE])
198+
item.xml_path_fragment = _read_pd_value(row[CL_XML_PATH_FRAGMENT])
199+
control_list.append(item)
200+
return control_list
201+
202+
159203
def _read_conceptual_mapping_xpaths(rules_df: pd.DataFrame, base_xpath: str) -> List[ConceptualMappingXPATH]:
160204
"""
161205
@@ -209,9 +253,14 @@ def mapping_suite_read_conceptual_mapping(conceptual_mappings_file_path: Path) -
209253
metadata = _read_conceptual_mapping_metadata(dfs[CONCEPTUAL_MAPPINGS_METADATA_SHEET_NAME])
210254
conceptual_mapping.metadata = metadata
211255
conceptual_mapping.rules = _read_conceptual_mapping_rules(dfs[CONCEPTUAL_MAPPINGS_RULES_SHEET_NAME])
256+
conceptual_mapping.mapping_remarks = _read_conceptual_mapping_remarks(dfs[CONCEPTUAL_MAPPINGS_REMARKS_SHEET_NAME])
212257
conceptual_mapping.resources = _read_conceptual_mapping_resources(dfs[CONCEPTUAL_MAPPINGS_RESOURCES_SHEET_NAME])
213258
conceptual_mapping.rml_modules = _read_conceptual_mapping_rml_modules(
214259
dfs[CONCEPTUAL_MAPPINGS_RML_MODULES_SHEET_NAME])
260+
conceptual_mapping.cl1_roles = _read_conceptual_mapping_control_list(
261+
dfs[CONCEPTUAL_MAPPINGS_CL1_ROLES_SHEET_NAME])
262+
conceptual_mapping.cl2_organisations = _read_conceptual_mapping_control_list(
263+
dfs[CONCEPTUAL_MAPPINGS_CL2_ORGANISATIONS_SHEET_NAME])
215264
conceptual_mapping.xpaths = _read_conceptual_mapping_xpaths(
216265
rules_df=dfs[CONCEPTUAL_MAPPINGS_RULES_SHEET_NAME][1:].copy(),
217266
base_xpath=metadata.base_xpath

tests/e2e/mapping_suite_processor/conceptual_mapping_differ/test_conceptual_mapping_differ.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
from ted_sws.core.model.transform import ConceptualMapping, ConceptualMappingMetadata
1+
from ted_sws.core.model.transform import ConceptualMapping, ConceptualMappingMetadata, ConceptualMappingDiff
22
from ted_sws.data_manager.adapters.mapping_suite_repository import MS_TRANSFORM_FOLDER_NAME, \
33
MS_CONCEPTUAL_MAPPING_FILE_NAME
44
from ted_sws.mapping_suite_processor.services.conceptual_mapping_differ import mapping_suite_diff_conceptual_mappings, \
5-
mapping_suite_diff_files_conceptual_mappings, mapping_suite_diff_repo_conceptual_mappings
5+
mapping_suite_diff_files_conceptual_mappings, mapping_suite_diff_repo_conceptual_mappings, \
6+
generate_conceptual_mappings_diff_filename
67

78

89
def test_mapping_suite_diff_conceptual_mappings():
@@ -53,3 +54,14 @@ def test_mapping_suite_diff_repo_conceptual_mappings(github_mapping_suite_id, pa
5354
mapping_suite_id=[github_mapping_suite_id, "package_F03_test"]
5455
)
5556
assert diff['data']['original']
57+
58+
59+
def test_generate_conceptual_mappings_diff_filename(package_folder_path, package_F03_folder_path):
60+
""""""
61+
filepath1 = package_folder_path / MS_TRANSFORM_FOLDER_NAME / MS_CONCEPTUAL_MAPPING_FILE_NAME
62+
filepath2 = package_F03_folder_path / MS_TRANSFORM_FOLDER_NAME / MS_CONCEPTUAL_MAPPING_FILE_NAME
63+
64+
diff = mapping_suite_diff_files_conceptual_mappings([filepath1, filepath2])
65+
filename = generate_conceptual_mappings_diff_filename(ConceptualMappingDiff(**diff), "conceptual_mappings_diff",
66+
".json")
67+
assert filename == "conceptual_mappings_diff_F03_v0.0.1_vs_package_F03_v2.2.0.json"

0 commit comments

Comments
 (0)