From f9a4d49fa4581cb3e9bc9c9af433246fc72b9881 Mon Sep 17 00:00:00 2001 From: Matthew Aynalem Date: Thu, 28 Mar 2019 18:23:05 -0700 Subject: [PATCH] fix #172 naming conflict from troposphere BaseAWSObject.attributes preventing "attributes" property name from being used/rendered by packerlicious classes --- src/thirdparty/troposphere/__init__.py | 6 ++-- .../packerlicious/test_provisioner_inspec.py | 28 ++++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/thirdparty/troposphere/__init__.py b/src/thirdparty/troposphere/__init__.py index 5059d5a..be047f8 100644 --- a/src/thirdparty/troposphere/__init__.py +++ b/src/thirdparty/troposphere/__init__.py @@ -65,7 +65,7 @@ def __init__(self, title, template=None, **kwargs): self.template = template # Cache the keys for validity checks self.propnames = list(self.props.keys()) - self.attributes = ['DependsOn', 'DeletionPolicy', + self.attributes_ = ['DependsOn', 'DeletionPolicy', 'Metadata', 'UpdatePolicy', 'Condition', 'CreationPolicy'] @@ -102,7 +102,7 @@ def __init__(self, title, template=None, **kwargs): def __getattr__(self, name): try: - if name in self.attributes: + if name in self.attributes_: return self.resource[name] else: return self.properties.__getitem__(name) @@ -118,7 +118,7 @@ def __setattr__(self, name, value): if name in list(self.__dict__.keys()) \ or '_BaseAWSObject__initialized' not in self.__dict__: return dict.__setattr__(self, name, value) - elif name in self.attributes: + elif name in self.attributes_: self.resource[name] = value return None elif name in self.propnames: diff --git a/tests/packerlicious/test_provisioner_inspec.py b/tests/packerlicious/test_provisioner_inspec.py index baaf0ee..8d0e9ab 100644 --- a/tests/packerlicious/test_provisioner_inspec.py +++ b/tests/packerlicious/test_provisioner_inspec.py @@ -1,6 +1,7 @@ import pytest - import packerlicious.provisioner as provisioner +from packerlicious import Template +import json class TestInspecProvisioner(object): @@ -11,3 +12,28 @@ def test_required_fields_missing(self): with pytest.raises(ValueError) as excinfo: b.to_dict() assert 'required' in str(excinfo.value) + + def test_property_attributes_renders(self): + expected_json = """ + { + "provisioners": [ + { + "attributes": ["examples/linux.yml"], + "profile": "a_profile", + "type": "inspec" + } + ] + } + """ + + t = Template() + p = provisioner.Inspec( + attributes=["examples/linux.yml"], + profile="a_profile" + ) + p.to_dict() + t.add_provisioner(p) + + to_json = t.to_json() + assert to_json == json.dumps(json.loads(expected_json), sort_keys=True, indent=2, + separators=(',', ': '))