Packages
mob_dev
0.6.13
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/adopt/mob_exs.ex
defmodule Mix.Tasks.Mob.Adopt.MobExs do
@shortdoc "Generates mob.exs and adds it to .gitignore"
@moduledoc """
Writes `mob.exs` (build-environment config: `mob_dir`, `elixir_lib`)
and ensures `.gitignore` ignores it.
## Options
- `--local` — pre-fill `mob_dir` and `elixir_lib` from `MOB_DIR` /
`MOB_DEV_DIR` env vars (or sibling-directory fallbacks). Without
`--local` the file uses `Path.join(File.cwd!(), "deps/mob")` and
reads `MOB_ELIXIR_LIB` / `:code.lib_dir(:elixir)` at runtime.
Other orchestrator flags accepted but inert.
## Idempotency
- `mob.exs` is created with `on_exists: :skip` — re-running won't
overwrite an edited mob.exs.
- `.gitignore` patch checks for `mob.exs` before appending.
Typically called by `mix mob.adopt`, not directly.
"""
use Igniter.Mix.Task
alias MobDev.Adopt.{Generator, Patcher}
alias MobDev.AdoptGuard
@common_schema [
ios: :boolean,
android: :boolean,
local: :boolean,
python: :boolean,
host_url: :string,
live_view: :boolean
]
@common_defaults [ios: true, android: true, live_view: true]
@impl Igniter.Mix.Task
def info(_argv, _composing_task) do
%Igniter.Mix.Task.Info{
group: :mob,
example: "mix mob.adopt.mob_exs",
schema: @common_schema,
defaults: @common_defaults
}
end
@impl Igniter.Mix.Task
def igniter(igniter) do
opts = igniter.args.options
# Guard call is idempotent — orchestrator runs the same checks but
# `prepare_for_write` dedupes issues. Defends direct invocation.
igniter = AdoptGuard.check(igniter, AdoptGuard.mode_from(opts))
if igniter.issues != [] do
igniter
else
generate(igniter, opts)
end
end
defp generate(igniter, opts) do
{_mob_dep, _mob_dev_dep, mob_dir_expr, elixir_lib_expr} =
Generator.resolve_deps(local: opts[:local] || false)
mob_exs_content = Patcher.mob_exs_content(mob_dir_expr, elixir_lib_expr)
igniter
|> Igniter.create_new_file("mob.exs", mob_exs_content, on_exists: :skip)
|> patch_gitignore()
end
defp patch_gitignore(igniter) do
if Igniter.exists?(igniter, ".gitignore") do
Igniter.update_file(igniter, ".gitignore", &append_mob_exs/1)
else
Igniter.create_new_file(igniter, ".gitignore", "# Mob local config\nmob.exs\n",
on_exists: :skip
)
end
end
defp append_mob_exs(source) do
content = Rewrite.Source.get(source, :content)
if mob_exs_ignored?(content) do
source
else
Rewrite.Source.update(source, :content, content <> "\n# Mob local config\nmob.exs\n")
end
end
defp mob_exs_ignored?(content) do
String.contains?(content, "\nmob.exs") or String.starts_with?(content, "mob.exs")
end
end