io_puts.ex (1185B)
1 defmodule Credo.Check.Refactor.IoPuts do 2 use Credo.Check, 3 tags: [:controversial], 4 explanations: [ 5 check: """ 6 Prefer using Logger statements over using `IO.puts/1`. 7 8 This is a situational check. 9 10 As such, it might be a great help for e.g. Phoenix projects, but 11 a clear mismatch for CLI projects. 12 """ 13 ] 14 15 @call_string "IO.puts" 16 17 @doc false 18 @impl true 19 def run(%SourceFile{} = source_file, params) do 20 issue_meta = IssueMeta.for(source_file, params) 21 22 Credo.Code.prewalk(source_file, &traverse(&1, &2, issue_meta)) 23 end 24 25 defp traverse( 26 {{:., _, [{:__aliases__, _, [:IO]}, :puts]}, meta, _arguments} = ast, 27 issues, 28 issue_meta 29 ) do 30 {ast, issues_for_call(meta, issues, issue_meta)} 31 end 32 33 defp traverse(ast, issues, _issue_meta) do 34 {ast, issues} 35 end 36 37 defp issues_for_call(meta, issues, issue_meta) do 38 [issue_for(issue_meta, meta[:line], @call_string) | issues] 39 end 40 41 defp issue_for(issue_meta, line_no, trigger) do 42 format_issue( 43 issue_meta, 44 message: "There should be no calls to IO.puts/1.", 45 trigger: trigger, 46 line_no: line_no 47 ) 48 end 49 end