Skip to content

Commit 7fe1b13

Browse files
authored
Merge pull request #4 from pvgenuchten/master
parses template url as template
2 parents d39d5be + 95c9c6f commit 7fe1b13

File tree

3 files changed

+37
-39
lines changed

3 files changed

+37
-39
lines changed

csvwlib/converter/ToRDFConverter.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from csvwlib.utils.rdf.RDFGraphUtils import RDFGraphUtils
1414
from csvwlib.utils.url.PropertyUrlUtils import PropertyUrlUtils
1515
from csvwlib.utils.url.UriTemplateUtils import UriTemplateUtils
16-
from csvwlib.utils.url.ValueUrlUtils import ValueUrlUtils
1716

1817
CSVW = Namespace('http://www.w3.org/ns/csvw#')
1918

@@ -122,9 +121,9 @@ def _parse_row_data(self, atdm_row, subject, table_metadata, property_url, row_n
122121

123122
property_namespace = PropertyUrlUtils.create_namespace(property_url, table_metadata['url'])
124123
predicate = self._predicate_node(property_namespace, property_url, col_name)
125-
self._parse_cell_values(values, col_metadata, subject, predicate)
124+
self._parse_cell_values(values, col_metadata, subject, predicate, atdm_row, table_metadata['url'])
126125

127-
def _parse_cell_values(self, values, col_metadata, subject, predicate):
126+
def _parse_cell_values(self, values, col_metadata, subject, predicate, atdm_row, tm_url):
128127
""" Parses single cell value, values if 'separator' is present"""
129128
if 'ordered' in col_metadata and col_metadata['ordered'] is True and len(values) > 1:
130129
next_item = BNode()
@@ -140,13 +139,14 @@ def _parse_cell_values(self, values, col_metadata, subject, predicate):
140139
self.graph.add((subject, predicate, rdf_list))
141140
else:
142141
for value in values:
143-
object_node = self._object_node(value, col_metadata)
142+
object_node = self._object_node(value, col_metadata, atdm_row, tm_url)
144143
self.graph.add((subject, predicate, object_node))
145144

146145
@staticmethod
147-
def _object_node(value, col_metadata):
146+
def _object_node(value, col_metadata, atdm_row, tm_url):
148147
if 'valueUrl' in col_metadata:
149-
return ValueUrlUtils.create_uri_ref(value, col_metadata['valueUrl'])
148+
return UriTemplateUtils.insert_value_rdf(col_metadata['valueUrl'], atdm_row, col_metadata.get('name'), tm_url)
149+
return ValueUrlUtils.create_uri_ref(value, col_metadata['valueUrl'], col_metadata)
150150
else:
151151
lang = col_metadata.get('lang')
152152
if not datatypeutils.is_compatible_with_datatype(value, col_metadata.get('datatype')):

csvwlib/utils/url/UriTemplateUtils.py

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from rdflib import URIRef, Literal
2-
2+
import re
33
from csvwlib.utils.ATDMUtils import ATDMUtils
44
from csvwlib.utils.json.CommonProperties import CommonProperties
55

@@ -13,6 +13,27 @@ def insert_value_rdf(url, atdm_row, col_name, domain_url):
1313
filled_url = UriTemplateUtils.insert_value(url, atdm_row, col_name, domain_url)
1414
return URIRef(filled_url) if filled_url.startswith('http') else Literal(filled_url)
1515

16+
@staticmethod
17+
def expand_template(template: str, row: dict) -> str:
18+
"""
19+
Expand a CSVW-style URI template with values from a row dict.
20+
21+
Args:
22+
template: A template string like "http://ex.org/book#{id}"
23+
row: A dict mapping column names or reserved vars to values.
24+
25+
Returns:
26+
The expanded string.
27+
"""
28+
def replacer(match):
29+
var = match.group(1)
30+
print('r',row)
31+
if var in row.keys():
32+
return str(row[var])
33+
raise KeyError(f"Missing value for template variable '{var}'")
34+
35+
return re.sub(r"\{([^}]+)\}", replacer, template)
36+
1637
@staticmethod
1738
def insert_value(url, atdm_row, col_name, domain_url):
1839
""" Inserts value into uri template - between {...}
@@ -24,18 +45,16 @@ def insert_value(url, atdm_row, col_name, domain_url):
2445
if '{' not in url:
2546
return url
2647

27-
key = url[url.find('{') + 1:url.find('}')]
28-
key = key.replace('#', '')
29-
prefix = UriTemplateUtils.prefix(url, '')
48+
cols = {
49+
"_row": str(atdm_row.get('number','')),
50+
"_sourceRow": str(atdm_row.get('url','').rsplit('=').pop()),
51+
"_name": str(col_name)
52+
}
3053

31-
if key == '_row':
32-
return prefix + str(atdm_row['number'])
33-
elif key == '_sourceRow':
34-
return prefix + atdm_row['url'].rsplit('=')[1]
35-
elif key == '_name':
36-
return prefix + col_name
37-
else:
38-
return prefix + ATDMUtils.column_value(atdm_row, key)
54+
for k, v in atdm_row['cells'].items():
55+
cols[k] = str(v[0])
56+
57+
return UriTemplateUtils.expand_template(url, cols)
3958

4059
@staticmethod
4160
def expand(url, domain_url):

csvwlib/utils/url/ValueUrlUtils.py

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

0 commit comments

Comments
 (0)