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.regen_plugin_manifest.ex
defmodule Mix.Tasks.Mob.RegenPluginManifest do
use Mix.Task
alias MobDev.Plugin.RuntimeManifest
@shortdoc "Regenerate priv/generated/mob_plugins.exs from the activated plugins"
@moduledoc """
Regenerates `priv/generated/mob_plugins.exs` — the host's **runtime plugin
manifest** — from the activated plugins' tier-3/4 manifest sections.
mix mob.regen_plugin_manifest # regenerate the file
mix mob.regen_plugin_manifest --check # verify on-disk matches, non-zero on drift
Tiers 3 (multi-screen) and 4 (sub-app) are pure-Elixir and runtime-wired: the
on-device `Mob.Plugins` module reads this file at boot to learn which screens,
lifecycle hooks, settings, and notification handlers the activated plugins
declared (`MobDev.Plugin.activated/0` is compile-time only). Spec-v2
`:screens_generator`s run here, under the host-config audit.
Like `mix mob.regen_driver_tab`, the output is committed so reviewers see the
runtime surface, and the file is regenerated whenever `config :mob, :plugins`
changes. `mob.doctor` runs `--check` to report drift.
"""
@rel_path "priv/generated/mob_plugins.exs"
@impl Mix.Task
def run(args) do
# Spec-v2 generators may call HOST modules (mob_ash introspects the host's
# Ash domains), not just read config values — make sure the host app is
# compiled, its config loaded, and its ebin on the code path. (Surfaced by
# mob_ash: gen_screens only ever read config, masking this.)
Mix.Task.run("app.config")
{opts, _, _} = OptionParser.parse(args, strict: [check: :boolean])
manifest = RuntimeManifest.build(MobDev.Plugin.activated())
rendered = RuntimeManifest.render(manifest)
path = Path.join(File.cwd!(), @rel_path)
if opts[:check] do
check_mode(path, rendered)
else
File.mkdir_p!(Path.dirname(path))
File.write!(path, rendered)
Mix.shell().info(" ✓ #{@rel_path} (#{summary(manifest)})")
end
end
defp check_mode(path, rendered) do
case File.read(path) do
{:ok, ^rendered} ->
Mix.shell().info(" ✓ #{@rel_path} up to date")
_ ->
Mix.raise("#{@rel_path} is out of date — run `mix mob.regen_plugin_manifest`")
end
end
defp summary(m) do
"#{length(m.screens)} screens, #{length(m.lifecycle)} lifecycle, " <>
"#{length(m.settings)} settings, #{length(m.notification_handlers)} handlers"
end
end