From e93ced5f6a1826698fb90e53312132e7c0a926f7 Mon Sep 17 00:00:00 2001 From: Stuckinaboot Date: Mon, 29 Oct 2018 13:13:39 +0100 Subject: [PATCH 1/3] Replace errors with exceptions --- peer/peerdata.py | 3 ++- peer/peerdata_interface.py | 3 ++- peer/peerstore.py | 17 ++++++++++------- peer/peerstore_interface.py | 7 ++++--- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/peer/peerdata.py b/peer/peerdata.py index d1bcf6f3..40676e88 100644 --- a/peer/peerdata.py +++ b/peer/peerdata.py @@ -28,4 +28,5 @@ class PeerData(IPeerData): def get_metadata(self, key): if key in self.metadata: return self.metadata[key], None - return None, "key not found" + else: + raise Exception("key not found") diff --git a/peer/peerdata_interface.py b/peer/peerdata_interface.py index f7e8b5df..1d5fa8ca 100644 --- a/peer/peerdata_interface.py +++ b/peer/peerdata_interface.py @@ -41,7 +41,8 @@ class IPeerData(ABC): """ :param key: key in KV pair - :return: val for key, error (only defined if key not found) + :return: val for key + :raise Exception: key not found exception """ def get_metadata(self, key): pass diff --git a/peer/peerstore.py b/peer/peerstore.py index 3922b7f5..58f195db 100644 --- a/peer/peerstore.py +++ b/peer/peerstore.py @@ -32,8 +32,9 @@ class PeerStore(IPeerStore): def get_protocols(self, peer_id): if peer_id in self.peer_map: - return self.peer_map[peer_id].get_protocols(), None - return None, peer_id + " not found" + return self.peer_map[peer_id].get_protocols() + else: + raise Exception("peer ID not found") def add_protocols(self, peer_id, protocols): peer = self.__create_or_get_peer(peer_id) @@ -44,9 +45,10 @@ class PeerStore(IPeerStore): def get(self, peer_id, key): if peer_id in self.peer_map: - val, error = self.peer_map[peer_id].get_metadata(key) - return val, error - return None, peer_id + " not found" + val = self.peer_map[peer_id].get_metadata(key) + return val + else: + raise Exception("peer ID not found") def put(self, peer_id, key, val): # <> @@ -64,8 +66,9 @@ class PeerStore(IPeerStore): def addrs(self, peer_id): if peer_id in self.peer_map: - return self.peer_map[peer_id].get_addrs(), None - return None, peer_id + " not found" + return self.peer_map[peer_id].get_addrs() + else: + raise Exception("peer ID not found") def clear_addrs(self, peer_id): # Only clear addresses if the peer is in peer map diff --git a/peer/peerstore_interface.py b/peer/peerstore_interface.py index 67f75c1d..8615ce05 100644 --- a/peer/peerstore_interface.py +++ b/peer/peerstore_interface.py @@ -20,7 +20,8 @@ class IPeerStore(ABC, IAddrBook, IPeerMetadata): def get_protocols(self, peer_id): """ :param peer_id: peer ID to get protocols for - :return: protocols (as strings), error + :return: protocols (as strings) + :raise Exception: peer ID not found exception """ pass @@ -29,7 +30,7 @@ class IPeerStore(ABC, IAddrBook, IPeerMetadata): """ :param peer_id: peer ID to add protocols for :param protocols: protocols to add - :return: error + :raise Exception: peer ID not found exception """ pass @@ -38,7 +39,7 @@ class IPeerStore(ABC, IAddrBook, IPeerMetadata): """ :param peer_id: peer ID to set protocols for :param protocols: protocols to set - :return: error + :raise Exception: peer ID not found exception """ pass From 95d3847d5ad98d396c0c7eb146c28759da631a79 Mon Sep 17 00:00:00 2001 From: Stuckinaboot Date: Mon, 29 Oct 2018 14:09:47 +0100 Subject: [PATCH 2/3] Change peerinfo to a class rather than a dictionary --- peer/README.md | 2 ++ peer/peerinfo.py | 4 ++++ peer/peerstore.py | 6 ++---- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 peer/peerinfo.py diff --git a/peer/README.md b/peer/README.md index 8a4ba3f8..df710f81 100644 --- a/peer/README.md +++ b/peer/README.md @@ -1,3 +1,5 @@ # PeerStore The PeerStore contains a mapping of peer IDs to PeerData objects. Each PeerData object represents a peer, and each PeerData contains a collection of protocols, addresses, and a mapping of metadata. PeerStore implements the IPeerStore (peer protocols), IAddrBook (address book), and IPeerMetadata (peer metadata) interfaces, which allows the peer store to effectively function as a dictionary for peer ID to protocol, address, and metadata. + +Note: PeerInfo represents a read-only summary of a PeerData object. Only the attributes assigned in PeerInfo are readable by references to PeerInfo objects. \ No newline at end of file diff --git a/peer/peerinfo.py b/peer/peerinfo.py new file mode 100644 index 00000000..b5cbd486 --- /dev/null +++ b/peer/peerinfo.py @@ -0,0 +1,4 @@ +class PeerInfo: + def __init__(self, peer_id, peer_data): + self.peer_id = peer_id + self.addrs = peer_data.get_addrs() diff --git a/peer/peerstore.py b/peer/peerstore.py index 58f195db..2ddcf112 100644 --- a/peer/peerstore.py +++ b/peer/peerstore.py @@ -1,5 +1,6 @@ from .peerstore_interface import IPeerStore from .peerdata import PeerData +from .peerinfo import PeerInfo class PeerStore(IPeerStore): @@ -24,10 +25,7 @@ class PeerStore(IPeerStore): def peer_info(self, peer_id): if peer_id in self.peer_map: peer = self.peer_map[peer_id] - return { - "peer_id": peer_id, - "addrs": peer.get_addrs() - } + return PeerInfo(peer_id, peer) return None def get_protocols(self, peer_id): From 869d2db84796896cb5df20f83d91117ed45518cd Mon Sep 17 00:00:00 2001 From: Stuckinaboot Date: Tue, 30 Oct 2018 00:03:19 +0100 Subject: [PATCH 3/3] Update exception type --- peer/peerdata.py | 8 ++++++-- peer/peerdata_interface.py | 3 ++- peer/peermetadata_interface.py | 5 +++-- peer/peerstore.py | 10 +++++++--- peer/peerstore_interface.py | 4 ++-- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/peer/peerdata.py b/peer/peerdata.py index 40676e88..9a700d9d 100644 --- a/peer/peerdata.py +++ b/peer/peerdata.py @@ -27,6 +27,10 @@ class PeerData(IPeerData): def get_metadata(self, key): if key in self.metadata: - return self.metadata[key], None + return self.metadata[key] else: - raise Exception("key not found") + raise PeerDataError("key not found") + +class PeerDataError(KeyError): + """Raised when a key is not found in peer metadata""" + pass diff --git a/peer/peerdata_interface.py b/peer/peerdata_interface.py index 1d5fa8ca..dd4432dc 100644 --- a/peer/peerdata_interface.py +++ b/peer/peerdata_interface.py @@ -35,6 +35,7 @@ class IPeerData(ABC): """ :param key: key in KV pair :param val: val to associate with key + :raise Exception: unsuccesful put """ def put_metadata(self, key, val): pass @@ -42,7 +43,7 @@ class IPeerData(ABC): """ :param key: key in KV pair :return: val for key - :raise Exception: key not found exception + :raise Exception: key not found """ def get_metadata(self, key): pass diff --git a/peer/peermetadata_interface.py b/peer/peermetadata_interface.py index 6fda82fe..818ee5e5 100644 --- a/peer/peermetadata_interface.py +++ b/peer/peermetadata_interface.py @@ -10,7 +10,8 @@ class IPeerMetadata(ABC): """ :param peer_id: peer ID to lookup key for :param key: key to look up - :return: value at key for given peer, error + :return: value at key for given peer + :raise Exception: peer ID not found """ pass @@ -20,7 +21,7 @@ class IPeerMetadata(ABC): :param peer_id: peer ID to lookup key for :param key: key to associate with peer :param val: value to associated with key - :return: error + :raise Exception: unsuccessful put """ pass \ No newline at end of file diff --git a/peer/peerstore.py b/peer/peerstore.py index 2ddcf112..fbefb20d 100644 --- a/peer/peerstore.py +++ b/peer/peerstore.py @@ -32,7 +32,7 @@ class PeerStore(IPeerStore): if peer_id in self.peer_map: return self.peer_map[peer_id].get_protocols() else: - raise Exception("peer ID not found") + raise PeerStoreError("peer ID not found") def add_protocols(self, peer_id, protocols): peer = self.__create_or_get_peer(peer_id) @@ -46,7 +46,7 @@ class PeerStore(IPeerStore): val = self.peer_map[peer_id].get_metadata(key) return val else: - raise Exception("peer ID not found") + raise PeerStoreError("peer ID not found") def put(self, peer_id, key, val): # <> @@ -66,7 +66,7 @@ class PeerStore(IPeerStore): if peer_id in self.peer_map: return self.peer_map[peer_id].get_addrs() else: - raise Exception("peer ID not found") + raise PeerStoreError("peer ID not found") def clear_addrs(self, peer_id): # Only clear addresses if the peer is in peer map @@ -81,3 +81,7 @@ class PeerStore(IPeerStore): if len(self.peer_map[key].get_addrs()) >= 1: output.append(key) return output + +class PeerStoreError(KeyError): + """Raised when peer ID is not found in peer store""" + pass diff --git a/peer/peerstore_interface.py b/peer/peerstore_interface.py index 8615ce05..240083a6 100644 --- a/peer/peerstore_interface.py +++ b/peer/peerstore_interface.py @@ -30,7 +30,7 @@ class IPeerStore(ABC, IAddrBook, IPeerMetadata): """ :param peer_id: peer ID to add protocols for :param protocols: protocols to add - :raise Exception: peer ID not found exception + :raise Exception: peer ID not found """ pass @@ -39,7 +39,7 @@ class IPeerStore(ABC, IAddrBook, IPeerMetadata): """ :param peer_id: peer ID to set protocols for :param protocols: protocols to set - :raise Exception: peer ID not found exception + :raise Exception: peer ID not found """ pass