Packages
igniter
0.5.17
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.30
0.6.29
0.6.28
0.6.27
0.6.26
0.6.25
0.6.24
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.52
0.5.51
0.5.50
0.5.49
0.5.48
0.5.47
0.5.46
0.5.45
0.5.44
0.5.43
0.5.42
0.5.41
0.5.40
0.5.39
0.5.38
0.5.37
0.5.36
0.5.35
0.5.34
0.5.33
0.5.32
0.5.31
0.5.30
0.5.29
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
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.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.78
0.3.77
0.3.76
0.3.75
0.3.74
0.3.73
0.3.72
0.3.71
0.3.70
0.3.69
0.3.68
0.3.67
0.3.66
0.3.65
0.3.64
0.3.63
0.3.62
0.3.61
0.3.60
0.3.59
0.3.58
0.3.57
0.3.56
0.3.55
0.3.54
0.3.53
0.3.52
0.3.51
0.3.50
0.3.49
0.3.48
0.3.47
0.3.46
0.3.45
0.3.44
0.3.43
0.3.42
0.3.41
0.3.40
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
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.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.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
A code generation and project patching framework
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/igniter.update_gettext.ex
defmodule Mix.Tasks.Igniter.UpdateGettext do
use Igniter.Mix.Task
@shortdoc "Applies changes to resolve a warning introduced in gettext 0.26.0"
@moduledoc """
#{@shortdoc}
"""
def info(_argv, _source) do
%Igniter.Mix.Task.Info{group: :igniter}
end
def igniter(igniter) do
{igniter, modules} = find_use_gettext_modules(igniter)
modules
|> Enum.reduce(igniter, fn module, igniter ->
igniter
|> use_gettext_backend(module)
|> rewrite_imports(module)
end)
|> Igniter.Project.Deps.add_dep(
{:gettext, "~> 0.26 and >= 0.26.1"},
yes?: true
)
end
defp rewrite_imports(igniter, rewriting_module) do
{igniter, modules} =
Igniter.Project.Module.find_all_matching_modules(igniter, fn _module, zipper ->
match?(
{:ok, _},
Igniter.Code.Common.move_to(zipper, fn zipper ->
import?(zipper, rewriting_module)
end)
)
end)
Enum.reduce(modules, igniter, fn module, igniter ->
Igniter.Project.Module.find_and_update_module!(igniter, module, fn zipper ->
Igniter.Code.Common.update_all_matches(zipper, &import?(&1, rewriting_module), fn _ ->
{:code,
quote do
use Gettext, backend: unquote(rewriting_module)
end}
end)
end)
end)
end
defp find_use_gettext_modules(igniter) do
Igniter.Project.Module.find_all_matching_modules(igniter, fn _module, zipper ->
with {:ok, zipper} <- Igniter.Code.Module.move_to_use(zipper, Gettext),
false <- has_backend_arg?(zipper) do
true
else
_ ->
false
end
end)
end
defp import?(zipper, module) do
Igniter.Code.Function.function_call?(zipper, :import, 1) &&
Igniter.Code.Function.argument_equals?(zipper, 0, module)
end
defp use_gettext_backend(igniter, module) do
Igniter.Project.Module.find_and_update_module!(igniter, module, fn zipper ->
with {:ok, zipper} <- Igniter.Code.Module.move_to_use(zipper, Gettext),
false <- has_backend_arg?(zipper),
{:ok, zipper} <-
Igniter.Code.Function.update_nth_argument(zipper, 0, fn zipper ->
{:ok, Igniter.Code.Common.replace_code(zipper, Gettext.Backend)}
end) do
{:ok, zipper}
else
true ->
{:ok, zipper}
_ ->
{:warning, "Failed to update to Gettext.Backend in #{inspect(module)}"}
end
end)
end
defp has_backend_arg?(zipper) do
with {:ok, zipper} <- Igniter.Code.Function.move_to_nth_argument(zipper, 1),
{:ok, _zipper} <- Igniter.Code.Keyword.get_key(zipper, :backend) do
true
else
_ ->
false
end
end
end