From b37c2b39eaa5a7eda427585cd95dccf10a3f976f Mon Sep 17 00:00:00 2001 From: Shizmob Date: Thu, 31 Jul 2014 00:41:43 +0200 Subject: [PATCH] Fix import errors more elegantly. --- pydle/__init__.py | 51 ++++++++++++++++++++++------------------------- pydle/async.py | 21 +++++++++++++++++-- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/pydle/__init__.py b/pydle/__init__.py index debbb28..6e824d3 100644 --- a/pydle/__init__.py +++ b/pydle/__init__.py @@ -1,37 +1,34 @@ -import os +from . import async, connection, protocol, client, features + +from .async import coroutine, Future +from .client import Error, NotInChannel, AlreadyInChannel, BasicClient, ClientPool +from .features.ircv3_1.cap import NEGOTIATING as CAPABILITY_NEGOTIATING, FAILED as CAPABILITY_FAILED, NEGOTIATED as CAPABILITY_NEGOTIATED __name__ = 'pydle' __version__ = '0.8.0' __version_info__ = (0, 8, 0) -__license__ = '3-clause BSD' +__license__ = 'BSD' -if os.environ.get('READTHEDOCS', None) != 'True': - from . import async, connection, protocol, client, features +def featurize(*features): + """ Put features into proper MRO order. """ + from functools import cmp_to_key - from .async import coroutine, Future - from .client import Error, NotInChannel, AlreadyInChannel, BasicClient, ClientPool - from .features.ircv3_1.cap import NEGOTIATING as CAPABILITY_NEGOTIATING, FAILED as CAPABILITY_FAILED, NEGOTIATED as CAPABILITY_NEGOTIATED + def compare_subclass(left, right): + if issubclass(left, right): + return -1 + elif issubclass(right, left): + return 1 + return 0 - def featurize(*features): - """ Put features into proper MRO order. """ - from functools import cmp_to_key + sorted_features = sorted(features, key=cmp_to_key(compare_subclass)) + name = 'FeaturizedClient[{features}]'.format(features=', '.join(feature.__name__ for feature in sorted_features)) + return type(name, tuple(sorted_features), {}) - def compare_subclass(left, right): - if issubclass(left, right): - return -1 - elif issubclass(right, left): - return 1 - return 0 +class Client(featurize(*features.ALL)): + """ A fully featured IRC client. """ + pass - sorted_features = sorted(features, key=cmp_to_key(compare_subclass)) - name = 'FeaturizedClient[{features}]'.format(features=', '.join(feature.__name__ for feature in sorted_features)) - return type(name, tuple(sorted_features), {}) - - class Client(featurize(*features.ALL)): - """ A fully featured IRC client. """ - pass - - class MinimalClient(featurize(*features.LITE)): - """ A cut-down, less-featured IRC client. """ - pass +class MinimalClient(featurize(*features.LITE)): + """ A cut-down, less-featured IRC client. """ + pass diff --git a/pydle/async.py b/pydle/async.py index 0d0ec6e..91eff55 100644 --- a/pydle/async.py +++ b/pydle/async.py @@ -1,5 +1,6 @@ ## async.py # Light wrapper around whatever async library pydle uses. +import os import functools import itertools import collections @@ -7,8 +8,24 @@ import threading import datetime import types -import tornado.concurrent -import tornado.ioloop +try: + import tornado.concurrent + import tornado.ioloop +except ImportError: + if os.environ.get('READTHEDOCS', None) == 'True': + # Shim some objects for RTD. + class tornado: + class concurrent: + class TracebackFuture: + pass + + class ioloop: + class IOLoop: + READ = 1 + WRITE = 2 + ERROR = 3 + else: + raise FUTURE_TIMEOUT = 30