diff options
author | Anthon van der Neut <anthon@mnt.org> | 2018-08-12 20:21:22 +0200 |
---|---|---|
committer | Anthon van der Neut <anthon@mnt.org> | 2018-08-12 20:21:22 +0200 |
commit | 3d972c045bab860b93ee6c28c61dabeafe81d7e9 (patch) | |
tree | a05e2a1fb14aad3883af1d3b4507cc12ce70cc6c /scanner.py | |
parent | bf95947e11492f1060819036694daed38237d10e (diff) | |
download | ruamel.yaml-3d972c045bab860b93ee6c28c61dabeafe81d7e9.tar.gz |
fix issue #172 compact JSON no longer parsing
This was quite intrusive, because loosing the tests surrounding the colon
made flow style lists with ::vector as key fail. Had to keept track of
whether in a flow-style mapping or sequence to get this solved
*When this change indeed resolves your problem, please **Close** this issue*.
*(You can do so usingthe WorkFlow pull-down (close to the top right of this page)*
Diffstat (limited to 'scanner.py')
-rw-r--r-- | scanner.py | 38 |
1 files changed, 28 insertions, 10 deletions
@@ -82,14 +82,25 @@ class Scanner(object): self.reset_scanner() self.first_time = False + @property + def flow_level(self): + return len(self.flow_context) + + # @flow_level.setter + # def flow_level(self): + # self.flow_context = [] + def reset_scanner(self): # type: () -> None # Had we reached the end of the stream? self.done = False + # flow_context is an expanding/shrinking list consisting of '{' and '[' + # in general len(flow_context) == flow_level + self.flow_context = [] # The number of unclosed '{' and '['. `flow_level == 0` means block # context. - self.flow_level = 0 + self.flow_level_org = 0 # List of processed tokens that are not yet emitted. self.tokens = [] # type: List[Any] @@ -489,18 +500,20 @@ class Scanner(object): def fetch_flow_sequence_start(self): # type: () -> None - self.fetch_flow_collection_start(FlowSequenceStartToken) + self.fetch_flow_collection_start(FlowSequenceStartToken, to_push='[') def fetch_flow_mapping_start(self): # type: () -> None - self.fetch_flow_collection_start(FlowMappingStartToken) + self.fetch_flow_collection_start(FlowMappingStartToken, to_push='{') - def fetch_flow_collection_start(self, TokenClass): + def fetch_flow_collection_start(self, TokenClass, to_push): # type: (Any) -> None # '[' and '{' may start a simple key. self.save_possible_simple_key() # Increase the flow level. - self.flow_level += 1 + self.flow_level_org += 1 + self.flow_context.append(to_push) + # assert self.flow_level == len(self.flow_context) # Simple keys are allowed after '[' and '{'. self.allow_simple_key = True # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. @@ -511,18 +524,20 @@ class Scanner(object): def fetch_flow_sequence_end(self): # type: () -> None - self.fetch_flow_collection_end(FlowSequenceEndToken) + self.fetch_flow_collection_end(FlowSequenceEndToken, to_pop='[') def fetch_flow_mapping_end(self): # type: () -> None - self.fetch_flow_collection_end(FlowMappingEndToken) + self.fetch_flow_collection_end(FlowMappingEndToken, to_pop='{') - def fetch_flow_collection_end(self, TokenClass): + def fetch_flow_collection_end(self, TokenClass, to_pop): # type: (Any) -> None # Reset possible simple key on the current level. self.remove_possible_simple_key() # Decrease the flow level. - self.flow_level -= 1 + self.flow_level_org -= 1 + assert self.flow_context.pop() == to_pop + assert self.flow_level_org == len(self.flow_context) # No simple keys after ']' or '}'. self.allow_simple_key = False # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. @@ -778,7 +793,10 @@ class Scanner(object): if bool(self.flow_level): return True else: - if bool(self.flow_level) and self.reader.peek(1) in '\'"{[]}': + if bool(self.flow_level): + if self.flow_context[-1] == '[': + return False + # if self.reader.peek(1) in '\'"{[]}': return True # VALUE(block context): ':' (' '|'\n') return self.reader.peek(1) in _THE_END_SPACE_TAB |