Skip to content

Commit d4fe9bf

Browse files
committed
Add Key.rename from PR #99, with test.
Manually applies patch from gsalgado: gsalgado@1c80d61 But changes semantics to return the new key instance, leaving the original key unchanged.
1 parent b878465 commit d4fe9bf

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

gcloud/storage/key.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,20 @@ def exists(self):
134134

135135
return self.bucket.get_key(self.name) is not None
136136

137+
def rename(self, new_name):
138+
"""Renames this key.
139+
140+
Effectively, copies key to the same bucket with a new name, then
141+
deletes the key.
142+
143+
:type new_name: string
144+
:param new_name: The new name for this key.
145+
146+
:rtype: :class:`Key`
147+
:returns: The newly-copied key.
148+
"""
149+
return self.bucket.copy_key(self, self.bucket, new_name)
150+
137151
def delete(self):
138152
"""Deletes a key from Cloud Storage.
139153

gcloud/storage/test_key.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,23 @@ def test_exists_hit(self):
9595
bucket._keys[KEY] = 1
9696
self.assertTrue(key.exists())
9797

98+
def test_rename(self):
99+
KEY = 'key'
100+
NEW_NAME = 'new-name'
101+
connection = _Connection()
102+
bucket = _Bucket(connection)
103+
key = self._makeOne(bucket, KEY)
104+
bucket._keys[KEY] = 1
105+
orig_key_path = key.path
106+
new_key = key.rename(NEW_NAME)
107+
expected = [
108+
['POST', orig_key_path + '/copyTo/b/bucket/o/%s' % NEW_NAME, None],
109+
['DELETE', orig_key_path, None]]
110+
self.assertEqual(key.name, KEY)
111+
self.assertEqual(new_key.name, NEW_NAME)
112+
self.assertFalse(KEY in bucket._keys)
113+
self.assertTrue(NEW_NAME in bucket._keys)
114+
98115
def test_delete(self):
99116
KEY = 'key'
100117
connection = _Connection()
@@ -594,5 +611,9 @@ def __init__(self, connection):
594611
def get_key(self, key):
595612
return self._keys.get(key) # XXX s.b. 'key.name'?
596613

614+
def copy_key(self, key, destination_bucket, new_name):
615+
destination_bucket._keys[new_name] = self._keys.pop(key.name)
616+
return key.from_dict({'name': new_name}, bucket=destination_bucket)
617+
597618
def delete_key(self, key):
598619
del self._keys[key.name] # XXX s.b. 'key'?

0 commit comments

Comments
 (0)