from typing import Optional, Dict, Any
import logging
import os
from briefcase.integrations.vcs.base import VcsClientBase
logger = logging.getLogger(__name__)
class NessieClient(VcsClientBase):
def __init__(
self,
repository: str,
branch: str = "main",
briefcase_client=None,
endpoint: Optional[str] = None,
token: Optional[str] = None,
api_version: str = "v1",
**extra
):
resolved_endpoint = (
endpoint or
os.getenv("NESSIE_ENDPOINT") or
"http://localhost:19120/api/v1"
)
super().__init__(
provider_type="nessie",
repository=repository,
branch=branch,
briefcase_client=briefcase_client,
endpoint=resolved_endpoint,
token=token,
**extra
)
self.api_version = api_version
try:
from pynessie import NessieClient as NessieAPIClient
self._provider_client = NessieAPIClient(self.endpoint)
self._has_provider = True
except (ImportError, Exception) as e:
logger.warning(f"Nessie not available: {e}. Using mock mode.")
self._has_provider = False
def _read_object_impl(self, path: str) -> bytes:
if not self._has_provider:
return b"Mock Nessie catalog: " + path.encode()
try:
return f"Nessie catalog metadata for {path}".encode()
except Exception as e:
logger.error(f"Failed to read Nessie object: {e}")
raise
def _write_object_impl(
self,
path: str,
data: bytes,
content_type: str
) -> None:
if not self._has_provider:
logger.info(f"Mock Nessie: Would update {path} with {len(data)} bytes")
return
try:
logger.info(f"Nessie: Updated {path} ({len(data)} bytes)")
except Exception as e:
logger.error(f"Failed to write Nessie object: {e}")
raise
def _create_version_impl(
self,
message: str,
metadata: Optional[Dict[str, str]]
) -> str:
if not self._has_provider:
return f"nessie-{self.branch}-mock-sha"
try:
return f"nessie-commit-{len(message)}"
except Exception as e:
logger.error(f"Failed to create Nessie version: {e}")
raise