root / snf-common / synnefo / util / entry_points.py @ bed8ed73
History | View | Annotate | Download (4.4 kB)
1 | 2ce0636e | Kostas Papadimitriou | # Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 2ce0636e | Kostas Papadimitriou | #
|
3 | 2ce0636e | Kostas Papadimitriou | # Redistribution and use in source and binary forms, with or
|
4 | 2ce0636e | Kostas Papadimitriou | # without modification, are permitted provided that the following
|
5 | 2ce0636e | Kostas Papadimitriou | # conditions are met:
|
6 | 2ce0636e | Kostas Papadimitriou | #
|
7 | 2ce0636e | Kostas Papadimitriou | # 1. Redistributions of source code must retain the above
|
8 | 2ce0636e | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
9 | 2ce0636e | Kostas Papadimitriou | # disclaimer.
|
10 | 2ce0636e | Kostas Papadimitriou | #
|
11 | 2ce0636e | Kostas Papadimitriou | # 2. Redistributions in binary form must reproduce the above
|
12 | 2ce0636e | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
13 | 2ce0636e | Kostas Papadimitriou | # disclaimer in the documentation and/or other materials
|
14 | 2ce0636e | Kostas Papadimitriou | # provided with the distribution.
|
15 | 2ce0636e | Kostas Papadimitriou | #
|
16 | 2ce0636e | Kostas Papadimitriou | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 2ce0636e | Kostas Papadimitriou | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 2ce0636e | Kostas Papadimitriou | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 2ce0636e | Kostas Papadimitriou | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 2ce0636e | Kostas Papadimitriou | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 2ce0636e | Kostas Papadimitriou | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 2ce0636e | Kostas Papadimitriou | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 2ce0636e | Kostas Papadimitriou | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 2ce0636e | Kostas Papadimitriou | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 2ce0636e | Kostas Papadimitriou | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 2ce0636e | Kostas Papadimitriou | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 2ce0636e | Kostas Papadimitriou | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 2ce0636e | Kostas Papadimitriou | #
|
29 | 2ce0636e | Kostas Papadimitriou | # The views and conclusions contained in the software and
|
30 | 2ce0636e | Kostas Papadimitriou | # documentation are those of the authors and should not be
|
31 | 2ce0636e | Kostas Papadimitriou | # interpreted as representing official policies, either expressed
|
32 | 2ce0636e | Kostas Papadimitriou | # or implied, of GRNET S.A.
|
33 | 2ce0636e | Kostas Papadimitriou | |
34 | 7fb619a0 | Kostas Papadimitriou | import sys |
35 | 7fb619a0 | Kostas Papadimitriou | import pkg_resources |
36 | 7fb619a0 | Kostas Papadimitriou | import inspect |
37 | 2ce0636e | Kostas Papadimitriou | import types |
38 | 7fb619a0 | Kostas Papadimitriou | |
39 | bed8ed73 | Kostas Papadimitriou | from collections import defaultdict |
40 | bed8ed73 | Kostas Papadimitriou | import inspect |
41 | 7fb619a0 | Kostas Papadimitriou | |
42 | 2ce0636e | Kostas Papadimitriou | def get_entry_points(ns, name): |
43 | 7fb619a0 | Kostas Papadimitriou | for entry_point in pkg_resources.iter_entry_points(group=ns): |
44 | 7fb619a0 | Kostas Papadimitriou | if entry_point.name == name:
|
45 | 7fb619a0 | Kostas Papadimitriou | yield entry_point
|
46 | 7fb619a0 | Kostas Papadimitriou | |
47 | 7fb619a0 | Kostas Papadimitriou | |
48 | 2ce0636e | Kostas Papadimitriou | def extend_module(module_name, attrs): |
49 | 2ce0636e | Kostas Papadimitriou | module = sys.modules[module_name] |
50 | 2ce0636e | Kostas Papadimitriou | for k,v in attrs.iteritems(): |
51 | 2ce0636e | Kostas Papadimitriou | setattr(module, k, v)
|
52 | 2ce0636e | Kostas Papadimitriou | |
53 | 2ce0636e | Kostas Papadimitriou | |
54 | 2ce0636e | Kostas Papadimitriou | def entry_point_to_object(ep): |
55 | 2ce0636e | Kostas Papadimitriou | object_or_func = ep.load() |
56 | 2ce0636e | Kostas Papadimitriou | |
57 | 2ce0636e | Kostas Papadimitriou | # user defined entry point is a function
|
58 | 2ce0636e | Kostas Papadimitriou | # get the return value
|
59 | 2ce0636e | Kostas Papadimitriou | obj = object_or_func |
60 | 2ce0636e | Kostas Papadimitriou | if hasattr(object_or_func, '__call__'): |
61 | 2ce0636e | Kostas Papadimitriou | obj = object_or_func() |
62 | 2ce0636e | Kostas Papadimitriou | |
63 | 2ce0636e | Kostas Papadimitriou | if type(obj) == types.ModuleType: |
64 | 2ce0636e | Kostas Papadimitriou | dct = {} |
65 | 2ce0636e | Kostas Papadimitriou | for k in dir(obj): |
66 | 2ce0636e | Kostas Papadimitriou | if k.startswith("__"): |
67 | 2ce0636e | Kostas Papadimitriou | continue
|
68 | 2ce0636e | Kostas Papadimitriou | dct[k] = getattr(obj, k)
|
69 | 2ce0636e | Kostas Papadimitriou | |
70 | 2ce0636e | Kostas Papadimitriou | obj = dct |
71 | 2ce0636e | Kostas Papadimitriou | |
72 | 2ce0636e | Kostas Papadimitriou | return obj
|
73 | 2ce0636e | Kostas Papadimitriou | |
74 | 2ce0636e | Kostas Papadimitriou | |
75 | 2ce0636e | Kostas Papadimitriou | def extend_module_from_entry_point(module_name, ns): |
76 | 7fb619a0 | Kostas Papadimitriou | """
|
77 | 2ce0636e | Kostas Papadimitriou | Extend a settings module from entry_point hooks
|
78 | 7fb619a0 | Kostas Papadimitriou | """
|
79 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, 'default_settings'): |
80 | 2ce0636e | Kostas Papadimitriou | extend_module(module_name, entry_point_to_object(e)) |
81 | 2ce0636e | Kostas Papadimitriou | |
82 | 2ce0636e | Kostas Papadimitriou | |
83 | 2ce0636e | Kostas Papadimitriou | def extend_dict_from_entry_point(settings_object, ns, entry_point_name): |
84 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, entry_point_name): |
85 | 2ce0636e | Kostas Papadimitriou | settings_object.update(entry_point_to_object(e)) |
86 | 2ce0636e | Kostas Papadimitriou | |
87 | 2ce0636e | Kostas Papadimitriou | return settings_object
|
88 | 2ce0636e | Kostas Papadimitriou | |
89 | 2ce0636e | Kostas Papadimitriou | |
90 | 2ce0636e | Kostas Papadimitriou | def extend_list_from_entry_point(settings_object, ns, entry_point_name, |
91 | 2ce0636e | Kostas Papadimitriou | unique=True):
|
92 | 2ce0636e | Kostas Papadimitriou | settings_object = list(settings_object)
|
93 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, entry_point_name): |
94 | 2ce0636e | Kostas Papadimitriou | obj = entry_point_to_object(e) |
95 | 2ce0636e | Kostas Papadimitriou | for row in obj: |
96 | 2ce0636e | Kostas Papadimitriou | if type(row) == dict and (row.get('before', False) or \ |
97 | 2ce0636e | Kostas Papadimitriou | row.get('after', False)): |
98 | 2ce0636e | Kostas Papadimitriou | if row.get('before', False): |
99 | 2ce0636e | Kostas Papadimitriou | position = settings_object.index(row.get('before'))
|
100 | 2ce0636e | Kostas Papadimitriou | insert_at = position - 1
|
101 | 2ce0636e | Kostas Papadimitriou | else:
|
102 | 2ce0636e | Kostas Papadimitriou | position = settings_object.index(row.get('after'))
|
103 | 2ce0636e | Kostas Papadimitriou | insert_at = position + 1
|
104 | 2ce0636e | Kostas Papadimitriou | |
105 | 2ce0636e | Kostas Papadimitriou | if insert_at < 0: |
106 | 2ce0636e | Kostas Papadimitriou | insert_at = 0
|
107 | 2ce0636e | Kostas Papadimitriou | |
108 | 2ce0636e | Kostas Papadimitriou | inserts = row.get('insert', [])
|
109 | 2ce0636e | Kostas Papadimitriou | if not type(inserts) == list: |
110 | 2ce0636e | Kostas Papadimitriou | inserts = [inserts] |
111 | 2ce0636e | Kostas Papadimitriou | |
112 | 2ce0636e | Kostas Papadimitriou | for entry in inserts: |
113 | 2ce0636e | Kostas Papadimitriou | if not entry in settings_object: |
114 | 2ce0636e | Kostas Papadimitriou | settings_object.insert(insert_at, entry) |
115 | 2ce0636e | Kostas Papadimitriou | insert_at = insert_at + 1
|
116 | 2ce0636e | Kostas Papadimitriou | else:
|
117 | 2ce0636e | Kostas Papadimitriou | settings_object.append(row) |
118 | 2ce0636e | Kostas Papadimitriou | |
119 | 2ce0636e | Kostas Papadimitriou | return settings_object
|
120 | 2ce0636e | Kostas Papadimitriou | |
121 | bed8ed73 | Kostas Papadimitriou | |
122 | bed8ed73 | Kostas Papadimitriou | def collect_defaults(ns): |
123 | bed8ed73 | Kostas Papadimitriou | settings = defaultdict(lambda: [])
|
124 | bed8ed73 | Kostas Papadimitriou | for e in get_entry_points('synnefo', 'default_settings'): |
125 | bed8ed73 | Kostas Papadimitriou | attrs = dir(e.load())
|
126 | bed8ed73 | Kostas Papadimitriou | settings[e.dist.key] = settings[e.dist.key] + attrs |
127 | bed8ed73 | Kostas Papadimitriou | |
128 | bed8ed73 | Kostas Papadimitriou | return settings
|
129 | bed8ed73 | Kostas Papadimitriou | |
130 | 2ce0636e | Kostas Papadimitriou | def extend_settings(mname, ns): |
131 | 2ce0636e | Kostas Papadimitriou | extend_module_from_entry_point(mname, ns) |
132 | 2ce0636e | Kostas Papadimitriou | |
133 | bed8ed73 | Kostas Papadimitriou | |
134 | 2ce0636e | Kostas Papadimitriou | def extend_urls(patterns, ns): |
135 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, 'urls'): |
136 | 2ce0636e | Kostas Papadimitriou | patterns += e.load() |
137 | 2ce0636e | Kostas Papadimitriou | |
138 | 2ce0636e | Kostas Papadimitriou | return patterns
|