infocalypse
 
(Steve Dougherty)
2013-06-17: Move name/identity parsing into function.

Move name/identity parsing into function. Less duplication and better readability.

diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py
--- a/infocalypse/__init__.py
+++ b/infocalypse/__init__.py
@@ -384,14 +384,14 @@ def infocalypse_create(ui_, repo, **opts
     elif opts['uri'] != '':
         insert_uri = opts['uri']
     elif opts['wot'] != '':
-        # Expecting nick_prefix/repo_name.R<redundancy num>/edition/
-        nick_prefix, repo_desc = opts['wot'].split('/', 1)
+        # Expecting wot_id/repo_name.R<redundancy num>/edition/
+        wot_id, repo_desc = opts['wot'].split('/', 1)
 
         import wot
 
         ui_.status("Querying WoT for local identities.\n")
 
-        attributes = wot.resolve_local_identity(ui_, nick_prefix)
+        attributes = wot.resolve_local_identity(ui_, wot_id)
         if attributes is None:
             # Something went wrong; the function already printed an error.
             return
@@ -535,18 +535,7 @@ def infocalypse_pull(ui_, repo, **opts):
         # TODO: How to handle redundancy? Does Infocalypse automatically try
         # an R0 if an R1 fails?
 
-        nickname_prefix = ''
-        key_prefix=''
-        # Could be nick@key, nick, @key
-        split = wot_id.split('@')
-        nickname_prefix = split[0]
-
-        if len(split) == 2:
-            key_prefix = split[1]
-
-        repositories = wot.read_repo_listing(ui_, truster,
-                                             nickname_prefix=nickname_prefix,
-                                             key_prefix=key_prefix)
+        repositories = wot.read_repo_listing(ui_, truster, wot_id)
         if repo_name not in repositories:
             ui_.warn("Could not find repository named \"{0}\".\n".format(repo_name))
             return
diff --git a/infocalypse/wot.py b/infocalypse/wot.py
--- a/infocalypse/wot.py
+++ b/infocalypse/wot.py
@@ -20,7 +20,8 @@ def update_repo_listing(ui, for_identity
     # TODO: Nonstandard IP and port.
     node = fcp.FCPNode()
     # TODO: Does it make sense to query the node here for the private key?
-    attributes = resolve_local_identity(ui, key_prefix=for_identity)
+    # Key goes after @ - before is nickname.
+    attributes = resolve_local_identity(ui, '@' + for_identity)
     # TODO: Repetitive key parsing again!
     insert_uri = attributes['InsertURI']
     # Expecting USK@key/WebOfTrust/edition; want only key.
@@ -35,13 +36,12 @@ def update_repo_listing(ui, for_identity
         ui.status("Updated repository listing:\n{0}\n".format(uri))
 
 
-def read_repo_listing(ui, truster, nickname_prefix=None, key_prefix=''):
+def read_repo_listing(ui, truster, identity):
     """
     Read a repo listing for a given identity.
     Return a dictionary of repository URIs keyed by name.
     """
-    identity = resolve_identity(ui, truster, nickname_prefix=nickname_prefix,
-                                key_prefix=key_prefix)
+    identity = resolve_identity(ui, truster, identity)
     if identity is None:
         return
 
@@ -73,20 +73,7 @@ def read_repo_listing(ui, truster, nickn
 
 def execute_setup_wot(ui_, opts):
     cfg = Config.from_ui(ui_)
-    wot_id = opts['truster']
-
-    # TODO: Code for wot_id parsing duplicated between here and WoT pull.
-    nickname_prefix = ''
-    key_prefix = ''
-    # Could be nick@key, nick, @key
-    split = wot_id.split('@')
-    nickname_prefix = split[0]
-
-    if len(split) == 2:
-        key_prefix = split[1]
-
-    # TODO: Support key
-    response = resolve_local_identity(ui_, nickname_prefix=nickname_prefix)
+    response = resolve_local_identity(ui_, opts['truster'])
 
     if response is None:
         return
@@ -99,11 +86,9 @@ def execute_setup_wot(ui_, opts):
     Config.to_file(cfg)
 
 
-def resolve_local_identity(ui, nickname_prefix=None, key_prefix=None):
+def resolve_local_identity(ui, identity):
     """
     Mercurial ui for error messages.
-    Nickname prefix should be enough to not be ambiguous.
-    If the nickname is not set the key must be.
     # TODO: Does not support duplicate nicknames between local identities.
     # Could support looking at identity to resolve further.
 
@@ -111,6 +96,8 @@ def resolve_local_identity(ui, nickname_
     and identity that match the given criteria.
     In the case of an error prints a message and returns None.
     """
+    nickname_prefix, key_prefix = parse_name(identity)
+
     node = fcp.FCPNode()
     response =\
         node.fcpPluginMessage(async=False,
@@ -161,7 +148,7 @@ def resolve_local_identity(ui, nickname_
     return read_local_identity(response, id_num)
 
 
-def resolve_identity(ui, truster, nickname_prefix=None, key_prefix=''):
+def resolve_identity(ui, truster, identity):
     """
     If using LCWoT, either the nickname prefix should be enough to be
     unambiguous, or failing that enough of the key.
@@ -177,6 +164,7 @@ def resolve_identity(ui, truster, nickna
     :param nickname_prefix: Partial (prefix) of nickname. Can be whole.
     :param key_prefix: Partial (prefix) of key. Can be empty.
     """
+    nickname_prefix, key_prefix = parse_name(identity)
     # TODO: Support different FCP IP / port.
     node = fcp.FCPNode()
 
@@ -266,4 +254,21 @@ def read_identity(message, id_num):
             num = key[len(prefix):]
             result["Context{0}".format(num)] = message[key]
 
-    return result
\ No newline at end of file
+    return result
+
+
+def parse_name(identity):
+    """
+    Parse identity of the forms: nick
+                                 nick@key
+                                 @key
+    Return nick, key. If a part is not given return an empty string.
+    """
+    split = identity.split('@', 1)
+    nickname_prefix = split[0]
+
+    key_prefix = ''
+    if len(split) == 2:
+        key_prefix = split[1]
+
+    return nickname_prefix, key_prefix