Update staticdirect stuff so it can handle "domains" of staticdirection
This commit is contained in:
parent
00eda826cb
commit
5377114c4d
@ -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():
|
||||
|
9
mediagoblin/tests/test_staticdirect.py
Normal file
9
mediagoblin/tests/test_staticdirect.py
Normal 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"
|
@ -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('/'))
|
||||
|
Loading…
x
Reference in New Issue
Block a user