Packages
spark
1.0.5
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
Current section
Files
lib/mix/tasks/spark.formatter.ex
defmodule Mix.Tasks.Spark.Formatter do
@shortdoc "Manages a variable called `spark_locals_without_parens` in the .formatter.exs from a list of DSL extensions."
@moduledoc @shortdoc
use Mix.Task
@spec run(term) :: no_return
def run(opts) do
Mix.Task.run("compile")
{opts, []} = OptionParser.parse!(opts, strict: [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]))
locals_without_parens =
Enum.flat_map(extensions, fn extension_mod ->
case Code.ensure_compiled(extension_mod) do
{:module, _module} -> :ok
other -> raise "Error ensuring extension compiled #{inspect(other)}"
end
all_entity_builders_everywhere(extension_mod.sections(), extensions)
end)
|> Enum.uniq()
|> Enum.sort()
contents = File.read!(".formatter.exs")
{_ast, spark_locals_without_parens} =
contents
|> Sourceror.parse_string!()
|> Macro.prewalk(
nil,
fn
{:=, _,
[
{:spark_locals_without_parens, _, _},
right
]} = ast,
_acc ->
{ast, right}
ast, acc ->
{ast, acc}
end
)
if !spark_locals_without_parens do
raise "Add `spark_locals_without_parens = []` to your .formatter.exs and run this again to populate the list."
end
new_contents =
contents
|> Sourceror.patch_string([
%{
range: Sourceror.get_range(spark_locals_without_parens, include_comments: true),
change: Sourceror.to_string(locals_without_parens, opts)
}
])
|> Code.format_string!()
contents_with_newline = [new_contents, "\n"]
if opts[:check] do
if contents != IO.iodata_to_binary(contents_with_newline) do
raise """
.formatter.exs is not up to date!
Run the following command and commit the result:
mix spark.formatter --extensions #{opts[:extensions]}
"""
else
IO.puts("The current .formatter.exs is correct")
end
else
File.write!(".formatter.exs", contents_with_newline)
end
end
def all_entity_builders_everywhere(sections, extensions, path \\ []) do
sections
|> Enum.flat_map(fn section ->
all_entity_builders_everywhere(
section.sections,
extensions,
path ++ [section.name]
)
end)
|> Enum.concat(Spark.Formatter.all_entity_builders(sections, extensions, path))
end
end