Coverage for yield_analysis_sdk\acp.py: 89%

27 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-07-02 19:22 +0800

1from typing import Optional 

2 

3from virtuals_acp import ACPJob, ACPJobPhase, ACPMemo, VirtualsACP # type: ignore 

4 

5from .type import ( 

6 AnalysisRequest, 

7 VaultRegistrationRequest, 

8) 

9 

10 

11def extract_analysis_request(memos: list[ACPMemo]) -> Optional[AnalysisRequest]: 

12 """ 

13 Extract AnalysisRequest from memos by trying each negotiation memo until one works. 

14 

15 Args: 

16 memos: List of ACP memos to process 

17 

18 Returns: 

19 AnalysisRequest if a valid one is found, otherwise None 

20 """ 

21 if not memos: 

22 return None 

23 

24 for memo in memos: 

25 if memo.next_phase == ACPJobPhase.NEGOTIATION: 

26 if memo.content: 

27 try: 

28 return AnalysisRequest.model_validate_json(memo.content) 

29 except Exception: 

30 # Continue to next memo if this one fails to parse 

31 continue 

32 else: 

33 # Skip empty memos 

34 continue 

35 

36 # No valid memo found 

37 return None 

38 

39def extract_vault_registration_request( 

40 memos: list[ACPMemo], 

41) -> Optional[VaultRegistrationRequest]: 

42 """ 

43 Extract VaultRegistrationRequest from memos by trying each negotiation memo until one works. 

44 

45 Args: 

46 memos: List of ACP memos to process 

47 

48 Returns: 

49 VaultRegistrationRequest if a valid one is found, otherwise None 

50 """ 

51 if not memos: 

52 return None 

53 

54 for memo in memos: 

55 if memo.next_phase == ACPJobPhase.NEGOTIATION: 

56 if memo.content: 

57 try: 

58 return VaultRegistrationRequest.model_validate_json(memo.content) 

59 except Exception: 

60 # Continue to next memo if this one fails to parse 

61 continue 

62 else: 

63 # Skip empty memos 

64 continue 

65 

66 # No valid memo found 

67 return None