diff options
| author | Nicholas Car <nicholas.car@surroundaustralia.com> | 2020-04-18 08:26:39 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-18 08:26:39 +1000 |
| commit | 60f5c7ea07e86fb17e4cf7ee76119d8143bd8977 (patch) | |
| tree | 5610b9203dc660b2e66454db50f7d0da151e3b71 | |
| parent | 39d07c4a5c9395f1322a269982e69b63cbf4db22 (diff) | |
| parent | 5b1a9d09f866ead87073deb4c8d0ba9f3aaccf8e (diff) | |
| download | rdflib-60f5c7ea07e86fb17e4cf7ee76119d8143bd8977.tar.gz | |
Merge pull request #1012 from white-gecko/feature/fixN3Exponent
Fix n3 parser exponent syntax of floats with leading dot.
| -rwxr-xr-x | rdflib/plugins/parsers/notation3.py | 4 | ||||
| -rw-r--r-- | setup.py | 3 | ||||
| -rw-r--r-- | test/test_n3.py | 47 |
3 files changed, 49 insertions, 5 deletions
diff --git a/rdflib/plugins/parsers/notation3.py b/rdflib/plugins/parsers/notation3.py index 4b6ff5d1..c57f5bcf 100755 --- a/rdflib/plugins/parsers/notation3.py +++ b/rdflib/plugins/parsers/notation3.py @@ -349,9 +349,7 @@ ws = re.compile(r'[ \t]*') # Whitespace not including NL 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]+)*') @@ -6,11 +6,12 @@ from setuptools import setup, find_packages 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'] } diff --git a/test/test_n3.py b/test/test_n3.py index 5d447732..5cdc74b5 100644 --- a/test/test_n3.py +++ b/test/test_n3.py @@ -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 @@ -164,6 +165,31 @@ foo-bar:Ex foo-bar:name "Test" . """ 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( @@ -226,5 +252,24 @@ foo-bar:Ex foo-bar:name "Test" . """ 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() |
