Exemple #1
0
def prompt_create_record(datacls: type,
                         message_header: str = '',
                         asdict=False):
    assert hasattr(datacls, '__dataclass_fields__'
                   ), 'Must input a dataclass in order to use this prompt'
    message_header = message_header or f'Please input the field values to create a new {datacls.__name__}'
    result_values = {
        name: field.default
        for name, field in datacls.__dataclass_fields__.items()
    }
    fields_by_index = picklist_to_dict(datacls.__dataclass_fields__)

    def prompt_single_field(index):
        field = fields_by_index[index]
        validator = validator = PromptConfigureObjectValidator(
            datacls,
            fields_by_index,
            result_values,
            preselected_field_index=index)
        completer = PromptConfigureObjectCompleter(
            datacls,
            fields_by_index,
            result_values,
            preselected_field_index=index)
        value = prompt_v2(f'Set value for {cyan(field.name)}:',
                          validator=validator,
                          completer=completer,
                          validate_while_typing=False)
        result_values[field.name] = _cast(value, field.type)

    while True:
        message = _configure_object_format_message(message_header, datacls,
                                                   result_values)
        validator = PromptConfigureObjectValidator(datacls, fields_by_index,
                                                   result_values)
        completer = PromptConfigureObjectCompleter(datacls, fields_by_index,
                                                   result_values)
        field_selection, value = prompt_v2(message,
                                           _configure_object_unpack_input,
                                           validator=validator,
                                           completer=completer,
                                           validate_while_typing=False)
        if field_selection == '':
            break
        if field_selection == '0':
            for index, field in fields_by_index.items():
                prompt_single_field(index)
            continue
        if field_selection and value is None:
            prompt_single_field(field_selection)
            continue
        field = fields_by_index[field_selection]
        result_values[field.name] = _cast(value, field.type)
    new_record = datacls(**result_values)
    if asdict:
        return _asdict(new_record)
    return new_record
Exemple #2
0
def asdict(obj: Any) -> dict:
    """Coerce a dataclass object to a dict."""
    return {key: value for key, value in _asdict(obj).items()}
Exemple #3
0
 def asdict(self):
     return _asdict(self)
Exemple #4
0
 def __iter__(self):
     for k, v in _asdict(self).items():
         if isinstance(v, _Path):
             v = str(v)
         yield k, v