|
|
|
@ -20,7 +20,6 @@ from __future__ import (absolute_import, division, print_function)
|
|
|
|
|
__metaclass__ = type
|
|
|
|
|
|
|
|
|
|
import copy
|
|
|
|
|
import json
|
|
|
|
|
import os
|
|
|
|
|
import stat
|
|
|
|
|
import subprocess
|
|
|
|
@ -74,30 +73,24 @@ class DataLoader():
|
|
|
|
|
a JSON or YAML string.
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
# YAML parser will take JSON as it is a subset.
|
|
|
|
|
if isinstance(data, AnsibleUnicode):
|
|
|
|
|
# The PyYAML's libyaml bindings use PyUnicode_CheckExact so
|
|
|
|
|
# they are unable to cope with our subclass.
|
|
|
|
|
# Unwrap and re-wrap the unicode so we can keep track of line
|
|
|
|
|
# numbers
|
|
|
|
|
in_data = text_type(data)
|
|
|
|
|
else:
|
|
|
|
|
in_data = data
|
|
|
|
|
try:
|
|
|
|
|
# we first try to load this data as JSON
|
|
|
|
|
return json.loads(data)
|
|
|
|
|
except:
|
|
|
|
|
# if loading JSON failed for any reason, we go ahead
|
|
|
|
|
# and try to parse it as YAML instead
|
|
|
|
|
|
|
|
|
|
if isinstance(data, AnsibleUnicode):
|
|
|
|
|
# The PyYAML's libyaml bindings use PyUnicode_CheckExact so
|
|
|
|
|
# they are unable to cope with our subclass.
|
|
|
|
|
# Unwrap and re-wrap the unicode so we can keep track of line
|
|
|
|
|
# numbers
|
|
|
|
|
new_data = text_type(data)
|
|
|
|
|
else:
|
|
|
|
|
new_data = data
|
|
|
|
|
try:
|
|
|
|
|
new_data = self._safe_load(new_data, file_name=file_name)
|
|
|
|
|
except YAMLError as yaml_exc:
|
|
|
|
|
self._handle_error(yaml_exc, file_name, show_content)
|
|
|
|
|
|
|
|
|
|
if isinstance(data, AnsibleUnicode):
|
|
|
|
|
new_data = AnsibleUnicode(new_data)
|
|
|
|
|
new_data.ansible_pos = data.ansible_pos
|
|
|
|
|
return new_data
|
|
|
|
|
new_data = self._safe_load(in_data, file_name=file_name)
|
|
|
|
|
except YAMLError as yaml_exc:
|
|
|
|
|
self._handle_error(yaml_exc, file_name, show_content)
|
|
|
|
|
|
|
|
|
|
if isinstance(data, AnsibleUnicode):
|
|
|
|
|
new_data = AnsibleUnicode(new_data)
|
|
|
|
|
new_data.ansible_pos = data.ansible_pos
|
|
|
|
|
return new_data
|
|
|
|
|
|
|
|
|
|
def load_from_file(self, file_name):
|
|
|
|
|
''' Loads data from a file, which can contain either JSON or YAML. '''
|
|
|
|
|