def test_context_loads_secrets_from_config(monkeypatch): secrets_dict = Config(password="******") config = Config(context=Config(secrets=secrets_dict)) monkeypatch.setattr(prefect.utilities.context, "config", config) fresh_context = Context() assert "secrets" in fresh_context assert fresh_context.secrets == secrets_dict
def test_retry_delay_is_timedelta_if_timedelta(self): config = Config() config.set_nested("tasks.defaults.retry_delay", datetime.timedelta(seconds=5)) config = configuration.process_task_defaults(config) assert config.tasks.defaults.retry_delay == datetime.timedelta( seconds=5)
def test_context_loads_values_from_config(monkeypatch): subsection = Config(password="******") config = Config(context=Config(subsection=subsection, my_key="my_value")) monkeypatch.setattr(prefect.utilities.context, "config", config) fresh_context = Context() assert "subsection" in fresh_context assert fresh_context.my_key == "my_value" assert fresh_context.subsection == subsection
def test_copy_leaves_values_mutable(config): config = Config(config, default_box=True) config.x.y.z = [1] new = config.copy() assert new.x.y.z == [1] new.x.y.z.append(2) assert config.x.y.z == [1, 2]
def test_context_loads_values_from_config(monkeypatch): subsection = Config(password="******") config = Config( context=Config(subsection=subsection, key1="val1", key2="val2")) monkeypatch.setattr(prefect.utilities.context, "config", config) fresh_context = Context(key2="new") assert "subsection" in fresh_context assert fresh_context.key1 == "val1" assert fresh_context.key2 == "new" # overridden by constructor assert fresh_context.subsection == subsection
def test_setdefault_nested_overwrites_only_if_missing(self): config = Config() config.setdefault_nested("a.b.c", 1) config.setdefault_nested("a.b.d", 10) config.setdefault_nested("a.b.c", 2) assert config.a.b.c == 1 assert config.a.b.d == 10
def test_set_nested_overwrites(self): config = Config() config.set_nested("a.b.c", 1) config.set_nested("a.b.d", 10) config.set_nested("a.b.c", 2) assert config.a.b.c == 2 assert config.a.b.d == 10
def set_temporary_config(temp_config: dict) -> Iterator: """ Temporarily sets configuration values for the duration of the context manager. Args: - temp_config (dict): a dictionary containing (possibly nested) configuration keys and values. Nested configuration keys should be supplied as `.`-delimited strings. Example: ```python with set_temporary_config({'setting': 1, 'nested.setting': 2}): assert prefect.config.setting == 1 assert prefect.config.nested.setting == 2 ``` """ try: old_config = prefect.config.copy() for key, value in temp_config.items(): # the `key` might be a dot-delimited string, so we split on "." and set the value cfg = prefect.config subkeys = key.split(".") for subkey in subkeys[:-1]: cfg = cfg.setdefault(subkey, Config()) cfg[subkeys[-1]] = value # ensure the new config is available in context with prefect.context(config=prefect.config): yield prefect.config finally: prefect.config.clear() prefect.config.update(old_config)
def set_temporary_config(key: str, value: Any) -> Iterator: """ Temporarily sets a configuration value for the duration of the context manager. Args: - key (str): the fully-qualified config key (including '.'s) - value (Any): the value to apply to the key Example: ```python with set_temporary_config('flows.eager_edge_validation', True): assert prefect.config.flows.eager_edge_validation ``` """ try: old_config = copy.deepcopy(prefect_server.config) config = prefect_server.config keys = key.split(".") for key in keys[:-1]: config = config.setdefault(key, Config()) setattr(config, keys[-1], value) yield finally: prefect_server.config.clear() prefect_server.config.update(old_config)
def test_context_contextmanager_prioritizes_new_keys_even_on_context_exit( monkeypatch): """Previously exiting a context block would reload from the config, overwriting any explicitly set values in a nested context. This was due to the `Context` constructor being implicitly called when stashing the old context, and the constructor prioritizing `config.context` over explicit values.""" config = Config(context=Config(my_key="fizz")) monkeypatch.setattr(prefect.utilities.context, "config", config) context = Context() assert context.my_key == "fizz" with context(my_key="buzz"): assert context.my_key == "buzz" with context({"config": {"logging": {"log_to_cloud": "FOO"}}}): assert context.config.logging.log_to_cloud == "FOO" assert context.my_key == "buzz" assert context.my_key == "buzz" assert context.my_key == "fizz"
def test_max_retries_is_0_if_not_set(self): config = configuration.process_task_defaults(Config()) assert config.tasks.defaults.max_retries == 0
def test_critical_key_protection_disabled(self): config = Config() assert not config.__protect_critical_keys__ config.update = 1 assert config.update == 1
def test_max_retries_ignored_if_set(self): config = Config() config.set_nested("tasks.defaults.max_retries", 3) config = configuration.process_task_defaults(config) assert config.tasks.defaults.max_retries == 3
def test_retry_delay_is_timedelta_if_int(self): config = Config(default_box=True) config.tasks.defaults.retry_delay = 5 config = configuration.process_task_defaults(config) assert config.tasks.defaults.retry_delay == datetime.timedelta( seconds=5)
def test_retry_delay_is_none_if_not_set(self): config = configuration.process_task_defaults(Config()) assert config.tasks.defaults.retry_delay is None
def test_timeout_is_none_if_none(self): config = Config(default_box=True) config.tasks.defaults.timeout = None config = configuration.process_task_defaults(config) assert config.tasks.defaults.timeout is None
def test_setdefault_nested_creates_configs(self): config = Config() config.setdefault_nested("a.b.c", 1) assert config.a.b.c == 1 assert isinstance(config.a, Config) assert isinstance(config.a.b, Config)
def test_set_nested_overwrites_values_with_more_configs(self): config = Config() config.set_nested("a.b", 1) config.set_nested("a.b.c", 2) config.set_nested("a.b.c.d", 3) assert config.a.b.c.d == 3
def test_is_dotdict(self): assert isinstance(Config(), prefect.utilities.collections.DotDict)
def test_timeout_is_timedelta_if_int(self): config = Config() config.set_nested("tasks.defaults.timeout", 5) config = configuration.process_task_defaults(config) assert config.tasks.defaults.timeout == datetime.timedelta(seconds=5)
def test_timeout_is_none_if_none(self): config = Config() config.set_nested("tasks.defaults.timeout", None) config = configuration.process_task_defaults(config) assert config.tasks.defaults.timeout is None
def test_max_retries_is_0_if_0(self): config = Config(default_box=True) config.tasks.defaults.max_retries = 0 config = configuration.process_task_defaults(config) assert config.tasks.defaults.max_retries == 0
def test_max_retries_ignored_if_set(self): config = Config(default_box=True) config.tasks.defaults.max_retries = 3 config = configuration.process_task_defaults(config) assert config.tasks.defaults.max_retries == 3
def test_get_nested_when_missing(self): assert Config().get_nested("a.b.c") is None
def test_retry_delay_is_none_if_none(self): config = Config(default_box=True) config.tasks.defaults.retry_delay = None config = configuration.process_task_defaults(config) assert config.tasks.defaults.retry_delay is None
def test_get_nested_default(self): assert Config().get_nested("a.b.c", 1) == 1
def test_timeout_is_none_if_not_set(self): config = configuration.process_task_defaults(Config()) assert config.tasks.defaults.timeout is None
def test_retry_delay_is_none_if_none(self): config = Config() config.set_nested("tasks.defaults.retry_delay", None) config = configuration.process_task_defaults(config) assert config.tasks.defaults.retry_delay is None
def test_timeout_is_timedelta_if_timedelta(self): config = Config(default_box=True) config.tasks.defaults.timeout = datetime.timedelta(seconds=5) config = configuration.process_task_defaults(config) assert config.tasks.defaults.timeout == datetime.timedelta(seconds=5)
def test_get_nested(self): config = Config() config.set_nested("a.b.c", 1) assert config.get_nested("a.b.c") == 1