root / snf-common / synnefo / util / entry_points.py @ f8af937f
History | View | Annotate | Download (5 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 | 2ce0636e | Kostas Papadimitriou | import types |
37 | 5c285c17 | Kostas Papadimitriou | import os |
38 | 7fb619a0 | Kostas Papadimitriou | |
39 | bed8ed73 | Kostas Papadimitriou | from collections import defaultdict |
40 | 7fb619a0 | Kostas Papadimitriou | |
41 | 5c285c17 | Kostas Papadimitriou | # List of python distribution names which entry points will get excluded
|
42 | 5c285c17 | Kostas Papadimitriou | # from snf-common settings extension mechanism
|
43 | 5c285c17 | Kostas Papadimitriou | EXCLUDED_PACKAGES = os.environ.get('SYNNEFO_EXCLUDE_PACKAGES', '').split(":") |
44 | 5c285c17 | Kostas Papadimitriou | |
45 | 88506db0 | Kostas Papadimitriou | |
46 | 2ce0636e | Kostas Papadimitriou | def get_entry_points(ns, name): |
47 | 7fb619a0 | Kostas Papadimitriou | for entry_point in pkg_resources.iter_entry_points(group=ns): |
48 | 5c285c17 | Kostas Papadimitriou | if entry_point.name == name and \ |
49 | 5c285c17 | Kostas Papadimitriou | not entry_point.dist.project_name in EXCLUDED_PACKAGES: |
50 | 7fb619a0 | Kostas Papadimitriou | yield entry_point
|
51 | 7fb619a0 | Kostas Papadimitriou | |
52 | 7fb619a0 | Kostas Papadimitriou | |
53 | 2ce0636e | Kostas Papadimitriou | def extend_module(module_name, attrs): |
54 | 2ce0636e | Kostas Papadimitriou | module = sys.modules[module_name] |
55 | 74d988b0 | Christos Stavrakakis | for k, v in attrs.iteritems(): |
56 | 2ce0636e | Kostas Papadimitriou | setattr(module, k, v)
|
57 | 2ce0636e | Kostas Papadimitriou | |
58 | 2ce0636e | Kostas Papadimitriou | |
59 | 2ce0636e | Kostas Papadimitriou | def entry_point_to_object(ep): |
60 | 2ce0636e | Kostas Papadimitriou | object_or_func = ep.load() |
61 | 2ce0636e | Kostas Papadimitriou | |
62 | 2ce0636e | Kostas Papadimitriou | # user defined entry point is a function
|
63 | 2ce0636e | Kostas Papadimitriou | # get the return value
|
64 | 2ce0636e | Kostas Papadimitriou | obj = object_or_func |
65 | 2ce0636e | Kostas Papadimitriou | if hasattr(object_or_func, '__call__'): |
66 | 2ce0636e | Kostas Papadimitriou | obj = object_or_func() |
67 | 2ce0636e | Kostas Papadimitriou | |
68 | 74d988b0 | Christos Stavrakakis | if isinstance(obj, types.ModuleType): |
69 | 2ce0636e | Kostas Papadimitriou | dct = {} |
70 | 2ce0636e | Kostas Papadimitriou | for k in dir(obj): |
71 | 2ce0636e | Kostas Papadimitriou | if k.startswith("__"): |
72 | 2ce0636e | Kostas Papadimitriou | continue
|
73 | 2ce0636e | Kostas Papadimitriou | dct[k] = getattr(obj, k)
|
74 | 2ce0636e | Kostas Papadimitriou | |
75 | 2ce0636e | Kostas Papadimitriou | obj = dct |
76 | 2ce0636e | Kostas Papadimitriou | |
77 | 2ce0636e | Kostas Papadimitriou | return obj
|
78 | 2ce0636e | Kostas Papadimitriou | |
79 | 2ce0636e | Kostas Papadimitriou | |
80 | 2ce0636e | Kostas Papadimitriou | def extend_module_from_entry_point(module_name, ns): |
81 | 7fb619a0 | Kostas Papadimitriou | """
|
82 | 2ce0636e | Kostas Papadimitriou | Extend a settings module from entry_point hooks
|
83 | 7fb619a0 | Kostas Papadimitriou | """
|
84 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, 'default_settings'): |
85 | 2ce0636e | Kostas Papadimitriou | extend_module(module_name, entry_point_to_object(e)) |
86 | 2ce0636e | Kostas Papadimitriou | |
87 | 2ce0636e | Kostas Papadimitriou | |
88 | 2ce0636e | Kostas Papadimitriou | def extend_dict_from_entry_point(settings_object, ns, entry_point_name): |
89 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, entry_point_name): |
90 | 2ce0636e | Kostas Papadimitriou | settings_object.update(entry_point_to_object(e)) |
91 | 2ce0636e | Kostas Papadimitriou | |
92 | 2ce0636e | Kostas Papadimitriou | return settings_object
|
93 | 2ce0636e | Kostas Papadimitriou | |
94 | 2ce0636e | Kostas Papadimitriou | |
95 | 2ce0636e | Kostas Papadimitriou | def extend_list_from_entry_point(settings_object, ns, entry_point_name, |
96 | 74d988b0 | Christos Stavrakakis | unique=True):
|
97 | 2ce0636e | Kostas Papadimitriou | settings_object = list(settings_object)
|
98 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, entry_point_name): |
99 | 2ce0636e | Kostas Papadimitriou | obj = entry_point_to_object(e) |
100 | 2ce0636e | Kostas Papadimitriou | for row in obj: |
101 | 5c285c17 | Kostas Papadimitriou | # skip duplicate entries
|
102 | 5c285c17 | Kostas Papadimitriou | if row in settings_object: |
103 | 5c285c17 | Kostas Papadimitriou | continue
|
104 | 5c285c17 | Kostas Papadimitriou | |
105 | 74d988b0 | Christos Stavrakakis | if type(row) == dict and (row.get('before', False) or |
106 | 74d988b0 | Christos Stavrakakis | row.get('after', False)): |
107 | f8af937f | Kostas Papadimitriou | |
108 | f8af937f | Kostas Papadimitriou | insert_at = len(settings_object)
|
109 | 2ce0636e | Kostas Papadimitriou | if row.get('before', False): |
110 | f8af937f | Kostas Papadimitriou | try:
|
111 | f8af937f | Kostas Papadimitriou | position = settings_object.index(row.get('before'))
|
112 | f8af937f | Kostas Papadimitriou | insert_at = position - 1
|
113 | f8af937f | Kostas Papadimitriou | except ValueError: |
114 | f8af937f | Kostas Papadimitriou | pass
|
115 | 2ce0636e | Kostas Papadimitriou | else:
|
116 | f8af937f | Kostas Papadimitriou | try:
|
117 | f8af937f | Kostas Papadimitriou | position = settings_object.index(row.get('after'))
|
118 | f8af937f | Kostas Papadimitriou | insert_at = position + 1
|
119 | f8af937f | Kostas Papadimitriou | except ValueError: |
120 | f8af937f | Kostas Papadimitriou | pass
|
121 | 2ce0636e | Kostas Papadimitriou | |
122 | 2ce0636e | Kostas Papadimitriou | if insert_at < 0: |
123 | 2ce0636e | Kostas Papadimitriou | insert_at = 0
|
124 | 2ce0636e | Kostas Papadimitriou | |
125 | 2ce0636e | Kostas Papadimitriou | inserts = row.get('insert', [])
|
126 | 2ce0636e | Kostas Papadimitriou | if not type(inserts) == list: |
127 | 74d988b0 | Christos Stavrakakis | inserts = [inserts] |
128 | 2ce0636e | Kostas Papadimitriou | |
129 | 2ce0636e | Kostas Papadimitriou | for entry in inserts: |
130 | 2ce0636e | Kostas Papadimitriou | if not entry in settings_object: |
131 | 2ce0636e | Kostas Papadimitriou | settings_object.insert(insert_at, entry) |
132 | 2ce0636e | Kostas Papadimitriou | insert_at = insert_at + 1
|
133 | 2ce0636e | Kostas Papadimitriou | else:
|
134 | 2ce0636e | Kostas Papadimitriou | settings_object.append(row) |
135 | 2ce0636e | Kostas Papadimitriou | |
136 | 2ce0636e | Kostas Papadimitriou | return settings_object
|
137 | 2ce0636e | Kostas Papadimitriou | |
138 | bed8ed73 | Kostas Papadimitriou | |
139 | bed8ed73 | Kostas Papadimitriou | def collect_defaults(ns): |
140 | bed8ed73 | Kostas Papadimitriou | settings = defaultdict(lambda: [])
|
141 | bed8ed73 | Kostas Papadimitriou | for e in get_entry_points('synnefo', 'default_settings'): |
142 | bed8ed73 | Kostas Papadimitriou | attrs = dir(e.load())
|
143 | bed8ed73 | Kostas Papadimitriou | settings[e.dist.key] = settings[e.dist.key] + attrs |
144 | bed8ed73 | Kostas Papadimitriou | |
145 | bed8ed73 | Kostas Papadimitriou | return settings
|
146 | bed8ed73 | Kostas Papadimitriou | |
147 | 88506db0 | Kostas Papadimitriou | |
148 | 2ce0636e | Kostas Papadimitriou | def extend_settings(mname, ns): |
149 | 2ce0636e | Kostas Papadimitriou | extend_module_from_entry_point(mname, ns) |
150 | 2ce0636e | Kostas Papadimitriou | |
151 | bed8ed73 | Kostas Papadimitriou | |
152 | 2ce0636e | Kostas Papadimitriou | def extend_urls(patterns, ns): |
153 | 2ce0636e | Kostas Papadimitriou | for e in get_entry_points(ns, 'urls'): |
154 | 2ce0636e | Kostas Papadimitriou | patterns += e.load() |
155 | 2ce0636e | Kostas Papadimitriou | |
156 | 2ce0636e | Kostas Papadimitriou | return patterns |