[tor-commits] [stem/master] Deduplicate more of from_remote()

atagar at torproject.org atagar at torproject.org
Tue May 8 20:20:10 UTC 2018


commit 4e360223f7567af932b3dd49e28f176c92f78bc8
Author: Damian Johnson <atagar at torproject.org>
Date:   Tue May 8 13:10:08 2018 -0700

    Deduplicate more of from_remote()
    
    Just tidying up boilerplate so this is more readable.
---
 stem/directory.py | 116 ++++++++++++++++++++++++++----------------------------
 1 file changed, 56 insertions(+), 60 deletions(-)

diff --git a/stem/directory.py b/stem/directory.py
index 014d07a5..5d1a352d 100644
--- a/stem/directory.py
+++ b/stem/directory.py
@@ -108,6 +108,14 @@ def _match_with(lines, regexes, required = None):
   return matches
 
 
+def _directory_entries(lines, pop_section_func, regexes, required = None):
+  next_section = pop_section_func(lines)
+
+  while next_section:
+    yield _match_with(next_section, regexes, required)
+    next_section = pop_section_func(lines)
+
+
 class Directory(object):
   """
   Relay we can contact for descriptor information.
@@ -261,34 +269,30 @@ class Authority(Directory):
     if not lines:
       raise IOError('%s did not have any content' % GITWEB_AUTHORITY_URL)
 
-    results = {}
+    # Entries look like...
+    #
+    # "moria1 orport=9101 "
+    #   "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 "
+    #   "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31",
 
-    while lines:
-      # Entries look like...
-      #
-      # "moria1 orport=9101 "
-      #   "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 "
-      #   "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31",
-
-      section = Authority._pop_section(lines)
-
-      if section:
-        try:
-          matches = _match_with(section, (AUTHORITY_NAME, AUTHORITY_V3IDENT, AUTHORITY_IPV6, AUTHORITY_ADDR), required = (AUTHORITY_NAME, AUTHORITY_ADDR))
-          nickname, or_port = matches.get(AUTHORITY_NAME)
-          address, dir_port, fingerprint = matches.get(AUTHORITY_ADDR)
-
-          results[nickname] = Authority(
-            address = address,
-            or_port = or_port,
-            dir_port = dir_port,
-            fingerprint = fingerprint.replace(' ', ''),
-            nickname = nickname,
-            orport_v6 = matches.get(AUTHORITY_IPV6),
-            v3ident = matches.get(AUTHORITY_V3IDENT),
-          )
-        except ValueError as exc:
-          raise IOError(str(exc))
+    try:
+      results = {}
+
+      for matches in _directory_entries(lines, Authority._pop_section, (AUTHORITY_NAME, AUTHORITY_V3IDENT, AUTHORITY_IPV6, AUTHORITY_ADDR), required = (AUTHORITY_NAME, AUTHORITY_ADDR)):
+        nickname, or_port = matches.get(AUTHORITY_NAME)
+        address, dir_port, fingerprint = matches.get(AUTHORITY_ADDR)
+
+        results[nickname] = Authority(
+          address = address,
+          or_port = or_port,
+          dir_port = dir_port,
+          fingerprint = fingerprint.replace(' ', ''),
+          nickname = nickname,
+          orport_v6 = matches.get(AUTHORITY_IPV6),
+          v3ident = matches.get(AUTHORITY_V3IDENT),
+        )
+    except ValueError as exc:
+      raise IOError(str(exc))
 
     return results
 
@@ -425,41 +429,33 @@ class Fallback(Directory):
       else:
         raise IOError('Malformed fallback directory header line: %s' % line)
 
-    # human readable comments
+    Fallback._pop_section(lines)  # skip human readable comments
 
-    Fallback._pop_section(lines)
+    # Entries look like...
+    #
+    # "5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB"
+    # " ipv6=[2a01:4f8:162:51e2::2]:9001"
+    # /* nickname=rueckgrat */
+    # /* extrainfo=1 */
 
-    # content, everything remaining are fallback directories
-
-    results = {}
-
-    while lines:
-      # Entries look like...
-      #
-      # "5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB"
-      # " ipv6=[2a01:4f8:162:51e2::2]:9001"
-      # /* nickname=rueckgrat */
-      # /* extrainfo=1 */
-
-      section = Fallback._pop_section(lines)
-
-      if section:
-        try:
-          matches = _match_with(section, (FALLBACK_ADDR, FALLBACK_NICKNAME, FALLBACK_EXTRAINFO, FALLBACK_IPV6), required = (FALLBACK_ADDR,))
-          address, dir_port, or_port, fingerprint = matches[FALLBACK_ADDR]
-
-          results[fingerprint] = Fallback(
-            address = address,
-            or_port = int(or_port),
-            dir_port = int(dir_port),
-            fingerprint = fingerprint,
-            nickname = matches.get(FALLBACK_NICKNAME),
-            has_extrainfo = matches.get(FALLBACK_EXTRAINFO) == '1',
-            orport_v6 = matches.get(FALLBACK_IPV6),
-            header = header,
-          )
-        except ValueError as exc:
-          raise IOError(str(exc))
+    try:
+      results = {}
+
+      for matches in _directory_entries(lines, Fallback._pop_section, (FALLBACK_ADDR, FALLBACK_NICKNAME, FALLBACK_EXTRAINFO, FALLBACK_IPV6), required = (FALLBACK_ADDR,)):
+        address, dir_port, or_port, fingerprint = matches[FALLBACK_ADDR]
+
+        results[fingerprint] = Fallback(
+          address = address,
+          or_port = int(or_port),
+          dir_port = int(dir_port),
+          fingerprint = fingerprint,
+          nickname = matches.get(FALLBACK_NICKNAME),
+          has_extrainfo = matches.get(FALLBACK_EXTRAINFO) == '1',
+          orport_v6 = matches.get(FALLBACK_IPV6),
+          header = header,
+        )
+    except ValueError as exc:
+      raise IOError(str(exc))
 
     return results
 





More information about the tor-commits mailing list