mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-10-05 19:25:28 +08:00
Update wording around dependencies and packages (#1151)
This commit is contained in:
parent
c85f11e0d1
commit
2a1d937189
17 changed files with 77 additions and 78 deletions
|
@ -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();
|
||||
},
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"])
|
||||
|
||||
%{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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: [
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue