Merge remote branch 'remotes/cwebber/sqlalchemy'
[mediagoblin.git] / mediagoblin / staticdirect.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 import pkg_resources
18 import urlparse
19
20 ####################################
21 # Staticdirect infrastructure.
22 # Borrowed largely from cc.engine
23 # by Chris Webber & Creative Commons
24 #
25 # This needs documentation!
26 ####################################
27
28 import pkg_resources
29 import urlparse
30
31
32 class StaticDirect(object):
33 def __init__(self):
34 self.cache = {}
35
36 def __call__(self, filepath):
37 if filepath in self.cache:
38 return self.cache[filepath]
39
40 static_direction = self.cache[filepath] = self.get(filepath)
41 return static_direction
42
43 def get(self, filepath):
44 # should be implemented by the individual staticdirector
45 pass
46
47
48 class RemoteStaticDirect(StaticDirect):
49 def __init__(self, remotepath):
50 StaticDirect.__init__(self)
51 self.remotepath = remotepath.rstrip('/')
52
53 def get(self, filepath):
54 return '%s/%s' % (
55 self.remotepath, filepath.lstrip('/'))
56
57
58 class MultiRemoteStaticDirect(StaticDirect):
59 """
60 For whene separate sections of the static data is served under
61 separate urls.
62 """
63 def __init__(self, remotepaths):
64 StaticDirect.__init__(self)
65 self.remotepaths = remotepaths
66
67 def get(self, filepath):
68 section, rest = filepath.strip('/').split('/', 1)
69
70 return '%s/%s' % (
71 self.remotepaths[section].rstrip('/'),
72 rest.lstrip('/'))