Source code for helium_py.transactions.decorators

"""Decorators for use in transactions classes."""
from inspect import Parameter, signature
from typing import List, Optional

from helium_py.crypto.address import Address
from helium_py.crypto.keypair import Keypair
from helium_py.transactions.payment import Payment


[docs]def transaction_class(cls): """Decorate transaction classes to dynamically generate method signatures.""" ANNOTATION_MAP = { 'addresses': Optional[Address], 'signatures': Optional[bytes], 'integers': Optional[int], 'strings': Optional[str], 'payment_lists': Optional[List[Payment]], } class TransactionClass(cls): """Class to be returned post-modification.""" pass parameters = tuple() for field_type in cls.fields: parameters += tuple( Parameter( field, Parameter.KEYWORD_ONLY, annotation=ANNOTATION_MAP[field_type], default=None, ) for field in cls.fields[field_type] ) init_sig = signature(cls.__init__) init_sig.replace(return_annotation=cls) TransactionClass.__init__.__signature__ = init_sig.replace(parameters=parameters) sign_sig = signature(cls.sign) sign_sig.replace(return_annotation=cls) TransactionClass.sign.__signature__ = sign_sig.replace(parameters=tuple( Parameter( field, Parameter.KEYWORD_ONLY, annotation=Optional[Keypair], default=None, ) for field in cls.keypairs.keys() )) return TransactionClass