Packages

spark

2.2.3
2.7.2 2.7.1 2.7.0 2.6.1 2.6.0 2.5.0 2.4.1 2.4.0 2.3.14 2.3.13 2.3.12 2.3.11 2.3.10 2.3.9 2.3.8 2.3.7 2.3.6 2.3.5 2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.69 2.2.68 2.2.67 2.2.66 2.2.65 2.2.64 2.2.63 2.2.62 2.2.61 2.2.60 2.2.59 2.2.58 2.2.57 2.2.56 2.2.55 2.2.54 2.2.53 2.2.52 2.2.51 2.2.50 2.2.49 2.2.48 2.2.47 2.2.46 2.2.45 2.2.44 2.2.43 2.2.42 2.2.41 2.2.40 2.2.39 2.2.38 2.2.37 2.2.36 2.2.35 2.2.34 2.2.33 2.2.32 2.2.31 2.2.30 2.2.29 2.2.28 2.2.27 2.2.26 2.2.25 2.2.24 2.2.23 2.2.22 2.2.21 2.2.20 2.2.19 2.2.18 2.2.17 2.2.16 2.2.15 2.2.14 2.2.13 2.2.12 2.2.11 2.2.10 2.2.9 2.2.8 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.24 2.1.23 2.1.22 2.1.21 2.1.20 2.1.19 2.1.18 2.1.17 2.1.16 2.1.15 2.1.14 2.1.13 2.1.12 2.1.11 2.1.10 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 2.1.2 2.1.1 2.1.0 2.0.1 2.0.0 1.1.55 1.1.54 1.1.53 1.1.52 1.1.51 1.1.50 1.1.49 1.1.48 1.1.47 1.1.46 1.1.45 1.1.44 1.1.43 1.1.42 1.1.41 1.1.40 1.1.39 1.1.38 1.1.37 1.1.36 1.1.35 1.1.34 1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.26 1.1.25 1.1.24 1.1.22 1.1.21 1.1.20 1.1.19 1.1.18 1.1.17 1.1.16 1.1.15 1.1.14 retired 1.1.13 1.1.12 1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.9 1.0.8 1.0.7 1.0.6 1.0.5 1.0.4 1.0.3 1.0.2 1.0.1 1.0.0 0.4.12 0.4.11 0.4.10 0.4.9 0.4.8 0.4.7 0.4.6 0.4.5 0.4.4 0.4.3 0.4.2 0.4.1 0.3.12 0.3.11 0.3.10 0.3.9 0.3.8 0.3.7 0.3.6 0.3.5 0.3.4 0.3.3 0.3.2 0.3.1 0.3.0 0.2.18 0.2.17 0.2.16 0.2.15 0.2.14 0.2.13 0.2.12 0.2.11 0.2.10 0.2.9 0.2.8 0.2.7 0.2.6 0.2.5 0.2.4 0.2.3 0.2.2 0.2.1 0.2.0 0.1.29 0.1.28 0.1.27 0.1.26 0.1.25 0.1.24 0.1.23 0.1.22 0.1.21 0.1.20 0.1.19 0.1.18 0.1.17 0.1.16 0.1.15 0.1.14 0.1.13 0.1.12 0.1.11 0.1.10 0.1.9 0.1.8 0.1.7 0.1.6 0.1.5 0.1.4 0.1.3 0.1.2 0.1.1 0.1.0

Generic tooling for building DSLs

Current section

Files

Jump to
spark lib mix tasks spark.cheat_sheets_in_search.ex
Raw

lib/mix/tasks/spark.cheat_sheets_in_search.ex

defmodule Mix.Tasks.Spark.CheatSheetsInSearch do
@shortdoc "Includes generated cheat sheets in the search bar"
@moduledoc @shortdoc
use Mix.Task
def run(opts) do
Mix.Task.run("compile")
{opts, _} =
OptionParser.parse!(opts,
switches: [strip_prefix: :string, check: :boolean, extensions: :string]
)
unless opts[:extensions] do
raise "Must supply a comma separated list of extensions to generate a .formatter.exs for"
end
extensions =
opts[:extensions]
|> String.split(",")
|> Enum.map(&Module.concat([&1]))
|> Enum.uniq()
with {:ok, search_data_file, search_data} <- search_data_file(),
{:ok, sidebar_items_file, sidebar_items} <- sidebar_items_file() do
{search_data, sidebar_items} =
Enum.reduce(extensions, {search_data, sidebar_items}, fn extension, acc ->
add_extension_to_search_data(extension, acc, opts)
end)
File.write!(search_data_file, "searchData=" <> Jason.encode!(search_data))
File.write!(sidebar_items_file, "sidebarNodes=" <> Jason.encode!(sidebar_items))
else
{:error, error} -> raise error
end
end
defp search_data_file do
"doc/dist/search_data-*.js"
|> Path.wildcard()
|> Enum.at(0)
|> case do
nil ->
{:error, "No search_data file found"}
file ->
case File.read!(file) do
"searchData=" <> contents ->
{:ok, file, Jason.decode!(contents)}
_ ->
{:error, "search data js file was malformed"}
end
end
end
defp sidebar_items_file do
"doc/dist/sidebar_items-*.js"
|> Path.wildcard()
|> Enum.at(0)
|> case do
nil ->
{:error, "No sidebar_items file found"}
file ->
case File.read!(file) do
"sidebarNodes=" <> contents ->
{:ok, file, Jason.decode!(contents)}
_ ->
{:error, "sidebar items js file was malformed"}
end
end
end
defp add_extension_to_search_data(extension, acc, opts) do
extension_name = Spark.Mix.Helpers.extension_name(extension, opts)
acc =
Enum.reduce(extension.sections(), acc, fn section, acc ->
add_section_to_search_data(extension_name, section, acc)
end)
Enum.reduce(
extension.dsl_patches(),
acc,
fn %Spark.Dsl.Patch.AddEntity{
section_path: section_path,
entity: entity
},
acc ->
add_entity_to_search_data(
extension_name,
entity,
acc,
section_path
)
end
)
end
defp add_section_to_search_data(
extension_name,
section,
{search_data, sidebar_items},
path \\ []
) do
search_data =
add_search_item(
search_data,
%{
"doc" => section.describe,
"ref" =>
"#{dsl_search_name(extension_name)}.html##{Enum.join(path ++ [section.name], "-")}",
"title" => "#{extension_name}.#{Enum.join(path ++ [section.name], ".")}",
"type" => "DSL"
}
)
search_data =
add_schema_to_search_data(
search_data,
extension_name,
section.schema,
path ++ [section.name]
)
acc =
Enum.reduce(
section.sections,
{search_data, sidebar_items},
&add_section_to_search_data(extension_name, &1, &2, path ++ [section.name])
)
Enum.reduce(
section.entities,
acc,
&add_entity_to_search_data(extension_name, &1, &2, path ++ [section.name])
)
end
defp add_entity_to_search_data(extension_name, entity, {search_data, sidebar_items}, path) do
search_data =
add_search_item(
search_data,
%{
"doc" => entity.describe,
"ref" =>
"#{dsl_search_name(extension_name)}.html##{Enum.join(path ++ [entity.name], "-")}",
"title" => "#{extension_name}.#{Enum.join(path ++ [entity.name], ".")}",
"type" => "DSL"
}
)
search_data =
add_schema_to_search_data(
search_data,
extension_name,
entity.schema,
path ++ [entity.name]
)
entity.entities
|> Enum.flat_map(&List.wrap(elem(&1, 1)))
|> Enum.reduce(
{search_data, sidebar_items},
&add_entity_to_search_data(extension_name, &1, &2, path ++ [entity.name])
)
end
defp add_schema_to_search_data(
search_data,
extension_name,
schema,
path
) do
Enum.reduce(schema || [], search_data, fn {key, config}, search_data ->
add_search_item(
search_data,
%{
"doc" => config[:doc] || "",
"ref" => "#{dsl_search_name(extension_name)}.html##{Enum.join(path ++ [key], "-")}",
"title" => "#{extension_name}.#{Enum.join(path ++ [key], ".")}",
"type" => "DSL"
}
)
end)
end
defp dsl_search_name(extension_name) do
("dsl-" <> extension_name) |> String.split(".") |> Enum.map_join("-", &String.downcase/1)
end
defp add_search_item(search_data, item) do
item = Map.update!(item, "title", &String.trim(&1 || ""))
Map.update!(search_data, "items", &Enum.uniq([item | &1]))
end
end