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 "
"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():

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!
####################################
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('/'))