Mercurial > hg > contenttransformer
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 |