Skip to content

Commit 078a117

Browse files
committed
checkpoint
1 parent 8ae9270 commit 078a117

File tree

15 files changed

+84
-79
lines changed

15 files changed

+84
-79
lines changed

rdflib/plugins/parsers/jsonld.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,10 @@ def _to_object(
525525
return # type: ignore[return-value]
526526
return Literal(value, lang=lang)
527527
elif datatype:
528-
return Literal(value, datatype=context.expand(datatype))
528+
datatype = context.expand(datatype)
529+
if datatype is None:
530+
datatype = XSD.string
531+
return Literal(value, datatype=datatype)
529532
else:
530533
return Literal(value)
531534
else:

rdflib/plugins/parsers/notation3.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,7 +1506,7 @@ def object(
15061506

15071507
j, s = self.strconst(argstr, i, delim)
15081508

1509-
res.append(self._store.newLiteral(s)) # type: ignore[call-arg] # TODO FIXME
1509+
res.append(Literal(s))
15101510
return j
15111511
else:
15121512
return -1
@@ -1570,11 +1570,14 @@ def nodeOrLiteral(self, argstr: str, i: int, res: MutableSequence[Any]) -> int:
15701570
i = m.end()
15711571
lang = argstr[j + 1 : i]
15721572
j = i
1573-
if argstr[j : j + 2] == "^^":
1573+
res.append(Literal(s, lang=lang))
1574+
elif argstr[j : j + 2] == "^^":
15741575
res2: typing.List[Any] = []
15751576
j = self.uri_ref2(argstr, j + 2, res2) # Read datatype URI
15761577
dt = res2[0]
1577-
res.append(self._store.newLiteral(s, dt, lang))
1578+
res.append(Literal(s, datatype=dt))
1579+
else:
1580+
res.append(Literal(s))
15781581
return j
15791582
else:
15801583
return -1
@@ -1852,11 +1855,11 @@ def newBlankNode(
18521855
bn = BNode(str(arg[0]).split("#").pop().replace("_", "b"))
18531856
return bn
18541857

1855-
def newLiteral(self, s: str, dt: Optional[URIRef], lang: Optional[str]) -> Literal:
1856-
if dt:
1857-
return Literal(s, datatype=dt)
1858-
else:
1859-
return Literal(s, lang=lang)
1858+
# def newLiteral(self, s: str, dt: Optional[URIRef], lang: Optional[str]) -> Literal:
1859+
# if dt:
1860+
# return Literal(s, datatype=dt)
1861+
# else:
1862+
# return Literal(s, lang=lang)
18601863

18611864
def newList(self, n: typing.List[Any], f: Optional[Formula]) -> IdentifiedNode:
18621865
nil = self.newSymbol("http://www.w3.org/1999/02/22-rdf-syntax-ns#nil")

rdflib/plugins/parsers/ntriples.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
from rdflib.compat import _string_escape_map, decodeUnicodeEscape
2626
from rdflib.exceptions import ParserError as ParseError
27+
from rdflib.namespace import XSD
2728
from rdflib.parser import InputSource, Parser
2829
from rdflib.term import BNode as bNode
2930
from rdflib.term import Literal
@@ -326,7 +327,7 @@ def literal(self) -> Union["te.Literal[False]", Literal]:
326327
dtype = uriquote(dtype)
327328
dtype = URI(dtype)
328329
else:
329-
dtype = None
330+
dtype = XSD.string
330331
if lang and dtype:
331332
raise ParseError("Can't have both a language and a datatype")
332333
lit = unquote(lit)

rdflib/plugins/parsers/rdfxml.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from rdflib.exceptions import Error, ParserError
1313
from rdflib.graph import Graph
14-
from rdflib.namespace import RDF, is_ncname
14+
from rdflib.namespace import RDF, XSD, is_ncname
1515
from rdflib.parser import InputSource, Parser
1616
from rdflib.plugins.parsers.RDFVOC import RDFVOC
1717
from rdflib.term import BNode, Identifier, Literal, URIRef
@@ -361,7 +361,7 @@ def node_element_start(
361361
if not att.startswith(str(RDFNS)):
362362
predicate = absolutize(att)
363363
try:
364-
object = Literal(atts[att], language)
364+
object = Literal(atts[att], lang=language)
365365
except Error as e:
366366
# type error: Argument 1 to "error" of "RDFXMLHandler" has incompatible type "Optional[str]"; expected "str"
367367
self.error(e.msg) # type: ignore[arg-type]
@@ -377,7 +377,7 @@ def node_element_start(
377377
else:
378378
predicate = absolutize(att)
379379
try:
380-
object = Literal(atts[att], language)
380+
object = Literal(atts[att], lang=language)
381381
except Error as e:
382382
# type error: Argument 1 to "error" of "RDFXMLHandler" has incompatible type "Optional[str]"; expected "str"
383383
self.error(e.msg) # type: ignore[arg-type]
@@ -510,7 +510,11 @@ def property_element_start(
510510
if datatype is not None:
511511
# type error: Statement is unreachable
512512
language = None # type: ignore[unreachable]
513-
o = Literal(atts[att], language, datatype)
513+
o = Literal(
514+
atts[att],
515+
language,
516+
XSD.string if datatype is None else datatype,
517+
)
514518

515519
if object is None:
516520
object = BNode()

rdflib/plugins/parsers/trix.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from rdflib.exceptions import ParserError
1111
from rdflib.graph import Graph
12-
from rdflib.namespace import Namespace
12+
from rdflib.namespace import XSD, Namespace
1313
from rdflib.parser import InputSource, Parser
1414
from rdflib.store import Store
1515
from rdflib.term import BNode, Identifier, Literal, URIRef
@@ -185,7 +185,11 @@ def endElementNS(self, name: Tuple[Optional[str], str], qname) -> None:
185185
elif name[1] == "plainLiteral" or name[1] == "typedLiteral":
186186
if self.state == 4:
187187
self.triple += [
188-
Literal(self.chars, lang=self.lang, datatype=self.datatype)
188+
Literal(
189+
self.chars,
190+
lang=self.lang,
191+
datatype=XSD.string if self.datatype is None else self.datatype,
192+
)
189193
]
190194
else:
191195
self.error(

rdflib/plugins/sparql/aggregates.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ def update(self, row: FrozenBindings, aggregator: "Aggregator") -> None:
140140
pass
141141

142142
def get_value(self) -> Literal:
143-
return Literal(self.value, datatype=self.datatype)
143+
return Literal(
144+
self.value, datatype=XSD.integer if self.datatype is None else self.datatype
145+
)
144146

145147

146148
class Average(Accumulator):

rdflib/plugins/sparql/evaluate.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
from pyparsing import ParseException
4040

4141
from rdflib.graph import Graph
42+
from rdflib.namespace import XSD
4243
from rdflib.plugins.sparql import CUSTOM_EVALS, parser
4344
from rdflib.plugins.sparql.aggregates import Aggregator
4445
from rdflib.plugins.sparql.evalutils import (
@@ -424,7 +425,7 @@ def _yieldBindingsFromServiceCallResult(
424425
elif var_type == "literal":
425426
res_dict[Variable(var)] = Literal(
426427
var_binding["value"],
427-
datatype=var_binding.get("datatype"),
428+
datatype=var_binding.get("datatype", XSD.string),
428429
lang=var_binding.get("xml:lang"),
429430
)
430431
# This is here because of

rdflib/plugins/sparql/operators.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -290,18 +290,18 @@ def Builtin_CONCAT(expr: Expr, ctx) -> Literal:
290290

291291
# dt/lang passed on only if they all match
292292

293-
dt = set(x.datatype for x in expr.arg if isinstance(x, Literal))
294-
# type error: Incompatible types in assignment (expression has type "Optional[str]", variable has type "Set[Optional[str]]")
295-
dt = dt.pop() if len(dt) == 1 else None # type: ignore[assignment]
296-
297-
lang = set(x.language for x in expr.arg if isinstance(x, Literal))
298-
# type error: error: Incompatible types in assignment (expression has type "Optional[str]", variable has type "Set[Optional[str]]")
299-
lang = lang.pop() if len(lang) == 1 else None # type: ignore[assignment]
300-
301-
# NOTE on type errors: this is because same variable is used for two incompatibel types
302-
# type error: Argument "datatype" to "Literal" has incompatible type "Set[Any]"; expected "Optional[str]" [arg-type]
303-
# type error: Argument "lang" to "Literal" has incompatible type "Set[Any]"; expected "Optional[str]"
304-
return Literal("".join(string(x) for x in expr.arg), datatype=dt, lang=lang) # type: ignore[arg-type]
293+
args = [x for x in expr.arg if isinstance(x, Literal)]
294+
295+
if not args:
296+
return Literal("")
297+
298+
dt_set = set(x.datatype for x in args)
299+
dt = dt_set.pop()
300+
301+
lang_set = set(x.language for x in args)
302+
lang = lang_set.pop()
303+
304+
return Literal("".join(string(x) for x in expr.arg), datatype=dt, lang=lang)
305305

306306

307307
def _compatibleStrings(a: Literal, b: Literal) -> None:

rdflib/plugins/sparql/parser.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77

88
import re
99
import sys
10-
from typing import Any, BinaryIO, List
11-
from typing import Optional as OptionalType
12-
from typing import TextIO, Tuple, Union
10+
from typing import Any, BinaryIO, List, TextIO, Tuple, Union
1311

1412
from pyparsing import CaselessKeyword as Keyword # watch out :)
1513
from pyparsing import (
@@ -45,11 +43,11 @@ def neg(literal: rdflib.Literal) -> rdflib.Literal:
4543
return rdflib.Literal(-literal, datatype=literal.datatype)
4644

4745

48-
def setLanguage(terms: Tuple[Any, OptionalType[str]]) -> rdflib.Literal:
46+
def setLanguage(terms: Tuple[Any, str]) -> rdflib.Literal:
4947
return rdflib.Literal(terms[0], lang=terms[1])
5048

5149

52-
def setDataType(terms: Tuple[Any, OptionalType[str]]) -> rdflib.Literal:
50+
def setDataType(terms: Tuple[Any, str]) -> rdflib.Literal:
5351
return rdflib.Literal(terms[0], datatype=terms[1])
5452

5553

rdflib/plugins/sparql/results/jsonresults.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import json
44
from typing import IO, Any, Dict, Mapping, MutableSequence, Optional
55

6+
from rdflib.namespace import XSD
67
from rdflib.query import Result, ResultException, ResultParser, ResultSerializer
78
from rdflib.term import BNode, Identifier, Literal, URIRef, Variable
89

@@ -101,7 +102,9 @@ def parseJsonTerm(d: Dict[str, str]) -> Identifier:
101102
if t == "uri":
102103
return URIRef(d["value"])
103104
elif t == "literal":
104-
return Literal(d["value"], datatype=d.get("datatype"), lang=d.get("xml:lang"))
105+
return Literal(
106+
d["value"], datatype=d.get("datatype", XSD.string), lang=d.get("xml:lang")
107+
)
105108
elif t == "typed-literal":
106109
return Literal(d["value"], datatype=URIRef(d["datatype"]))
107110
elif t == "bnode":

0 commit comments

Comments
 (0)