Coverage for src / lexigram / contracts / infra / storage / models.py: 0%

24 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-15 18:57 +0800

1"""Storage data models for Lexigram Framework.""" 

2 

3from __future__ import annotations 

4 

5from collections.abc import AsyncIterator 

6from dataclasses import dataclass 

7from typing import TYPE_CHECKING, Any, BinaryIO 

8 

9if TYPE_CHECKING: 

10 from datetime import datetime 

11 

12 

13@dataclass(frozen=True) 

14class FileInfo: 

15 """Information about a stored file.""" 

16 

17 path: str 

18 size: int 

19 content_type: str 

20 last_modified: datetime 

21 created_at: datetime | None = None 

22 etag: str | None = None 

23 metadata: dict[str, Any] | None = None 

24 

25 

26@dataclass(frozen=True) 

27class UploadOptions: 

28 """Options for file uploads.""" 

29 

30 content_type: str | None = None 

31 public: bool = False 

32 metadata: dict[str, str] | None = None 

33 cache_control: str | None = None 

34 

35 def __post_init__(self) -> None: 

36 """Normalize metadata keys to lowercase for consistent lookups.""" 

37 if self.metadata: 

38 object.__setattr__( 

39 self, "metadata", {k.lower(): v for k, v in self.metadata.items()} 

40 ) 

41 

42 

43# Type alias for uploadable content 

44Uploadable = bytes | str | BinaryIO | AsyncIterator[Any] 

45 

46 

47__all__ = ["FileInfo", "UploadOptions", "Uploadable"]