commit c0af25275f66e36c05f721167949dd63ef4ebed3 Author: Damian Johnson atagar@torproject.org Date: Sat May 21 18:37:33 2016 -0700
Fetching event descriptions directly, rather than use manual.py
Using the manual's _config() certainly did the trick, but kinda a hack. Populating our own cache of these.
This now omits events from _config() so its cache is a little smaller. --- docs/change_log.rst | 1 + stem/control.py | 24 +++++++++++++++++++++--- stem/manual.py | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst index b443c69..ecfc49a 100644 --- a/docs/change_log.rst +++ b/docs/change_log.rst @@ -49,6 +49,7 @@ The following are only available within Stem's `git repository * :func:`~stem.connection.connect` and :func:`~stem.control.Controller.from_port` now connect to both port 9051 (relay's default) and 9151 (Tor Browser's default) (:trac:`16075`) * :class:`~stem.exit_policy.ExitPolicy` support for *accept6/reject6* and **4/6* wildcards (:trac:`16053`) * Added `support for NETWORK_LIVENESS events <api/response.html#stem.response.events.NetworkLivenessEvent>`_ (:spec:`44aac63`) + * Added :func:`~stem.control.event_description` for getting human-friendly descriptions of tor events (:trac:`19061`) * Added :func:`~stem.control.Controller.reconnect` to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.is_set` to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.is_user_traffic_allowed` to the :class:`~stem.control.Controller` diff --git a/stem/control.py b/stem/control.py index 621aaea..f1eb274 100644 --- a/stem/control.py +++ b/stem/control.py @@ -263,10 +263,10 @@ import stem.descriptor.reader import stem.descriptor.router_status_entry import stem.descriptor.server_descriptor import stem.exit_policy -import stem.manual import stem.response import stem.response.events import stem.socket +import stem.util.conf import stem.util.connection import stem.util.enum import stem.util.str_tools @@ -378,12 +378,15 @@ UNCACHEABLE_GETCONF_PARAMS = (
# number of sequential attempts before we decide that the Tor geoip database # is unavailable + GEOIP_FAILURE_THRESHOLD = 5
SERVER_DESCRIPTORS_UNSUPPORTED = "Tor is currently not configured to retrieve \ server descriptors. As of Tor version 0.2.3.25 it downloads microdescriptors \ instead unless you set 'UseMicrodescriptors 0' in your torrc."
+EVENT_DESCRIPTIONS = None +
class AccountingStats(collections.namedtuple('AccountingStats', ['retrieved', 'status', 'interval_end', 'time_until_reset', 'read_bytes', 'read_bytes_left', 'read_limit', 'written_bytes', 'write_bytes_left', 'write_limit'])): """ @@ -484,9 +487,24 @@ def event_description(event):
:param str event: the event for which a description is needed
- :returns: str The event description + :returns: str The event description or **None** if this is an event name we + don't have a description for """ - return stem.manual._config().get('event.description.%s' % event.lower(), None) + + global EVENT_DESCRIPTIONS + + if EVENT_DESCRIPTIONS is None: + config = stem.util.conf.Config() + config_path = os.path.join(os.path.dirname(__file__), 'settings.cfg') + + try: + config.load(config_path) + EVENT_DESCRIPTIONS = dict([(key.lower()[18:], config.get_value(key)) for key in config.keys() if key.startswith('event.description.')]) + except Exception as exc: + log.warn("BUG: stem failed to load its internal manual information from '%s': %s" % (config_path, exc)) + return None + + return EVENT_DESCRIPTIONS.get(event.lower())
class BaseController(object): diff --git a/stem/manual.py b/stem/manual.py index be7b224..1e2a5e1 100644 --- a/stem/manual.py +++ b/stem/manual.py @@ -141,7 +141,7 @@ def _config(lowercase = True):
try: config.load(config_path) - config_dict = dict([(key.lower() if lowercase else key, config.get_value(key)) for key in config.keys()]) + config_dict = dict([(key.lower() if lowercase else key, config.get_value(key)) for key in config.keys() if key.startswith('manual.summary.')]) config_dict['manual.important'] = [name.lower() if lowercase else name for name in config.get_value('manual.important', [], multiple = True)] return config_dict except Exception as exc:
tor-commits@lists.torproject.org