comparison env/lib/python3.7/site-packages/virtualenv/run/plugin/base.py @ 2:6af9afd405e9 draft

"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author shellac
date Thu, 14 May 2020 14:56:58 -0400
parents 26e78fe6e8c4
children
comparison
equal deleted inserted replaced
1:75ca89e9b81c 2:6af9afd405e9
1 from __future__ import absolute_import, unicode_literals
2
3 import sys
4 from collections import OrderedDict
5
6 if sys.version_info >= (3, 8):
7 from importlib.metadata import entry_points
8 else:
9 from importlib_metadata import entry_points
10
11
12 class PluginLoader(object):
13 _OPTIONS = None
14 _ENTRY_POINTS = None
15
16 @classmethod
17 def entry_points_for(cls, key):
18 return OrderedDict((e.name, e.load()) for e in cls.entry_points().get(key, {}))
19
20 @staticmethod
21 def entry_points():
22 if PluginLoader._ENTRY_POINTS is None:
23 PluginLoader._ENTRY_POINTS = entry_points()
24 return PluginLoader._ENTRY_POINTS
25
26
27 class ComponentBuilder(PluginLoader):
28 def __init__(self, interpreter, parser, name, possible):
29 self.interpreter = interpreter
30 self.name = name
31 self._impl_class = None
32 self.possible = possible
33 self.parser = parser.add_argument_group(title=name)
34 self.add_selector_arg_parse(name, list(self.possible))
35
36 @classmethod
37 def options(cls, key):
38 if cls._OPTIONS is None:
39 cls._OPTIONS = cls.entry_points_for(key)
40 return cls._OPTIONS
41
42 def add_selector_arg_parse(self, name, choices):
43 raise NotImplementedError
44
45 def handle_selected_arg_parse(self, options):
46 selected = getattr(options, self.name)
47 if selected not in self.possible:
48 raise RuntimeError("No implementation for {}".format(self.interpreter))
49 self._impl_class = self.possible[selected]
50 self.populate_selected_argparse(selected, options.app_data)
51 return selected
52
53 def populate_selected_argparse(self, selected, app_data):
54 self.parser.description = "options for {} {}".format(self.name, selected)
55 self._impl_class.add_parser_arguments(self.parser, self.interpreter, app_data)
56
57 def create(self, options):
58 return self._impl_class(options, self.interpreter)