Skip to content

Commit bdb4073

Browse files
committed
feat: add resolved file name handling for versioned files to properly format CDN key
Enhanced `VersionedFile` to support distinct properties for `full_name` and `resolved_full_name`, enabling separate handling of base file names and versioned file names. Updated related tests and action classes to reflect these changes.
1 parent 99ac44f commit bdb4073

File tree

5 files changed

+52
-16
lines changed

5 files changed

+52
-16
lines changed

backend/core/actions/jetton.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -155,17 +155,19 @@ async def _get_blockchain_info(self, address_raw: str, version: int) -> JettonDT
155155
jetton_logo,
156156
target_location=tmp_file,
157157
)
158-
# Make sure the cursor is set at the beginning to avoid empty files
159-
tmp_file.seek(0)
160-
logo_path = VersionedFile(
161-
base_name=address_raw,
162-
version=version,
163-
extension=file_extension,
164-
).full_name
158+
165159
if file_extension:
160+
# Make sure the cursor is set at the beginning to avoid empty files
161+
tmp_file.seek(0)
162+
versioned_file = VersionedFile(
163+
base_name=address_raw,
164+
version=version,
165+
extension=file_extension,
166+
)
167+
logo_path = versioned_file.resolved_full_name
166168
await self.cdn_service.upload_file(
167169
file_path=tmp_file.name,
168-
object_name=logo_path,
170+
object_name=versioned_file.full_name,
169171
)
170172

171173
dto = JettonDTO.from_info(jetton_info, logo_path)

backend/core/actions/nft_collection.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,14 @@ async def _get_blockchain_info(
161161
# Make sure the cursor is set at the beginning to avoid empty files
162162
tmp_file.seek(0)
163163
if file_extension:
164-
logo_path = VersionedFile(
164+
versioned_file = VersionedFile(
165165
base_name=address_raw,
166166
version=version,
167167
extension=file_extension,
168-
).full_name
168+
)
169+
logo_path = versioned_file.resolved_full_name
169170
await self.cdn_service.upload_file(
170-
file_path=tmp_file.name, object_name=logo_path
171+
file_path=tmp_file.name, object_name=versioned_file.full_name
171172
)
172173

173174
dto = NftCollectionDTO.from_info(nft_collection_data, logo_path)

backend/core/utils/file.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,15 @@ def from_filename(cls, file_name: str) -> Self:
158158
return instance
159159

160160
def _format_file_name(self) -> str:
161+
"""
162+
Returns the full formatted name of the file, including base name and extension only
163+
"""
164+
return f"{self.base_name}{self._extension}"
165+
166+
def _resolve_file_name(self) -> str:
167+
"""
168+
Resolves the file name based on the version.
169+
"""
161170
return f"{self.base_name}{self._extension}?v={self._version}"
162171

163172
def _parse_file_name(self) -> tuple[str, int | None, str]:
@@ -174,8 +183,18 @@ def _parse_file_name(self) -> tuple[str, int | None, str]:
174183

175184
@property
176185
def full_name(self) -> str:
186+
"""
187+
Returns the full formatted name of the file, including base name and extension.
188+
"""
177189
return self._format_file_name()
178190

191+
@property
192+
def resolved_full_name(self) -> str:
193+
"""
194+
Returns the full formatted name of the file, including base name, version, and extension.
195+
"""
196+
return self._resolve_file_name()
197+
179198
@property
180199
def base_name(self) -> str:
181200
return self._base_name

backend/tests/unit/core/actions/test_jetton.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ async def test_refresh__increments_file_version__pass(
299299
jetton_dto = JettonDTO.from_orm(jetton)
300300
new_version = logo_path_obj.get_next_version()
301301
logo_path_obj._version = new_version
302-
jetton_dto.logo_path = logo_path_obj.full_name
302+
jetton_dto.logo_path = logo_path_obj.resolved_full_name
303303
jetton_action._get_blockchain_info = mocker.AsyncMock(return_value=jetton_dto)
304304
await jetton_action.refresh(jetton.address)
305305

backend/tests/unit/core/utils/test_file.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,32 @@ def test_versioned_file__increment_version__pass(
5858

5959

6060
@pytest.mark.parametrize(
61-
("base_name", "extension", "version", "expected_filename"),
61+
(
62+
"base_name",
63+
"extension",
64+
"version",
65+
"expected_filename",
66+
"expected_resolved_filename",
67+
),
6268
[
63-
("test", ".txt", None, f"test.txt?v={DEFAULT_INCREMENTED_FILE_VERSION}"),
64-
("test", ".txt", 1, "test.txt?v=1"),
65-
("test", ".png", 123, "test.png?v=123"),
69+
(
70+
"test",
71+
".txt",
72+
None,
73+
"test.txt",
74+
f"test.txt?v={DEFAULT_INCREMENTED_FILE_VERSION}",
75+
),
76+
("test", ".txt", 1, "test.txt", "test.txt?v=1"),
77+
("test", ".png", 123, "test.png", "test.png?v=123"),
6678
],
6779
)
6880
def test_versioned_file__to_filename__pass(
6981
base_name: str,
7082
extension: str,
7183
version: int | None,
7284
expected_filename: str,
85+
expected_resolved_filename: str,
7386
) -> None:
7487
result = VersionedFile(base_name, extension, version)
7588
assert result.full_name == expected_filename
89+
assert result.resolved_full_name == expected_resolved_filename

0 commit comments

Comments
 (0)