Guest User

Untitled

a guest
Dec 14th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. defmodule Mix.Tasks.RemoveUnusedCassettes do
  2. @moduledoc """
  3. A task to remove all unused VCR cassettes.
  4. """
  5.  
  6. use Mix.Task
  7.  
  8. @shortdoc "A task to remove all unused VCR cassettes."
  9.  
  10. @cassettes_path "test/fixtures/vcr_cassettes"
  11. @cassette_fileext ".json"
  12.  
  13. @doc false
  14. @spec run(any) :: any
  15. def run(_args) do
  16. all_fixtures = get_all_fixtures()
  17. used_fixtures = get_used_fixtures()
  18. unused_fixtures = MapSet.difference(all_fixtures, used_fixtures)
  19. remove_fixture_files(unused_fixtures)
  20. end
  21.  
  22. defp get_all_fixtures do
  23. @cassettes_path
  24. |> Path.join("*#{@cassette_fileext}")
  25. |> Path.wildcard()
  26. |> Enum.into(MapSet.new(), &Path.basename(&1, @cassette_fileext))
  27. end
  28.  
  29. defp get_used_fixtures do
  30. "test/**/*_test.exs"
  31. |> Path.wildcard()
  32. |> Enum.reduce(MapSet.new(), fn path, fixtures ->
  33. path
  34. |> File.stream!()
  35. |> Enum.reduce(fixtures, fn line, fixtures ->
  36. case Regex.named_captures(~r/use_cassette \"(?<name>.*)\"/, line) do
  37. %{"name" => name} ->
  38. MapSet.put(fixtures, normalize_fixture_name(name))
  39.  
  40. _ ->
  41. fixtures
  42. end
  43. end)
  44. end)
  45. end
  46.  
  47. defp normalize_fixture_name(fixture) do
  48. fixture |> String.replace(~r/\s/, "_") |> String.downcase()
  49. end
  50.  
  51. defp remove_fixture_files(fixtures) do
  52. Enum.each(fixtures, &remove_fixture_file/1)
  53. end
  54.  
  55. defp remove_fixture_file(fixture) do
  56. path = Path.join(@cassettes_path, "#{fixture}#{@cassette_fileext}")
  57. File.rm!(path)
  58. IO.puts("Removed fixture: #{path}")
  59. end
  60. end
Add Comment
Please, Sign In to add comment