diff --git a/octodns/provider/plan.py b/octodns/provider/plan.py index 825204c..5c33460 100644 --- a/octodns/provider/plan.py +++ b/octodns/provider/plan.py @@ -2,7 +2,9 @@ # # +from collections import defaultdict from io import StringIO +from json import dumps from logging import DEBUG, ERROR, INFO, WARN, getLogger from sys import stdout @@ -220,6 +222,20 @@ def _value_stringifier(record, sep): return sep.join(values) +class PlanJson(_PlanOutput): + def __init__(self, name, indent=None, sort_keys=True): + super().__init__(name) + self.indent = indent + self.sort_keys = sort_keys + + def run(self, plans, fh=stdout, *args, **kwargs): + data = defaultdict(dict) + for target, plan in plans: + data[target.id][plan.desired.name] = plan.data + + fh.write(dumps(data, indent=self.indent, sort_keys=self.sort_keys)) + + class PlanMarkdown(_PlanOutput): def run(self, plans, fh=stdout, *args, **kwargs): if plans: diff --git a/tests/test_octodns_plan.py b/tests/test_octodns_plan.py index 2fda278..21240a0 100644 --- a/tests/test_octodns_plan.py +++ b/tests/test_octodns_plan.py @@ -3,6 +3,7 @@ # from io import StringIO +from json import loads from logging import getLogger from unittest import TestCase @@ -11,6 +12,7 @@ from helpers import SimpleProvider from octodns.provider.plan import ( Plan, PlanHtml, + PlanJson, PlanLogger, PlanMarkdown, RootNsChange, @@ -126,6 +128,17 @@ class TestPlanHtml(TestCase): ) +class TestPlanJson(TestCase): + def test_basics(self): + out = StringIO() + PlanJson('json').run(plans, fh=out) + data = loads(out.getvalue()) + for key in ('test', 'unit.tests.', 'changes'): + self.assertTrue(key in data) + data = data[key] + self.assertEqual(4, len(data)) + + class TestPlanMarkdown(TestCase): log = getLogger('TestPlanMarkdown')