commit 4a58b7a9fb30584f70ade4a6d75bc8f9821e57d0 Author: Ravi Chandra Padmala neenaoffline@gmail.com Date: Mon Aug 6 14:07:25 2012 +0530
networkstatus_descriptor.parse_file iterates over RouterDescriptors in a document --- stem/descriptor/networkstatus_descriptor.py | 22 +++++++++++++++------- 1 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/stem/descriptor/networkstatus_descriptor.py b/stem/descriptor/networkstatus_descriptor.py index 6c5544f..036c47e 100644 --- a/stem/descriptor/networkstatus_descriptor.py +++ b/stem/descriptor/networkstatus_descriptor.py @@ -43,20 +43,20 @@ _bandwidth_weights_regex = re.compile(" ".join(["W%s=\d+" % weight for weight in
def parse_file(document_file, validate = True): """ - Parses a network status document file, and returns a NetworkStatusDocument - object. + Iterates over the router descriptors in a network status document.
:param file document_file: file with network status document content :param bool validate: checks the validity of the document's contents if True, skips these checks otherwise
- :returns: NetworkStatusDocument object created by parsing the file + :returns: iterator for :class:`stem.descriptor.networkstatus_descriptor.RouterDescriptor` instances in the file
:raises: * ValueError if the contents is malformed and validate is True * IOError if the file can't be read """
- return NetworkStatusDocument(document_file.read(), validate) + document = NetworkStatusDocument(document_file.read(), validate) + return document.router_descriptors
def _strptime(string, validate = True, optional = False): try: @@ -186,10 +186,18 @@ class NetworkStatusDocument(stem.descriptor.Descriptor): dirauth_data = doc_parser.read_until(["dir-source", "r"]) self.directory_authorities.append(DirectoryAuthority(dirauth_data, vote, validate))
+ def _router_desc_generator(raw_content, vote, validate): + parser = stem.descriptor.DescriptorParser(raw_content, validate) + while parser.line != None: + descriptor = parser.read_until("r") + yield self._generate_router(descriptor, vote, validate) + # router descriptors - while doc_parser.line.startswith("r "): - router_data = doc_parser.read_until(["r", "directory-footer", "directory-signature"]) - self.router_descriptors.append(self._generate_router(router_data, vote, validate)) + if doc_parser.peek_keyword() == "r": + router_descriptors_data = doc_parser.read_until(["bandwidth-weights", "directory-footer", "directory-signature"]) + self.router_descriptors = _router_desc_generator(router_descriptors_data, vote, validate) + elif validate: + raise ValueError("No router descriptors found")
# footer section if self.consensus_method > 9 or vote and filter(lambda x: x >= 9, self.consensus_methods):
tor-commits@lists.torproject.org