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
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-15 18:57 +0800
1"""Storage data models for Lexigram Framework."""
3from __future__ import annotations
5from collections.abc import AsyncIterator
6from dataclasses import dataclass
7from typing import TYPE_CHECKING, Any, BinaryIO
9if TYPE_CHECKING:
10 from datetime import datetime
13@dataclass(frozen=True)
14class FileInfo:
15 """Information about a stored file."""
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
26@dataclass(frozen=True)
27class UploadOptions:
28 """Options for file uploads."""
30 content_type: str | None = None
31 public: bool = False
32 metadata: dict[str, str] | None = None
33 cache_control: str | None = None
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 )
43# Type alias for uploadable content
44Uploadable = bytes | str | BinaryIO | AsyncIterator[Any]
47__all__ = ["FileInfo", "UploadOptions", "Uploadable"]