code: def _preprocess(project_dict):
          
          handlers = {
              ('archive',): _list_if_none,
              ('on-run-start',): _list_if_none_or_string,
              ('on-run-end',): _list_if_none_or_string,
          }
  
          for k in ('models', 'seeds'):
              handlers[(k,)] = _dict_if_none
              handlers[(k, 'vars')] = _dict_if_none
              handlers[(k, 'pre-hook')] = _list_if_none_or_string
              handlers[(k, 'post-hook')] = _list_if_none_or_string
          handlers[('seeds', 'column_types')] = _dict_if_none
  
          def converter(value, keypath):
              if keypath in handlers:
                  handler = handlers[keypath]
                  return handler(value)
              else:
                  return value
  
          return deep_map(converter, project_dict)
docs: Pre-process certain special keys to convert them from None values
          into empty containers, and to turn strings into arrays of strings.