Packages
mob_dev
0.6.21
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.37
0.3.35
0.3.34
0.3.33
0.3.28
0.3.26
0.3.23
0.3.21
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
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.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.0
Development tooling for the Mob mobile framework
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/mob.validate_plugin.ex
defmodule Mix.Tasks.Mob.ValidatePlugin do
use Mix.Task
@shortdoc "Validate this project's mob plugin manifest (priv/mob_plugin.exs)"
@moduledoc """
Validates the `priv/mob_plugin.exs` manifest of the plugin project in the
current directory — a plugin author's pre-publish check.
mix mob.validate_plugin
Checks (see `MOB_PLUGINS.md`): required top-level fields, every declared file
path exists, and the installed `:mob` satisfies the manifest's `mob_version`.
Advisory warnings cover single-platform components and declared
permissions/plist keys. Exits non-zero if any error is found — never silent.
A project with no `priv/mob_plugin.exs` is a tier-0 plugin (nothing to
validate) and the task says so.
"""
alias MobDev.Plugin.{Manifest, Validator}
@impl Mix.Task
def run(_args) do
Mix.Task.run("loadpaths")
dir = File.cwd!()
case Manifest.load(dir) do
{:ok, nil} ->
Mix.shell().info(
"No priv/mob_plugin.exs — this is a tier-0 plugin (no manifest to validate)."
)
{:ok, manifest} ->
manifest
|> Validator.validate_plugin(dir, installed_mob_version())
|> report()
{:error, reason} ->
Mix.raise("could not read priv/mob_plugin.exs: #{reason}")
end
end
defp installed_mob_version do
_ = Application.load(:mob)
case Application.spec(:mob, :vsn) do
nil -> nil
vsn -> to_string(vsn)
end
end
defp report(%{errors: errors, warnings: warnings}) do
Enum.each(warnings, &Mix.shell().info([:yellow, "⚠ ", &1, :reset]))
case errors do
[] ->
suffix = if warnings == [], do: "", else: " (#{length(warnings)} warning(s))"
Mix.shell().info([:green, "✓ manifest valid#{suffix}", :reset])
_ ->
Enum.each(errors, &Mix.shell().error("✗ #{&1}"))
Mix.raise("plugin manifest validation failed with #{length(errors)} error(s)")
end
end
end