prepare_checks_to_run.ex (3048B)
1 defmodule Credo.CLI.Task.PrepareChecksToRun do 2 @moduledoc false 3 4 use Credo.Execution.Task 5 6 def call(exec, _opts \\ []) do 7 source_files = Execution.get_source_files(exec) 8 9 exec 10 |> set_config_comments(source_files) 11 |> enable_disabled_checks_if_applicable() 12 |> exclude_low_priority_checks(exec.min_priority - 9) 13 |> exclude_checks_based_on_elixir_version 14 end 15 16 defp set_config_comments(exec, source_files) do 17 config_comment_map = 18 source_files 19 |> Credo.Check.ConfigCommentFinder.run() 20 |> Enum.into(%{}) 21 22 %Execution{exec | config_comment_map: config_comment_map} 23 end 24 25 defp enable_disabled_checks_if_applicable(%Execution{enable_disabled_checks: nil} = exec) do 26 exec 27 end 28 29 defp enable_disabled_checks_if_applicable(exec) do 30 enable_disabled_checks_regexes = to_match_regexes(exec.enable_disabled_checks) 31 32 enable_disabled_checks = 33 Enum.map(exec.checks.disabled, fn 34 {check, params} -> 35 if matches?(to_string(check), enable_disabled_checks_regexes) do 36 {check, params} 37 else 38 {check, false} 39 end 40 end) 41 42 checks = Keyword.merge(exec.checks.enabled, enable_disabled_checks) 43 44 %Execution{exec | checks: %{enabled: checks, disabled: exec.checks.disabled}} 45 end 46 47 defp exclude_low_priority_checks(exec, below_priority) do 48 checks = 49 Enum.reject(exec.checks.enabled, fn 50 # deprecated 51 {check} -> 52 Credo.Priority.to_integer(check.base_priority) < below_priority 53 54 {_check, false} -> 55 true 56 57 {check, params} -> 58 priority = 59 params 60 |> Credo.Check.Params.priority(check) 61 |> Credo.Priority.to_integer() 62 63 priority < below_priority 64 end) 65 66 %Execution{exec | checks: %{enabled: checks, disabled: exec.checks.disabled}} 67 end 68 69 defp exclude_checks_based_on_elixir_version(exec) do 70 elixir_version = System.version() 71 skipped_checks = Enum.reject(exec.checks.enabled, &matches_requirement?(&1, elixir_version)) 72 checks = Enum.filter(exec.checks.enabled, &matches_requirement?(&1, elixir_version)) 73 74 %Execution{ 75 exec 76 | checks: %{enabled: checks, disabled: exec.checks.disabled}, 77 skipped_checks: skipped_checks 78 } 79 end 80 81 defp matches_requirement?({check, _}, elixir_version) do 82 matches_requirement?({check}, elixir_version) 83 end 84 85 defp matches_requirement?({check}, elixir_version) do 86 Version.match?(elixir_version, check.elixir_version) 87 end 88 89 defp to_match_regexes(nil), do: [] 90 91 defp to_match_regexes(list) do 92 Enum.map(list, fn match_check -> 93 {:ok, match_pattern} = Regex.compile(match_check, "i") 94 match_pattern 95 end) 96 end 97 98 defp matches?(_string, nil), do: false 99 defp matches?(string, list) when is_list(list), do: Enum.any?(list, &matches?(string, &1)) 100 defp matches?(string, %Regex{} = regex), do: Regex.match?(regex, string) 101 defp matches?(string, pattern) when is_binary(pattern), do: String.contains?(string, pattern) 102 end