Skip to content

Commit a9128e8

Browse files
committed
refactor: remove FileMetaShim in favour of api methods
This commit removes the temporary shim now that the SDK is up-to-date
1 parent 4d25348 commit a9128e8

File tree

4 files changed

+87
-183
lines changed

4 files changed

+87
-183
lines changed

django_backblaze_b2/b2_filemeta_shim.py

Lines changed: 0 additions & 79 deletions
This file was deleted.

django_backblaze_b2/storage.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from django.utils.deconstruct import deconstructible
1111

1212
from django_backblaze_b2.b2_file import B2File
13-
from django_backblaze_b2.b2_filemeta_shim import FileMetaShim
1413
from django_backblaze_b2.options import BackblazeB2StorageOptions, getDefaultB2StorageOptions
1514

1615
logger = getLogger("django-backblaze-b2")
@@ -101,17 +100,22 @@ def path(self, name: str) -> str:
101100

102101
def delete(self, name: str) -> None:
103102
try:
104-
fileId = FileMetaShim(self.b2Api, self.bucket, name).id
105-
logger.debug(f"Deleting file {name} id=({fileId})")
106-
self.b2Api.delete_file_version(file_id=fileId, file_name=name)
103+
fileInfo = self.bucket.get_file_info_by_name(name)
104+
logger.debug(f"Deleting file {name} id=({fileInfo.id_})")
105+
self.b2Api.delete_file_version(file_id=fileInfo.id_, file_name=name)
107106
except FileNotPresent:
108107
logger.debug("Not found")
109108

110109
def exists(self, name: str) -> bool:
111-
return FileMetaShim(self.b2Api, self.bucket, name).exists
110+
try:
111+
self.bucket.get_file_info_by_name(name)
112+
return True
113+
except FileNotPresent:
114+
return False
112115

113116
def size(self, name: str) -> int:
114-
return FileMetaShim(self.b2Api, self.bucket, name).contentLength
117+
fileInfo = self.bucket.get_file_info_by_name(name)
118+
return fileInfo.size if fileInfo.size is not None else 0
115119

116120
def url(self, name: Optional[str]) -> str:
117121
if not name:

tests/test_b2_storage_class.py

Lines changed: 15 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
from unittest import mock
33

44
import pytest
5-
from b2sdk.exception import B2Error, ServiceError
6-
from b2sdk.v1 import B2Api
5+
from b2sdk.exception import FileNotPresent
6+
from b2sdk.file_version import FileVersionInfoFactory
7+
from b2sdk.v1 import B2Api, Bucket
78
from b2sdk.v1.exception import NonExistentBucket
89
from django.core.exceptions import ImproperlyConfigured
910
from django_backblaze_b2 import BackblazeB2Storage
10-
from django_backblaze_b2.b2_filemeta_shim import FileMetaShim
11-
from requests import HTTPError, Response
1211

1312

1413
def test_requiresConfiguration():
@@ -130,9 +129,15 @@ def test_urlRequiresName(settings):
130129

131130

132131
def test_get_available_nameWithOverwrites(settings):
132+
mockedBucket = mock.Mock(spec=Bucket)
133+
mockedBucket.get_file_info_by_name.return_value = FileVersionInfoFactory.from_response_headers(
134+
{"id_": 1, "file_name": "some_name.txt"}
135+
)
136+
133137
with mock.patch.object(settings, "BACKBLAZE_CONFIG", _settingsDict({})), mock.patch.object(
134138
B2Api, "authorize_account"
135-
), mock.patch.object(B2Api, "get_bucket_by_name"), mock.patch.object(FileMetaShim, "exists", return_value=True):
139+
), mock.patch.object(B2Api, "get_bucket_by_name") as api:
140+
api.return_value = mockedBucket
136141
storage = BackblazeB2Storage(opts={"allowFileOverwrites": True})
137142

138143
availableName = storage.get_available_name("some_name.txt", max_length=None)
@@ -157,62 +162,19 @@ def test_notImplementedMethods(settings):
157162

158163

159164
def test_existsFileDoesNotExist(settings):
160-
fileMetaResponse = mock.Mock(spec=Response)
161-
fileMetaResponse.status_code = 404
165+
mockedBucket = mock.Mock(spec=Bucket)
166+
mockedBucket.get_file_info_by_name.side_effect = FileNotPresent()
162167

163168
with mock.patch.object(settings, "BACKBLAZE_CONFIG", _settingsDict({})), mock.patch.object(
164169
B2Api, "authorize_account"
165-
), mock.patch.object(B2Api, "get_bucket_by_name"), mock.patch.object(
166-
FileMetaShim, "_get_head_response", side_effect=HTTPError(response=fileMetaResponse)
167-
) as patchedHead:
170+
), mock.patch.object(B2Api, "get_bucket_by_name") as api:
171+
api.return_value = mockedBucket
168172
storage = BackblazeB2Storage(opts={})
169173

170174
doesFileExist = storage.exists("some/file.txt")
171175

172176
assert not doesFileExist
173-
assert patchedHead.call_count == 1
174-
175-
176-
def test_existsServerErrorInterpretationAndRetry(settings):
177-
fileMetaResponse = mock.Mock(spec=Response)
178-
fileMetaResponse.status_code = 500
179-
fileMetaResponse.headers = {}
180-
181-
with mock.patch.object(settings, "BACKBLAZE_CONFIG", _settingsDict({})), mock.patch.object(
182-
B2Api, "authorize_account"
183-
), mock.patch.object(B2Api, "get_bucket_by_name"), mock.patch.object(
184-
B2Api, "authorize_automatically", return_value=True
185-
), mock.patch.object(
186-
FileMetaShim, "_get_head_response", side_effect=HTTPError(response=fileMetaResponse)
187-
) as patchedHead:
188-
storage = BackblazeB2Storage(opts={})
189-
190-
with pytest.raises(B2Error) as raised:
191-
storage.exists("some/file.txt")
192-
193-
assert isinstance(raised.value, ServiceError)
194-
assert patchedHead.call_count == 4
195-
196-
197-
def test_existsServerErrorDoesNotRetryIfCantAuth(settings):
198-
fileMetaResponse = mock.Mock(spec=Response)
199-
fileMetaResponse.status_code = 500
200-
fileMetaResponse.headers = {}
201-
202-
with mock.patch.object(settings, "BACKBLAZE_CONFIG", _settingsDict({})), mock.patch.object(
203-
B2Api, "authorize_account"
204-
), mock.patch.object(B2Api, "get_bucket_by_name"), mock.patch.object(
205-
B2Api, "authorize_automatically", return_value=False
206-
), mock.patch.object(
207-
FileMetaShim, "_get_head_response", side_effect=HTTPError(response=fileMetaResponse)
208-
) as patchedHead:
209-
storage = BackblazeB2Storage(opts={})
210-
211-
with pytest.raises(B2Error) as raised:
212-
storage.exists("some/file.txt")
213-
214-
assert isinstance(raised.value, ServiceError)
215-
assert patchedHead.call_count == 1
177+
assert mockedBucket.get_file_info_by_name.call_count == 1
216178

217179

218180
def _settingsDict(config: Dict[str, Any]) -> Dict[str, Any]:

0 commit comments

Comments
 (0)