Files
wehub-resource-sync 6b7e6b44f1
Python Build and Type Check / python-ci (ubuntu-latest, 3.11) (push) Has been cancelled
Python Build and Type Check / python-ci (ubuntu-latest, 3.13) (push) Has been cancelled
Python Build and Type Check / python-ci (windows-latest, 3.11) (push) Has been cancelled
Python Build and Type Check / python-ci (windows-latest, 3.13) (push) Has been cancelled
Python Integration Tests / python-ci (ubuntu-latest, 3.13) (push) Has been cancelled
Python Integration Tests / python-ci (windows-latest, 3.13) (push) Has been cancelled
Python Notebook Tests / python-ci (ubuntu-latest, 3.13) (push) Has been cancelled
Python Notebook Tests / python-ci (windows-latest, 3.13) (push) Has been cancelled
Python Smoke Tests / python-ci (ubuntu-latest, 3.13) (push) Has been cancelled
Python Smoke Tests / python-ci (windows-latest, 3.13) (push) Has been cancelled
Python Unit Tests / python-ci (ubuntu-latest, 3.13) (push) Has been cancelled
Python Unit Tests / python-ci (windows-latest, 3.13) (push) Has been cancelled
gh-pages / build (push) Has been cancelled
Python Publish (pypi) / Upload release to PyPI (push) Has been cancelled
Spellcheck / spellcheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:37:31 +08:00

126 lines
3.2 KiB
Python

# Copyright (C) 2025 Microsoft
# Licensed under the MIT License
"""Table abstraction for streaming row-by-row access."""
from abc import ABC, abstractmethod
from collections.abc import AsyncIterator, Callable
from types import TracebackType
from typing import Any
from typing_extensions import Self
RowTransformer = Callable[[dict[str, Any]], Any]
class Table(ABC):
"""Abstract base class for streaming table access.
Provides row-by-row iteration and write capabilities for memory-efficient
processing of large datasets. Supports async context manager protocol for
automatic resource cleanup.
Examples
--------
Reading rows as dicts:
>>> async with (
... provider.open(
... "documents"
... ) as table
... ):
... async for (
... row
... ) in table:
... process(row)
With Pydantic model as transformer:
>>> async with (
... provider.open(
... "entities",
... Entity,
... ) as table
... ):
... async for entity in table: # yields Entity instances
... print(
... entity.name
... )
"""
@abstractmethod
def __aiter__(self) -> AsyncIterator[Any]:
"""Yield rows asynchronously, transformed if transformer provided.
Yields
------
Any:
Each row, either as dict or transformed type (e.g., Pydantic model).
"""
...
@abstractmethod
async def length(self) -> int:
"""Return number of rows asynchronously.
Returns
-------
int:
Number of rows in the table.
"""
@abstractmethod
async def has(self, row_id: str) -> bool:
"""Check if a row with the given ID exists.
Args
----
row_id: The ID value to search for.
Returns
-------
bool:
True if a row with matching ID exists.
"""
@abstractmethod
async def write(self, row: dict[str, Any]) -> None:
"""Write a single row to the table.
Args
----
row: Dictionary representing a single row to write.
"""
@abstractmethod
async def close(self) -> None:
"""Flush buffered writes and release resources.
This method is called automatically when exiting the async context
manager, but can also be called explicitly.
"""
async def __aenter__(self) -> Self:
"""Enter async context manager.
Returns
-------
Table:
Self for context manager usage.
"""
return self
async def __aexit__(
self,
exc_type: type[BaseException] | None,
exc_val: BaseException | None,
exc_tb: TracebackType | None,
) -> None:
"""Exit async context manager, ensuring close() is called.
Args
----
exc_type: Exception type if an exception occurred
exc_val: Exception value if an exception occurred
exc_tb: Exception traceback if an exception occurred
"""
await self.close()