[tor-commits] [stem/master] Allowing stem.descriptor.parse_file() to handle paths

atagar at torproject.org atagar at torproject.org
Mon Mar 25 03:54:22 UTC 2013


commit fa0fbd195d0531980a6e250ee2e32c99a0708259
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Mar 24 20:52:07 2013 -0700

    Allowing stem.descriptor.parse_file() to handle paths
    
    Several times now I've passed a string path to parse_file() rather than a file
    object and been confused for a sec by the stacktrace. On reflection there's no
    reason *not* to accept paths - that's commonly what we want it for after all
    and eliminating the extra open() lets our callers have much nicer code.
---
 stem/descriptor/__init__.py        |   11 ++++++++++-
 stem/descriptor/microdescriptor.py |   14 ++++++--------
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/stem/descriptor/__init__.py b/stem/descriptor/__init__.py
index 501ac5d..ef438a7 100644
--- a/stem/descriptor/__init__.py
+++ b/stem/descriptor/__init__.py
@@ -125,7 +125,7 @@ def parse_file(descriptor_file, descriptor_type = None, validate = True, documen
 
     my_descriptor_file = open(descriptor_path, 'rb')
 
-  :param file descriptor_file: opened file with the descriptor contents
+  :param str,file descriptor_file: path or opened file with the descriptor contents
   :param str descriptor_type: `descriptor type <https://metrics.torproject.org/formats.html#descriptortypes>`_, this is guessed if not provided
   :param bool validate: checks the validity of the descriptor's content if
     **True**, skips these checks otherwise
@@ -139,6 +139,15 @@ def parse_file(descriptor_file, descriptor_type = None, validate = True, documen
     * **IOError** if unable to read from the descriptor_file
   """
 
+  # if we got a path then open that file for parsing
+
+  if isinstance(descriptor_file, (bytes, unicode)):
+    with open(descriptor_file) as desc_file:
+      for desc in parse_file(desc_file, descriptor_type, validate, document_handler):
+        yield desc
+
+      return
+
   import stem.descriptor.server_descriptor
   import stem.descriptor.extrainfo_descriptor
   import stem.descriptor.networkstatus
diff --git a/stem/descriptor/microdescriptor.py b/stem/descriptor/microdescriptor.py
index 4fc2c31..ac1eb2e 100644
--- a/stem/descriptor/microdescriptor.py
+++ b/stem/descriptor/microdescriptor.py
@@ -41,10 +41,9 @@ the exit relays.
 
     print "Exit Relays:"
 
-    with open(os.path.join(data_dir, 'cached-microdesc-consensus')) as desc_file:
-      for desc in parse_file(desc_file):
-        if desc.digest in exit_digests:
-          print "  %s (%s)" % (desc.nickname, desc.fingerprint)
+    for desc in parse_file(os.path.join(data_dir, 'cached-microdesc-consensus')):
+      if desc.digest in exit_digests:
+        print "  %s (%s)" % (desc.nickname, desc.fingerprint)
 
 Doing the same is trivial with server descriptors...
 
@@ -54,10 +53,9 @@ Doing the same is trivial with server descriptors...
 
   print "Exit Relays:"
 
-  with open("/home/atagar/.tor/cached-descriptors") as desc_file:
-    for desc in parse_file(desc_file):
-      if desc.exit_policy.is_exiting_allowed():
-        print "  %s (%s)" % (desc.nickname, desc.fingerprint)
+  for desc in parse_file("/home/atagar/.tor/cached-descriptors"):
+    if desc.exit_policy.is_exiting_allowed():
+      print "  %s (%s)" % (desc.nickname, desc.fingerprint)
 
 **Module Overview:**
 



More information about the tor-commits mailing list