fixed subcondition instantiation recursively

Signed-off-by: Lorenz Herzberger <lorenzherzberger@gmail.com>
This commit is contained in:
Lorenz Herzberger 2023-02-21 15:20:59 +01:00
parent 979af5e453
commit 3d47043090
No known key found for this signature in database
GPG Key ID: FA5EE906EB55316A
2 changed files with 63 additions and 58 deletions

View File

@ -8,57 +8,35 @@ from dataclasses import dataclass, field
from typing import List
@dataclass
class SubCondition:
type: str
public_key: str
def to_tuple(self) -> tuple:
return self.type, self.public_key
def to_dict(self) -> dict:
return {"type": self.type, "public_key": self.public_key}
@staticmethod
def from_dict(subcondition_dict: dict) -> SubCondition:
return SubCondition(subcondition_dict["type"], subcondition_dict["public_key"])
@staticmethod
def list_to_dict(subconditions: List[SubCondition]) -> List[dict] | None:
if subconditions is None:
return None
return [subcondition.to_dict() for subcondition in subconditions]
@dataclass
class ConditionDetails:
type: str = ""
public_key: str = ""
threshold: int = None
sub_conditions: list[SubCondition] = None
sub_conditions: List[ConditionDetails] = field(default_factory=list)
def to_dict(self) -> dict:
if self.sub_conditions is None:
return {
"type": self.type,
"public_key": self.public_key,
"public_key": self.public_key
}
else:
return {
"type": self.type,
"threshold": self.threshold,
"subconditions": [subcondition.to_dict() for subcondition in self.sub_conditions],
"subconditions": [sub_condition.to_dict() for sub_condition in self.sub_conditions]
}
@staticmethod
def from_dict(data: dict) -> ConditionDetails:
def from_dict(details: dict) -> ConditionDetails:
sub_conditions = None
if "subconditions" in data:
sub_conditions = [SubCondition.from_dict(sub_condition) for sub_condition in data["subconditions"]]
if "subconditions" in details:
sub_conditions = [ConditionDetails.from_dict(sub_condition) for sub_condition in details["subconditions"]]
return ConditionDetails(
type=data.get("type"),
public_key=data.get("public_key"),
threshold=data.get("threshold"),
type=details.get("type"),
public_key=details.get("public_key"),
threshold=details.get("threshold"),
sub_conditions=sub_conditions,
)
@ -126,17 +104,9 @@ class Output:
def to_dict(self) -> dict:
return {
"id": self.id,
# "id": self.id,
"public_keys": self.public_keys,
"condition": {
"details": {
"type": self.condition.details.type,
"public_key": self.condition.details.public_key,
"threshold": self.condition.details.threshold,
"subconditions": SubCondition.list_to_dict(self.condition.details.sub_conditions),
},
"uri": self.condition.uri,
},
"condition": self.condition.to_dict(),
"amount": str(self.amount),
}
@ -152,10 +122,7 @@ def output_with_public_key(output, transaction_id) -> Output:
amount=output["amount"],
condition=Condition(
uri=output["condition"]["uri"],
details=ConditionDetails(
type=output["condition"]["details"]["type"],
public_key=output["condition"]["details"]["public_key"],
),
details=ConditionDetails.from_dict(output["condition"]["details"])
),
)
@ -167,16 +134,6 @@ def output_with_sub_conditions(output, transaction_id) -> Output:
amount=output["amount"],
condition=Condition(
uri=output["condition"]["uri"],
details=ConditionDetails(
type=output["condition"]["details"]["type"],
threshold=output["condition"]["details"]["threshold"],
sub_conditions=[
SubCondition(
type=sub_condition["type"],
public_key=sub_condition["public_key"],
)
for sub_condition in output["condition"]["details"]["subconditions"]
],
),
details=ConditionDetails.from_dict(output["condition"]["details"])
),
)

View File

@ -0,0 +1,48 @@
# Copyright © 2020 Interplanetary Database Association e.V.,
# Planetmint and IPDB software contributors.
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
# Code is Apache-2.0 and docs are CC-BY-4.0
from planetmint.backend.models import Output
nested_threshold_output = {
"amount": "1",
"condition": {
"details": {
"subconditions": [
{
"type": "ed25519-sha-256",
"public_key": "7pT7eBEGJsmpUvRFhu7NUQSZVJVZDeF1xREuYKdVYUKK"
},
{
"subconditions": [
{
"type": "ed25519-sha-256",
"public_key": "746ZbyMgoCJykAdzZ2vZcHzwnndrVnAAh6pv6yLZDiH2"
},
{
"type": "ed25519-sha-256",
"public_key": "EYb188vCQoaYDmW3Agen1u6Fh7xvDWCMnWJK8ueuCdbX"
}
],
"threshold": 2,
"type": "threshold-sha-256"
}
],
"threshold": 1,
"type": "threshold-sha-256"
},
"uri": "ni:///sha-256;hhw6Rf9JgwKYkapwE9qu7oVaI0ArS0hj_dmzAkpIPdc?fpt=threshold-sha-256&cost=266240&subtypes=ed25519-sha-256"
},
"public_keys": [
"7pT7eBEGJsmpUvRFhu7NUQSZVJVZDeF1xREuYKdVYUKK",
"746ZbyMgoCJykAdzZ2vZcHzwnndrVnAAh6pv6yLZDiH2",
"EYb188vCQoaYDmW3Agen1u6Fh7xvDWCMnWJK8ueuCdbX"
]
}
def test_output_nested_threshold_condition():
output = Output.outputs_dict(nested_threshold_output)
assert output
output_dict = output.to_dict()
assert nested_threshold_output == output_dict