livebook/test/support/notebook_app_spec.ex
Jonatan Kłosko 8c91a1f788
Introduce abstraction for app deployment and permanent apps (#2524)
Co-authored-by: José Valim <jose.valim@dashbit.co>
2024-03-26 20:20:07 +01:00

39 lines
1,005 B
Elixir

defmodule Livebook.Apps.NotebookAppSpec do
# App spec carrying an in-memory notebook.
defstruct [:slug, :notebook, :load_failures, :should_warmup, version: "1"]
def new(notebook, opts \\ []) do
opts = Keyword.validate!(opts, load_failures: 0, should_warmup: false)
slug = notebook.app_settings.slug
:persistent_term.put({slug, :failures}, 0)
%__MODULE__{
slug: slug,
notebook: notebook,
load_failures: opts[:load_failures],
should_warmup: opts[:should_warmup]
}
end
end
defimpl Livebook.Apps.AppSpec, for: Livebook.Apps.NotebookAppSpec do
def load(app_spec, _files_tmp_path) do
key = {app_spec.slug, :failures}
num_failures = :persistent_term.get(key)
if num_failures < app_spec.load_failures do
:persistent_term.put(key, num_failures + 1)
{:error, "failed to load"}
else
{:ok, %{notebook: app_spec.notebook, warnings: []}}
end
end
def should_warmup?(app_spec) do
app_spec.should_warmup
end
end