diff options
author | Toshio Kuratomi <toshio@fedoraproject.org> | 2015-03-31 12:39:11 -0700 |
---|---|---|
committer | Toshio Kuratomi <toshio@fedoraproject.org> | 2015-03-31 12:58:24 -0700 |
commit | 6380249ee3adf406e50a0855478b8962e2aec4ca (patch) | |
tree | 78a478d03f2b8e720e293f2dcbf308f67122a31c | |
parent | 302d439e65cb311eba3c62fe1542e52e61f353b0 (diff) | |
download | ansible-v2-unicode-yaml.tar.gz |
Make a yaml type for unicode so that we can track line numbersv2-unicode-yaml
-rw-r--r-- | v2/ansible/parsing/yaml/composer.py | 16 | ||||
-rw-r--r-- | v2/ansible/parsing/yaml/constructor.py | 21 | ||||
-rw-r--r-- | v2/ansible/parsing/yaml/objects.py | 3 |
3 files changed, 35 insertions, 5 deletions
diff --git a/v2/ansible/parsing/yaml/composer.py b/v2/ansible/parsing/yaml/composer.py index 0f9c90606f..4f2c9f411b 100644 --- a/v2/ansible/parsing/yaml/composer.py +++ b/v2/ansible/parsing/yaml/composer.py @@ -20,17 +20,27 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type from yaml.composer import Composer -from yaml.nodes import MappingNode +from yaml.nodes import MappingNode, ScalarNode class AnsibleComposer(Composer): def __init__(self): self.__mapping_starts = [] super(Composer, self).__init__() + def compose_node(self, parent, index): # the line number where the previous token has ended (plus empty lines) node = Composer.compose_node(self, parent, index) - if isinstance(node, MappingNode): + if isinstance(node, ScalarNode): + # Scalars are pretty easy -- assume they start on the current + # token's line (what about multiline strings? Perhaps we also + # need to use previous token ended + node.__datasource__ = self.name + node.__line__ = self.line + 1 + node.__column__ = self.column + 1 + elif isinstance(node, MappingNode): node.__datasource__ = self.name + + # Need extra help to know where the mapping starts try: (cur_line, cur_column) = self.__mapping_starts.pop() except: @@ -38,7 +48,9 @@ class AnsibleComposer(Composer): cur_column = None node.__line__ = cur_line node.__column__ = cur_column + return node + def compose_mapping_node(self, anchor): # the column here will point at the position in the file immediately # after the first key is found, which could be a space or a newline. diff --git a/v2/ansible/parsing/yaml/constructor.py b/v2/ansible/parsing/yaml/constructor.py index 2d7c976e74..b607f46b05 100644 --- a/v2/ansible/parsing/yaml/constructor.py +++ b/v2/ansible/parsing/yaml/constructor.py @@ -20,7 +20,8 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type from yaml.constructor import Constructor -from ansible.parsing.yaml.objects import AnsibleMapping +from ansible.utils.unicode import to_unicode +from ansible.parsing.yaml.objects import AnsibleMapping, AnsibleUnicode class AnsibleConstructor(Constructor): def __init__(self, file_name=None): @@ -55,8 +56,18 @@ class AnsibleConstructor(Constructor): def construct_yaml_str(self, node): # Override the default string handling function # to always return unicode objects - # Adapted from: http://stackoverflow.com/questions/2890146/how-to-force-pyyaml-to-load-strings-as-unicode-objects - return self.construct_scalar(node) + value = self.construct_scalar(node) + value = to_unicode(value) + data = AnsibleUnicode(self.construct_scalar(node)) + + data._line_number = node.__line__ + data._column_number = node.__column__ + if self._ansible_file_name: + data._data_source = self._ansible_file_name + else: + data._data_source = node.__datasource__ + + return data AnsibleConstructor.add_constructor( u'tag:yaml.org,2002:map', @@ -70,3 +81,7 @@ AnsibleConstructor.add_constructor( u'tag:yaml.org,2002:str', AnsibleConstructor.construct_yaml_str) +AnsibleConstructor.add_constructor( + u'tag:yaml.org,2002:python/unicode', + AnsibleConstructor.construct_yaml_str) + diff --git a/v2/ansible/parsing/yaml/objects.py b/v2/ansible/parsing/yaml/objects.py index 6eff9966f9..69f8c0968d 100644 --- a/v2/ansible/parsing/yaml/objects.py +++ b/v2/ansible/parsing/yaml/objects.py @@ -50,3 +50,6 @@ class AnsibleMapping(AnsibleBaseYAMLObject, dict): ''' sub class for dictionaries ''' pass +class AnsibleUnicode(AnsibleBaseYAMLObject, unicode): + ''' sub class for unicode objects ''' + pass |