summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthon van der Neut <anthon@mnt.org>2015-05-27 12:25:01 +0200
committerAnthon van der Neut <anthon@mnt.org>2015-05-27 12:25:01 +0200
commit59d53c586983dd5cb2ee6cfc7111dd233f50cddd (patch)
tree08aa6b97c20180aa55c599739fa6680864cc9ffe
parent39f09f74fd760216031b864c210f259d64080331 (diff)
downloadruamel.yaml-59d53c586983dd5cb2ee6cfc7111dd233f50cddd.tar.gz
added test and fix for json numbers ( 1e-06 and 3.0e4 )
-rw-r--r--py/__init__.py2
-rw-r--r--py/resolver.py4
-rw-r--r--test/test_comments.py2
-rw-r--r--test/test_json_numbers.py48
-rw-r--r--test/test_line_col.py70
5 files changed, 123 insertions, 3 deletions
diff --git a/py/__init__.py b/py/__init__.py
index bbe42d1..3ab81ad 100644
--- a/py/__init__.py
+++ b/py/__init__.py
@@ -21,7 +21,7 @@ def _convert_version(tup):
return ret_val
-version_info = (0, 9, 1)
+version_info = (0, 9, 2)
__version__ = _convert_version(version_info)
del _convert_version
diff --git a/py/resolver.py b/py/resolver.py
index b5ce916..d385b0e 100644
--- a/py/resolver.py
+++ b/py/resolver.py
@@ -181,7 +181,9 @@ Resolver.add_implicit_resolver(
Resolver.add_implicit_resolver(
u'tag:yaml.org,2002:float',
- re.compile(u'''^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?
+ re.compile(u'''^(?:
+ [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)?
+ |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+)
|\\.[0-9_]+(?:[eE][-+][0-9]+)?
|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*
|[-+]?\\.(?:inf|Inf|INF)
diff --git a/test/test_comments.py b/test/test_comments.py
index 2b10577..6a400b5 100644
--- a/test/test_comments.py
+++ b/test/test_comments.py
@@ -195,7 +195,7 @@ class TestComments:
""")
@pytest.mark.xfail
- def test_set_comment_before_tag(self):
+ def XXXtest_set_comment_before_tag(self):
# no comments before tags
round_trip("""
# the beginning
diff --git a/test/test_json_numbers.py b/test/test_json_numbers.py
new file mode 100644
index 0000000..db5bcaa
--- /dev/null
+++ b/test/test_json_numbers.py
@@ -0,0 +1,48 @@
+
+from __future__ import print_function
+
+import pytest
+
+import ruamel.yaml
+import json
+
+def load(s, typ=float):
+ x = '{"low": %s }' % (s)
+ print('input: [%s]' % (s), repr(x))
+ # just to check it is loadable json
+ res = json.loads(x)
+ assert isinstance(res['low'], typ)
+ ret_val = ruamel.yaml.load(x, ruamel.yaml.RoundTripLoader)
+ print(ret_val)
+ return ret_val['low']
+
+class TestJSONNumbers:
+ # based on http://stackoverflow.com/a/30462009/1307905
+ # yaml number regex: http://yaml.org/spec/1.2/spec.html#id2804092
+ #
+ # -? [1-9] ( \. [0-9]* [1-9] )? ( e [-+] [1-9] [0-9]* )?
+ #
+ # which is not a superset of the JSON numbers
+ def test_json_number_float(self):
+ for x in (y.split('#')[0].strip() for y in """
+ 1.0 # should fail on YAML spec on 1-9 allowed as single digit
+ -1.0
+ 1e-06
+ 3.1e-5
+ 3.1e+5
+ 3.1e5 # should fail on YAML spec: no +- after e
+ """.splitlines()):
+ if not x:
+ continue
+ res = load(x)
+ assert isinstance(res, float)
+
+ def test_json_number_int(self):
+ for x in (y.split('#')[0].strip() for y in """
+ 42
+ """.splitlines()):
+ if not x:
+ continue
+ res = load(x, int)
+ assert isinstance(res, int)
+
diff --git a/test/test_line_col.py b/test/test_line_col.py
new file mode 100644
index 0000000..7a09884
--- /dev/null
+++ b/test/test_line_col.py
@@ -0,0 +1,70 @@
+# coding: utf-8
+
+import pytest
+from textwrap import dedent
+
+import ruamel.yaml
+from roundtrip import round_trip, dedent, round_trip_load, round_trip_dump
+
+
+def load(s):
+ return round_trip_load(dedent(s))
+
+
+class TestLineCol:
+ def test_item_00(self):
+ data = load("""
+ - a
+ - e
+ - [b, d]
+ - c
+ """)
+ assert data[2].lc.line == 2
+ assert data[2].lc.col == 2
+
+ def test_item_01(self):
+ data = load("""
+ - a
+ - e
+ - {x: 3}
+ - c
+ """)
+ assert data[2].lc.line == 2
+ assert data[2].lc.col == 2
+
+ def test_item_02(self):
+ data = load("""
+ - a
+ - e
+ - !!set {x, y}
+ - c
+ """)
+ assert data[2].lc.line == 2
+ assert data[2].lc.col == 2
+
+ def test_item_03(self):
+ data = load("""
+ - a
+ - e
+ - !!omap
+ - x: 1
+ - y: 3
+ - c
+ """)
+ assert data[2].lc.line == 2
+ assert data[2].lc.col == 2
+
+
+ def test_item_04(self):
+ data = load("""
+ # testing line and column based on SO
+ # http://stackoverflow.com/questions/13319067/
+ - key1: item 1
+ key2: item 2
+ - key3: another item 1
+ key4: another item 2
+ """)
+ assert data[0].lc.line == 2
+ assert data[0].lc.col == 2
+ assert data[1].lc.line == 4
+ assert data[1].lc.col == 2