chainlib

Generic blockchain access library and tooling
Log | Files | Refs | README | LICENSE

commit 095c0810f32b7017040c39264675d89d5644959a
parent 58b92837ffa45ebaca3032b97abd1ec3ecccec51
Author: Louis Holbrook <accounts-gitlab@holbrook.no>
Date:   Tue, 26 Oct 2021 14:15:59 +0000

feat: chainspec, positional args, docfix

Diffstat:
Mchainlib/chain.py | 24++++++++++++------------
Mchainlib/cli/arg.py | 20+++++++++++++++-----
Mchainlib/cli/config.py | 1-
Mchainlib/cli/wallet.py | 5+----
Mchainlib/connection.py | 12+++++++++---
Mchainlib/data/config/config.ini | 1-
Rdoc/texinfo/index.texi -> doc/texinfo/content.texi | 0
Mrequirements.txt | 2+-
Msetup.cfg | 2+-
Mtests/test_chain.py | 20++++++++++++++++++++
10 files changed, 59 insertions(+), 28 deletions(-)

diff --git a/chainlib/chain.py b/chainlib/chain.py @@ -16,12 +16,12 @@ class ChainSpec: :param tag: Descriptive tag :type tag: str """ - def __init__(self, engine, common_name, network_id, tag=None): + def __init__(self, arch, fork, network_id, common_name=None): self.o = { - 'engine': engine, - 'common_name': common_name, + 'arch': arch, + 'fork': fork, 'network_id': network_id, - 'tag': tag, + 'common_name': common_name, } def network_id(self): @@ -48,7 +48,7 @@ class ChainSpec: :rtype: str :returns: engine """ - return self.o['engine'] + return self.o['arch'] def common_name(self): @@ -78,10 +78,10 @@ class ChainSpec: o = chain_str.split(':') if len(o) < 3: raise ValueError('Chain string must have three sections, got {}'.format(len(o))) - tag = None + common_name = None if len(o) == 4: - tag = o[3] - return ChainSpec(o[0], o[1], int(o[2]), tag) + common_name = o[3] + return ChainSpec(o[0], o[1], int(o[2]), common_name) @staticmethod @@ -100,7 +100,7 @@ class ChainSpec: :rtype: chainlib.chain.ChainSpec :returns: Resulting chain spec """ - return ChainSpec(o['engine'], o['common_name'], o['network_id'], tag=o['tag']) + return ChainSpec(o['arch'], o['fork'], o['network_id'], common_name=o['common_name']) def asdict(self): @@ -113,7 +113,7 @@ class ChainSpec: def __str__(self): - s = '{}:{}:{}'.format(self.o['engine'], self.o['common_name'], self.o['network_id']) - if self.o['tag'] != None: - s += ':' + self.o['tag'] + s = '{}:{}:{}'.format(self.o['arch'], self.o['fork'], self.o['network_id']) + if self.o['common_name'] != None: + s += ':' + self.o['common_name'] return s diff --git a/chainlib/cli/arg.py b/chainlib/cli/arg.py @@ -57,7 +57,7 @@ class ArgumentParser(argparse.ArgumentParser): self.pos_args = [] - def add_positional(self, name, type=str, help=None, required=True): + def add_positional(self, name, type=str, help=None, append=False, required=True): """Add a positional argument. Stdin piping will only be possible in the event a single positional argument is defined. @@ -73,7 +73,7 @@ class ArgumentParser(argparse.ArgumentParser): :param required: If true, argument will be set to required :type required: bool """ - self.pos_args.append((name, type, help, required,)) + self.pos_args.append((name, type, help, required, append,)) def parse_args(self, argv=sys.argv[1:]): @@ -88,13 +88,23 @@ class ArgumentParser(argparse.ArgumentParser): """ if len(self.pos_args) == 1: arg = self.pos_args[0] - self.add_argument(arg[0], nargs='?', type=arg[1], default=stdin_arg(), help=arg[2]) + if arg[4]: + self.add_argument(arg[0], nargs='*', type=arg[1], default=stdin_arg(), help=arg[2]) + else: + self.add_argument(arg[0], nargs='?', type=arg[1], default=stdin_arg(), help=arg[2]) else: for arg in self.pos_args: if arg[3]: - self.add_argument(arg[0], type=arg[1], help=arg[2]) + if arg[4]: + logg.debug('argumen') + self.add_argument(arg[0], nargs='+', type=arg[1], help=arg[2]) + else: + self.add_argument(arg[0], type=arg[1], help=arg[2]) else: - self.add_argument(arg[0], nargs='?', type=arg[1], help=arg[2]) + if arg[4]: + self.add_argument(arg[0], nargs='*', type=arg[1], help=arg[2]) + else: + self.add_argument(arg[0], type=arg[1], help=arg[2]) args = super(ArgumentParser, self).parse_args(args=argv) if args.dumpconfig: diff --git a/chainlib/cli/config.py b/chainlib/cli/config.py @@ -170,7 +170,6 @@ class Config(confini.Config): args_override = {} if arg_flags & Flag.PROVIDER: - args_override['RPC_HTTP_PROVIDER'] = getattr(args, 'p') args_override['RPC_PROVIDER'] = getattr(args, 'p') args_override['RPC_DIALECT'] = getattr(args, 'rpc_dialect') if arg_flags & Flag.CHAIN_SPEC: diff --git a/chainlib/cli/wallet.py b/chainlib/cli/wallet.py @@ -1,9 +1,6 @@ # standard imports import logging -# external imports -from crypto_dev_signer.keystore.dict import DictKeystore - logg = logging.getLogger(__name__) @@ -19,7 +16,7 @@ class Wallet: :todo: sign_transaction_to_rlp from chainlib-eth must be renamed to sign_transaction_to_wire, and included as part of signer interface """ - def __init__(self, signer_cls, keystore=DictKeystore(), checksummer=None): + def __init__(self, signer_cls, keystore=None, checksummer=None): self.signer_constructor = signer_cls self.keystore = keystore self.signer = None diff --git a/chainlib/connection.py b/chainlib/connection.py @@ -23,7 +23,10 @@ from .jsonrpc import ( ErrorParser, ) from .http import PreemptiveBasicAuthHandler -from .error import JSONRPCException +from .error import ( + JSONRPCException, + RPCException, + ) from .auth import Auth logg = logging.getLogger(__name__) @@ -308,8 +311,11 @@ class JSONRPCHTTPConnection(HTTPConnection): ) ho = build_opener(handler) install_opener(ho) - - r = urlopen(req, data=data.encode('utf-8')) + + try: + r = urlopen(req, data=data.encode('utf-8')) + except URLError as e: + raise RPCException(e) result = json.load(r) logg.debug('(HTTP) recv {}'.format(result)) diff --git a/chainlib/data/config/config.ini b/chainlib/data/config/config.ini @@ -1,5 +1,4 @@ [rpc] -http_provider = provider = auth = credentials = diff --git a/doc/texinfo/index.texi b/doc/texinfo/content.texi diff --git a/requirements.txt b/requirements.txt @@ -1,3 +1,3 @@ -crypto-dev-signer>=0.4.15rc2,<=0.4.15 +funga>=0.5.1a1,<0.6.0 pysha3==1.0.2 hexathon~=0.0.1a8 diff --git a/setup.cfg b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = chainlib -version = 0.0.9rc1 +version = 0.0.10a7 description = Generic blockchain access library and tooling author = Louis Holbrook author_email = dev@holbrook.no diff --git a/tests/test_chain.py b/tests/test_chain.py @@ -7,6 +7,13 @@ from tests.base import TestBase class TestChain(TestBase): + def test_chain_spec_str(self): + s = ChainSpec('foo', 'bar', 3, 'baz') + self.assertEqual('foo:bar:3:baz', str(s)) + + s = ChainSpec('foo', 'bar', 3) + self.assertEqual('foo:bar:3', str(s)) + def test_chain_spec(self): s = ChainSpec.from_chain_str('foo:bar:3') @@ -18,5 +25,18 @@ class TestChain(TestBase): s = ChainSpec.from_chain_str('foo') + def test_chain_spec_dict(self): + s = 'foo:bar:3:baz' + c = ChainSpec.from_chain_str('foo:bar:3:baz') + d = c.asdict() + self.assertEqual(d['arch'], 'foo') + self.assertEqual(d['fork'], 'bar') + self.assertEqual(d['network_id'], 3) + self.assertEqual(d['common_name'], 'baz') + cc = ChainSpec.from_dict(d) + self.assertEqual(s, str(cc)) + + + if __name__ == '__main__': unittest.main()