# `Skipper.Resolver`
[🔗](https://github.com/get-skipper/skipper-elixir/blob/main/lib/skipper/resolver.ex#L1)

Decides whether a test runs. Tests not in the spreadsheet always run
(opt-out model); a test with a future `disabledUntil` is skipped.

# `t`

```elixir
@type t() :: %Skipper.Resolver{cache: %{required(String.t()) =&gt; DateTime.t() | nil}}
```

# `disabled_until`

Instant the test is re-enabled (midnight UTC after the sheet date), or nil.

# `enabled?`

```elixir
@spec enabled?(t(), String.t()) :: boolean()
```

# `initialize`

```elixir
@spec initialize(Skipper.Config.t()) :: {:ok, t()} | {:error, String.t()}
```

Fetch the spreadsheet once. See `initialize_with/1` for the fallback rules.

# `initialize_with`

```elixir
@spec initialize_with((-&gt; {:ok, [Skipper.Client.entry()]} | {:error, String.t()})) ::
  {:ok, t()} | {:error, String.t()}
```

Build the resolver from `fetch` (returns `{:ok, entries}`). If it fails: use
the disk cache (`SKIPPER_CACHE_FILE`, default `.skipper-cache.json`) when
younger than `SKIPPER_CACHE_TTL` seconds (default 300, `0` disables it);
else, with `SKIPPER_FAIL_OPEN` (default true), run every test; else error.

# `put`

Add or override entries (test ID → re-enable instant). Handy in tests.

# `skip_message`

`[skipper] Test disabled until <sheet date>`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
