summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--__init__.py4
-rw-r--r--emitter.py6
-rw-r--r--parser.py14
-rw-r--r--representer.py32
-rw-r--r--scanner.py1
-rw-r--r--tokens.py21
6 files changed, 54 insertions, 24 deletions
diff --git a/__init__.py b/__init__.py
index 87adcd7..1ea3f6b 100644
--- a/__init__.py
+++ b/__init__.py
@@ -7,8 +7,8 @@ if False: # MYPY
_package_data = dict(
full_package_name='ruamel.yaml',
- version_info=(0, 15, 23),
- __version__='0.15.23',
+ version_info=(0, 15, 24, 'dev'),
+ __version__='0.15.24.dev',
author='Anthon van der Neut',
author_email='a.van.der.neut@ruamel.eu',
description='ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order', # NOQA
diff --git a/emitter.py b/emitter.py
index 617d439..a1b703d 100644
--- a/emitter.py
+++ b/emitter.py
@@ -1329,7 +1329,11 @@ class Emitter(object):
self.column += len(data)
if self.encoding:
data = data.encode(self.encoding)
- self.stream.write(data)
+ try:
+ self.stream.write(data)
+ except:
+ print(repr(data))
+ raise
start = end
if ch is not None:
spaces = (ch == u' ')
diff --git a/parser.py b/parser.py
index 779d50f..860fdd9 100644
--- a/parser.py
+++ b/parser.py
@@ -532,6 +532,8 @@ class Parser(object):
def parse_block_mapping_key(self):
# type: () -> Any
+ next_token = self.scanner.peek_token()
+ # print('>>>> tk', type(self), next_token, getattr(next_token, 'comment', None))
if self.scanner.check_token(KeyToken):
token = self.scanner.get_token()
token.move_comment(self.scanner.peek_token())
@@ -560,17 +562,23 @@ class Parser(object):
if self.scanner.check_token(ValueToken):
token = self.scanner.get_token()
# value token might have post comment move it to e.g. block
+ # pt = self.scanner.peek_token()
+ # print('pt', pt)
if self.scanner.check_token(ValueToken):
token.move_comment(self.scanner.peek_token())
else:
- token.move_comment(self.scanner.peek_token(), empty=True)
+ if not self.scanner.check_token(KeyToken):
+ token.move_comment(self.scanner.peek_token(), empty=True)
+ # else: empty value for this key cannot move token.comment
if not self.scanner.check_token(KeyToken, ValueToken, BlockEndToken):
self.states.append(self.parse_block_mapping_key)
return self.parse_block_node_or_indentless_sequence()
else:
self.state = self.parse_block_mapping_key
- return self.process_empty_scalar(token.end_mark,
- comment=self.scanner.peek_token().comment)
+ comment = token.comment
+ if comment is None:
+ comment=self.scanner.peek_token().comment
+ return self.process_empty_scalar(token.end_mark, comment=comment)
else:
self.state = self.parse_block_mapping_key
token = self.scanner.peek_token()
diff --git a/representer.py b/representer.py
index a4cf481..ee0f49e 100644
--- a/representer.py
+++ b/representer.py
@@ -766,21 +766,21 @@ class RoundTripRepresenter(SafeRepresenter):
return self.represent_scalar(u'tag:yaml.org,2002:float', value)
if data._exp is None and data._prec > 0 and data._prec == data._width - 1:
# no exponent, but trailing dot
- value = '{}{:d}.'.format(data._m_sign if data._m_sign else '', abs(int(data)))
+ value = u'{}{:d}.'.format(data._m_sign if data._m_sign else u'', abs(int(data)))
elif data._exp is None:
# no exponent, "normal" dot
prec = data._prec
if prec < 1:
prec = 1
# print('dw2', data._width, prec)
- ms = data._m_sign if data._m_sign else ''
+ ms = data._m_sign if data._m_sign else u''
# -1 for the dot
- value = '{}{:0{}.{}f}'.format(ms, abs(data), data._width-len(ms), data._width-prec-1)
+ value = u'{}{:0{}.{}f}'.format(ms, abs(data), data._width-len(ms), data._width-prec-1)
while len(value) < data._width:
- value += '0'
+ value += u'0'
else:
# exponent
- m, es = '{:{}e}'.format(data, data._width).split('e')
+ m, es = u'{:{}e}'.format(data, data._width).split('e')
w = data._width if data._prec > 0 else (data._width + 1)
if data < 0:
w += 1
@@ -788,39 +788,39 @@ class RoundTripRepresenter(SafeRepresenter):
e = int(es)
m1, m2 = m.split('.') # always second?
while len(m1) + len(m2) < data._width - (1 if data._prec >= 0 else 0):
- m2 += '0'
+ m2 += u'0'
if data._m_sign and data > 0:
m1 = '+' + m1
- esgn = '+' if data._e_sign else ''
+ esgn = u'+' if data._e_sign else u''
if data._prec < 0: # mantissa without dot
- if m2 != '0':
+ if m2 != u'0':
e -= len(m2)
else:
- m2 = ''
+ m2 = u''
while (len(m1) + len(m2) - (1 if data._m_sign else 0)) < data._width:
- m2 += '0'
+ m2 += u'0'
e -= 1
- value = m1 + m2 + data._exp + '{:{}0{}d}'.format(e, esgn, data._e_width)
+ value = m1 + m2 + data._exp + u'{:{}0{}d}'.format(e, esgn, data._e_width)
elif data._prec == 0: # mantissa with trailing dot
e -= len(m2)
- value = m1 + m2 + '.' + data._exp + '{:{}0{}d}'.format(e, esgn, data._e_width)
+ value = m1 + m2 + u'.' + data._exp + u'{:{}0{}d}'.format(e, esgn, data._e_width)
else:
if data._m_lead0 > 0:
- m2 = '0' * (data._m_lead0 - 1) + m1 + m2
- m1 = '0'
+ m2 = u'0' * (data._m_lead0 - 1) + m1 + m2
+ m1 = u'0'
m2 = m2[:-data._m_lead0] # these should be zeros
e += data._m_lead0
while len(m1) < data._prec:
m1 += m2[0]
m2 = m2[1:]
e -= 1
- value = m1 + '.' + m2 + data._exp + '{:{}0{}d}'.format(e, esgn, data._e_width)
+ value = m1 + u'.' + m2 + data._exp + u'{:{}0{}d}'.format(e, esgn, data._e_width)
if value is None:
value = to_unicode(repr(data)).lower()
return self.represent_scalar(u'tag:yaml.org,2002:float', value)
#if data._width is not None:
- # s = '{:0{}d}'.format(data, data._width)
+ # s = u'{:0{}d}'.format(data, data._width)
#else:
# s = format(data, 'f')
#return self.insert_underscore('', s, data._underscore)
diff --git a/scanner.py b/scanner.py
index dd2a825..989726a 100644
--- a/scanner.py
+++ b/scanner.py
@@ -1651,6 +1651,7 @@ class RoundTripScanner(Scanner):
self.fetch_more_tokens()
self._gather_comments()
if bool(self.tokens):
+ print('tk', self.tokens)
# only add post comment to single line tokens:
# scalar, value token. FlowXEndToken, otherwise
# hidden streamtokens could get them (leave them and they will be
diff --git a/tokens.py b/tokens.py
index b60d11b..e36aca0 100644
--- a/tokens.py
+++ b/tokens.py
@@ -51,14 +51,19 @@ class Token(object):
ScalarToken that follows it
empty is a special for empty values -> comment after key
"""
+ if self.comment is not None:
+ print('mci:', self, target, getattr(self, '_comment', None),
+ getattr(target, '_comment', None), empty)
c = self.comment
if c is None:
return
# don't push beyond last element
if isinstance(target, StreamEndToken):
return
- if isinstance(self, ValueToken) and isinstance(target, BlockEntryToken):
- return
+ #if isinstance(self, ValueToken) and isinstance(target, BlockEntryToken):
+ # if target._comment:
+ # target._comment[0] = c[0]
+ # return
delattr(self, '_comment')
tc = target.comment
if not tc: # target comment, just insert
@@ -66,6 +71,7 @@ class Token(object):
if empty:
c = [c[0], c[1], None, None, c[0]]
target._comment = c
+ print('mco2:', self, target, target.comment, empty)
return self
if c[0] and tc[0] or c[1] and tc[1]:
raise NotImplementedError('overlap in comment %r %r' % c, tc)
@@ -73,6 +79,14 @@ class Token(object):
tc[0] = c[0]
if c[1]:
tc[1] = c[1]
+ #if empty:
+ # if len(tc) == 2:
+ # tc.extend([None, None, c[0]])
+ # elif len(tc) == 4:
+ # tc.append(d[0])
+ # else:
+ # raise NotImplementedError
+ print('mco:', self, target, target.comment, empty)
return self
def split_comment(self):
@@ -170,6 +184,9 @@ class KeyToken(Token):
__slots__ = ()
id = '?'
+ def x__repr__(self):
+ return 'KeyToken({})'.format(
+ self.start_mark.buffer[self.start_mark.index:].split(None, 1)[0])
class ValueToken(Token):
__slots__ = ()