diff options
author | Anthon van der Neut <anthon@mnt.org> | 2017-08-07 09:43:06 +0200 |
---|---|---|
committer | Anthon van der Neut <anthon@mnt.org> | 2017-08-07 09:43:06 +0200 |
commit | 56035ae630d159ce4d4f32264d3f992a24d6014f (patch) | |
tree | a8a01711504430b1f196e6ac9aafd07fe346a2c4 | |
parent | be4502b57ac2203e3ad075b18a5a94f87dfcf8dc (diff) | |
download | ruamel.yaml-56035ae630d159ce4d4f32264d3f992a24d6014f.tar.gz |
python 2.7 changes float round-trippign
-rw-r--r-- | __init__.py | 4 | ||||
-rw-r--r-- | emitter.py | 6 | ||||
-rw-r--r-- | parser.py | 14 | ||||
-rw-r--r-- | representer.py | 32 | ||||
-rw-r--r-- | scanner.py | 1 | ||||
-rw-r--r-- | tokens.py | 21 |
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 @@ -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' ') @@ -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) @@ -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 @@ -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__ = () |