Skip to content

Commit 5a57190

Browse files
backends now fully support branching
1 parent 10ecf46 commit 5a57190

5 files changed

Lines changed: 25 additions & 2 deletions

File tree

pypangolin/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,19 @@ DeltaAsset.write(
104104
**Governance** - Role-based access control and business metadata
105105
**Federated Catalogs** - Connect to remote Iceberg catalogs
106106
**Type-Safe** - Pydantic models for all API responses
107+
**Audit Logging** - Comprehensive audit logs with user attribution
108+
109+
## Verification
110+
111+
To run the end-to-end verification suite against a local Pangolin + MinIO stack:
112+
113+
```bash
114+
# Ensure MinIO is running and buckets exist
115+
python3 scripts/ensure_buckets.py
116+
117+
# Run verification script
118+
python3 scripts/verify_pypangolin_live.py
119+
```
107120

108121
## License
109122

pypangolin/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "pypangolin"
7-
version = "0.2.1"
7+
version = "0.3.0"
88
description = "Python client for Pangolin Data Catalog"
99
readme = "README.md"
1010
requires-python = ">=3.8"

pypangolin/src/pypangolin/admin.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@ class AuditClient:
66
def __init__(self, client):
77
self.client = client
88

9-
def list_events(self, limit: int = 100, offset: int = 0) -> List[AuditEvent]:
9+
def list_events(self, limit: int = 100, offset: int = 0,
10+
user_id: str = None, resource_type: str = None,
11+
start_time: str = None, end_time: str = None) -> List[AuditEvent]:
1012
"""List audit events."""
1113
params = {"limit": limit, "offset": offset}
14+
if user_id: params["user_id"] = user_id
15+
if resource_type: params["resource_type"] = resource_type
16+
if start_time: params["start_time"] = start_time
17+
if end_time: params["end_time"] = end_time
18+
1219
data = self.client.get("/api/v1/audit", params=params)
1320
return [AuditEvent(**e) for e in data]
1421

pypangolin/src/pypangolin/git.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def create(self, name: str, from_branch: str = "main", catalog_name: str = None)
1313
"from_branch": from_branch,
1414
"catalog": catalog_name
1515
}
16+
print(f"DEBUG CLIENT: Create branch {name} from {from_branch} in {catalog_name} via /api/v1/branches")
1617
data = self.client.post("/api/v1/branches", json=payload)
1718
return Branch(**data)
1819

pypangolin/src/pypangolin/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class AuditEvent(BaseModel):
125125
resource_type: str
126126
resource_id: Optional[str] = None
127127
timestamp: str # ISO 8601
128+
ip_address: Optional[str] = None
129+
user_agent: Optional[str] = None
128130
result: str
129131
error_message: Optional[str] = None
130132
metadata: Optional[Dict[str, Any]] = None

0 commit comments

Comments
 (0)