lib/mix/tasks.ex

defmodule Mix.Tasks.Vcr do
  use Mix.Task

  @shortdoc "Operate exvcr cassettes"

  @moduledoc """
  Provides mix tasks for operating cassettes.

  ## Command line options
  * `--dir` - specifies the vcr cassette directory.
  * `--custom` - specifies the custom cassette directory.
  * `-i (--interactive)` - ask for confirmation for each file operation.
  """

  @doc "Entry point for [mix vcr] task"
  def run(args) do
    {options, _, _} = OptionParser.parse(args, aliases: [d: :dir, c: :custom, h: :help], switches: [dir: :string, custom: :string, help: :boolean])
    if options[:help] do
      ExVCR.Task.Util.print_help_message()
    else
      ExVCR.Task.Util.parse_basic_options(options) |> ExVCR.Task.Runner.show_vcr_cassettes
    end
  end

  defmodule Delete do
    use Mix.Task

    @doc "Entry point for [mix vcr.delete] task"
    def run(args) do
      {options, files, _} =
        OptionParser.parse(args,
                           switches: [interactive: :boolean, all: :boolean],
                           aliases: [d: :dir, i: :interactive, a: :all])

      pattern = cond do
        options[:all]          -> ~r/.*/
        Enum.count(files) == 1 -> Enum.at(files, 0)
        true                   -> nil
      end

      if pattern do
        ExVCR.Task.Runner.delete_cassettes(
          options[:dir] || ExVCR.Setting.get(:cassette_library_dir),
          pattern, options[:interactive] || false)
      else
        IO.puts "[Invalid Param] Specify substring of cassette file-name to be deleted - `mix vcr.delete [pattern]`, or use `mix vcr.delete --all` for deleting all cassettes."
      end
    end
  end

  defmodule Check do
    @moduledoc """
    Check how the recorded cassettes are used while executing [mix test] task.
    """
    use Mix.Task

    @doc "Entry point for [mix vcr.check] task."
    def run(args) do
      {options, _files, _} = OptionParser.parse(args, aliases: [d: :dir, c: :custom], switches: [dir: :string, custom: :string])
      dirs = ExVCR.Task.Util.parse_basic_options(options)
      ExVCR.Checker.start(%ExVCR.Checker.Results{dirs: dirs})

      Mix.env(:test)
      Mix.Task.run("test")
      System.at_exit(fn(_) ->
        ExVCR.Task.Runner.check_cassettes(ExVCR.Checker.get())
      end)
    end
  end

  defmodule Show do
    @moduledoc """
    Show the contents of the cassettes.
    """
    use Mix.Task

    @doc "Entry point for [mix vcr.show] task."
    def run(args) do
      {_options, files, _} = OptionParser.parse(args, aliases: [], switches: [])
      ExVCR.Task.Show.run(files)
    end
  end
end