[tor-commits] [stem/master] Move _hash_attr() to stem.util

atagar at torproject.org atagar at torproject.org
Sun Jul 3 18:09:35 UTC 2016


commit 873d2ecf8931b70181cd6d7c7271a7ce3670ec9b
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Jul 2 12:20:34 2016 -0700

    Move _hash_attr() to stem.util
    
    On reflection more fitting in the util module.
---
 stem/__init__.py          | 26 --------------------------
 stem/descriptor/remote.py | 10 ++++------
 stem/exit_policy.py       |  6 +++---
 stem/manual.py            |  7 ++++---
 stem/util/__init__.py     | 26 ++++++++++++++++++++++++++
 stem/version.py           |  5 +++--
 6 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/stem/__init__.py b/stem/__init__.py
index 56d294d..1f61075 100644
--- a/stem/__init__.py
+++ b/stem/__init__.py
@@ -860,29 +860,3 @@ HSAuth = stem.util.enum.UppercaseEnum(
   'STEALTH_AUTH',
   'UNKNOWN',
 )
-
-
-def _hash_attr(obj, *attributes, **kwargs):
-  """
-  Provide a hash value for the given set of attributes.
-
-  :param Object obj: object to be hashed
-  :param list attributes: attribute names to take into account
-  :param class parent: parent object to include in the hash value
-  """
-
-  my_hash = 0 if kwargs.get('parent') == None else kwargs.get('parent').__hash__(obj)
-
-  for attr in attributes:
-    my_hash *= 1024
-
-    attr_value = getattr(obj, attr)
-
-    if attr_value is not None:
-      if isinstance(attr_value, dict):
-        for k, v in attr_value.items():
-          my_hash = (my_hash + hash(k)) * 1024 + hash(v)
-      else:
-        my_hash += hash(attr_value)
-
-  return my_hash
diff --git a/stem/descriptor/remote.py b/stem/descriptor/remote.py
index 69f4d39..f25d58e 100644
--- a/stem/descriptor/remote.py
+++ b/stem/descriptor/remote.py
@@ -91,8 +91,6 @@ import threading
 import time
 import zlib
 
-import stem
-
 try:
   # account for urllib's change between python 2.x and 3.x
   import urllib.request as urllib
@@ -102,7 +100,7 @@ except ImportError:
 import stem.descriptor
 
 from stem import Flag
-from stem.util import connection, log, str_tools, tor_tools
+from stem.util import _hash_attr, connection, log, str_tools, tor_tools
 
 # Tor has a limited number of descriptors we can fetch explicitly by their
 # fingerprint or hashes due to a limit on the url length by squid proxies.
@@ -719,7 +717,7 @@ class Directory(object):
     self.fingerprint = fingerprint
 
   def __hash__(self):
-    return stem._hash_attr(self, 'address', 'or_port', 'dir_port', 'fingerprint')
+    return _hash_attr(self, 'address', 'or_port', 'dir_port', 'fingerprint')
 
   def __eq__(self, other):
     return hash(self) == hash(other) if isinstance(other, Directory) else False
@@ -772,7 +770,7 @@ class DirectoryAuthority(Directory):
     self.is_bandwidth_authority = is_bandwidth_authority
 
   def __hash__(self):
-    return stem._hash_attr(self, 'nickname', 'v3ident', 'is_bandwidth_authority', parent = Directory)
+    return _hash_attr(self, 'nickname', 'v3ident', 'is_bandwidth_authority', parent = Directory)
 
   def __eq__(self, other):
     return hash(self) == hash(other) if isinstance(other, DirectoryAuthority) else False
@@ -1066,7 +1064,7 @@ class FallbackDirectory(Directory):
     return results
 
   def __hash__(self):
-    return stem._hash_attr(self, 'orport_v6', parent = Directory)
+    return _hash_attr(self, 'orport_v6', parent = Directory)
 
   def __eq__(self, other):
     return hash(self) == hash(other) if isinstance(other, FallbackDirectory) else False
diff --git a/stem/exit_policy.py b/stem/exit_policy.py
index a0b3064..e84a456 100644
--- a/stem/exit_policy.py
+++ b/stem/exit_policy.py
@@ -70,13 +70,13 @@ from __future__ import absolute_import
 import socket
 import zlib
 
-import stem
 import stem.prereq
 import stem.util.connection
 import stem.util.enum
 import stem.util.str_tools
 
 from stem import str_type
+from stem.util import _hash_attr
 
 try:
   # added in python 3.2
@@ -1014,7 +1014,7 @@ class ExitPolicyRule(object):
 
   def __hash__(self):
     if self._hash is None:
-      self._hash = stem._hash_attr(self, 'is_accept', 'address', 'min_port', 'max_port') * 1024 + hash(self.get_mask(False))
+      self._hash = _hash_attr(self, 'is_accept', 'address', 'min_port', 'max_port') * 1024 + hash(self.get_mask(False))
 
     return self._hash
 
@@ -1060,7 +1060,7 @@ class MicroExitPolicyRule(ExitPolicyRule):
 
   def __hash__(self):
     if self._hash is None:
-      self._hash = stem._hash_attr(self, 'is_accept', 'min_port', 'max_port')
+      self._hash = _hash_attr(self, 'is_accept', 'min_port', 'max_port')
 
     return self._hash
 
diff --git a/stem/manual.py b/stem/manual.py
index fe83487..70cae73 100644
--- a/stem/manual.py
+++ b/stem/manual.py
@@ -52,13 +52,14 @@ import shutil
 import sys
 import tempfile
 
-import stem
 import stem.prereq
 import stem.util.conf
 import stem.util.enum
 import stem.util.log
 import stem.util.system
 
+from stem.util import _hash_attr
+
 try:
   # added in python 2.7
   from collections import OrderedDict
@@ -112,7 +113,7 @@ class ConfigOption(object):
     self.description = description
 
   def __hash__(self):
-    return stem._hash_attr(self, 'name', 'category', 'usage', 'summary', 'description')
+    return _hash_attr(self, 'name', 'category', 'usage', 'summary', 'description')
 
   def __eq__(self, other):
     return hash(self) == hash(other) if isinstance(other, ConfigOption) else False
@@ -468,7 +469,7 @@ class Manual(object):
     conf.save(path)
 
   def __hash__(self):
-    return stem._hash_attr(self, 'name', 'synopsis', 'description', 'commandline_options', 'signals', 'files', 'config_options')
+    return _hash_attr(self, 'name', 'synopsis', 'description', 'commandline_options', 'signals', 'files', 'config_options')
 
   def __eq__(self, other):
     return hash(self) == hash(other) if isinstance(other, Manual) else False
diff --git a/stem/util/__init__.py b/stem/util/__init__.py
index beb0ee6..63609d9 100644
--- a/stem/util/__init__.py
+++ b/stem/util/__init__.py
@@ -40,3 +40,29 @@ def datetime_to_unix(timestamp):
     return int(timestamp.strftime('%s')) - int(datetime.datetime(1970, 1, 1).strftime('%s')) + 3600
   else:
     return (timestamp - datetime.datetime(1970, 1, 1)).total_seconds()
+
+
+def _hash_attr(obj, *attributes, **kwargs):
+  """
+  Provide a hash value for the given set of attributes.
+
+  :param Object obj: object to be hashed
+  :param list attributes: attribute names to take into account
+  :param class parent: parent object to include in the hash value
+  """
+
+  my_hash = 0 if kwargs.get('parent') == None else kwargs.get('parent').__hash__(obj)
+
+  for attr in attributes:
+    my_hash *= 1024
+
+    attr_value = getattr(obj, attr)
+
+    if attr_value is not None:
+      if isinstance(attr_value, dict):
+        for k, v in attr_value.items():
+          my_hash = (my_hash + hash(k)) * 1024 + hash(v)
+      else:
+        my_hash += hash(attr_value)
+
+  return my_hash
diff --git a/stem/version.py b/stem/version.py
index de4a784..e13c420 100644
--- a/stem/version.py
+++ b/stem/version.py
@@ -72,10 +72,11 @@ easily parsed and compared, for instance...
 import os
 import re
 
-import stem
 import stem.util.enum
 import stem.util.system
 
+from stem.util import _hash_attr
+
 try:
   # added in python 3.2
   from functools import lru_cache
@@ -235,7 +236,7 @@ class Version(object):
 
   def __hash__(self):
     if self._hash is None:
-      self._hash = stem._hash_attr(self, 'major', 'minor', 'micro', 'patch', 'status')
+      self._hash = _hash_attr(self, 'major', 'minor', 'micro', 'patch', 'status')
 
     return self._hash
 





More information about the tor-commits mailing list