From 5377114c4d1a3e5a9f80c49f27af81470a30230c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 6 Jul 2012 14:54:21 -0500 Subject: [PATCH] Update staticdirect stuff so it can handle "domains" of staticdirection --- mediagoblin/init/__init__.py | 4 +-- mediagoblin/tests/test_staticdirect.py | 9 +++++ mediagoblin/tools/staticdirect.py | 49 ++++++++++++++------------ 3 files changed, 38 insertions(+), 24 deletions(-) create mode 100644 mediagoblin/tests/test_staticdirect.py diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index b8681016..e9708398 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -107,8 +107,8 @@ def get_staticdirector(app_config): "One of direct_remote_path or " "direct_remote_paths must be provided") - return staticdirect.RemoteStaticDirect( - app_config['direct_remote_path'].strip()) + return staticdirect.StaticDirect( + {None: app_config['direct_remote_path'].strip()}) def setup_storage(): diff --git a/mediagoblin/tests/test_staticdirect.py b/mediagoblin/tests/test_staticdirect.py new file mode 100644 index 00000000..3a9e2fd9 --- /dev/null +++ b/mediagoblin/tests/test_staticdirect.py @@ -0,0 +1,9 @@ +from mediagoblin.tools import staticdirect + +def test_staticdirect(): + sdirect = staticdirect.StaticDirect( + {None: "/static/", + "theme": "http://example.org/themestatic"}) + assert sdirect("css/monkeys.css") == "/static/css/monkeys.css" + assert sdirect("images/lollerskate.png", "theme") == \ + "http://example.org/themestatic/images/lollerskate.png" diff --git a/mediagoblin/tools/staticdirect.py b/mediagoblin/tools/staticdirect.py index 4143b453..31abc566 100644 --- a/mediagoblin/tools/staticdirect.py +++ b/mediagoblin/tools/staticdirect.py @@ -22,37 +22,42 @@ # This needs documentation! #################################### -import pkg_resources import logging _log = logging.getLogger(__name__) class StaticDirect(object): - def __init__(self): + """ + Direct to a static resource. + + This StaticDirect class can take a series of "domains" to + staticdirect to. In general, you should supply a None domain, as + that's the "default" domain. + + Things work like this: + >>> staticdirect = StaticDirect( + ... {None: "/static/", + ... "theme": "http://example.org/themestatic/"}) + >>> staticdirect("css/monkeys.css") + "/static/css/monkeys.css" + >>> staticdirect("images/lollerskate.png", "theme") + "http://example.org/themestatic/images/lollerskate.png" + """ + def __init__(self, domains): + self.domains = dict( + [(key, value.rstrip('/')) + for key, value in domains.iteritems()]) self.cache = {} - def __call__(self, filepath): - if filepath in self.cache: - return self.cache[filepath] + def __call__(self, filepath, domain=None): + if domain in self.cache and filepath in self.cache[domain]: + return self.cache[domain][filepath] - if not pkg_resources.resource_exists('mediagoblin', - 'static' + filepath): - _log.info("StaticDirect resource %r not found locally", - filepath) - static_direction = self.cache[filepath] = self.get(filepath) + static_direction = self.cache.setdefault( + domain, {})[filepath] = self.get(filepath, domain) return static_direction - def get(self, filepath): - # should be implemented by the individual staticdirector - pass - - -class RemoteStaticDirect(StaticDirect): - def __init__(self, remotepath): - StaticDirect.__init__(self) - self.remotepath = remotepath.rstrip('/') - - def get(self, filepath): + def get(self, filepath, domain=None): return '%s/%s' % ( - self.remotepath, filepath.lstrip('/')) + self.domains[domain], filepath.lstrip('/')) -- 2.25.1