Update staticdirect stuff so it can handle "domains" of staticdirection
authorChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 6 Jul 2012 19:54:21 +0000 (14:54 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Sat, 14 Jul 2012 17:55:14 +0000 (12:55 -0500)
mediagoblin/init/__init__.py
mediagoblin/tests/test_staticdirect.py [new file with mode: 0644]
mediagoblin/tools/staticdirect.py

index b86810166916db2bb3e269f569c269cdaf69f4bc..e9708398d2e541122e585160a5c15fb542aa07dc 100644 (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():
diff --git a/mediagoblin/tests/test_staticdirect.py b/mediagoblin/tests/test_staticdirect.py
new file mode 100644 (file)
index 0000000..3a9e2fd
--- /dev/null
@@ -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"
index 4143b453ea6d9acd6f9065bf0b29849d75524497..31abc566c3194e58c2b75717b26a78ef241b9636 100644 (file)
 # 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('/'))