File size: 4,001 Bytes
1f213fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import copy
import random
from typing import Any, Dict, List

_COMMIT_POOL = [
    {"hash": "a1b2c3d", "message": "fix: null pointer in auth middleware", "author": "alice", "files": ["auth/middleware.py"], "service": "auth"},
    {"hash": "e4f5g6h", "message": "feat: rate limiting for API gateway", "author": "bob", "files": ["gateway/ratelimit.py"], "service": "api-gateway"},
    {"hash": "i7j8k9l", "message": "refactor: database connection pool", "author": "carol", "files": ["db/pool.py"], "service": "auth"},
    {"hash": "m1n2o3p", "message": "fix: SQL injection in user search", "author": "dave", "files": ["search/query.py"], "service": "search"},
    {"hash": "q4r5s6t", "message": "perf: Redis session caching", "author": "eve", "files": ["payments/session.py"], "service": "payments"},
    {"hash": "u7v8w9x", "message": "feat: dark mode dashboard", "author": "frank", "files": ["frontend/theme.js"], "service": "notifications"},
    {"hash": "y1z2a3b", "message": "fix: XSS in comment renderer", "author": "alice", "files": ["frontend/comments.jsx"], "service": "notifications"},
    {"hash": "c4d5e6f", "message": "docs: API authentication guide", "author": "bob", "files": ["docs/auth.md"], "service": "auth"},
    {"hash": "g7h8i9j", "message": "feat: CSV data export endpoint", "author": "carol", "files": ["api/export.py"], "service": "api-gateway"},
    {"hash": "k1l2m3n", "message": "fix: websocket memory leak", "author": "dave", "files": ["payments/ws.py"], "service": "payments"},
    {"hash": "p2q3r4s", "message": "fix: checkout timeout on slow networks", "author": "eve", "files": ["checkout/flow.py"], "service": "checkout"},
    {"hash": "t5u6v7w", "message": "perf: inventory cache warm-up", "author": "frank", "files": ["inventory/cache.py"], "service": "inventory"},
]

_PR_POOL = [
    {"id": "PR-101", "title": "Fix auth rate limiting bug", "author": "alice", "status": "merged", "service": "auth"},
    {"id": "PR-102", "title": "Add payment retry logic", "author": "bob", "status": "open", "service": "payments"},
    {"id": "PR-103", "title": "Search index optimization", "author": "carol", "status": "merged", "service": "search"},
    {"id": "PR-104", "title": "Gateway health check endpoint", "author": "dave", "status": "open", "service": "api-gateway"},
    {"id": "PR-105", "title": "Checkout flow improvements", "author": "eve", "status": "merged", "service": "checkout"},
]


class CodebaseApp:
    def __init__(self, seed: int, services: List[str]):
        rng = random.Random(seed + 1337)
        relevant = [c for c in _COMMIT_POOL if c["service"] in services]
        other = [c for c in _COMMIT_POOL if c["service"] not in services]
        pool = relevant + rng.sample(other, min(3, len(other)))
        self.commits = rng.sample(pool, min(8, len(pool)))
        self.prs = [p for p in _PR_POOL if p["service"] in services]

    def list_commits(self, args: Dict[str, Any]) -> Dict[str, Any]:
        query = args.get("query", "").lower()
        service = args.get("service")
        limit = min(args.get("limit", 10), 20)
        offset = args.get("offset", 0)
        results = self.commits
        if query:
            results = [c for c in results if query in c["message"].lower() or query in c["hash"]]
        if service:
            results = [c for c in results if c.get("service") == service]
        return {"ok": True, "data": results[offset: offset + limit], "total": len(results)}

    def get_commit(self, args: Dict[str, Any]) -> Dict[str, Any]:
        h = args.get("hash", "")
        for c in self.commits:
            if c["hash"].startswith(h):
                return {"ok": True, "data": copy.deepcopy(c)}
        return {"ok": False, "error": f"Commit '{h}' not found"}

    def list_prs(self, args: Dict[str, Any]) -> Dict[str, Any]:
        status = args.get("status")
        results = self.prs if not status else [p for p in self.prs if p["status"] == status]
        return {"ok": True, "data": copy.deepcopy(results)}