Update wording around dependencies and packages (#1151)

This commit is contained in:
Jonatan Kłosko 2022-04-30 17:14:10 +02:00 committed by GitHub
parent c85f11e0d1
commit 2a1d937189
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 77 additions and 78 deletions

View file

@ -339,8 +339,8 @@ const Session = {
this.toggleRuntimeInfo(); this.toggleRuntimeInfo();
} else if (keyBuffer.tryMatch(["s", "b"])) { } else if (keyBuffer.tryMatch(["s", "b"])) {
this.showBin(); this.showBin();
} else if (keyBuffer.tryMatch(["s", "d"])) { } else if (keyBuffer.tryMatch(["s", "p"])) {
this.showDependencySearch(); this.showPackageSearch();
} else if (keyBuffer.tryMatch(["e", "x"])) { } else if (keyBuffer.tryMatch(["e", "x"])) {
this.cancelFocusedCellEvaluation(); this.cancelFocusedCellEvaluation();
} else if (keyBuffer.tryMatch(["0", "0"])) { } else if (keyBuffer.tryMatch(["0", "0"])) {
@ -683,10 +683,10 @@ const Session = {
actionEl && actionEl.click(); actionEl && actionEl.click();
}, },
showDependencySearch() { showPackageSearch() {
this.setFocusedEl("setup"); this.setFocusedEl("setup");
const actionEl = this.el.querySelector(`[data-btn-dependency-search]`); const actionEl = this.el.querySelector(`[data-btn-package-search]`);
actionEl && actionEl.click(); actionEl && actionEl.click();
}, },

View file

@ -19,12 +19,12 @@ defmodule Livebook do
### Embedded runtime dependencies ### Embedded runtime dependencies
In case you use the Embedded runtime and support installing dependencies In case you use the Embedded runtime and support installing
with `Mix.install/2`, you can make those discoverable in the dependencies with `Mix.install/2`, you can make those discoverable
dependency search, by configuring a loader function: in the package search, by configuring a loader function:
config :livebook, Livebook.Runtime.Embedded, config :livebook, Livebook.Runtime.Embedded,
load_dependency_entries: {Loader, :dependency_entries, []} load_packages: {Loader, :packages, []}
The function should return a list of entries like this: The function should return a list of entries like this:

View file

@ -208,10 +208,9 @@ defprotocol Livebook.Runtime do
@type dependency :: term() @type dependency :: term()
@type search_dependencies_response :: @type search_packages_response :: {:ok, list(package())} | {:error, String.t()}
{:ok, list(search_dependencies_entry())} | {:error, String.t()}
@type search_dependencies_entry :: %{ @type package :: %{
name: String.t(), name: String.t(),
version: String.t(), version: String.t(),
description: String.t() | nil, description: String.t() | nil,
@ -443,7 +442,7 @@ defprotocol Livebook.Runtime do
dependencies, the dependencies are not considered fixed. dependencies, the dependencies are not considered fixed.
When dependencies are fixed, the following functions are allowed to When dependencies are fixed, the following functions are allowed to
raise an implementation error: `add_dependencies/3`, `search_dependencies/3`. raise an implementation error: `add_dependencies/3`, `search_packages/3`.
""" """
@spec fixed_dependencies?(t()) :: boolean() @spec fixed_dependencies?(t()) :: boolean()
def fixed_dependencies?(runtime) def fixed_dependencies?(runtime)
@ -460,8 +459,8 @@ defprotocol Livebook.Runtime do
The response is sent to the `send_to` process as The response is sent to the `send_to` process as
* `{:runtime_search_dependencies_response, ref, response}`. * `{:runtime_search_packages_response, ref, response}`.
""" """
@spec search_dependencies(t(), pid(), String.t()) :: reference() @spec search_packages(t(), pid(), String.t()) :: reference()
def search_dependencies(runtime, send_to, search) def search_packages(runtime, send_to, search)
end end

View file

@ -120,7 +120,7 @@ defimpl Livebook.Runtime, for: Livebook.Runtime.Attached do
raise "not supported" raise "not supported"
end end
def search_dependencies(_runtime, _send_to, _search) do def search_packages(_runtime, _send_to, _search) do
raise "not supported" raise "not supported"
end end
end end

View file

@ -157,45 +157,45 @@ defmodule Livebook.Runtime.Dependencies do
defp unescape_term(_node), do: :error defp unescape_term(_node), do: :error
@doc """ @doc """
Implements `Livebook.Runtime.search_dependencies/3` on top of Implements `Livebook.Runtime.search_packages/3` on top of
`search_hex/2`. `search_hex/2`.
""" """
@spec search_dependencies_on_hex(pid(), String.t()) :: reference() @spec search_packages_on_hex(pid(), String.t()) :: reference()
def search_dependencies_on_hex(send_to, search) do def search_packages_on_hex(send_to, search) do
ref = make_ref() ref = make_ref()
Task.Supervisor.start_child(Livebook.TaskSupervisor, fn -> Task.Supervisor.start_child(Livebook.TaskSupervisor, fn ->
response = search_hex(search) response = search_hex(search)
send(send_to, {:runtime_search_dependencies_response, ref, response}) send(send_to, {:runtime_search_packages_response, ref, response})
end) end)
ref ref
end end
@doc """ @doc """
Implements `Livebook.Runtime.search_dependencies/3` by searching Implements `Livebook.Runtime.search_packages/3` by searching
through the given list of entries. through the given list of packages.
""" """
@spec search_dependencies_in_entries( @spec search_packages_in_list(
list(Livebook.Runtime.search_dependencies_entry()), list(Livebook.Runtime.package()),
pid(), pid(),
String.t() String.t()
) :: reference() ) :: reference()
def search_dependencies_in_entries(entries, send_to, search) do def search_packages_in_list(packages, send_to, search) do
ref = make_ref() ref = make_ref()
entries = Enum.filter(entries, &String.starts_with?(&1.name, search)) packages = Enum.filter(packages, &String.starts_with?(&1.name, search))
send(send_to, {:runtime_search_dependencies_response, ref, {:ok, entries}}) send(send_to, {:runtime_search_packages_response, ref, {:ok, packages}})
ref ref
end end
@doc """ @doc """
Searches for packages on Hex and returns them as dependency entries. Searches for packages on Hex.
## Options ## Options
* `:api_url` - the base URL for Hex API requests. Optional * `:api_url` - the base URL for Hex API requests. Optional
""" """
@spec search_hex(String.t(), keyword()) :: Livebook.Runtime.search_dependencies_response() @spec search_hex(String.t(), keyword()) :: Livebook.Runtime.search_packages_response()
def search_hex(search, opts \\ []) def search_hex(search, opts \\ [])
def search_hex("", _opts), do: {:ok, []} def search_hex("", _opts), do: {:ok, []}
@ -209,8 +209,8 @@ defmodule Livebook.Runtime.Dependencies do
case Livebook.Utils.HTTP.request(:get, url) do case Livebook.Utils.HTTP.request(:get, url) do
{:ok, status, _headers, body} -> {:ok, status, _headers, body} ->
with 200 <- status, {:ok, packages} <- Jason.decode(body) do with 200 <- status, {:ok, packages} <- Jason.decode(body) do
entries = Enum.map(packages, &package_to_entry/1) packages = Enum.map(packages, &parse_package/1)
{:ok, entries} {:ok, packages}
else else
_ -> {:error, "unexpected response"} _ -> {:error, "unexpected response"}
end end
@ -220,7 +220,7 @@ defmodule Livebook.Runtime.Dependencies do
end end
end end
defp package_to_entry(package) do defp parse_package(package) do
{:ok, dependency} = parse_term(package["configs"]["mix.exs"]) {:ok, dependency} = parse_term(package["configs"]["mix.exs"])
%{ %{

View file

@ -192,7 +192,7 @@ defimpl Livebook.Runtime, for: Livebook.Runtime.ElixirStandalone do
Livebook.Runtime.Dependencies.add_mix_deps(code, dependencies) Livebook.Runtime.Dependencies.add_mix_deps(code, dependencies)
end end
def search_dependencies(_runtime, send_to, search) do def search_packages(_runtime, send_to, search) do
Livebook.Runtime.Dependencies.search_dependencies_on_hex(send_to, search) Livebook.Runtime.Dependencies.search_packages_on_hex(send_to, search)
end end
end end

View file

@ -109,17 +109,17 @@ defimpl Livebook.Runtime, for: Livebook.Runtime.Embedded do
end end
def fixed_dependencies?(_runtime) do def fixed_dependencies?(_runtime) do
not Keyword.has_key?(config(), :load_dependency_entries) not Keyword.has_key?(config(), :load_packages)
end end
def add_dependencies(_runtime, code, dependencies) do def add_dependencies(_runtime, code, dependencies) do
Livebook.Runtime.Dependencies.add_mix_deps(code, dependencies) Livebook.Runtime.Dependencies.add_mix_deps(code, dependencies)
end end
def search_dependencies(_runtime, send_to, search) do def search_packages(_runtime, send_to, search) do
{mod, fun, args} = config()[:load_dependency_entries] {mod, fun, args} = config()[:load_packages]
entries = apply(mod, fun, args) packages = apply(mod, fun, args)
Livebook.Runtime.Dependencies.search_dependencies_in_entries(entries, send_to, search) Livebook.Runtime.Dependencies.search_packages_in_list(packages, send_to, search)
end end
defp config() do defp config() do

View file

@ -209,7 +209,7 @@ defimpl Livebook.Runtime, for: Livebook.Runtime.MixStandalone do
raise "not supported" raise "not supported"
end end
def search_dependencies(_runtime, _send_to, _search) do def search_packages(_runtime, _send_to, _search) do
raise "not supported" raise "not supported"
end end
end end

View file

@ -317,10 +317,10 @@ defmodule LivebookWeb.SessionLive do
</.modal> </.modal>
<% end %> <% end %>
<%= if @live_action == :dependency_search do %> <%= if @live_action == :package_search do %>
<.modal id="dependency-search-modal" show class="w-full max-w-xl" patch={@self_path}> <.modal id="package-search-modal" show class="w-full max-w-xl" patch={@self_path}>
<%= live_render @socket, LivebookWeb.SessionLive.DependencySearchLive, <%= live_render @socket, LivebookWeb.SessionLive.PackageSearchLive,
id: "dependency-search", id: "package-search",
session: %{ session: %{
"session" => @session, "session" => @session,
"runtime" => @data_view.runtime, "runtime" => @data_view.runtime,

View file

@ -104,7 +104,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
</:primary> </:primary>
<:secondary> <:secondary>
<.enable_insert_mode_button /> <.enable_insert_mode_button />
<.dependency_search_button session_id={@session_id} runtime={@runtime} socket={@socket} /> <.package_search_button session_id={@session_id} runtime={@runtime} socket={@socket} />
<.cell_link_button cell_id={@cell_view.id} /> <.cell_link_button cell_id={@cell_view.id} />
<.setup_cell_info /> <.setup_cell_info />
</:secondary> </:secondary>
@ -362,7 +362,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
<span class="tooltip top" data-tooltip="Convert to Code cell"> <span class="tooltip top" data-tooltip="Convert to Code cell">
<button class="icon-button" <button class="icon-button"
aria-label="toggle source" aria-label="toggle source"
data-link-dependency-search data-link-package-search
phx-click={ phx-click={
with_confirm( with_confirm(
JS.push("convert_smart_cell", value: %{cell_id: @cell_id}), JS.push("convert_smart_cell", value: %{cell_id: @cell_id}),
@ -379,7 +379,7 @@ defmodule LivebookWeb.SessionLive.CellComponent do
""" """
end end
defp dependency_search_button(assigns) do defp package_search_button(assigns) do
~H""" ~H"""
<%= if Livebook.Runtime.fixed_dependencies?(@runtime) do %> <%= if Livebook.Runtime.fixed_dependencies?(@runtime) do %>
<span class="tooltip top" data-tooltip="The current runtime does not support adding dependencies"> <span class="tooltip top" data-tooltip="The current runtime does not support adding dependencies">
@ -388,12 +388,12 @@ defmodule LivebookWeb.SessionLive.CellComponent do
</button> </button>
</span> </span>
<% else %> <% else %>
<span class="tooltip top" data-tooltip="Add dependency (sd)"> <span class="tooltip top" data-tooltip="Add dependency (sp)">
<%= live_patch to: Routes.session_path(@socket, :dependency_search, @session_id), <%= live_patch to: Routes.session_path(@socket, :package_search, @session_id),
class: "icon-button", class: "icon-button",
aria_label: "add dependency", aria_label: "add dependency",
role: "button", role: "button",
data_btn_dependency_search: true do %> data_btn_package_search: true do %>
<.remix_icon icon="play-list-add-line" class="text-xl" /> <.remix_icon icon="play-list-add-line" class="text-xl" />
<% end %> <% end %>
</span> </span>

View file

@ -1,4 +1,4 @@
defmodule LivebookWeb.SessionLive.DependencySearchLive do defmodule LivebookWeb.SessionLive.PackageSearchLive do
use LivebookWeb, :live_view use LivebookWeb, :live_view
@impl true @impl true
@ -14,7 +14,7 @@ defmodule LivebookWeb.SessionLive.DependencySearchLive do
return_to: return_to, return_to: return_to,
search: "", search: "",
search_ref: nil, search_ref: nil,
entries: [], packages: [],
error_message: nil error_message: nil
) )
@ -28,7 +28,7 @@ defmodule LivebookWeb.SessionLive.DependencySearchLive do
~H""" ~H"""
<div class="p-6 pb-4 flex flex-col space-y-8"> <div class="p-6 pb-4 flex flex-col space-y-8">
<h3 class="text-2xl font-semibold text-gray-800"> <h3 class="text-2xl font-semibold text-gray-800">
Dependency search Search packages
</h3> </h3>
<p class="text-gray-700"> <p class="text-gray-700">
Find external packages for your notebook Find external packages for your notebook
@ -50,15 +50,15 @@ defmodule LivebookWeb.SessionLive.DependencySearchLive do
<%= @error_message %> <%= @error_message %>
</div> </div>
<% @entries == [] -> %> <% @packages == [] -> %>
<div class="flex h-full items-center justify-center text-gray-600"> <div class="flex h-full items-center justify-center text-gray-600">
<.remix_icon icon="windy-line" class="text-xl" /> <.remix_icon icon="windy-line" class="text-xl" />
<div class="ml-2">No results</div> <div class="ml-2">No results</div>
</div> </div>
<% true -> %> <% true -> %>
<%= for {entry, idx} <- Enum.with_index(@entries) do %> <%= for {package, idx} <- Enum.with_index(@packages) do %>
<.dependency_entry entry={entry} idx={idx} /> <.package package={package} idx={idx} />
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
@ -66,20 +66,20 @@ defmodule LivebookWeb.SessionLive.DependencySearchLive do
""" """
end end
defp dependency_entry(assigns) do defp package(assigns) do
~H""" ~H"""
<div class="flex items-center"> <div class="flex items-center">
<div class="flex-grow p-2 flex flex-col text-sm"> <div class="flex-grow p-2 flex flex-col text-sm">
<div class="flex text-gray-700"> <div class="flex text-gray-700">
<%= if @entry[:url] do %> <%= if @package[:url] do %>
<a class="font-semibold" href={@entry[:url]} target="_blank"><%= @entry.name %></a> <a class="font-semibold" href={@package[:url]} target="_blank"><%= @package.name %></a>
<% else %> <% else %>
<span class="font-semibold"><%= @entry.name %></span> <span class="font-semibold"><%= @package.name %></span>
<% end %> <% end %>
<span class="ml-1"><%= @entry.version %></span> <span class="ml-1"><%= @package.version %></span>
</div> </div>
<div class="text-gray-600"> <div class="text-gray-600">
<%= @entry.description %> <%= @package.description %>
</div> </div>
</div> </div>
<div class="ml-2"> <div class="ml-2">
@ -102,7 +102,7 @@ defmodule LivebookWeb.SessionLive.DependencySearchLive do
@impl true @impl true
def handle_event("submit", %{}, socket) do def handle_event("submit", %{}, socket) do
socket = socket =
case socket.assigns.entries do case socket.assigns.packages do
[] -> socket [] -> socket
[first | _] -> add_dependency(socket, first.dependency) [first | _] -> add_dependency(socket, first.dependency)
end end
@ -112,20 +112,20 @@ defmodule LivebookWeb.SessionLive.DependencySearchLive do
@impl true @impl true
def handle_event("add", %{"idx" => idx}, socket) do def handle_event("add", %{"idx" => idx}, socket) do
entry = Enum.fetch!(socket.assigns.entries, idx) package = Enum.fetch!(socket.assigns.packages, idx)
socket = add_dependency(socket, entry.dependency) socket = add_dependency(socket, package.dependency)
{:noreply, socket} {:noreply, socket}
end end
@impl true @impl true
def handle_info( def handle_info(
{:runtime_search_dependencies_response, ref, response}, {:runtime_search_packages_response, ref, response},
%{assigns: %{search_ref: ref}} = socket %{assigns: %{search_ref: ref}} = socket
) do ) do
socket = socket =
case response do case response do
{:ok, entries} -> {:ok, packages} ->
assign(socket, entries: entries, error_message: nil) assign(socket, packages: packages, error_message: nil)
{:error, message} -> {:error, message} ->
assign(socket, error_message: Livebook.Utils.upcase_first(message)) assign(socket, error_message: Livebook.Utils.upcase_first(message))
@ -137,7 +137,7 @@ defmodule LivebookWeb.SessionLive.DependencySearchLive do
def handle_info(_message, socket), do: {:noreply, socket} def handle_info(_message, socket), do: {:noreply, socket}
defp do_search(socket, search) do defp do_search(socket, search) do
search_ref = Livebook.Runtime.search_dependencies(socket.assigns.runtime, self(), search) search_ref = Livebook.Runtime.search_packages(socket.assigns.runtime, self(), search)
assign(socket, search_ref: search_ref, search: search) assign(socket, search_ref: search_ref, search: search)
end end

View file

@ -101,7 +101,7 @@ defmodule LivebookWeb.SessionLive.ShortcutsComponent do
%{seq: ["s", "u"], desc: "Toggle users panel"}, %{seq: ["s", "u"], desc: "Toggle users panel"},
%{seq: ["s", "r"], desc: "Show runtime panel"}, %{seq: ["s", "r"], desc: "Show runtime panel"},
%{seq: ["s", "b"], desc: "Show bin"}, %{seq: ["s", "b"], desc: "Show bin"},
%{seq: ["s", "d"], desc: "Show dependency search"}, %{seq: ["s", "p"], desc: "Show package search"},
%{seq: ["0", "0"], desc: "Reconnect current runtime"} %{seq: ["0", "0"], desc: "Reconnect current runtime"}
], ],
universal: [ universal: [

View file

@ -65,7 +65,7 @@ defmodule LivebookWeb.Router do
live "/sessions/:id/cell-settings/:cell_id", SessionLive, :cell_settings live "/sessions/:id/cell-settings/:cell_id", SessionLive, :cell_settings
live "/sessions/:id/cell-upload/:cell_id", SessionLive, :cell_upload live "/sessions/:id/cell-upload/:cell_id", SessionLive, :cell_upload
live "/sessions/:id/delete-section/:section_id", SessionLive, :delete_section live "/sessions/:id/delete-section/:section_id", SessionLive, :delete_section
live "/sessions/:id/dependency-search", SessionLive, :dependency_search live "/sessions/:id/package-search", SessionLive, :package_search
get "/sessions/:id/images/:image", SessionController, :show_image get "/sessions/:id/images/:image", SessionController, :show_image
live "/sessions/:id/*path_parts", SessionLive, :catch_all live "/sessions/:id/*path_parts", SessionLive, :catch_all
end end

View file

@ -196,7 +196,7 @@ defmodule Livebook.Runtime.DependenciesTest do
{:ok, bypass: bypass} {:ok, bypass: bypass}
end end
test "parses the response into dependency entries", %{bypass: bypass} do test "parses the response into a list of packages", %{bypass: bypass} do
Bypass.expect_once(bypass, "GET", "/api/packages", fn conn -> Bypass.expect_once(bypass, "GET", "/api/packages", fn conn ->
conn conn
|> Plug.Conn.put_resp_content_type("application/json") |> Plug.Conn.put_resp_content_type("application/json")

View file

@ -896,9 +896,9 @@ defmodule LivebookWeb.SessionLiveTest do
end end
end end
describe "dependency search" do describe "package search" do
test "lists search entries", %{conn: conn, session: session} do test "lists search entries", %{conn: conn, session: session} do
{:ok, view, _} = live(conn, "/sessions/#{session.id}/dependency-search") {:ok, view, _} = live(conn, "/sessions/#{session.id}/package-search")
[search_view] = live_children(view) [search_view] = live_children(view)

View file

@ -37,6 +37,6 @@ defmodule Livebook.Runtime.NoopRuntime do
Livebook.Runtime.Dependencies.add_mix_deps(code, dependencies) Livebook.Runtime.Dependencies.add_mix_deps(code, dependencies)
end end
def search_dependencies(_, _, _), do: make_ref() def search_packages(_, _, _), do: make_ref()
end end
end end

View file

@ -18,8 +18,8 @@ Application.put_env(:livebook, :runtime_modules, [
Livebook.Runtime.Embedded Livebook.Runtime.Embedded
]) ])
defmodule Livebook.Runtime.Embedded.Dependencies do defmodule Livebook.Runtime.Embedded.Packages do
def entries() do def list() do
[ [
%{ %{
dependency: {:jason, "~> 1.3.0"}, dependency: {:jason, "~> 1.3.0"},
@ -34,7 +34,7 @@ end
# Enable dependency saerch for the embedded runtime # Enable dependency saerch for the embedded runtime
Application.put_env(:livebook, Livebook.Runtime.Embedded, Application.put_env(:livebook, Livebook.Runtime.Embedded,
load_dependency_entries: {Livebook.Runtime.Embedded.Dependencies, :entries, []} load_packages: {Livebook.Runtime.Embedded.Packages, :list, []}
) )
# Disable autosaving # Disable autosaving