diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d546277..65cbeeff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ [1]: https://pypi.org/project/google-api-core/#history +### [1.26.2](https://www.github.com/googleapis/python-api-core/compare/v1.26.1...v1.26.2) (2021-03-23) + + +### Bug Fixes + +* save empty IAM policy bindings ([#155](https://www.github.com/googleapis/python-api-core/issues/155)) ([536c2ca](https://www.github.com/googleapis/python-api-core/commit/536c2cad814b8fa8cd346a3d7bd5f6b9889c4a6f)) + ### [1.26.1](https://www.github.com/googleapis/python-api-core/compare/v1.26.0...v1.26.1) (2021-02-12) diff --git a/google/api_core/iam.py b/google/api_core/iam.py index f1309360..d83cbf35 100644 --- a/google/api_core/iam.py +++ b/google/api_core/iam.py @@ -136,7 +136,10 @@ def __getitem__(self, key): for b in self._bindings: if b["role"] == key: return b["members"] - return set() + # binding does not yet exist, create one + new_binding = {"role": key, "members": set()} + self._bindings.append(new_binding) + return new_binding["members"] def __setitem__(self, key, value): self.__check_version__() diff --git a/google/api_core/version.py b/google/api_core/version.py index eff0ea18..3c06c88d 100644 --- a/google/api_core/version.py +++ b/google/api_core/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.26.1" +__version__ = "1.26.2" diff --git a/tests/unit/test_iam.py b/tests/unit/test_iam.py index 896e10de..f9771f0f 100644 --- a/tests/unit/test_iam.py +++ b/tests/unit/test_iam.py @@ -32,11 +32,11 @@ def test_ctor_defaults(self): policy = self._make_one() assert policy.etag is None assert policy.version is None + assert len(policy) == 0 + assert dict(policy) == {} assert policy.owners == empty assert policy.editors == empty assert policy.viewers == empty - assert len(policy) == 0 - assert dict(policy) == {} def test_ctor_explicit(self): VERSION = 1 @@ -45,16 +45,24 @@ def test_ctor_explicit(self): policy = self._make_one(ETAG, VERSION) assert policy.etag == ETAG assert policy.version == VERSION + assert len(policy) == 0 + assert dict(policy) == {} assert policy.owners == empty assert policy.editors == empty assert policy.viewers == empty - assert len(policy) == 0 - assert dict(policy) == {} def test___getitem___miss(self): policy = self._make_one() assert policy["nonesuch"] == set() + def test__getitem___and_set(self): + from google.api_core.iam import OWNER_ROLE + policy = self._make_one() + + # get the policy using the getter and then modify it + policy[OWNER_ROLE].add("user:phred@example.com") + assert dict(policy) == {OWNER_ROLE: {"user:phred@example.com"}} + def test___getitem___version3(self): policy = self._make_one("DEADBEEF", 3) with pytest.raises(InvalidOperationException, match=_DICT_ACCESS_MSG): @@ -293,10 +301,10 @@ def test_from_api_repr_only_etag(self): policy = klass.from_api_repr(RESOURCE) assert policy.etag == "ACAB" assert policy.version is None + assert dict(policy) == {} assert policy.owners == empty assert policy.editors == empty assert policy.viewers == empty - assert dict(policy) == {} def test_from_api_repr_complete(self): from google.api_core.iam import OWNER_ROLE, EDITOR_ROLE, VIEWER_ROLE