Skip to content

Commit 7166a14

Browse files
committed
Merge branch 'tests/redesign' into dev
# Conflicts: # pypergraph/__about__.py
2 parents ac251a2 + 8c677b5 commit 7166a14

File tree

14 files changed

+264
-119
lines changed

14 files changed

+264
-119
lines changed

pypergraph/account/dag_account.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,16 @@ async def transfer(
253253
return pending_tx
254254
return None
255255

256-
async def create_allow_spend(self, destination: str, amount: int, approvers: List[str], source: Optional[str] = None, fee: int = 0, currency_id: Optional[str] = None, valid_until_epoch: Optional[int] = None):
256+
async def create_allow_spend(
257+
self,
258+
destination: str,
259+
amount: int,
260+
approvers: List[str],
261+
source: Optional[str] = None,
262+
fee: int = 0,
263+
currency_id: Optional[str] = None,
264+
valid_until_epoch: Optional[int] = None,
265+
):
257266
"""
258267
Grants permission for another wallet or metagraph to spend up to a specified amount from the user’s wallet in a metagraph token or DAG.
259268
@@ -276,19 +285,26 @@ async def create_allow_spend(self, destination: str, amount: int, approvers: Lis
276285
currency_id=currency_id or self.network.connected_network.metagraph_id,
277286
valid_until_epoch=valid_until_epoch,
278287
network=self.network,
279-
key_trio=self.key_trio
288+
key_trio=self.key_trio,
280289
)
281290
return response
282291

283-
async def create_token_lock(self, amount: int, fee: int = 0, unlock_epoch: int = None, source: Optional[str] = None, currency_id: Optional[str] = None):
292+
async def create_token_lock(
293+
self,
294+
amount: int,
295+
fee: int = 0,
296+
unlock_epoch: int = None,
297+
source: Optional[str] = None,
298+
currency_id: Optional[str] = None,
299+
):
284300
"""
285301
Token locking is used for:
286302
287303
Node collateral staking
288304
Delegated staking participation
289305
Governance requirements
290306
Time-based vesting or escrow models
291-
307+
292308
:param source: The wallet signing the transaction. The logged in account is the default if left empty.
293309
:param amount: The amount to lock.
294310
:param currency_id: The Metagraph identifier address for the currency to lock. Leave None, if currency is DAG.
@@ -306,7 +322,7 @@ async def create_token_lock(self, amount: int, fee: int = 0, unlock_epoch: int =
306322
currency_id=currency_id,
307323
unlock_epoch=unlock_epoch,
308324
network=self.network,
309-
key_trio=self.key_trio
325+
key_trio=self.key_trio,
310326
)
311327
return response
312328

pypergraph/account/metagraph_client.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,16 @@ async def get_fee_recommendation(self):
9494

9595
return 1 / self.token_decimals
9696

97-
async def create_allow_spend(self, destination: str, amount: int, approvers: List[str], source: Optional[str] = None, fee: int = 0, currency_id: Optional[str] = None, valid_until_epoch: Optional[int] = None):
97+
async def create_allow_spend(
98+
self,
99+
destination: str,
100+
amount: int,
101+
approvers: List[str],
102+
source: Optional[str] = None,
103+
fee: int = 0,
104+
currency_id: Optional[str] = None,
105+
valid_until_epoch: Optional[int] = None,
106+
):
98107
"""
99108
Grants permission for another wallet or metagraph to spend up to a specified amount from the user’s wallet in a metagraph token or DAG.
100109
@@ -113,14 +122,22 @@ async def create_allow_spend(self, destination: str, amount: int, approvers: Lis
113122
amount=amount,
114123
approvers=approvers,
115124
source=source or self.account.key_trio.address,
116-
fee=fee, currency_id=currency_id or self.network.connected_network.metagraph_id,
125+
fee=fee,
126+
currency_id=currency_id or self.network.connected_network.metagraph_id,
117127
valid_until_epoch=valid_until_epoch,
118128
network=self.network,
119-
key_trio=self.account.key_trio
129+
key_trio=self.account.key_trio,
120130
)
121131
return response
122132

123-
async def create_token_lock(self, amount: int, fee: int = 0, unlock_epoch: int = None, source: str = None, currency_id: Optional[str] = None):
133+
async def create_token_lock(
134+
self,
135+
amount: int,
136+
fee: int = 0,
137+
unlock_epoch: int = None,
138+
source: str = None,
139+
currency_id: Optional[str] = None,
140+
):
124141
"""
125142
Token locking is used for:
126143
@@ -146,7 +163,7 @@ async def create_token_lock(self, amount: int, fee: int = 0, unlock_epoch: int =
146163
currency_id=currency_id or self.network.connected_network.metagraph_id,
147164
unlock_epoch=unlock_epoch,
148165
network=self.network,
149-
key_trio=self.account.key_trio
166+
key_trio=self.account.key_trio,
150167
)
151168
return response
152169

pypergraph/account/tests/test_account.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ async def test_login_logout(self):
137137
assert account.key_trio.address == "DAG0zJW14beJtZX2BY2KA9gLbpaZ8x6vgX4KVPVX"
138138
account.logout()
139139

140+
141+
@pytest.mark.mock
142+
class TestMockAccount:
143+
pass
144+
145+
146+
@pytest.mark.integration
147+
class TestIntegrationAccount:
140148
@pytest.mark.asyncio
141149
async def test_get_balance(self):
142150
# TODO: Mock this
@@ -273,7 +281,12 @@ async def test_allow_spend(self):
273281

274282
latest_snapshot = await account.network.l0_api.get_latest_snapshot()
275283
latest_epoch = latest_snapshot.value.epoch_progress
276-
print("Latest Epoch:", latest_epoch)
277-
res = await account.create_allow_spend(destination="DAG1GH7r7RX1Ca7MbuvqUPT37FAtTfGM1WYQ4otZ", amount=10000000000, approvers=["DAG1GH7r7RX1Ca7MbuvqUPT37FAtTfGM1WYQ4otZ"], valid_until_epoch=latest_epoch + 10)
278-
print("Response:", res)
279-
284+
try:
285+
res = await account.create_allow_spend(
286+
destination="DAG1GH7r7RX1Ca7MbuvqUPT37FAtTfGM1WYQ4otZ",
287+
amount=10000000000,
288+
approvers=["DAG1GH7r7RX1Ca7MbuvqUPT37FAtTfGM1WYQ4otZ"],
289+
valid_until_epoch=latest_epoch + 10,
290+
)
291+
except NetworkError:
292+
pytest.skip("Expecting status 500.")

pypergraph/account/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ def normalize_public_key(public_key: str) -> str:
44
elif len(public_key) == 128:
55
return public_key
66
else:
7-
raise ValueError("Public key has wrong length")
7+
raise ValueError("Public key has wrong length")

pypergraph/keystore/utils.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import json
22
import brotli
33

4+
45
def remove_nulls(obj):
56
if obj is None:
67
return None
@@ -16,6 +17,7 @@ def remove_nulls(obj):
1617
}
1718
return obj
1819

20+
1921
def sort_object_keys(obj):
2022
if isinstance(obj, dict):
2123
# Sort keys and recursively process values
@@ -25,6 +27,7 @@ def sort_object_keys(obj):
2527
return [sort_object_keys(item) for item in obj]
2628
return obj
2729

30+
2831
def normalize_object(obj, sort=True, remove=True):
2932
processed = obj
3033
if remove:
@@ -33,12 +36,9 @@ def normalize_object(obj, sort=True, remove=True):
3336
processed = sort_object_keys(processed)
3437
return processed
3538

39+
3640
def serialize_brotli(content, compression_level=2):
3741
normalized = normalize_object(content)
38-
normalized_json = json.dumps(
39-
normalized,
40-
separators=(',', ':'),
41-
ensure_ascii=False
42-
)
43-
utf8_bytes = normalized_json.encode('utf-8')
44-
return brotli.compress(utf8_bytes, quality=compression_level)
42+
normalized_json = json.dumps(normalized, separators=(",", ":"), ensure_ascii=False)
43+
utf8_bytes = normalized_json.encode("utf-8")
44+
return brotli.compress(utf8_bytes, quality=compression_level)

pypergraph/network/api/layer_0_api.py

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,23 @@
88
from pypergraph.network.models.network import PeerInfo, TotalSupply
99
from pypergraph.network.models.account import Balance
1010
from pypergraph.network.models.network import Ordinal
11-
from pypergraph.network.models.node_param import SignedUpdateNodeParameters, NodeParametersInfo, UpdateNodeParameters
11+
from pypergraph.network.models.node_param import (
12+
SignedUpdateNodeParameters,
13+
NodeParametersInfo,
14+
UpdateNodeParameters,
15+
)
1216
from pypergraph.network.models.snapshot import SignedGlobalIncrementalSnapshot
1317
from pypergraph.network.models.transaction import TransactionReference
14-
from pypergraph.network.models.node_collateral import NodeCollateralsInfo, SignedCreateNodeCollateral, SignedWithdrawNodeCollateral
15-
from pypergraph.network.models.delegated_stake import DelegatedStakesInfo, SignedCreateDelegatedStake, SignedWithdrawDelegatedStake
18+
from pypergraph.network.models.node_collateral import (
19+
NodeCollateralsInfo,
20+
SignedCreateNodeCollateral,
21+
SignedWithdrawNodeCollateral,
22+
)
23+
from pypergraph.network.models.delegated_stake import (
24+
DelegatedStakesInfo,
25+
SignedCreateDelegatedStake,
26+
SignedWithdrawDelegatedStake,
27+
)
1628

1729

1830
def _handle_metrics(response: str) -> List[Dict[str, Any]]:
@@ -151,34 +163,56 @@ async def post_node_collateral(self, tx: SignedCreateNodeCollateral):
151163

152164
async def post_node_parameters(self, tx: SignedUpdateNodeParameters):
153165
"""Register validator parameters for delegated staking"""
154-
return await self._make_request(
155-
"POST", "/node-params", payload=tx.model_dump()
156-
)
166+
return await self._make_request("POST", "/node-params", payload=tx.model_dump())
157167

158168
@staticmethod
159169
def _get_node_parameters_search_and_sort_path_and_params(
160170
search_name_or_id: Optional[str],
161-
sort: Optional[Literal["name", "peerID", "address", "totalAddressesAssigned", "totalAmountDelegated"]],
162-
sort_order: Optional[Literal["ASC", "DESC"]]
171+
sort: Optional[
172+
Literal[
173+
"name",
174+
"peerID",
175+
"address",
176+
"totalAddressesAssigned",
177+
"totalAmountDelegated",
178+
]
179+
],
180+
sort_order: Optional[Literal["ASC", "DESC"]],
163181
) -> Dict:
164182
params = {}
165183

166184
if isinstance(search_name_or_id, str):
167185
params["search"] = search_name_or_id
168-
if sort in ("name", "peerID", "address", "totalAddressesAssigned", "totalAmountDelegated"):
186+
if sort in (
187+
"name",
188+
"peerID",
189+
"address",
190+
"totalAddressesAssigned",
191+
"totalAmountDelegated",
192+
):
169193
params["sort"] = sort
170194
if sort_order in ("ASC", "DESC"):
171195
params["sortOrder"] = sort_order
172196

173197
return {"params": params}
174198

175199
async def get_node_parameters(
176-
self,
177-
search_name_or_id: Optional[str] = None,
178-
sort: Optional[Literal["name", "peerID", "address", "totalAddressesAssigned", "totalAmountDelegated"]] = None,
179-
sort_order: Optional[Literal["ASC", "DESC"]] = None
200+
self,
201+
search_name_or_id: Optional[str] = None,
202+
sort: Optional[
203+
Literal[
204+
"name",
205+
"peerID",
206+
"address",
207+
"totalAddressesAssigned",
208+
"totalAmountDelegated",
209+
]
210+
] = None,
211+
sort_order: Optional[Literal["ASC", "DESC"]] = None,
180212
):
181-
request = self._get_node_parameters_search_and_sort_path_and_params(search_name_or_id, sort, sort_order)
213+
request = self._get_node_parameters_search_and_sort_path_and_params(
214+
search_name_or_id, sort, sort_order
215+
)
182216
result = await self._make_request(
183217
"GET", "/node-params", params=request["params"]
184218
)

pypergraph/network/api/layer_1_api.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from pypergraph.network.models.transaction import (
1212
PendingTransaction,
1313
SignedTransaction,
14-
TransactionReference
14+
TransactionReference,
1515
)
1616

1717

@@ -96,17 +96,25 @@ async def post_transaction(self, tx: SignedTransaction):
9696
)
9797

9898
async def get_allow_spend_last_reference(self, address: str) -> AllowSpendReference:
99-
result = await self._make_request("GET", f"/allow-spends/last-reference/{address}")
99+
result = await self._make_request(
100+
"GET", f"/allow-spends/last-reference/{address}"
101+
)
100102
return AllowSpendReference(**result)
101103

102104
async def post_allow_spend(self, tx: SignedAllowSpend):
103-
result = await self._make_request("POST", "/allow-spends", payload=tx.model_dump())
105+
result = await self._make_request(
106+
"POST", "/allow-spends", payload=tx.model_dump()
107+
)
104108
return result
105109

106110
async def get_token_lock_last_reference(self, address: str) -> TokenLockReference:
107-
result = await self._make_request("GET", f"/token-locks/last-reference/{address}")
111+
result = await self._make_request(
112+
"GET", f"/token-locks/last-reference/{address}"
113+
)
108114
return TokenLockReference(**result)
109115

110116
async def post_token_lock(self, tx: SignedTokenLock):
111-
result = await self._make_request("POST", "/token-locks", payload=tx.model_dump(by_alias=True))
117+
result = await self._make_request(
118+
"POST", "/token-locks", payload=tx.model_dump(by_alias=True)
119+
)
112120
return result

pypergraph/network/models/allow_spend.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ class AllowSpendReference(BaseModel):
1111

1212

1313
class AllowSpend(BaseModel):
14-
1514
source: str
1615
destination: str
1716
currency: Optional[str] = Field(default=None, serialization_alias="currencyId")
1817
amount: int
1918
fee: int
2019
parent: AllowSpendReference
21-
last_valid_epoch_progress: Optional[int] = Field(default=None, serialization_alias="lastValidEpochProgress")
20+
last_valid_epoch_progress: Optional[int] = Field(
21+
default=None, serialization_alias="lastValidEpochProgress"
22+
)
2223
approvers: List[str]
23-
#ordinal: Optional[int]
24+
# ordinal: Optional[int]
2425

2526

2627
class SignedAllowSpend(BaseModel):

0 commit comments

Comments
 (0)