Add new 'unsafe' YAML constructor

This commit is contained in:
Matt Martz 2016-02-04 09:58:50 -06:00
parent b2c0abe998
commit 8bc2d3be9c

View file

@ -22,6 +22,7 @@ __metaclass__ = type
from yaml.constructor import Constructor, ConstructorError from yaml.constructor import Constructor, ConstructorError
from yaml.nodes import MappingNode from yaml.nodes import MappingNode
from ansible.parsing.yaml.objects import AnsibleMapping, AnsibleSequence, AnsibleUnicode from ansible.parsing.yaml.objects import AnsibleMapping, AnsibleSequence, AnsibleUnicode
from ansible.vars.unsafe_proxy import wrap_var
try: try:
from __main__ import display from __main__ import display
@ -72,7 +73,7 @@ class AnsibleConstructor(Constructor):
return mapping return mapping
def construct_yaml_str(self, node): def construct_yaml_str(self, node, unsafe=False):
# Override the default string handling function # Override the default string handling function
# to always return unicode objects # to always return unicode objects
value = self.construct_scalar(node) value = self.construct_scalar(node)
@ -80,6 +81,9 @@ class AnsibleConstructor(Constructor):
ret.ansible_pos = self._node_position_info(node) ret.ansible_pos = self._node_position_info(node)
if unsafe:
ret = wrap_var(ret)
return ret return ret
def construct_yaml_seq(self, node): def construct_yaml_seq(self, node):
@ -88,6 +92,9 @@ class AnsibleConstructor(Constructor):
data.extend(self.construct_sequence(node)) data.extend(self.construct_sequence(node))
data.ansible_pos = self._node_position_info(node) data.ansible_pos = self._node_position_info(node)
def construct_yaml_unsafe(self, node):
return self.construct_yaml_str(node, unsafe=True)
def _node_position_info(self, node): def _node_position_info(self, node):
# the line number where the previous token has ended (plus empty lines) # the line number where the previous token has ended (plus empty lines)
# Add one so that the first line is line 1 rather than line 0 # Add one so that the first line is line 1 rather than line 0
@ -121,3 +128,7 @@ AnsibleConstructor.add_constructor(
AnsibleConstructor.add_constructor( AnsibleConstructor.add_constructor(
u'tag:yaml.org,2002:seq', u'tag:yaml.org,2002:seq',
AnsibleConstructor.construct_yaml_seq) AnsibleConstructor.construct_yaml_seq)
AnsibleConstructor.add_constructor(
u'!unsafe',
AnsibleConstructor.construct_yaml_unsafe)