Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/emacs-for-python/rope-dist/ropemode/dialog.py
990 views
1
class Data(object):
2
3
def __init__(self, prompt=None, default=None, values=None,
4
kind=None, decode=None):
5
self.prompt = prompt
6
self.default = default
7
self.values = values
8
self.kind = kind
9
self._decode = decode
10
11
def decode(self, value):
12
if self._decode:
13
return self._decode(value)
14
return value
15
16
17
class Boolean(Data):
18
19
def __init__(self, prompt=None, default=False):
20
Data.__init__(self, prompt, self._encode(default),
21
[self._encode(True), self._encode(False)])
22
23
def _encode(self, value):
24
if value:
25
return 'yes'
26
return 'no'
27
28
def decode(self, value):
29
if value.lower() in ('yes', '1', 'true'):
30
return True
31
return False
32
33
34
def show_dialog(askdata, actions, confs={}, optionals={}, initial_asking=True):
35
result = {}
36
if initial_asking:
37
for name, conf in confs.items():
38
result[name] = askdata(conf)
39
actions.append('batchset')
40
names = list(actions)
41
names.extend(optionals.keys())
42
names.extend(confs.keys())
43
base_question = Data('Choose what to do: ',
44
default=actions[0], values=names)
45
batchset_question = Data('Batch sets: ')
46
while True:
47
response = askdata(base_question)
48
if response == '':
49
response = base_question.default
50
elif response == 'batchset':
51
sets = askdata(batchset_question)
52
for key, value in _parse_batchset(sets).items():
53
if key.endswith(':'):
54
key = key[:-1]
55
if key in names:
56
conf = confs.get(key, optionals.get(key))
57
result[key] = value
58
elif response in actions:
59
break
60
else:
61
if response in confs:
62
conf = confs[response]
63
else:
64
conf = optionals[response]
65
oldvalue = result.get(response, None)
66
result[response] = askdata(conf, starting=oldvalue)
67
decoded = {}
68
all_confs = dict(confs)
69
all_confs.update(optionals)
70
for key in all_confs:
71
conf = all_confs.get(key)
72
if key in result:
73
decoded[key] = conf.decode(result[key])
74
else:
75
decoded[key] = conf.decode(conf.default)
76
return response, decoded
77
78
79
def _parse_batchset(sets):
80
result = []
81
multiline = False
82
for line in sets.splitlines(True):
83
if line[0].isspace():
84
if multiline:
85
result[-1][1] += line[1:]
86
else:
87
if not line.strip():
88
continue
89
multiline= False
90
tokens = line.split(None, 1)
91
value = ''
92
if len(tokens) > 1:
93
result.append([tokens[0], tokens[1].rstrip('\r\n')])
94
else:
95
multiline = True
96
result.append([tokens[0], ''])
97
return dict(result)
98
99