ebea70573b
- Repository structure for all services, infra, lakehouse, dashboards - K8s manifests targeting stonks-oracle namespace with GHCR images - Ingress via Traefik with ca-issuer TLS for internal services - ConfigMap wired to existing cluster services (pg, redis, minio, ollama) - GitHub Actions workflow for lint, test, multi-service container builds - Dockerfile with build-arg CMD per service - Makefile for local build/push/deploy - Steering rules for TDD workflow, K8s conventions, project context - Agent hooks for lint-on-save, test-on-save, k8s-validate, phase-commit - Ruff linter config, all lint issues fixed - 14 passing tests for schemas, config, redis keys - PostgreSQL migrations, Trino catalogs, Superset config, MinIO lifecycle
30 lines
734 B
Python
30 lines
734 B
Python
"""Base adapter interface for all external API integrations."""
|
|
from abc import ABC, abstractmethod
|
|
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
|
|
@dataclass
|
|
class AdapterResult:
|
|
source_type: str
|
|
ticker: str
|
|
items: List[Dict[str, Any]]
|
|
raw_payload: bytes
|
|
content_hash: str
|
|
fetched_at: datetime
|
|
error: Optional[str] = None
|
|
|
|
|
|
class BaseAdapter(ABC):
|
|
"""Interface for all ingestion adapters."""
|
|
|
|
@abstractmethod
|
|
async def fetch(self, ticker: str, config: Dict[str, Any]) -> AdapterResult:
|
|
"""Fetch data for a given ticker using source config."""
|
|
...
|
|
|
|
@abstractmethod
|
|
def source_type(self) -> str:
|
|
...
|