Skip to content

Commit 21aa603

Browse files
authored
fix: simplify primary key mixin id column (#20)
1 parent 5539fde commit 21aa603

File tree

7 files changed

+23
-20
lines changed

7 files changed

+23
-20
lines changed

src/brussels/__tests__/mixins/test_primary_key_mixin.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ def test_id_column_definition() -> None:
3232
column = table.c.id
3333

3434
assert column.primary_key is True
35-
assert column.unique is True
36-
assert any("id" in index.columns for index in table.indexes)
3735

3836
server_default = column.server_default
3937
assert server_default is not None

src/brussels/__tests__/types/file/test_file.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
pytest.skip("files optional dependencies not installed", allow_module_level=True)
1919

2020
if TYPE_CHECKING:
21-
from obstore import Attributes, GetOptions, PutMode
21+
from obstore import GetOptions, PutMode
2222
from sqlalchemy import Engine
2323

2424
from brussels.types.file._types import RemoteMetadataField
@@ -202,7 +202,7 @@ async def test_put_async_without_sqlalchemy_session_raises_and_does_not_call_sto
202202
with pytest.raises(RuntimeError, match="requires a resolvable SQLAlchemy session"):
203203
await _file_handle(model).put_async(
204204
b"hello",
205-
attributes=cast("Attributes", {"cache_control": "max-age=60"}),
205+
attributes={"cache_control": "max-age=60"},
206206
tags={"kind": "avatar"},
207207
mode=cast("PutMode", "overwrite"),
208208
use_multipart=True,
@@ -225,7 +225,7 @@ async def test_put_async_propagates_upload_options_with_attached_session(engine:
225225
session.flush()
226226
await _file_handle(model).put_async(
227227
b"hello",
228-
attributes=cast("Attributes", {"cache_control": "max-age=60"}),
228+
attributes={"cache_control": "max-age=60"},
229229
tags={"kind": "avatar"},
230230
mode=cast("PutMode", "overwrite"),
231231
use_multipart=True,

src/brussels/__tests__/types/file/test_lifecycle_integration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ def read(self) -> str:
734734

735735
@pytest.mark.asyncio
736736
async def test_snapshot_put_payload_async_supports_async_iterable() -> None:
737-
async def chunks() -> AsyncIterator[object]:
737+
async def chunks() -> AsyncIterator[bytes | bytearray | memoryview]:
738738
yield b"a"
739739
yield bytearray(b"b")
740740
yield memoryview(b"c")

src/brussels/__tests__/types/file/test_metadata.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from datetime import UTC, datetime, timedelta, timezone
4+
from typing import TYPE_CHECKING
45

56
import pytest
67
from pydantic import ValidationError
@@ -10,6 +11,9 @@
1011
except ImportError:
1112
pytest.skip("files optional dependencies not installed", allow_module_level=True)
1213

14+
if TYPE_CHECKING:
15+
from brussels.types.file.metadata import RemoteMetadataDict
16+
1317

1418
def test_to_dict_and_from_dict_round_trip_with_aliases() -> None:
1519
created_at = datetime(2025, 1, 1, 12, 0, tzinfo=UTC)
@@ -33,7 +37,7 @@ def test_to_dict_and_from_dict_round_trip_with_aliases() -> None:
3337

3438

3539
def test_schema_alias_is_accepted_and_serialized() -> None:
36-
data = {
40+
data: RemoteMetadataDict = {
3741
"schema": 1,
3842
"key": "alias/file.txt",
3943
"status": "pending",
@@ -64,11 +68,13 @@ def test_datetime_fields_are_normalized_to_utc() -> None:
6468

6569
def test_invalid_status_is_rejected() -> None:
6670
with pytest.raises(ValidationError, match="status"):
67-
RemoteMetadata(
68-
key="example/file.txt",
69-
status="deleted", # type: ignore[arg-type]
70-
created_at=datetime(2025, 1, 1, 12, 0, tzinfo=UTC),
71-
updated_at=datetime(2025, 1, 1, 12, 0, tzinfo=UTC),
71+
RemoteMetadata.model_validate(
72+
{
73+
"key": "example/file.txt",
74+
"status": "deleted",
75+
"created_at": datetime(2025, 1, 1, 12, 0, tzinfo=UTC),
76+
"updated_at": datetime(2025, 1, 1, 12, 0, tzinfo=UTC),
77+
},
7278
)
7379

7480

src/brussels/__tests__/types/file/test_storage.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from datetime import UTC, datetime
4+
from typing import TYPE_CHECKING
45

56
import pytest
67
from sqlalchemy.dialects.postgresql import dialect as postgres_dialect
@@ -13,6 +14,9 @@
1314
except ImportError:
1415
pytest.skip("files optional dependencies not installed", allow_module_level=True)
1516

17+
if TYPE_CHECKING:
18+
from brussels.types.file.metadata import RemoteMetadataDict
19+
1620

1721
class ModelWithMetadataField:
1822
def __init__(self, file: object) -> None:
@@ -64,7 +68,7 @@ def test_process_bind_param_serializes_metadata() -> None:
6468

6569

6670
def test_process_bind_param_accepts_dict_payload() -> None:
67-
raw = {
71+
raw: RemoteMetadataDict = {
6872
"schema": 1,
6973
"key": "example/file.txt",
7074
"status": "pending",

src/brussels/mixins/primary_key.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,11 @@ class MyModel(DataclassBase, PrimaryKeyMixin, TimestampMixin):
2424
The UUID is:
2525
- Generated client-side by default (uuid4)
2626
- Has server-side fallback (gen_random_uuid() for PostgreSQL)
27-
- Indexed and unique for efficient lookups
2827
"""
2928

3029
id: Mapped[UUID] = mapped_column(
3130
primary_key=True,
3231
default_factory=uuid4,
3332
server_default=func.gen_random_uuid(),
34-
index=True,
35-
unique=True,
3633
init=False,
3734
)

src/brussels/types/file/utils.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from datetime import datetime, timedelta
4-
from typing import TYPE_CHECKING, TypeVar
4+
from typing import TYPE_CHECKING
55

66
from brussels.types.file.file import RemoteFile
77
from brussels.utils import utc
@@ -16,8 +16,6 @@
1616
from brussels.types.file._types import RemoteMetadataField
1717
from brussels.types.file.metadata import RemoteMetadata
1818

19-
T = TypeVar("T")
20-
2119

2220
def is_cleanup_candidate(
2321
metadata: RemoteMetadata | None,
@@ -37,7 +35,7 @@ def is_cleanup_candidate(
3735
return utc(metadata.updated_at) <= cutoff
3836

3937

40-
def find_cleanup_candidates(
38+
def find_cleanup_candidates[T](
4139
items: list[T],
4240
*,
4341
extractor: Callable[[T], RemoteMetadata | None],

0 commit comments

Comments
 (0)