comparison contenttransformer/app.py @ 22:ee3eadc97a41

py3
author Jeff Hammel <k0scist@gmail.com>
date Tue, 03 Nov 2020 10:53:13 -0800
parents 32a05d7bb214
children 2a2063d571a6
comparison
equal deleted inserted replaced
21:7ad9bbc070be 22:ee3eadc97a41
2 import sys 2 import sys
3 from fnmatch import fnmatch 3 from fnmatch import fnmatch
4 from mimetypes import guess_type 4 from mimetypes import guess_type
5 from paste.fileapp import FileApp 5 from paste.fileapp import FileApp
6 from pkg_resources import iter_entry_points 6 from pkg_resources import iter_entry_points
7 from transformers import ContentTypeChanger 7 from .transformers import ContentTypeChanger
8 8
9 class FileTypeTransformer(object): 9 class FileTypeTransformer(object):
10 10
11 def __init__(self, *types, **kwargs): 11 def __init__(self, *types, **kwargs):
12 """types is a list of two-tuples: glob pattern (string), transformer name (string, name of entry point)""" 12 """types is a list of two-tuples: glob pattern (string), transformer name (string, name of entry point)"""
13 self.types = types 13 self.types = types
14 14
15 # arguments to the xformers 15 # arguments to the xformers
16 self.kwargs = kwargs 16 self.kwargs = kwargs
17 17
18 self.transformers = transformers() 18 self.transformers = transformers()
19 for pattern, transformer_name in self.types: 19 for pattern, transformer_name in self.types:
20 if '/' in transformer_name: 20 if '/' in transformer_name:
21 continue 21 continue
22 assert transformer_name in self.transformers, '%s not in transformers' % transformer_name 22 assert transformer_name in self.transformers, '%s not in transformers' % transformer_name
23 23
24 def __call__(self, path): 24 def __call__(self, path):
25 """this should return something that is callable with (environ, start_response) to return a response; the transformer thing""" 25 """this should return something that is callable with (environ, start_response) to return a response; the transformer thing"""
26 filename = os.path.basename(path) 26 filename = os.path.basename(path)
27 for pattern, transformer_name in self.types: 27 for pattern, transformer_name in self.types:
28 if fnmatch(filename, pattern): 28 if fnmatch(filename, pattern):
29 content_type, _ = guess_type(filename) 29 content_type, _ = guess_type(filename)
31 31
32 # transform content type 32 # transform content type
33 # XXX hack: -> refactor 33 # XXX hack: -> refactor
34 if '/' in transformer_name: 34 if '/' in transformer_name:
35 return ContentTypeChanger(content, content_type, transformer_name) 35 return ContentTypeChanger(content, content_type, transformer_name)
36 return self.transformers[transformer_name](content, content_type, **self.kwargs.get(transformer_name, {})) 36 return self.transformers[transformer_name](content, content_type, **self.kwargs.get(transformer_name, {}))
37 return FileApp(path) 37 return FileApp(path)
38 38
39 39
40 def transformers(): 40 def transformers():
41 transformers = {} # XXX could cache 41 transformers = {} # XXX could cache
43 try: 43 try:
44 transformers[entry_point.name] = entry_point.load() 44 transformers[entry_point.name] = entry_point.load()
45 except: 45 except:
46 raise # XXX 46 raise # XXX
47 return transformers 47 return transformers
48 48