add option to not use references in yaml output
diff --git a/reclass/__init__.py b/reclass/__init__.py
index 7cd6c30..c86b880 100644
--- a/reclass/__init__.py
+++ b/reclass/__init__.py
@@ -16,7 +16,7 @@
return MemcacheProxy(storage_class(nodes_uri, classes_uri, **kwargs))
-def output(data, fmt, pretty_print=False):
+def output(data, fmt, pretty_print=False, no_refs=False):
output_class = OutputLoader(fmt).load()
outputter = output_class()
- return outputter.dump(data, pretty_print=pretty_print)
+ return outputter.dump(data, pretty_print=pretty_print, no_refs=no_refs)
diff --git a/reclass/adapters/ansible.py b/reclass/adapters/ansible.py
index cbf5f17..cf0795e 100755
--- a/reclass/adapters/ansible.py
+++ b/reclass/adapters/ansible.py
@@ -27,6 +27,7 @@
ansible_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
defaults = {'inventory_base_uri': ansible_dir,
+ 'no_refs' : False,
'pretty_print' : True,
'output' : 'json',
'applications_postfix': '_hosts'
@@ -81,7 +82,7 @@
data = groups
- print output(data, options.output, options.pretty_print)
+ print output(data, options.output, options.pretty_print, options.no_refs)
except ReclassException, e:
e.exit_with_message(sys.stderr)
diff --git a/reclass/adapters/salt.py b/reclass/adapters/salt.py
index 1b45823..8647eb7 100755
--- a/reclass/adapters/salt.py
+++ b/reclass/adapters/salt.py
@@ -81,6 +81,7 @@
try:
inventory_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
defaults = {'pretty_print' : True,
+ 'no_refs' : False,
'output' : 'yaml',
'inventory_base_uri': inventory_dir
}
@@ -111,7 +112,7 @@
classes_uri=options.classes_uri,
class_mappings=class_mappings)
- print output(data, options.output, options.pretty_print)
+ print output(data, options.output, options.pretty_print, options.no_refs)
except ReclassException, e:
e.exit_with_message(sys.stderr)
diff --git a/reclass/cli.py b/reclass/cli.py
index 5666e16..1f7213d 100644
--- a/reclass/cli.py
+++ b/reclass/cli.py
@@ -19,7 +19,8 @@
def main():
try:
- defaults = {'pretty_print' : OPT_PRETTY_PRINT,
+ defaults = {'no_refs' : OPT_NO_REFS,
+ 'pretty_print' : OPT_PRETTY_PRINT,
'output' : OPT_OUTPUT
}
defaults.update(find_and_read_configfile())
@@ -37,7 +38,7 @@
else:
data = reclass.inventory()
- print output(data, options.output, options.pretty_print)
+ print output(data, options.output, options.pretty_print, options.no_refs)
except ReclassException, e:
e.exit_with_message(sys.stderr)
diff --git a/reclass/config.py b/reclass/config.py
index 17d0dc6..3d218d8 100644
--- a/reclass/config.py
+++ b/reclass/config.py
@@ -42,6 +42,9 @@
action="store_true",
default=defaults.get('pretty_print', OPT_PRETTY_PRINT),
help='try to make the output prettier [%default]')
+ ret.add_option('-r', '--no-refs', dest='no_refs', action="store_true",
+ default=defaults.get('no_refs', OPT_NO_REFS),
+ help='output all key values do not use yaml references [%default]')
return ret
diff --git a/reclass/defaults.py b/reclass/defaults.py
index fb04c83..c3fa4a7 100644
--- a/reclass/defaults.py
+++ b/reclass/defaults.py
@@ -15,6 +15,7 @@
OPT_NODES_URI = 'nodes'
OPT_CLASSES_URI = 'classes'
OPT_PRETTY_PRINT = True
+OPT_NO_REFS = False
OPT_OUTPUT = 'yaml'
CONFIG_FILE_SEARCH_PATH = [os.getcwd(),
diff --git a/reclass/output/json_outputter.py b/reclass/output/json_outputter.py
index dab86ed..8c79039 100644
--- a/reclass/output/json_outputter.py
+++ b/reclass/output/json_outputter.py
@@ -11,7 +11,7 @@
class Outputter(OutputterBase):
- def dump(self, data, pretty_print=False):
+ def dump(self, data, pretty_print=False, no_refs=False):
separators = (',', ': ') if pretty_print else (',', ':')
indent = 2 if pretty_print else None
return json.dumps(data, indent=indent, separators=separators)
diff --git a/reclass/output/yaml_outputter.py b/reclass/output/yaml_outputter.py
index 2c70cc3..9a0d098 100644
--- a/reclass/output/yaml_outputter.py
+++ b/reclass/output/yaml_outputter.py
@@ -11,5 +11,16 @@
class Outputter(OutputterBase):
- def dump(self, data, pretty_print=False):
- return yaml.dump(data, default_flow_style=not pretty_print)
+ def dump(self, data, pretty_print=False, no_refs=False):
+ if (no_refs):
+ return yaml.dump(data, default_flow_style=not pretty_print, Dumper=ExplicitDumper)
+ else:
+ return yaml.dump(data, default_flow_style=not pretty_print)
+
+class ExplicitDumper(yaml.SafeDumper):
+ """
+ A dumper that will never emit aliases.
+ """
+
+ def ignore_aliases(self, data):
+ return True