[tor-commits] [stem/master] Move comparison and hashing to base Descriptor class

atagar at torproject.org atagar at torproject.org
Thu Nov 29 01:09:16 UTC 2018


commit 1c2f851dd20ae16a5b00f340f8f369566b58e860
Author: Damian Johnson <atagar at torproject.org>
Date:   Tue Nov 27 18:42:19 2018 -0800

    Move comparison and hashing to base Descriptor class
    
    Huh. Not sure why I added these to subclasses rather than their common parent.
    Maybe there's a reason that will make me regret this, but certainly seems to
    work.
---
 stem/descriptor/__init__.py            | 25 ++++++++++
 stem/descriptor/microdescriptor.py     | 21 ---------
 stem/descriptor/networkstatus.py       | 84 ----------------------------------
 stem/descriptor/router_status_entry.py | 84 ----------------------------------
 stem/descriptor/server_descriptor.py   | 42 -----------------
 5 files changed, 25 insertions(+), 231 deletions(-)

diff --git a/stem/descriptor/__init__.py b/stem/descriptor/__init__.py
index 1b38783c..5f153f81 100644
--- a/stem/descriptor/__init__.py
+++ b/stem/descriptor/__init__.py
@@ -699,6 +699,7 @@ class Descriptor(object):
     self._raw_contents = contents
     self._lazy_loading = lazy_load
     self._entries = {}
+    self._hash = None
     self._unrecognized_lines = []
 
   @classmethod
@@ -1040,6 +1041,30 @@ class Descriptor(object):
     else:
       return self._raw_contents
 
+  def _compare(self, other, method):
+    if type(self) != type(other):
+      return False
+
+    return method(str(self).strip(), str(other).strip())
+
+  def __hash__(self):
+    if self._hash is None:
+      self._hash = hash(str(self).strip())
+
+    return self._hash
+
+  def __eq__(self, other):
+    return self._compare(other, lambda s, o: s == o)
+
+  def __ne__(self, other):
+    return not self == other
+
+  def __lt__(self, other):
+    return self._compare(other, lambda s, o: s < o)
+
+  def __le__(self, other):
+    return self._compare(other, lambda s, o: s <= o)
+
 
 class NewlineNormalizer(object):
   """
diff --git a/stem/descriptor/microdescriptor.py b/stem/descriptor/microdescriptor.py
index 8672f039..78b2b532 100644
--- a/stem/descriptor/microdescriptor.py
+++ b/stem/descriptor/microdescriptor.py
@@ -364,24 +364,3 @@ class Microdescriptor(Descriptor):
 
   def _name(self, is_plural = False):
     return 'microdescriptors' if is_plural else 'microdescriptor'
-
-  def _compare(self, other, method):
-    if not isinstance(other, Microdescriptor):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py
index baba556c..8cf07f03 100644
--- a/stem/descriptor/networkstatus.py
+++ b/stem/descriptor/networkstatus.py
@@ -1294,12 +1294,6 @@ class NetworkStatusDocumentV3(NetworkStatusDocument):
     else:
       return False  # malformed document
 
-  def _compare(self, other, method):
-    if not isinstance(other, NetworkStatusDocumentV3):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
   def _header(self, document_file, validate):
     content = bytes.join(b'', _read_until_keywords((AUTH_START, ROUTERS_START, FOOTER_START), document_file))
     entries = _descriptor_components(content, validate)
@@ -1384,21 +1378,6 @@ class NetworkStatusDocumentV3(NetworkStatusDocument):
       if value < minimum or value > maximum:
         raise ValueError("'%s' value on the params line must be in the range of %i - %i, was %i" % (key, minimum, maximum, value))
 
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 def _check_for_missing_and_disallowed_fields(document, entries, fields):
   """
@@ -1691,27 +1670,6 @@ class DirectoryAuthority(Descriptor):
 
     self.fingerprint = self.v3ident
 
-  def _compare(self, other, method):
-    if not isinstance(other, DirectoryAuthority):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 def _parse_dir_address_line(descriptor, entries):
   # "dir-address" IPPort
@@ -1828,27 +1786,6 @@ class KeyCertificate(Descriptor):
     else:
       self._entries = entries
 
-  def _compare(self, other, method):
-    if not isinstance(other, KeyCertificate):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 class DocumentSignature(object):
   """
@@ -2007,27 +1944,6 @@ class DetachedSignature(Descriptor):
     else:
       self._entries = entries
 
-  def _compare(self, other, method):
-    if not isinstance(other, DetachedSignature):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 class BridgeNetworkStatusDocument(NetworkStatusDocument):
   """
diff --git a/stem/descriptor/router_status_entry.py b/stem/descriptor/router_status_entry.py
index b3334620..45385135 100644
--- a/stem/descriptor/router_status_entry.py
+++ b/stem/descriptor/router_status_entry.py
@@ -503,27 +503,6 @@ class RouterStatusEntry(Descriptor):
 
     return ()
 
-  def _compare(self, other, method):
-    if not isinstance(other, RouterStatusEntry):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 class RouterStatusEntryV2(RouterStatusEntry):
   """
@@ -558,27 +537,6 @@ class RouterStatusEntryV2(RouterStatusEntry):
   def _single_fields(self):
     return ('r', 's', 'v')
 
-  def _compare(self, other, method):
-    if not isinstance(other, RouterStatusEntryV2):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 class RouterStatusEntryV3(RouterStatusEntry):
   """
@@ -661,27 +619,6 @@ class RouterStatusEntryV3(RouterStatusEntry):
   def _single_fields(self):
     return ('r', 's', 'v', 'w', 'p', 'pr')
 
-  def _compare(self, other, method):
-    if not isinstance(other, RouterStatusEntryV3):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 class RouterStatusEntryMicroV3(RouterStatusEntry):
   """
@@ -753,24 +690,3 @@ class RouterStatusEntryMicroV3(RouterStatusEntry):
 
   def _single_fields(self):
     return ('r', 's', 'v', 'w', 'm', 'pr')
-
-  def _compare(self, other, method):
-    if not isinstance(other, RouterStatusEntryMicroV3):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index 568af108..89b80d0a 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -985,12 +985,6 @@ class RelayDescriptor(ServerDescriptor):
     data = signing_key_digest + base64.b64decode(stem.util.str_tools._to_bytes(self.ed25519_master_key) + b'=')
     return stem.util.str_tools._to_unicode(binascii.hexlify(data).upper())
 
-  def _compare(self, other, method):
-    if not isinstance(other, RelayDescriptor):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
   def _check_constraints(self, entries):
     super(RelayDescriptor, self)._check_constraints(entries)
 
@@ -1000,21 +994,6 @@ class RelayDescriptor(ServerDescriptor):
       elif not self.ed25519_signature:
         raise ValueError("Descriptor must have a 'router-sig-ed25519' when identity-ed25519 is present")
 
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)
-
 
 class BridgeDescriptor(ServerDescriptor):
   """
@@ -1131,24 +1110,3 @@ class BridgeDescriptor(ServerDescriptor):
 
   def _last_keyword(self):
     return None
-
-  def _compare(self, other, method):
-    if not isinstance(other, BridgeDescriptor):
-      return False
-
-    return method(str(self).strip(), str(other).strip())
-
-  def __hash__(self):
-    return hash(str(self).strip())
-
-  def __eq__(self, other):
-    return self._compare(other, lambda s, o: s == o)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __lt__(self, other):
-    return self._compare(other, lambda s, o: s < o)
-
-  def __le__(self, other):
-    return self._compare(other, lambda s, o: s <= o)





More information about the tor-commits mailing list