ropemacs / ropemacs /

class Data(object):

    def __init__(self, prompt=None, default=None, values=None,
                 kind=None, decode=None):
        self.prompt = prompt
        self.default = default
        self.values = values
        self.kind = kind
        self._decode = decode

    def decode(self, value):
        if self._decode:
            return self._decode(value)
        return value

class Boolean(Data):

    def __init__(self, prompt=None, default=False):
        Data.__init__(self, prompt, self._encode(default),
                      [self._encode(True), self._encode(False)])

    def _encode(self, value):
        if value:
            return 'yes'
        return 'no'

    def decode(self, value):
        if value.lower() in ('yes', '1', 'true'):
            return True
        return False

def show_dialog(askdata, actions, confs={}, optionals={}, initial_asking=True):
    result = {}
    if initial_asking:
        for name, conf in confs.items():
            result[name] = askdata(conf)
    names = list(confs.keys())
    base_question = Data('Choose what to do: ',
                         default=actions[0], values=names)
    batchset_question = Data('Batch sets: ')
    while True:
        response = askdata(base_question)
        if response == '':
            response = base_question.default
        elif response == 'batchset':
            sets = askdata(batchset_question)
            for key, value in _parse_batchset(sets).items():
                if key.endswith(':'):
                    key = key[:-1]
                if key in names:
                    conf = confs.get(key, optionals.get(key))
                    result[key] = value
        elif response in actions:
            if response in confs:
                conf = confs[response]
                conf = optionals[response]
            oldvalue = result.get(response, None)
            result[response] = askdata(conf, starting=oldvalue)
    decoded = {}
    all_confs = dict(confs)
    for key in all_confs:
        conf = all_confs.get(key)
        if key in result:
            decoded[key] = conf.decode(result[key])
            decoded[key] = conf.decode(conf.default)
    return response, decoded

def _parse_batchset(sets):
    result = []
    multiline = False
    for line in sets.splitlines(True):
        if line[0].isspace():
            if multiline:
                result[-1][1] += line[1:]
            if not line.strip():
            multiline= False
            tokens = line.split(None, 1)
            value = ''
            if len(tokens) > 1:
                result.append([tokens[0], tokens[1].rstrip('\r\n')])
                multiline = True
                result.append([tokens[0], ''])
    return dict(result)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.