Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule Mix.Tasks.RemoveUnusedCassettes do
- @moduledoc """
- A task to remove all unused VCR cassettes.
- """
- use Mix.Task
- @shortdoc "A task to remove all unused VCR cassettes."
- @cassettes_path "test/fixtures/vcr_cassettes"
- @cassette_fileext ".json"
- @doc false
- @spec run(any) :: any
- def run(_args) do
- all_fixtures = get_all_fixtures()
- used_fixtures = get_used_fixtures()
- unused_fixtures = MapSet.difference(all_fixtures, used_fixtures)
- remove_fixture_files(unused_fixtures)
- end
- defp get_all_fixtures do
- @cassettes_path
- |> Path.join("*#{@cassette_fileext}")
- |> Path.wildcard()
- |> Enum.into(MapSet.new(), &Path.basename(&1, @cassette_fileext))
- end
- defp get_used_fixtures do
- "test/**/*_test.exs"
- |> Path.wildcard()
- |> Enum.reduce(MapSet.new(), fn path, fixtures ->
- path
- |> File.stream!()
- |> Enum.reduce(fixtures, fn line, fixtures ->
- case Regex.named_captures(~r/use_cassette \"(?<name>.*)\"/, line) do
- %{"name" => name} ->
- MapSet.put(fixtures, normalize_fixture_name(name))
- _ ->
- fixtures
- end
- end)
- end)
- end
- defp normalize_fixture_name(fixture) do
- fixture |> String.replace(~r/\s/, "_") |> String.downcase()
- end
- defp remove_fixture_files(fixtures) do
- Enum.each(fixtures, &remove_fixture_file/1)
- end
- defp remove_fixture_file(fixture) do
- path = Path.join(@cassettes_path, "#{fixture}#{@cassette_fileext}")
- File.rm!(path)
- IO.puts("Removed fixture: #{path}")
- end
- end
Add Comment
Please, Sign In to add comment