Skip to content

Commit b058ca3

Browse files
committed
refactor: clean up
1 parent 101fe41 commit b058ca3

File tree

3 files changed

+27
-17
lines changed

3 files changed

+27
-17
lines changed

src/apify/apify_storage_client/_key_value_store_client.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from typing import TYPE_CHECKING, Any
55

66
from typing_extensions import override
7+
from yarl import URL
78

89
from crawlee.storage_clients._base import KeyValueStoreClient as BaseKeyValueStoreClient
910
from crawlee.storage_clients.models import KeyValueStoreListKeysPage, KeyValueStoreMetadata, KeyValueStoreRecord
@@ -91,11 +92,18 @@ async def get_public_url(self, key: str) -> str:
9192
Args:
9293
key: The key for which the URL should be generated.
9394
"""
94-
public_api_url = self._api_public_base_url
95-
public_url = f'{public_api_url}/v2/key-value-stores/{self._client.resource_id}/records/{key}'
95+
if self._client.resource_id is None:
96+
raise ValueError('resource_id cannot be None when generating a public URL')
9697

97-
url_signing_secret_key = getattr(self.storage_object, 'url_signing_secret_key', None)
98-
if url_signing_secret_key:
99-
public_url += f'?signature={create_hmac_signature(url_signing_secret_key, key)}'
98+
public_url = (
99+
URL(self._api_public_base_url) / 'v2' / 'key-value-stores' / self._client.resource_id / 'records' / key
100+
)
101+
102+
key_value_store = await self.get()
103+
104+
if key_value_store is not None and isinstance(key_value_store.model_extra, dict):
105+
url_signing_secret_key = key_value_store.model_extra.get('urlSigningSecretKey')
106+
if url_signing_secret_key:
107+
public_url = public_url.with_query(signature=create_hmac_signature(url_signing_secret_key, key))
100108

101-
return public_url
109+
return str(public_url)

tests/integration/test_actor_key_value_store.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
from ._utils import generate_unique_resource_name
88
from apify import Actor
9-
from apify._crypto import create_hmac_signature
109

1110
if TYPE_CHECKING:
1211
import pytest
@@ -202,21 +201,24 @@ async def test_generate_public_url_for_kvs_record(
202201
run_actor: RunActorFunction,
203202
) -> None:
204203
async def main() -> None:
205-
from typing import cast
206-
207-
from apify.apify_storage_client._key_value_store_client import KeyValueStoreClient
204+
from apify._crypto import create_hmac_signature
208205

209206
async with Actor:
210207
public_api_url = Actor.config.api_public_base_url
211208
default_store_id = Actor.config.default_key_value_store_id
209+
record_key = 'public-record-key'
212210

213211
store = await Actor.open_key_value_store()
214-
record_key = 'dummy'
215-
record_url = await cast(KeyValueStoreClient, store._resource_client).get_public_url(record_key)
216-
url_signing_secret_key = cast(str, getattr(store.storage_object, 'url_signing_secret_key', None))
217-
signature = create_hmac_signature(url_signing_secret_key, record_key)
218212

213+
assert isinstance(store.storage_object.model_extra, dict)
214+
url_signing_secret_key = store.storage_object.model_extra.get('urlSigningSecretKey')
219215
assert url_signing_secret_key is not None
216+
217+
await store.set_value(record_key, {'exposedData': 'test'}, 'application/json')
218+
219+
record_url = await store.get_public_url(record_key)
220+
221+
signature = create_hmac_signature(url_signing_secret_key, record_key)
220222
assert (
221223
record_url
222224
== f'{public_api_url}/v2/key-value-stores/{default_store_id}/records/{record_key}?signature={signature}'

uv.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)