diff --git a/charms_openstack/adapters.py b/charms_openstack/adapters.py index e5d42ec..0abad7d 100644 --- a/charms_openstack/adapters.py +++ b/charms_openstack/adapters.py @@ -187,23 +187,22 @@ class OpenStackRelationAdapter(object): (lambda name: property( lambda self: getattr( self.relation, name)))(name)) - else: - try: - self.accessors.extend(self.relation.auto_accessors) - except AttributeError: - self.accessors = [] - for field in self.accessors: - meth_name = field.replace('-', '_') - # Get the relation property dynamically - # Note the additional lambda name: is to create a closure over - # meth_name so that a new 'name' gets created for each loop, - # otherwise the same variable meth_name is referenced in each - # of the internal lambdas. i.e. this is (lambda x: ...)(value) - setattr(self.__class__, - meth_name, - (lambda name: property( - lambda self: getattr( - self.relation, name)()))(meth_name)) + try: + self.accessors.extend(self.relation.auto_accessors) + except AttributeError: + pass + for field in self.accessors: + meth_name = field.replace('-', '_') + # Get the relation property dynamically + # Note the additional lambda name: is to create a closure over + # meth_name so that a new 'name' gets created for each loop, + # otherwise the same variable meth_name is referenced in each + # of the internal lambdas. i.e. this is (lambda x: ...)(value) + setattr(self.__class__, + meth_name, + (lambda name: property( + lambda self: getattr( + self.relation, name)()))(meth_name)) class MemcacheRelationAdapter(OpenStackRelationAdapter): diff --git a/tox.ini b/tox.ini index 58d452c..febf758 100644 --- a/tox.ini +++ b/tox.ini @@ -30,6 +30,10 @@ deps = -r{toxinidir}/test-requirements.txt basepython = python3.8 deps = -r{toxinidir}/test-requirements.txt +[testenv:py310] +basepython = python3.10 +deps = -r{toxinidir}/test-requirements.txt + [testenv:pep8] basepython = python3 deps = -r{toxinidir}/test-requirements.txt diff --git a/unit_tests/test_charms_openstack_adapters.py b/unit_tests/test_charms_openstack_adapters.py index 4a52bdf..1d0361f 100644 --- a/unit_tests/test_charms_openstack_adapters.py +++ b/unit_tests/test_charms_openstack_adapters.py @@ -136,6 +136,16 @@ class MyEndpointRelation(reactive.Endpoint): return self.value +class MyEndpointAutoAccessorsRelation( + MyEndpointRelation, + metaclass=reactive.relations.AutoAccessors): + + auto_accessors = ['foo', 'bar'] + + def get_remote(self, key): + return key + + class TestOpenStackRelationAdapter(unittest.TestCase): def test_class(self): @@ -184,6 +194,17 @@ class TestOpenStackRelationAdapter(unittest.TestCase): with self.assertRaises(AttributeError): self.assertFalse(ad.a_function) + def test_class_with_endpoint_auto_accessors_relation(self): + er = MyEndpointAutoAccessorsRelation('my-name') + ad = adapters.OpenStackRelationAdapter(er) + self.assertEqual(ad.a_property, 'has value in config rendering') + er.value = 'can change after instantiation' + self.assertEqual(ad.a_property, 'can change after instantiation') + with self.assertRaises(AttributeError): + self.assertFalse(ad.a_function) + self.assertEqual(ad.foo, 'foo') + self.assertEqual(ad.bar, 'bar') + class FakeMemcacheRelation():