Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix n3 parser exponent syntax of floats with leading dot. #1012

Merged
merged 8 commits into from
Apr 17, 2020
4 changes: 1 addition & 3 deletions rdflib/plugins/parsers/notation3.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,9 +349,7 @@ def unicodeExpand(m):
signed_integer = re.compile(r'[-+]?[0-9]+') # integer
integer_syntax = re.compile(r'[-+]?[0-9]+')
decimal_syntax = re.compile(r'[-+]?[0-9]*\.[0-9]+')
exponent_syntax = re.compile(r'[-+]?(?:[0-9]+\.[0-9]*(?:e|E)[-+]?[0-9]+|'+
r'\.[0-9](?:e|E)[-+]?[0-9]+|'+
r'[0-9]+(?:e|E)[-+]?[0-9]+)')
exponent_syntax = re.compile(r'[-+]?(?:[0-9]+\.[0-9]*|\.[0-9]+|[0-9]+)(?:e|E)[-+]?[0-9]+')
digitstring = re.compile(r'[0-9]+') # Unsigned integer
interesting = re.compile(r"""[\\\r\n\"\']""")
langcode = re.compile(r'[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*')
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@

kwargs = {}
kwargs['install_requires'] = [ 'six', 'isodate', 'pyparsing']
kwargs['tests_require'] = ['html5lib', 'networkx']
kwargs['tests_require'] = ['html5lib', 'networkx', 'nose', 'doctest-ignore-unicode']
kwargs['test_suite'] = "nose.collector"
kwargs['extras_require'] = {
'html': ['html5lib'],
'sparql': ['requests'],
'tests': kwargs['tests_require'],
'docs': ['sphinx < 3', 'sphinxcontrib-apidoc']
}

Expand Down
47 changes: 46 additions & 1 deletion test/test_n3.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from rdflib.graph import Graph, ConjunctiveGraph
import unittest
from rdflib.term import Literal, URIRef
from rdflib.plugins.parsers.notation3 import BadSyntax
from rdflib.plugins.parsers.notation3 import BadSyntax, exponent_syntax
import itertools

from six import b
from six.moves.urllib.error import URLError
Expand Down Expand Up @@ -164,6 +165,31 @@ def testIssue156(self):
g = Graph()
g.parse("test/n3/issue156.n3", format="n3")

def testIssue999(self):
"""
Make sure the n3 parser does recognize exponent and leading dot in ".171e-11"
"""
data = """
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<http://qudt.org/vocab/unit/MilliM-PER-YR>
a <http://qudt.org/schema/qudt/Unit> ;
<http://qudt.org/schema/qudt/conversionMultiplier> .171e-11 ;
<http://qudt.org/schema/qudt/conversionOffset> 0e+00 ;
<http://qudt.org/schema/qudt/description> "0.001-fold of the SI base unit metre divided by the unit year" ;
<http://qudt.org/schema/qudt/hasQuantityKind> <http://qudt.org/vocab/quantitykind/Velocity> ;
<http://qudt.org/schema/qudt/iec61360Code> "0112/2///62720#UAA868" ;
<http://qudt.org/schema/qudt/uneceCommonCode> "H66" ;
rdfs:isDefinedBy <http://qudt.org/2.1/vocab/unit> ;
rdfs:isDefinedBy <http://qudt.org/vocab/unit> ;
rdfs:label "MilliM PER YR" ;
<http://www.w3.org/2004/02/skos/core#prefLabel> "millimetre per year" ;
.
"""
g = Graph()
g.parse(data=data, format="n3")
g.parse(data=data, format="turtle")

def testDotInPrefix(self):
g = Graph()
g.parse(
Expand Down Expand Up @@ -226,5 +252,24 @@ def testEmptyPrefix(self):
g2), 'Document with declared empty prefix must match default #'


class TestRegularExpressions(unittest.TestCase):
def testExponents(self):
signs = ("", "+", "-")
mantissas = ("1", "1.", ".1",
"12", "12.", "1.2", ".12",
"123", "123.", "12.3", "1.23", ".123")
es = "eE"
exps = ("1", "12", "+1", "-1", "+12", "-12")
for parts in itertools.product(signs, mantissas, es, exps):
expstring = "".join(parts)
self.assertTrue(exponent_syntax.match(expstring))

def testInvalidExponents(self):
# Add test cases as needed
invalid = (".e1",)
for expstring in invalid:
self.assertFalse(exponent_syntax.match(expstring))


if __name__ == '__main__':
unittest.main()