Attempts to resolve any config value that is missing (e.g. None).

        @param dict_path our current path as we traverse the values dict
        @param values dictionary containing configs we want to resolve
        @param unresolved keep track of config values that are missing
        @returns list containing all unresolved configs

def _process_config_values(self, dict_path, values, unresolved=[]):
        """Attempts to resolve any config value that is missing (e.g. None).

        @param dict_path our current path as we traverse the values dict
        @param values dictionary containing configs we want to resolve
        @param unresolved keep track of config values that are missing
        @returns list containing all unresolved configs
        """
        if isinstance(values, dict):
            for k, v in values.items():
                if not k.isupper():
                    del values[k]
                    # Flask only supports config values that are uppercase.
                    # see: http://flask.pocoo.org/docs/1.0/config/#configuring-from-files
                    continue
                dict_path.append(''.join(['_', k])) # track our dict traversal
                # Found a missing value, try to resolve
                if v is None:
                    path = (''.join(dict_path))[1:]
                    resolved_value = self.resolve_missing_value(k, values, path)
                    if resolved_value is None:
                        unresolved.append(path)
                    else:
                        values[k] = resolved_value
                # is config has value, and it's another dict, traverse it
                elif hasattr(v, '__iter__'):
                    self._process_config_values(dict_path, v, unresolved)
                # again, update where we are in dict traversal
                dict_path.pop()
        elif isinstance(values, list):
            for _ in values:
                self._process_config_values(dict_path, _, unresolved)
        return unresolved