From cc2eca42b547692360b4c3aca29135673743c8b6 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Wed, 21 May 2014 12:22:32 +0200 Subject: [PATCH] Coins value management --- src/cutecoin/models/coin/__init__.py | 22 +++++++++++++++----- src/cutecoin/models/coin/algorithms.py | 11 +++++----- src/cutecoin/models/wallet/__init__.py | 28 ++++++++++++-------------- src/cutecoin/tools/exceptions.py | 5 ++--- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/cutecoin/models/coin/__init__.py b/src/cutecoin/models/coin/__init__.py index 22407fbd..5c31cd02 100644 --- a/src/cutecoin/models/coin/__init__.py +++ b/src/cutecoin/models/coin/__init__.py @@ -7,7 +7,8 @@ Created on 2 févr. 2014 import re import math import logging -import ucoin +import importlib +from cutecoin.tools.exceptions import AlgorithmNotImplemented class Coin(object): @@ -22,7 +23,7 @@ class Coin(object): self.coin_number = coin_number @classmethod - def from_id(cls, coin_id): + def from_id(cls, wallet, coin_id): # Regex to parse the coin id regex = "^([A-Z\d]{40})-(\d+)-(\d+)$" m = re.search(regex, coin_id) @@ -35,9 +36,20 @@ class Coin(object): return self.get_id() == other.get_id() def value(self, wallet): - amendment_request = ucoin.hdc.amendments.view.Self(self.am_number) - amendment = wallet.request(amendment_request) - return wallet.coin_algo(amendment, self.coin_number) + amendment = wallet.get_amendment(self.am_number) + if 'CoinAlgo' in amendment: + coin_algo_name = self.amendment['CoinAlgo'] + else: + coin_algo_name = 'Base2Draft' + + try: + module = importlib.import_module("cutecoin.models.coin.algorithms") + coin_algo_class = getattr(module, coin_algo_name) + coin_algo = coin_algo_class({}) + except AttributeError: + raise AlgorithmNotImplemented(coin_algo_name) + + return coin_algo(amendment, self.coin_number) def get_id(self): return self.issuer + "-" \ diff --git a/src/cutecoin/models/coin/algorithms.py b/src/cutecoin/models/coin/algorithms.py index 13a4c7d4..0888d262 100644 --- a/src/cutecoin/models/coin/algorithms.py +++ b/src/cutecoin/models/coin/algorithms.py @@ -6,6 +6,7 @@ Created on 21 mai 2014 import math + class Algorithm(object): ''' classdocs @@ -16,18 +17,18 @@ class Algorithm(object): ''' self.parameters = parameters - def coin_value(self, amendement, coin_number): + def __call__(self, amendment, coin_number): pass class Base2Draft(Algorithm): def __init__(self, parameters): - super.__init__(parameters) + super().__init__(parameters) - def coin_value(self, amendment, coin_number): - coin_base = amendment['CoinBase'] - coins_list = amendment['CoinsList'] + def __call__(self, amendment, coin_number): + coin_base = amendment['coinBase'] + coins_list = amendment['coinList'] i = 0 while coin_number > coins_list[i]: coin_number -= coins_list[i] diff --git a/src/cutecoin/models/wallet/__init__.py b/src/cutecoin/models/wallet/__init__.py index 18d33999..57ea7140 100644 --- a/src/cutecoin/models/wallet/__init__.py +++ b/src/cutecoin/models/wallet/__init__.py @@ -35,7 +35,7 @@ class Wallet(object): self.name = name self.nodes = nodes self.required_trusts = required_trusts - self.coin_algo = None + self.amendments_cache = {} @classmethod def create(cls, keyid, currency, node, required_trusts, name): @@ -65,27 +65,16 @@ class Wallet(object): def value(self): value = 0 for coin in self.coins: - value += coin.value(self.coin_algo) + value += coin.value(self) return value + #TODO: Enhance this code. Loading the amendment each time we load a coin is bad def refresh_coins(self): coins_list_request = ucoin.hdc.coins.List(self.fingerprint()) data = self.request(coins_list_request) for coin_data in data['coins']: - coin = Coin.from_id(coin_data) + coin = Coin.from_id(self, coin_data) self.coins.append(coin) - node_parameters = self.request(ucoin.registry.Parameters()) - - if 'CoinAlgo' in node_parameters: - coin_algo_name = node_parameters['CoinAlgo'] - else: - coin_algo_name = 'Base2Draft' - - try: - module = importlib.import_module("cutecoin.models.coin.algorithm") - self.coin_algo = module.getattr(module, coin_algo_name) - except AttributeError: - raise AlgorithmNotImplemented(coin_algo_name) def transactions_received(self): received = [] @@ -202,6 +191,15 @@ Hosters: def hosters(self): return [node for node in self.nodes if node.hoster] + def get_amendment(self, am_number): + if am_number in self.amendments_cache: + return self.amendments_cache[am_number] + else: + amendment_req = ucoin.hdc.amendments.Promoted(am_number) + new_am = self.request(amendment_req) + self.amendments_cache[am_number] = new_am + return new_am + def fingerprint(self): gpg = gnupg.GPG() available_keys = gpg.list_keys() diff --git a/src/cutecoin/tools/exceptions.py b/src/cutecoin/tools/exceptions.py index 96403b03..c40723cc 100644 --- a/src/cutecoin/tools/exceptions.py +++ b/src/cutecoin/tools/exceptions.py @@ -60,7 +60,7 @@ class AlgorithmNotImplemented(Error): Constructor ''' super(AlgorithmNotImplemented, self) \ - .__init("Algorithm " + algo_name + " not implemented.") + .__init__("Algorithm " + algo_name + " not implemented.") class KeyAlreadyUsed(Error): @@ -79,8 +79,7 @@ class KeyAlreadyUsed(Error): self) .__init__( "Cannot add account " + new_account.name + - " : " - " the pgpKey " + + " : the pgpKey " + keyid + " is already used by " + found_account.name) -- GitLab