dialog.py 2.9 KB

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