From a61aff4662d6e60779171eaff1286d108dd86ff3 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Mon, 17 Feb 2014 00:40:43 +0100 Subject: [PATCH] Using more pythonic factories with classmethods --- src/cutecoin/core/__init__.py | 4 +- src/cutecoin/gui/addAccountDialog.py | 4 +- src/cutecoin/models/account/__init__.py | 38 ++++++++++++++++--- .../models/account/communities/__init__.py | 4 +- src/cutecoin/models/account/factory.py | 38 ------------------- .../models/account/wallets/__init__.py | 4 +- src/cutecoin/models/community/__init__.py | 34 ++++++++++++++--- src/cutecoin/models/community/factory.py | 27 ------------- .../models/community/membersListModel.py | 4 +- src/cutecoin/models/node/__init__.py | 5 +++ src/cutecoin/models/person/__init__.py | 37 ++++++++++++++++-- src/cutecoin/models/person/factory.py | 36 ------------------ src/cutecoin/models/transaction/__init__.py | 1 - src/cutecoin/models/transaction/factory.py | 7 ++-- src/cutecoin/models/wallet/__init__.py | 19 ++++++++-- src/cutecoin/models/wallet/factory.py | 21 ---------- 16 files changed, 129 insertions(+), 154 deletions(-) delete mode 100644 src/cutecoin/models/account/factory.py delete mode 100644 src/cutecoin/models/community/factory.py delete mode 100644 src/cutecoin/models/person/factory.py delete mode 100644 src/cutecoin/models/wallet/factory.py diff --git a/src/cutecoin/core/__init__.py b/src/cutecoin/core/__init__.py index 908b1a8d..7aa15265 100644 --- a/src/cutecoin/core/__init__.py +++ b/src/cutecoin/core/__init__.py @@ -10,7 +10,7 @@ import json from cutecoin.core import config from cutecoin.core.exceptions import KeyAlreadyUsed -from cutecoin.models.account import factory +from cutecoin.models.account import Account class Core(object): @@ -57,7 +57,7 @@ class Core(object): json_data.close() for accountData in data['localAccounts']: - self.accounts.append(factory.loadAccount(accountData)) + self.accounts.append(Account.load(accountData)) def save(self): with open(config.parameters['data'], 'w') as outfile: diff --git a/src/cutecoin/gui/addAccountDialog.py b/src/cutecoin/gui/addAccountDialog.py index 32e04eee..3dcbca64 100644 --- a/src/cutecoin/gui/addAccountDialog.py +++ b/src/cutecoin/gui/addAccountDialog.py @@ -6,7 +6,7 @@ Created on 2 févr. 2014 from cutecoin.gen_resources.addAccountDialog_uic import Ui_AddAccountDialog from PyQt5.QtWidgets import QDialog from cutecoin.gui.addCommunityDialog import AddCommunityDialog -from cutecoin.models.account import factory +from cutecoin.models.account import Account from cutecoin.models.account.communities import Communities from cutecoin.models.account.communities.listModel import CommunitiesListModel @@ -39,7 +39,7 @@ class AddAccountDialog(QDialog, Ui_AddAccountDialog): for key in availableKeys: self.pgpKeysList.addItem(key['uids'][0]) - self.account = factory.createAccount(availableKeys[0]['keyid'], "", Communities()) + self.account = Account.create(availableKeys[0]['keyid'], "", Communities()) self.pgpKeysList.setEnabled(True) self.pgpKeysList.currentIndexChanged[int].connect(self.keyChanged) self.communityDialog = AddCommunityDialog(self) diff --git a/src/cutecoin/models/account/__init__.py b/src/cutecoin/models/account/__init__.py index 3cf9917c..393bed91 100644 --- a/src/cutecoin/models/account/__init__.py +++ b/src/cutecoin/models/account/__init__.py @@ -10,7 +10,8 @@ import logging import json from cutecoin.models.account.wallets import Wallets from cutecoin.models.account.communities import Communities -from cutecoin.models.transaction import factory as trxFactory +from cutecoin.models.community import Community +from cutecoin.models.transaction import factory class Account(object): ''' @@ -18,14 +19,39 @@ class Account(object): Each account has only one pgpKey, and a key can be locally referenced by only one account. ''' - def __init__(self): + def __init__(self, pgpKeyId, name, communities, wallets): ''' Constructor ''' - self.pgpKeyId = "" - self.name = "" - self.communities = Communities() - self.wallets = Wallets() + self.pgpKeyId = pgpKeyId + self.name = name + self.communities = communities + self.wallets = wallets + + @classmethod + def create(cls, pgpKeyId, name, communities): + ''' + Constructor + ''' + wallets = Wallets() + account = cls(pgpKeyId, name, communities, wallets) + for community in account.communities.communitiesList: + wallet = account.wallets.addWallet(community.currency) + wallet.refreshCoins(community, account.keyFingerprint()) + return account + + @classmethod + def load(cls, jsonData): + pgpKeyId = jsonData['pgpKeyId'] + name = jsonData['name'] + communities = Communities() + wallets = Wallets() + account = cls(pgpKeyId, name, communities, wallets) + + for communityData in jsonData['communities']: + account.communities.communitiesList.append(Community.load(communityData, account)) + + return account def addWallet(name, currency): self.wallets.addWallet(name, currency) diff --git a/src/cutecoin/models/account/communities/__init__.py b/src/cutecoin/models/account/communities/__init__.py index 574a84d2..0e04bb60 100644 --- a/src/cutecoin/models/account/communities/__init__.py +++ b/src/cutecoin/models/account/communities/__init__.py @@ -4,7 +4,7 @@ Created on 5 févr. 2014 @author: inso ''' import ucoinpy as ucoin -from cutecoin.models.community import factory +from cutecoin.models.community import Community from cutecoin.core.exceptions import NotMemberOfCommunityError import logging @@ -24,7 +24,7 @@ class Communities(object): Check if the pgpFingerprint is present in the community members list If its not, the account isnt added and an error is raised. ''' - community = factory.createCommunity(mainNode) + community = Community.create(mainNode) members = community.ucoinRequest(ucoin.hdc.amendments.view.Members(community.amendmentId())) logging.debug("Account fingerprint : " + keyFingerprint) diff --git a/src/cutecoin/models/account/factory.py b/src/cutecoin/models/account/factory.py deleted file mode 100644 index 85971dfc..00000000 --- a/src/cutecoin/models/account/factory.py +++ /dev/null @@ -1,38 +0,0 @@ -''' -Created on 11 févr. 2014 - -@author: inso -''' - -import logging - -from cutecoin.models.account import Account -from cutecoin.models.account.wallets import Wallets -from cutecoin.models.account.communities import Communities -from cutecoin.models.wallet import factory as walletFactory -from cutecoin.models.community import factory as communityFactory - - -def createAccount(pgpKeyId, name, communities): - ''' - Constructor - ''' - account = Account() - account.pgpKeyId = pgpKeyId - account.name = name - account.communities = communities - account.wallets = Wallets() - for community in account.communities.communitiesList: - wallet = account.wallets.addWallet(community.currency) - wallet.refreshCoins(community, account.keyFingerprint()) - return account - -def loadAccount(jsonData): - account = Account() - account.pgpKeyId = jsonData['pgpKeyId'] - account.name = jsonData['name'] - account.communities = Communities() - account.wallets = Wallets() - for communityData in jsonData['communities']: - account.communities.communitiesList.append(communityFactory.loadCommunity(communityData, account)) - return account \ No newline at end of file diff --git a/src/cutecoin/models/account/wallets/__init__.py b/src/cutecoin/models/account/wallets/__init__.py index eb13798c..05f7c806 100644 --- a/src/cutecoin/models/account/wallets/__init__.py +++ b/src/cutecoin/models/account/wallets/__init__.py @@ -4,7 +4,7 @@ Created on 7 févr. 2014 @author: inso ''' -from cutecoin.models.wallet import factory +from cutecoin.models.wallet import Wallet class Wallets(object): ''' @@ -22,7 +22,7 @@ class Wallets(object): This wallet must not already be present in the account, it means the wallet must have a different name or a different currency. ''' - wallet = factory.createWallet(currency) + wallet = Wallet.create(currency) if wallet not in self.walletsList: self.walletsList.append(wallet) else: diff --git a/src/cutecoin/models/community/__init__.py b/src/cutecoin/models/community/__init__.py index 98b37e21..1dbfbe85 100644 --- a/src/cutecoin/models/community/__init__.py +++ b/src/cutecoin/models/community/__init__.py @@ -9,18 +9,43 @@ import hashlib import json import logging +from cutecoin.models.node import MainNode +from cutecoin.models.wallet import Wallet + class Community(object): ''' classdocs ''' - def __init__(self): + def __init__(self, knownNodes): ''' A community is a group of nodes using the same currency. They are all using the same amendment and are syncing their datas. An account is a member of a community if he is a member of the current amendment. ''' - self.knownNodes = [] - self.currency = "" + self.knownNodes = knownNodes + currentAmendment = self.ucoinRequest(ucoin.hdc.amendments.Current()) + self.currency = currentAmendment['currency'] + + @classmethod + def create(cls, mainNode): + knownNodes = [] + knownNodes.append(mainNode) + return cls(knownNodes) + + + @classmethod + def load(cls, jsonData, account): + knownNodes = [] + for nodeData in jsonData['nodes']: + knownNodes.append(MainNode(nodeData['server'], nodeData['port'])) + + community = cls(knownNodes) + + for walletsData in jsonData['wallets']: + account.wallets.walletsList.append(Wallet.load(walletsData, community)) + return community + + def membersFingerprints(self): ''' @@ -35,8 +60,7 @@ class Community(object): def ucoinRequest(self, request, get_args={}): for node in self.knownNodes: logging.debug("Trying to connect to : " + node.getText()) - request.server = node.server - request.port = node.port + request = node.use(request) return request.get(**get_args) raise RuntimeError("Cannot connect to any node") diff --git a/src/cutecoin/models/community/factory.py b/src/cutecoin/models/community/factory.py deleted file mode 100644 index 3576db72..00000000 --- a/src/cutecoin/models/community/factory.py +++ /dev/null @@ -1,27 +0,0 @@ -''' -Created on 11 févr. 2014 - -@author: inso -''' -from cutecoin.models.community import Community -from cutecoin.models.node import MainNode -from cutecoin.models.wallet import factory -import ucoinpy as ucoin - -def createCommunity(mainNode): - community = Community() - community.knownNodes.append(mainNode) - currentAmendment = community.ucoinRequest(ucoin.hdc.amendments.Current()) - community.currency = currentAmendment['currency'] - return community - - -def loadCommunity(jsonData, account): - community = Community() - for nodeData in jsonData['nodes']: - community.knownNodes.append(MainNode(nodeData['server'], nodeData['port'])) - community.currency = jsonData['currency'] - for walletsData in jsonData['wallets']: - account.wallets.walletsList.append(factory.loadWallet(walletsData, community)) - return community - diff --git a/src/cutecoin/models/community/membersListModel.py b/src/cutecoin/models/community/membersListModel.py index 855df3b3..70fdc0f4 100644 --- a/src/cutecoin/models/community/membersListModel.py +++ b/src/cutecoin/models/community/membersListModel.py @@ -4,7 +4,7 @@ Created on 5 févr. 2014 @author: inso ''' -from cutecoin.models.person import factory +from cutecoin.models.person import Person from PyQt5.QtCore import QAbstractListModel, Qt class MembersListModel(QAbstractListModel): @@ -19,7 +19,7 @@ class MembersListModel(QAbstractListModel): fingerprints = community.membersFingerprints() self.members = [] for f in fingerprints: - self.members.append(factory.createPerson(f, community)) + self.members.append(Person.create(f, community)) def rowCount(self ,parent): return len(self.members) diff --git a/src/cutecoin/models/node/__init__.py b/src/cutecoin/models/node/__init__.py index 0d2c5d8f..41337c1b 100644 --- a/src/cutecoin/models/node/__init__.py +++ b/src/cutecoin/models/node/__init__.py @@ -39,6 +39,11 @@ class MainNode(Node): peers.append(node) return peers + def use(self, request): + request.server = self.server + request.port = self.port + return request + def jsonify(self): return {'server' : self.server, 'port' : self.port} diff --git a/src/cutecoin/models/person/__init__.py b/src/cutecoin/models/person/__init__.py index ad382abb..410d8192 100644 --- a/src/cutecoin/models/person/__init__.py +++ b/src/cutecoin/models/person/__init__.py @@ -5,6 +5,7 @@ Created on 11 févr. 2014 ''' import ucoinpy as ucoin +from cutecoin.core.exceptions import PersonNotFoundError class Person(object): ''' @@ -13,10 +14,38 @@ class Person(object): ''' - def __init__(self): + def __init__(self, name, fingerprint, email): ''' Constructor ''' - self.name = "" - self.fingerprint = "" - self.email = "" \ No newline at end of file + self.name = name + self.fingerprint = fingerprint + self.email = email + + @classmethod + def create(cls, pgpFingerprint, community): + ''' + Create a person from the pgpFingerprint found in a community + ''' + keys = community.ucoinRequest(ucoin.pks.Lookup(), + get_args={'search':"0x"+pgpFingerprint, 'op':'index'})['keys'] + if len(keys) > 0: + json = keys[0]['key'] + name = json['name'] + fingerprint = json['fingerprint'] + email = json['email'] + return cls(name, fingerprint, email) + else: + raise PersonNotFoundError(pgpFingerprint, "pgpFingerprint", community) + return None + + @classmethod + def fromJson(cls, jsonPerson): + ''' + Create a person from json data + ''' + name = jsonPerson['name'] + pgpFingerprint = jsonPerson['fingerprint'] + email = jsonPerson['email'] + return cls(name, pgpFingerprint, email) + diff --git a/src/cutecoin/models/person/factory.py b/src/cutecoin/models/person/factory.py deleted file mode 100644 index 6a47b8ba..00000000 --- a/src/cutecoin/models/person/factory.py +++ /dev/null @@ -1,36 +0,0 @@ -''' -Created on 11 févr. 2014 - -@author: inso -''' -from cutecoin.core.exceptions import PersonNotFoundError -from cutecoin.models.person import Person -import ucoinpy as ucoin - - -def createPerson(pgpFingerprint, community): - ''' - Create a person from the pgpFingerprint found in a community - ''' - keys = community.ucoinRequest(ucoin.pks.Lookup(), - get_args={'search':"0x"+pgpFingerprint, 'op':'index'})['keys'] - if len(keys) > 0: - person = Person() - json = keys[0]['key'] - person.name = json['name'] - person.fingerprint = json['fingerprint'] - person.email = json['email'] - return person - else: - raise PersonNotFoundError(pgpFingerprint, "pgpFingerprint", community) - return None - -def createPersonFromJson(jsonPerson): - ''' - Create a person from json data - ''' - person = Person() - person.name = jsonPerson['name'] - person.pgpFingerprint = jsonPerson['fingerprint'] - person.email = jsonPerson['email'] - pass \ No newline at end of file diff --git a/src/cutecoin/models/transaction/__init__.py b/src/cutecoin/models/transaction/__init__.py index 10c30221..5d69d5c2 100644 --- a/src/cutecoin/models/transaction/__init__.py +++ b/src/cutecoin/models/transaction/__init__.py @@ -6,7 +6,6 @@ Created on 1 févr. 2014 import ucoinpy as ucoin from cutecoin.models.coin import Coin -from cutecoin.models.person import factory class Transaction(object): ''' diff --git a/src/cutecoin/models/transaction/factory.py b/src/cutecoin/models/transaction/factory.py index 38322b20..d36b11b2 100644 --- a/src/cutecoin/models/transaction/factory.py +++ b/src/cutecoin/models/transaction/factory.py @@ -5,9 +5,10 @@ Created on 12 févr. 2014 ''' import ucoinpy as ucoin -from cutecoin.models.person import factory +from cutecoin.models.person import Person from cutecoin.models.transaction import Transfer, Issuance +#TODO: Passer par des factory + pythonic def createTransaction(senderFingerprint, increment, community): transactionId = senderFingerprint + "-" + str(increment) ucoinTransactionView = ucoin.hdc.transactions.View(transactionId) @@ -21,7 +22,7 @@ def createTransaction(senderFingerprint, increment, community): if transaction != None: transaction.increment = increment transaction.community = community - transaction.sender = factory.createPerson(senderFingerprint, community) - transaction.recipient = factory.createPerson(ucoinTransaction['recipient'], community) + transaction.sender = Person.create(senderFingerprint, community) + transaction.recipient = Person.create(ucoinTransaction['recipient'], community) return transaction diff --git a/src/cutecoin/models/wallet/__init__.py b/src/cutecoin/models/wallet/__init__.py index 8e0ebd70..2d46c9f2 100644 --- a/src/cutecoin/models/wallet/__init__.py +++ b/src/cutecoin/models/wallet/__init__.py @@ -15,15 +15,28 @@ class Wallet(object): ''' - def __init__(self): + def __init__(self, coins, community): ''' Constructor ''' - self.coins = [] - self.community = None + self.coins = coins + self.community = community self.name = "Main Wallet" + @classmethod + def create(cls, community): + return cls([], community) + + @classmethod + def load(cls, jsonData, community): + coins = [] + for coinData in jsonData['coins']: + coins.append(Coin.fromId(coinData['coin'])) + return cls(coins, community) + + + def __eq__(self, other): return ( self.community == other.community ) diff --git a/src/cutecoin/models/wallet/factory.py b/src/cutecoin/models/wallet/factory.py deleted file mode 100644 index fca886d1..00000000 --- a/src/cutecoin/models/wallet/factory.py +++ /dev/null @@ -1,21 +0,0 @@ -''' -Created on 11 févr. 2014 - -@author: inso -''' -from cutecoin.models.wallet import Wallet -from cutecoin.models.coin import Coin - -def createWallet(community): - wallet = Wallet() - wallet.community = community - return wallet - - -def loadWallet(jsonData, community): - wallet = Wallet() - for coinData in jsonData['coins']: - wallet.coins.append(Coin.fromId(coinData['coin'])) - wallet.community = community - return wallet - -- GitLab