filename.ex (2006B)
1 defmodule Credo.CLI.Filename do 2 @moduledoc """ 3 This module can be used to handle filenames given at the command line. 4 """ 5 6 @doc """ 7 Returns `true` if a given `filename` contains a pos_suffix. 8 9 iex> Credo.CLI.Filename.contains_line_no?("lib/credo/sources.ex:39:8") 10 true 11 12 iex> Credo.CLI.Filename.contains_line_no?("lib/credo/sources.ex:39") 13 true 14 15 iex> Credo.CLI.Filename.contains_line_no?("lib/credo/sources.ex") 16 false 17 """ 18 def contains_line_no?(nil), do: false 19 20 def contains_line_no?(filename) do 21 count = 22 filename 23 |> String.split(":") 24 |> Enum.count() 25 26 if windows_path?(filename) do 27 count == 3 || count == 4 28 else 29 count == 2 || count == 3 30 end 31 end 32 33 @doc """ 34 Returns a suffix for a filename, which contains a line and column value. 35 36 iex> Credo.CLI.Filename.pos_suffix(39, 8) 37 ":39:8" 38 39 iex> Credo.CLI.Filename.pos_suffix(39, nil) 40 ":39" 41 42 These are used in this way: lib/credo/sources.ex:39:8 43 """ 44 def pos_suffix(nil, nil), do: "" 45 def pos_suffix(line_no, nil), do: ":#{line_no}" 46 def pos_suffix(line_no, column), do: ":#{line_no}:#{column}" 47 48 @doc """ 49 Removes the pos_suffix for a filename. 50 51 iex> Credo.CLI.Filename.remove_line_no_and_column("lib/credo/sources.ex:39:8") 52 "lib/credo/sources.ex" 53 """ 54 def remove_line_no_and_column(filename) do 55 filename 56 |> String.split(":") 57 |> remove_line_no_and_column(windows_path?(filename)) 58 end 59 60 defp remove_line_no_and_column(parts, true) do 61 Enum.at(parts, 0) <> ":" <> Enum.at(parts, 1) 62 end 63 64 defp remove_line_no_and_column(parts, false) do 65 List.first(parts) 66 end 67 68 defp windows_path?(path) do 69 String.contains?(path, ":\/") 70 end 71 72 @doc """ 73 Adds a pos_suffix to a filename. 74 75 iex> Credo.CLI.Filename.with("test/file.exs", %{:line_no => 1, :column => 2}) 76 "test/file.exs:1:2" 77 """ 78 def with(filename, opts) do 79 filename <> pos_suffix(opts[:line_no], opts[:column]) 80 end 81 end