infocalypse
 
(Steve Dougherty)
2013-07-26: Break away querying WoT for local ID for readability.

Break away querying WoT for local ID for readability.

diff --git a/infocalypse/wot_id.py b/infocalypse/wot_id.py
--- a/infocalypse/wot_id.py
+++ b/infocalypse/wot_id.py
@@ -107,64 +107,11 @@ class Local_WoT_ID(WoT_ID):
     """
 
     def __init__(self, wot_identifier):
-        # Query WoT for local identities, and find a match if one exists.
-        # If not, abort. Otherwise define insert_uri and pass the WoT result
-        # and id_num along to WoT_ID.__init__() for further processing.
+        id_num, message = get_local_identity(wot_identifier)
 
-        nickname_prefix, key_prefix = parse_name(wot_identifier)
+        self.insert_uri = USK(message['Replies.InsertURI{0}'.format(id_num)])
 
-        node = fcp.FCPNode()
-        response = \
-            node.fcpPluginMessage(async=False,
-                                  plugin_name="plugins.WebOfTrust.WebOfTrust",
-                                  plugin_params={'Message':
-                                                 'GetOwnIdentities'})[0]
-
-        if response['header'] != 'FCPPluginReply' or \
-                'Replies.Message' not in response or \
-                response['Replies.Message'] != 'OwnIdentities':
-            raise util.Abort("Unexpected reply. Got {0}\n.".format(response))
-
-        # Find nicknames starting with the supplied nickname prefix.
-        prefix = 'Replies.Nickname'
-        # Key: nickname, value (id_num, public key hash).
-        matches = {}
-        for key in response.iterkeys():
-            if key.startswith(prefix) and \
-                    response[key].startswith(nickname_prefix):
-
-                # Key is Replies.Nickname<number>, where number is used in
-                # the other attributes returned for that identity.
-                id_num = key[len(prefix):]
-
-                nickname = response[key]
-                pubkey_hash = response['Replies.Identity{0}'.format(id_num)]
-
-                matches[nickname] = (id_num, pubkey_hash)
-
-        # Remove matching nicknames not also matching the (possibly partial)
-        # public key hash.
-        for key in matches.keys():
-            # public key hash is second member of value tuple.
-            if not matches[key][1].startswith(key_prefix):
-                del matches[key]
-
-        if len(matches) > 1:
-            raise util.Abort("'{0}' is ambiguous.\n".format(wot_identifier))
-
-        if len(matches) == 0:
-            raise util.Abort("No local identities match '{0}'.\n".format(
-                wot_identifier))
-
-        assert len(matches) == 1
-
-        # id_num is first member of value tuple.
-        only_key = matches.keys()[0]
-        id_num = matches[only_key][0]
-
-        self.insert_uri = USK(response['Replies.InsertURI{0}'.format(id_num)])
-
-        WoT_ID.__init__(self, None, None, id_num=id_num, message=response)
+        WoT_ID.__init__(self, None, None, id_num=id_num, message=message)
 
 
 def get_identity(wot_identifier, truster):
@@ -236,6 +183,67 @@ def get_identity(wot_identifier, truster
     return response
 
 
+def get_local_identity(wot_identifier):
+    """
+    Internal.
+
+    Return (id_number, FCP reply) from WoT for a local identity matching the
+    identifier. Abort if anything but exactly one match is found.
+    """
+    nickname_prefix, key_prefix = parse_name(wot_identifier)
+
+    node = fcp.FCPNode()
+    response = \
+        node.fcpPluginMessage(async=False,
+                              plugin_name="plugins.WebOfTrust.WebOfTrust",
+                              plugin_params={'Message':
+                                             'GetOwnIdentities'})[0]
+
+    if response['header'] != 'FCPPluginReply' or \
+            'Replies.Message' not in response or \
+            response['Replies.Message'] != 'OwnIdentities':
+        raise util.Abort("Unexpected reply. Got {0}\n.".format(response))
+
+    # Find nicknames starting with the supplied nickname prefix.
+    prefix = 'Replies.Nickname'
+    # Key: nickname, value (id_num, public key hash).
+    matches = {}
+    for key in response.iterkeys():
+        if key.startswith(prefix) and \
+                response[key].startswith(nickname_prefix):
+
+            # Key is Replies.Nickname<number>, where number is used in
+            # the other attributes returned for that identity.
+            id_num = key[len(prefix):]
+
+            nickname = response[key]
+            pubkey_hash = response['Replies.Identity{0}'.format(id_num)]
+
+            matches[nickname] = (id_num, pubkey_hash)
+
+    # Remove matching nicknames not also matching the (possibly partial)
+    # public key hash.
+    for key in matches.keys():
+        # public key hash is second member of value tuple.
+        if not matches[key][1].startswith(key_prefix):
+            del matches[key]
+
+    if len(matches) > 1:
+        raise util.Abort("'{0}' is ambiguous.\n".format(wot_identifier))
+
+    if len(matches) == 0:
+        raise util.Abort("No local identities match '{0}'.\n".format(
+            wot_identifier))
+
+    assert len(matches) == 1
+
+    # id_num is first member of value tuple.
+    only_key = matches.keys()[0]
+    id_num = matches[only_key][0]
+
+    return id_num, response
+
+
 def parse_name(wot_identifier):
     """
     Parse identifier of the forms: nick