Update staticdirect stuff so it can handle "domains" of staticdirection

This commit is contained in:
Christopher Allan Webber 2012-07-06 14:54:21 -05:00
parent 00eda826cb
commit 5377114c4d
3 changed files with 38 additions and 24 deletions

View File

@ -107,8 +107,8 @@ def get_staticdirector(app_config):
"One of direct_remote_path or " "One of direct_remote_path or "
"direct_remote_paths must be provided") "direct_remote_paths must be provided")
return staticdirect.RemoteStaticDirect( return staticdirect.StaticDirect(
app_config['direct_remote_path'].strip()) {None: app_config['direct_remote_path'].strip()})
def setup_storage(): def setup_storage():

View File

@ -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"

View File

@ -22,37 +22,42 @@
# This needs documentation! # This needs documentation!
#################################### ####################################
import pkg_resources
import logging import logging
_log = logging.getLogger(__name__) _log = logging.getLogger(__name__)
class StaticDirect(object): 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 = {} self.cache = {}
def __call__(self, filepath): def __call__(self, filepath, domain=None):
if filepath in self.cache: if domain in self.cache and filepath in self.cache[domain]:
return self.cache[filepath] return self.cache[domain][filepath]
if not pkg_resources.resource_exists('mediagoblin', static_direction = self.cache.setdefault(
'static' + filepath): domain, {})[filepath] = self.get(filepath, domain)
_log.info("StaticDirect resource %r not found locally",
filepath)
static_direction = self.cache[filepath] = self.get(filepath)
return static_direction return static_direction
def get(self, filepath): def get(self, filepath, domain=None):
# 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):
return '%s/%s' % ( return '%s/%s' % (
self.remotepath, filepath.lstrip('/')) self.domains[domain], filepath.lstrip('/'))