Packages
fnord
0.8.33
0.9.40
0.9.39
0.9.38
0.9.37
0.9.36
0.9.35
0.9.34
0.9.33
0.9.32
0.9.31
0.9.30
0.9.29
0.9.28
0.9.27
0.9.26
0.9.25
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.99
0.8.98
0.8.97
0.8.96
0.8.95
0.8.94
0.8.93
0.8.92
0.8.91
0.8.90
0.8.89
0.8.88
0.8.87
0.8.86
0.8.85
0.8.84
0.8.83
0.8.82
0.8.81
0.8.80
0.8.79
0.8.78
0.8.77
0.8.76
0.8.75
0.8.74
0.8.73
0.8.72
0.8.71
0.8.70
0.8.69
0.8.68
0.8.67
0.8.66
0.8.65
0.8.64
0.8.63
0.8.62
0.8.61
0.8.60
0.8.59
0.8.58
0.8.57
0.8.56
0.8.55
0.8.54
0.8.53
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.47
0.8.46
0.8.45
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.1
0.8.0
0.7.24
0.7.23
0.7.22
0.7.21
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.3
0.7.2
0.7.1
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.1
0.6.0
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.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
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.4.0
0.3.0
0.2.0
0.1.0
AI code archaeology
Current section
Files
Jump to
Current section
Files
lib/settings/approvals.ex
defmodule Settings.Approvals do
alias Settings.Approvals.RegexMatcher
@type settings :: Settings.t()
@type scope :: :project | :global
@type kind :: binary
@type prefix :: binary
@type subject :: binary
@spec get_approvals(settings, scope) :: map
def get_approvals(settings, :global) do
settings
|> Settings.get("approvals", %{})
end
def get_approvals(settings, :project) do
with {:ok, project} <- Settings.get_project(settings) do
project
|> Map.get("approvals", %{})
else
_ -> %{}
end
end
@spec get_approvals(settings, scope, kind) :: list(prefix)
def get_approvals(settings, :global, kind) do
settings
|> get_approvals(:global)
|> Map.get(kind, [])
end
def get_approvals(settings, :project, kind) do
settings
|> get_approvals(:project)
|> Map.get(kind, [])
end
@spec approve(settings, scope, kind, prefix) :: settings
def approve(settings, :global, kind, prefix) do
prefixes =
settings
|> get_approvals(:global, kind)
|> Enum.concat([prefix])
|> Enum.uniq()
|> Enum.sort()
approvals =
settings
|> get_approvals(:global)
|> Map.put(kind, prefixes)
settings
|> Settings.set("approvals", approvals)
end
def approve(settings, :project, kind, prefix) do
with {:ok, %{"name" => name} = project} <- Settings.get_project(settings) do
prefixes =
settings
|> get_approvals(:project, kind)
|> Enum.concat([prefix])
|> Enum.uniq()
|> Enum.sort()
approvals =
settings
|> get_approvals(:project)
|> Map.put(kind, prefixes)
project =
project
|> Map.put("approvals", approvals)
settings
|> Settings.set_project_data(name, project)
else
_ -> settings
end
end
@spec approved?(settings, kind, subject) :: boolean
def approved?(settings, kind, subject) do
# Check both global and project scopes for any matching regex pattern
[:global, :project]
|> Enum.any?(&approved?(settings, &1, kind, subject))
end
def approved?(settings, :global, kind, subject) do
get_approvals(settings, :global, kind)
|> Enum.any?(&RegexMatcher.matches?(&1, subject))
end
def approved?(settings, :project, kind, subject) do
get_approvals(settings, :project, kind)
|> Enum.any?(&RegexMatcher.matches?(&1, subject))
end
end