Skip to content

Commit

Permalink
Merge pull request #1012 from white-gecko/feature/fixN3Exponent
Browse files Browse the repository at this point in the history
Fix n3 parser exponent syntax of floats with leading dot.
  • Loading branch information
nicholascar committed Apr 17, 2020
2 parents 39d07c4 + 5b1a9d0 commit 60f5c7e
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 5 deletions.
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()

0 comments on commit 60f5c7e

Please sign in to comment.