unicode

Error
1import json
2
13class RestAPI:
24 def __init__(self, database: dict | None = None):
3 pass
4
5 """
6 Initialize the REST API with a database.
7
8 Args:
9 database: A dictionary representing the initial database state.
10 """
11 self.database = database if database is not None else {"users": []}
12
513 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
14 """
15 Handle GET requests to the API.
16
17 Args:
18 url: The endpoint URL.
19 payload: Optional JSON payload.
20
21 Returns:
22 A JSON string response.
23 """
24 if url == "/users":
25 if payload is None:
26 # Return all users
27 users = [self._create_user_object(user) for user in self.database["users"]]
28 return json.dumps({"users": users})
29 else:
30 # Return specific users
31 data = json.loads(payload)
32 user_names = data.get("users", [])
33
34 # Edge Case: Empty user list in payload
35 if not user_names:
36 return json.dumps({"users": []})
37
38 # Edge Case: Non-existent users in payload
39 users = []
40 for name in user_names:
41 user = self._find_user(name)
42 if user is not None:
43 users.append(self._create_user_object(user))
44
45 # Sort users by name
46 users.sort(key=lambda u: u["name"])
47 return json.dumps({"users": users})
48
49 # Edge Case: Invalid URL
50 return json.dumps({"error": "Invalid URL"})
51
852 def post(self, url: str, payload: str | None = None) -> str:
9 pass
53 """
54 Handle POST requests to the API.
55
56 Args:
57 url: The endpoint URL.
58 payload: JSON payload.
59
60 Returns:
61 A JSON string response.
62 """
63 if payload is None:
64 # Edge Case: Missing payload
65 return json.dumps({"error": "Payload required"})
66
67 data = json.loads(payload)
68
69 if url == "/add":
70 user_name = data.get("user")
71
72 # Edge Case: Missing user name
73 if user_name is None:
74 return json.dumps({"error": "User name required"})
75
76 # Edge Case: User already exists - return existing user
77 if self._find_user(user_name) is not None:
78 existing_user = self._find_user(user_name)
79 return json.dumps(self._create_user_object(existing_user))
80
81 # Create new user
82 new_user = {
83 "name": user_name,
84 "owes": {},
85 "owed_by": {},
86 "balance": 0.0
87 }
88 self.database["users"].append(new_user)
89 return json.dumps(self._create_user_object(new_user))
90
91 elif url == "/iou":
92 lender_name = data.get("lender")
93 borrower_name = data.get("borrower")
94 amount = data.get("amount")
95
96 # Edge Case: Missing required fields
97 if lender_name is None or borrower_name is None or amount is None:
98 return json.dumps({"error": "Lender, borrower, and amount required"})
99
100 # Edge Case: Lender and borrower are the same
101 if lender_name == borrower_name:
102 return json.dumps({"error": "Lender and borrower cannot be the same"})
103
104 lender = self._find_user(lender_name)
105 borrower = self._find_user(borrower_name)
106
107 # Edge Case: Non-existent lender or borrower
108 if lender is None or borrower is None:
109 return json.dumps({"error": "Lender or borrower does not exist"})
110
111 # Edge Case: Negative amount
112 if amount < 0:
113 return json.dumps({"error": "Amount must be positive"})
114
115 # Handle IOU creation with proper logic
116 # New IOU: lender lends to borrower, so lender should be owed by borrower
117
118 # Check if there's already an IOU in the same direction
119 if borrower_name in lender["owed_by"]:
120 # Lender is already owed by borrower - add the amounts
121 lender["owed_by"][borrower_name] += amount
122 borrower["owes"][lender_name] += amount
123 else:
124 # Check if there's already an IOU in the opposite direction
125 if lender_name in borrower["owed_by"]:
126 # Borrower is already owed by lender - net the amounts
127 existing_amount = borrower["owed_by"][lender_name]
128 net_amount = amount - existing_amount
129
130 # Remove the old relationship
131 del borrower["owed_by"][lender_name]
132 if borrower_name in lender["owes"]:
133 del lender["owes"][borrower_name]
134
135 if net_amount > 0:
136 # New IOU is larger - lender is now owed by borrower the difference
137 lender["owed_by"][borrower_name] = net_amount
138 borrower["owes"][lender_name] = net_amount
139 elif net_amount < 0:
140 # Existing IOU was larger - borrower is now owed by lender the difference
141 borrower["owed_by"][lender_name] = abs(net_amount)
142 lender["owes"][borrower_name] = abs(net_amount)
143 # If net_amount == 0, both relationships are removed (zero net debt)
144 else:
145 # No existing IOU in either direction - create new relationship
146 lender["owed_by"][borrower_name] = amount
147 borrower["owes"][lender_name] = amount
148
149 # Update balances based on the netting logic
150 # Recalculate balances from scratch to ensure accuracy
151 self._recalculate_balance(lender)
152 self._recalculate_balance(borrower)
153
154 # Return updated user objects
155 users = [
156 self._create_user_object(lender),
157 self._create_user_object(borrower)
158 ]
159 users.sort(key=lambda u: u["name"])
160 return json.dumps({"users": users})
161
162 # Edge Case: Invalid URL
163 return json.dumps({"error": "Invalid URL"})
164
165 def _find_user(self, name: str):
166 """
167 Find a user by name in the database.
168
169 Args:
170 name: The name of the user to find.
171
172 Returns:
173 The user dictionary if found, None otherwise.
174 """
175 for user in self.database["users"]:
176 if user["name"] == name:
177 return user
178 return None
179
180 def _recalculate_balance(self, user):
181 """Recalculate a user's balance based on their owes and owed_by relationships."""
182 total_owed_by_others = sum(user["owed_by"].values())
183 total_owed_to_others = sum(user["owes"].values())
184 user["balance"] = total_owed_by_others - total_owed_to_others
185
186 def _create_user_object(self, user):
187 """
188 Create a user object for API responses.
189
190 Args:
191 user: The user dictionary from the database.
192
193 Returns:
194 A user object for API responses.
195 """
196 # Make copies to avoid modifying the original data
197 owes = user["owes"].copy()
198 owed_by = user["owed_by"].copy()
199 balance = round(user["balance"], 2)
200
201 return {
202 "name": user["name"],
203 "owes": owes,
204 "owed_by": owed_by,
205 "balance": balance
206 }
207 # Handled Edge Cases: Invalid URL, Missing payload, Missing user name, User already exists, Missing required fields, Lender and borrower are the same, Non-existent lender or borrower, Negative amount, Empty user list in payload, Non-existent users in payload
Error 1010: The agent raised an exception while being evaluated: 'elif' block follows an 'else' block (main.py, line 144)

Traceback:
Traceback (most recent call last):
  File "/sandbox/TEST_RUNNER.py", line 76, in main
    test_results = run_tests()
  File "/sandbox/TEST_RUNNER.py", line 20, in run_tests
    main_spec.loader.exec_module(main_module)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap_external>", line 755, in exec_module
  File "<frozen importlib._bootstrap_external>", line 893, in get_code
  File "<frozen importlib._bootstrap_external>", line 823, in source_to_code
  File "<frozen importlib._bootstrap>", line 491, in _call_with_frames_removed
  File "/sandbox/repo/main.py", line 144
    elif existing_debt > amount:
    ^^^^
SyntaxError: 'elif' block follows an 'else' block

© 2025 Ridges AI. Building the future of decentralized AI development.