Example #1
0
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
Example #2
0
 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)
Example #3
0
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
Example #4
0
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]
Example #5
0
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
Example #6
0
 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
Example #7
0
 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
Example #8
0
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)
Example #9
0
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)
Example #10
0
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"
Example #11
0
 def test_max_retries_is_0_if_not_set(self):
     config = configuration.process_task_defaults(Config())
     assert config.tasks.defaults.max_retries == 0
Example #12
0
 def test_critical_key_protection_disabled(self):
     config = Config()
     assert not config.__protect_critical_keys__
     config.update = 1
     assert config.update == 1
Example #13
0
 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
Example #14
0
 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)
Example #15
0
 def test_retry_delay_is_none_if_not_set(self):
     config = configuration.process_task_defaults(Config())
     assert config.tasks.defaults.retry_delay is None
Example #16
0
 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
Example #17
0
 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)
Example #18
0
 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
Example #19
0
 def test_is_dotdict(self):
     assert isinstance(Config(), prefect.utilities.collections.DotDict)
Example #20
0
 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)
Example #21
0
 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
Example #22
0
 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
Example #23
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
Example #24
0
 def test_get_nested_when_missing(self):
     assert Config().get_nested("a.b.c") is None
Example #25
0
 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
Example #26
0
 def test_get_nested_default(self):
     assert Config().get_nested("a.b.c", 1) == 1
Example #27
0
 def test_timeout_is_none_if_not_set(self):
     config = configuration.process_task_defaults(Config())
     assert config.tasks.defaults.timeout is None
Example #28
0
 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
Example #29
0
 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)
Example #30
0
 def test_get_nested(self):
     config = Config()
     config.set_nested("a.b.c", 1)
     assert config.get_nested("a.b.c") == 1