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

View file

@ -19,12 +19,12 @@ defmodule Livebook do
### Embedded runtime dependencies
In case you use the Embedded runtime and support installing dependencies
with `Mix.install/2`, you can make those discoverable in the
dependency search, by configuring a loader function:
In case you use the Embedded runtime and support installing
dependencies with `Mix.install/2`, you can make those discoverable
in the package search, by configuring a loader function:
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:

View file

@ -208,10 +208,9 @@ defprotocol Livebook.Runtime do
@type dependency :: term()
@type search_dependencies_response ::
{:ok, list(search_dependencies_entry())} | {:error, String.t()}
@type search_packages_response :: {:ok, list(package())} | {:error, String.t()}
@type search_dependencies_entry :: %{
@type package :: %{
name: String.t(),
version: String.t(),
description: String.t() | nil,
@ -443,7 +442,7 @@ defprotocol Livebook.Runtime do
dependencies, the dependencies are not considered fixed.
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()
def fixed_dependencies?(runtime)
@ -460,8 +459,8 @@ defprotocol Livebook.Runtime do
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()
def search_dependencies(runtime, send_to, search)
@spec search_packages(t(), pid(), String.t()) :: reference()
def search_packages(runtime, send_to, search)
end

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -101,7 +101,7 @@ defmodule LivebookWeb.SessionLive.ShortcutsComponent do
%{seq: ["s", "u"], desc: "Toggle users panel"},
%{seq: ["s", "r"], desc: "Show runtime panel"},
%{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"}
],
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-upload/:cell_id", SessionLive, :cell_upload
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
live "/sessions/:id/*path_parts", SessionLive, :catch_all
end

View file

@ -196,7 +196,7 @@ defmodule Livebook.Runtime.DependenciesTest do
{:ok, bypass: bypass}
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 ->
conn
|> Plug.Conn.put_resp_content_type("application/json")

View file

@ -896,9 +896,9 @@ defmodule LivebookWeb.SessionLiveTest do
end
end
describe "dependency search" do
describe "package search" 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)

View file

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

View file

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