def validate_params(self): """ Validate database parameters. Should validate that a dbtype is a valid one and that the appropriate params have been passed for a particular db_type. :raises ETLHelperParamsError: Error if params are invalid """ # Get a set of the attributes to compare against required attributes. given = set(self.keys()) try: required_params = DB_HELPER_FACTORY.from_dbtype( self.dbtype).required_params except ETLHelperHelperError: msg = f'{self.dbtype} not in valid types ({DB_HELPER_FACTORY.helpers.keys()})' # from None suppresses lower errors in the stack trace # Deeper error is recorded in ETLHelperDbParamsError.__context__ raise ETLHelperDbParamsError(msg) from None unset_params = (given ^ required_params) & required_params if unset_params: msg = f'{unset_params} not set. Required parameters are {required_params}' raise ETLHelperDbParamsError(msg) valid_params = required_params.union({'dbtype'}) bad_params = given ^ valid_params if bad_params: msg = f"Invalid parameter(s): {bad_params}" raise ETLHelperDbParamsError(msg)
def from_environment(cls, prefix='ETLHelper_'): """ Create DbParams object from parameters specified by environment variables e.g. ETLHelper_dbtype, ETLHelper_host, ETLHelper_port, etc. :param prefix: str, prefix to environment variable names """ dbparams_keys = [key for key in os.environ if key.startswith(prefix)] dbparams_from_env = { key.replace(prefix, '').lower(): os.environ[key] for key in dbparams_keys } # Ensure dbtype has been set dbtype_var = f'{prefix}dbtype' dbtype = dbparams_from_env.get('dbtype', None) if dbtype is None: msg = f"{dbtype_var} environment variable is not set" raise ETLHelperDbParamsError(msg) # Only include the required params # This prevents something like ETLHelper_password being added required_params = DB_HELPER_FACTORY.from_dbtype( dbtype).required_params | {'dbtype'} dbparams_from_env = { key: dbparams_from_env[key] for key in required_params } return cls(**dbparams_from_env)
def validate_params(self): """ Validate database parameters. Should validate that a dbtype is a valid one and that the appropriate params have been passed for a particular db_type. :raises ETLHelperParamsError: Error if params are invalid """ # Get a set of the attributes to compare against required attributes. given = set(self.keys()) try: required_params = DB_HELPER_FACTORY.from_dbtype(self.dbtype).required_params except ETLHelperHelperError: msg = f'{self.dbtype} not in valid types ({DB_HELPER_FACTORY.helpers.keys()})' raise ETLHelperDbParamsError(msg) unset_params = (given ^ required_params) & required_params if unset_params: msg = f'{unset_params} not set. Required parameters are {required_params}' raise ETLHelperDbParamsError(msg)
def from_environment(cls, prefix='ETLHelper_'): """ Create DbParams object from parameters specified by environment variables e.g. ETLHelper_dbtype, ETLHelper_host, ETLHelper_port, etc. :param prefix: str, prefix to environment variable names """ dbparams_keys = [key for key in os.environ if key.startswith(prefix)] dbparams_from_env = {key.replace(prefix, '').lower(): os.environ[key] for key in dbparams_keys} # Ensure dbtype has been set dbtype_var = f'{prefix}dbtype' if 'dbtype' not in dbparams_from_env: msg = f"{dbtype_var} environment variable is not set" raise ETLHelperDbParamsError(msg) return cls(**dbparams_from_env)