Skip to content

Commit 82a1a1c

Browse files
authored
fix: minor patches in dataclass inheritance; fixes for mypy errors; addressing internal feedback (#37)
* fix: minor patches in dataclass inheritance; fixes for mypy errors * refactor: ensure create, update, delete params in factory deploy only require args dataclass (to figure out signature)
1 parent 58f13aa commit 82a1a1c

File tree

18 files changed

+566
-165
lines changed

18 files changed

+566
-165
lines changed

examples/arc56_test/client.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def _init_dataclass(cls: type, data: dict) -> object:
5959
field_value = data.get(field.name)
6060
# Check if the field expects another dataclass and the value is a dict.
6161
if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict):
62-
field_values[field.name] = _init_dataclass(field.type, field_value)
62+
field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value)
6363
else:
6464
field_values[field.name] = field_value
6565
return cls(**field_values)
@@ -100,6 +100,10 @@ class FooArgs:
100100
"""Dataclass for foo arguments"""
101101
inputs: Inputs
102102

103+
@property
104+
def abi_method_signature(self) -> str:
105+
return "foo(((uint64,uint64),(uint64,uint64)))(uint64,uint64)"
106+
103107

104108
class _Arc56TestOptIn:
105109
def __init__(self, app_client: algokit_utils.AppClient):
@@ -679,17 +683,19 @@ def decode_return_value(
679683
class Arc56TestMethodCallCreateParams(
680684
algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[
681685
typing.Any,
682-
typing.Any,
686+
str | None,
683687
]
684688
):
685689
"""Parameters for creating Arc56Test contract using ABI"""
686690
on_complete: typing.Literal[OnComplete.NoOpOC] | None = None
691+
method: str | None = None
687692

688693
def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams:
689694
method_args = _parse_abi_args(self.args)
690695
return algokit_utils.AppClientMethodCallCreateParams(
691696
**{
692697
**self.__dict__,
698+
"method": self.method or getattr(self.args, "abi_method_signature", None),
693699
"args": method_args,
694700
}
695701
)
@@ -911,7 +917,7 @@ def bare(
911917
"""Updates an instance using a bare call"""
912918
params = params or algokit_utils.CommonAppCallCreateParams()
913919
return self.app_factory.params.bare.deploy_update(
914-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
920+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
915921
)
916922

917923
class Arc56TestFactoryDeleteParams:
@@ -929,7 +935,7 @@ def bare(
929935
"""Deletes an instance using a bare call"""
930936
params = params or algokit_utils.CommonAppCallCreateParams()
931937
return self.app_factory.params.bare.deploy_delete(
932-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
938+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
933939
)
934940

935941

examples/duplicate_structs/client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def _init_dataclass(cls: type, data: dict) -> object:
5959
field_value = data.get(field.name)
6060
# Check if the field expects another dataclass and the value is a dict.
6161
if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict):
62-
field_values[field.name] = _init_dataclass(field.type, field_value)
62+
field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value)
6363
else:
6464
field_values[field.name] = field_value
6565
return cls(**field_values)
@@ -584,7 +584,7 @@ def bare(
584584
"""Updates an instance using a bare call"""
585585
params = params or algokit_utils.CommonAppCallCreateParams()
586586
return self.app_factory.params.bare.deploy_update(
587-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
587+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
588588
)
589589

590590
class DuplicateStructsContractFactoryDeleteParams:
@@ -602,7 +602,7 @@ def bare(
602602
"""Deletes an instance using a bare call"""
603603
params = params or algokit_utils.CommonAppCallCreateParams()
604604
return self.app_factory.params.bare.deploy_delete(
605-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
605+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
606606
)
607607

608608

examples/helloworld/client.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def _init_dataclass(cls: type, data: dict) -> object:
5959
field_value = data.get(field.name)
6060
# Check if the field expects another dataclass and the value is a dict.
6161
if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict):
62-
field_values[field.name] = _init_dataclass(field.type, field_value)
62+
field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value)
6363
else:
6464
field_values[field.name] = field_value
6565
return cls(**field_values)
@@ -69,11 +69,19 @@ class HelloArgs:
6969
"""Dataclass for hello arguments"""
7070
name: str
7171

72+
@property
73+
def abi_method_signature(self) -> str:
74+
return "hello(string)string"
75+
7276
@dataclasses.dataclass(frozen=True, kw_only=True)
7377
class HelloWorldCheckArgs:
7478
"""Dataclass for hello_world_check arguments"""
7579
name: str
7680

81+
@property
82+
def abi_method_signature(self) -> str:
83+
return "hello_world_check(string)void"
84+
7785

7886
class _HelloWorldAppUpdate:
7987
def __init__(self, app_client: algokit_utils.AppClient):
@@ -498,15 +506,15 @@ def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams
498506
return algokit_utils.AppClientBareCallCreateParams(**self.__dict__)
499507

500508
@dataclasses.dataclass(frozen=True)
501-
class HelloWorldAppBareCallUpdateParams(algokit_utils.AppClientBareCallCreateParams):
509+
class HelloWorldAppBareCallUpdateParams(algokit_utils.AppClientBareCallParams):
502510
"""Parameters for calling HelloWorldApp contract with bare calls"""
503511
on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None
504512

505513
def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallParams:
506514
return algokit_utils.AppClientBareCallParams(**self.__dict__)
507515

508516
@dataclasses.dataclass(frozen=True)
509-
class HelloWorldAppBareCallDeleteParams(algokit_utils.AppClientBareCallCreateParams):
517+
class HelloWorldAppBareCallDeleteParams(algokit_utils.AppClientBareCallParams):
510518
"""Parameters for calling HelloWorldApp contract with bare calls"""
511519
on_complete: typing.Literal[OnComplete.DeleteApplicationOC] | None = None
512520

@@ -712,7 +720,7 @@ def bare(
712720
"""Updates an instance using a bare call"""
713721
params = params or algokit_utils.CommonAppCallCreateParams()
714722
return self.app_factory.params.bare.deploy_update(
715-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
723+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
716724
)
717725

718726
class HelloWorldAppFactoryDeleteParams:
@@ -730,7 +738,7 @@ def bare(
730738
"""Deletes an instance using a bare call"""
731739
params = params or algokit_utils.CommonAppCallCreateParams()
732740
return self.app_factory.params.bare.deploy_delete(
733-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
741+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
734742
)
735743

736744

examples/lifecycle/client.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def _init_dataclass(cls: type, data: dict) -> object:
5959
field_value = data.get(field.name)
6060
# Check if the field expects another dataclass and the value is a dict.
6161
if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict):
62-
field_values[field.name] = _init_dataclass(field.type, field_value)
62+
field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value)
6363
else:
6464
field_values[field.name] = field_value
6565
return cls(**field_values)
@@ -69,17 +69,29 @@ class HelloStringStringArgs:
6969
"""Dataclass for hello_string_string arguments"""
7070
name: str
7171

72+
@property
73+
def abi_method_signature(self) -> str:
74+
return "hello(string)string"
75+
7276
@dataclasses.dataclass(frozen=True, kw_only=True)
7377
class CreateStringStringArgs:
7478
"""Dataclass for create_string_string arguments"""
7579
greeting: str
7680

81+
@property
82+
def abi_method_signature(self) -> str:
83+
return "create(string)string"
84+
7785
@dataclasses.dataclass(frozen=True, kw_only=True)
7886
class CreateStringUint32VoidArgs:
7987
"""Dataclass for create_string_uint32_void arguments"""
8088
greeting: str
8189
times: int
8290

91+
@property
92+
def abi_method_signature(self) -> str:
93+
return "create(string,uint32)void"
94+
8395

8496
class _LifeCycleAppUpdate:
8597
def __init__(self, app_client: algokit_utils.AppClient):
@@ -592,18 +604,20 @@ def decode_return_value(
592604
@dataclasses.dataclass(frozen=True)
593605
class LifeCycleAppMethodCallCreateParams(
594606
algokit_utils.AppClientCreateSchema, algokit_utils.BaseAppClientMethodCallParams[
595-
tuple[str] | CreateStringStringArgs | tuple[str, int] | CreateStringUint32VoidArgs,
596-
typing.Literal["create(string)string"] | typing.Literal["create(string,uint32)void"],
607+
CreateStringStringArgs | CreateStringUint32VoidArgs,
608+
str | None,
597609
]
598610
):
599611
"""Parameters for creating LifeCycleApp contract using ABI"""
600612
on_complete: typing.Literal[OnComplete.NoOpOC] | None = None
613+
method: str | None = None
601614

602615
def to_algokit_utils_params(self) -> algokit_utils.AppClientMethodCallCreateParams:
603616
method_args = _parse_abi_args(self.args)
604617
return algokit_utils.AppClientMethodCallCreateParams(
605618
**{
606619
**self.__dict__,
620+
"method": self.method or getattr(self.args, "abi_method_signature", None),
607621
"args": method_args,
608622
}
609623
)
@@ -617,7 +631,7 @@ def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams
617631
return algokit_utils.AppClientBareCallCreateParams(**self.__dict__)
618632

619633
@dataclasses.dataclass(frozen=True)
620-
class LifeCycleAppBareCallUpdateParams(algokit_utils.AppClientBareCallCreateParams):
634+
class LifeCycleAppBareCallUpdateParams(algokit_utils.AppClientBareCallParams):
621635
"""Parameters for calling LifeCycleApp contract with bare calls"""
622636
on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None
623637

@@ -862,7 +876,7 @@ def bare(
862876
"""Updates an instance using a bare call"""
863877
params = params or algokit_utils.CommonAppCallCreateParams()
864878
return self.app_factory.params.bare.deploy_update(
865-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
879+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
866880
)
867881

868882
class LifeCycleAppFactoryDeleteParams:
@@ -880,7 +894,7 @@ def bare(
880894
"""Deletes an instance using a bare call"""
881895
params = params or algokit_utils.CommonAppCallCreateParams()
882896
return self.app_factory.params.bare.deploy_delete(
883-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
897+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
884898
)
885899

886900

examples/lifecycle/test_client.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ def test_create_2arg(lifecycle_factory: LifeCycleAppFactory) -> None:
9393
def test_deploy_create_1arg(lifecycle_factory: LifeCycleAppFactory) -> None:
9494
client, response = lifecycle_factory.deploy(
9595
create_params=LifeCycleAppMethodCallCreateParams(
96-
args=CreateStringStringArgs(greeting="greeting"),
97-
method="create(string)string",
96+
args=CreateStringStringArgs(greeting="greeting")
9897
)
9998
)
10099

examples/minimal/client.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def _init_dataclass(cls: type, data: dict) -> object:
5959
field_value = data.get(field.name)
6060
# Check if the field expects another dataclass and the value is a dict.
6161
if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict):
62-
field_values[field.name] = _init_dataclass(field.type, field_value)
62+
field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value)
6363
else:
6464
field_values[field.name] = field_value
6565
return cls(**field_values)
@@ -384,15 +384,15 @@ def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallCreateParams
384384
return algokit_utils.AppClientBareCallCreateParams(**self.__dict__)
385385

386386
@dataclasses.dataclass(frozen=True)
387-
class AppBareCallUpdateParams(algokit_utils.AppClientBareCallCreateParams):
387+
class AppBareCallUpdateParams(algokit_utils.AppClientBareCallParams):
388388
"""Parameters for calling App contract with bare calls"""
389389
on_complete: typing.Literal[OnComplete.UpdateApplicationOC] | None = None
390390

391391
def to_algokit_utils_params(self) -> algokit_utils.AppClientBareCallParams:
392392
return algokit_utils.AppClientBareCallParams(**self.__dict__)
393393

394394
@dataclasses.dataclass(frozen=True)
395-
class AppBareCallDeleteParams(algokit_utils.AppClientBareCallCreateParams):
395+
class AppBareCallDeleteParams(algokit_utils.AppClientBareCallParams):
396396
"""Parameters for calling App contract with bare calls"""
397397
on_complete: typing.Literal[OnComplete.DeleteApplicationOC] | None = None
398398

@@ -558,7 +558,7 @@ def bare(
558558
"""Updates an instance using a bare call"""
559559
params = params or algokit_utils.CommonAppCallCreateParams()
560560
return self.app_factory.params.bare.deploy_update(
561-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
561+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
562562
)
563563

564564
class AppFactoryDeleteParams:
@@ -576,7 +576,7 @@ def bare(
576576
"""Deletes an instance using a bare call"""
577577
params = params or algokit_utils.CommonAppCallCreateParams()
578578
return self.app_factory.params.bare.deploy_delete(
579-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
579+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
580580
)
581581

582582

examples/nested/client.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def _init_dataclass(cls: type, data: dict) -> object:
5959
field_value = data.get(field.name)
6060
# Check if the field expects another dataclass and the value is a dict.
6161
if dataclasses.is_dataclass(field.type) and isinstance(field_value, dict):
62-
field_values[field.name] = _init_dataclass(field.type, field_value)
62+
field_values[field.name] = _init_dataclass(typing.cast(type, field.type), field_value)
6363
else:
6464
field_values[field.name] = field_value
6565
return cls(**field_values)
@@ -70,18 +70,30 @@ class AddArgs:
7070
a: int
7171
b: int
7272

73+
@property
74+
def abi_method_signature(self) -> str:
75+
return "add(uint64,uint64)uint64"
76+
7377
@dataclasses.dataclass(frozen=True, kw_only=True)
7478
class GetPayTxnAmountArgs:
7579
"""Dataclass for get_pay_txn_amount arguments"""
7680
pay_txn: algokit_utils.AppMethodCallTransactionArgument
7781

82+
@property
83+
def abi_method_signature(self) -> str:
84+
return "get_pay_txn_amount(pay)uint64"
85+
7886
@dataclasses.dataclass(frozen=True, kw_only=True)
7987
class NestedMethodCallArgs:
8088
"""Dataclass for nested_method_call arguments"""
8189
_: str
8290
_pay_txn: algokit_utils.AppMethodCallTransactionArgument | None = None
8391
method_call: algokit_utils.AppMethodCallTransactionArgument
8492

93+
@property
94+
def abi_method_signature(self) -> str:
95+
return "nested_method_call(string,pay,appl)byte[]"
96+
8597

8698
class NestedContractParams:
8799
def __init__(self, app_client: algokit_utils.AppClient):
@@ -678,7 +690,7 @@ def bare(
678690
"""Updates an instance using a bare call"""
679691
params = params or algokit_utils.CommonAppCallCreateParams()
680692
return self.app_factory.params.bare.deploy_update(
681-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
693+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
682694
)
683695

684696
class NestedContractFactoryDeleteParams:
@@ -696,7 +708,7 @@ def bare(
696708
"""Deletes an instance using a bare call"""
697709
params = params or algokit_utils.CommonAppCallCreateParams()
698710
return self.app_factory.params.bare.deploy_delete(
699-
algokit_utils.AppFactoryCreateParams(**dataclasses.asdict(params)),
711+
algokit_utils.AppClientBareCallParams(**dataclasses.asdict(params)),
700712
)
701713

702714

0 commit comments

Comments
 (0)