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 "
|
"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():
|
||||||
|
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!
|
# 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('/'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user