Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/virtualenv/config/convert.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4f3585e2f14b |
---|---|
1 from __future__ import absolute_import, unicode_literals | |
2 | |
3 import logging | |
4 import os | |
5 | |
6 | |
7 class TypeData(object): | |
8 def __init__(self, default_type, as_type): | |
9 self.default_type = default_type | |
10 self.as_type = as_type | |
11 | |
12 def __repr__(self): | |
13 return "{}(base={}, as={})".format(self.__class__.__name__, self.default_type, self.as_type) | |
14 | |
15 def convert(self, value): | |
16 return self.default_type(value) | |
17 | |
18 | |
19 class BoolType(TypeData): | |
20 BOOLEAN_STATES = { | |
21 "1": True, | |
22 "yes": True, | |
23 "true": True, | |
24 "on": True, | |
25 "0": False, | |
26 "no": False, | |
27 "false": False, | |
28 "off": False, | |
29 } | |
30 | |
31 def convert(self, value): | |
32 if value.lower() not in self.BOOLEAN_STATES: | |
33 raise ValueError("Not a boolean: %s" % value) | |
34 return self.BOOLEAN_STATES[value.lower()] | |
35 | |
36 | |
37 class NoneType(TypeData): | |
38 def convert(self, value): | |
39 if not value: | |
40 return None | |
41 return str(value) | |
42 | |
43 | |
44 class ListType(TypeData): | |
45 def _validate(self): | |
46 """""" | |
47 | |
48 def convert(self, value, flatten=True): | |
49 values = self.split_values(value) | |
50 result = [] | |
51 for value in values: | |
52 sub_values = value.split(os.pathsep) | |
53 result.extend(sub_values) | |
54 converted = [self.as_type(i) for i in result] | |
55 return converted | |
56 | |
57 def split_values(self, value): | |
58 """Split the provided value into a list. | |
59 | |
60 First this is done by newlines. If there were no newlines in the text, | |
61 then we next try to split by comma. | |
62 """ | |
63 if isinstance(value, (str, bytes)): | |
64 # Use `splitlines` rather than a custom check for whether there is | |
65 # more than one line. This ensures that the full `splitlines()` | |
66 # logic is supported here. | |
67 values = value.splitlines() | |
68 if len(values) <= 1: | |
69 values = value.split(",") | |
70 values = filter(None, [x.strip() for x in values]) | |
71 else: | |
72 values = list(value) | |
73 | |
74 return values | |
75 | |
76 | |
77 def convert(value, as_type, source): | |
78 """Convert the value as a given type where the value comes from the given source""" | |
79 try: | |
80 return as_type.convert(value) | |
81 except Exception as exception: | |
82 logging.warning("%s failed to convert %r as %r because %r", source, value, as_type, exception) | |
83 raise | |
84 | |
85 | |
86 _CONVERT = {bool: BoolType, type(None): NoneType, list: ListType} | |
87 | |
88 | |
89 def get_type(action): | |
90 default_type = type(action.default) | |
91 as_type = default_type if action.type is None else action.type | |
92 return _CONVERT.get(default_type, TypeData)(default_type, as_type) | |
93 | |
94 | |
95 __all__ = ( | |
96 "convert", | |
97 "get_type", | |
98 ) |