summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToshio Kuratomi <toshio@fedoraproject.org>2015-03-31 12:39:11 -0700
committerToshio Kuratomi <toshio@fedoraproject.org>2015-03-31 12:58:24 -0700
commit6380249ee3adf406e50a0855478b8962e2aec4ca (patch)
tree78a478d03f2b8e720e293f2dcbf308f67122a31c
parent302d439e65cb311eba3c62fe1542e52e61f353b0 (diff)
downloadansible-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.py16
-rw-r--r--v2/ansible/parsing/yaml/constructor.py21
-rw-r--r--v2/ansible/parsing/yaml/objects.py3
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