Packages
espec
0.4.0
1.10.0
1.9.2
1.9.1
1.9.0
1.8.3
1.8.2
1.8.1
1.8.0
1.7.0
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.0.1
1.0.0
0.8.28
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.2
0.4.1
0.4.0
0.3.7
0.3.5
0.3.0
0.2.0
0.1.0
BDD testing framework for Elixir inspired by RSpec.
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/espec.ex
defmodule Mix.Tasks.Espec do
use Mix.Task
@shortdoc "Runs specs"
@moduledoc """
Runs the specs.
This task starts the current application, loads up
`spec/spec_helper.exs` and then requires all files matching the
`spec/**/_spec.exs` pattern in parallel.
A list of files can be given after the task name in order to select
the files to compile:
mix spec test/some/particular/file_test.exs
## Command line options
* `--trace` - run spec with detailed reporting
* `--focus` - run examples with `focus`
* `--silent` - no output
"""
def run(args) do
{opts, files, _} = OptionParser.parse(args)
unless System.get_env("MIX_ENV") || Mix.env == :test do
Mix.raise "espec is running on environment #{Mix.env}.\n" <>
"It is recommended to run espec in test environment.\n" <>
"Please add `preferred_cli_env: [espec: :test]` to project configurations in mix.exs file.\n" <>
"Or set MIX_ENV explicitly (MIX_ENV=test mix espec)"
end
Mix.Task.run "loadpaths", args
Mix.shell.print_app
Mix.Task.run "app.start", args
# Ensure espec is loaded.
case Application.load(:espec) do
:ok -> :ok
{:error, {:already_loaded, :espec}} -> :ok
end
spec_paths = ["spec"]
spec_pattern = "*_spec.exs"
ESpec.Configuration.add(opts)
Enum.each([spec_paths], &require_spec_helper(&1))
files_with_opts = []
if Enum.any?(files) do
files_with_opts = parse_files(files)
spec_files = files_with_opts |> Enum.map(fn {f,_} -> f end)
spec_files = Mix.Utils.extract_files(spec_files, spec_pattern)
else
spec_files = Mix.Utils.extract_files(spec_paths, spec_pattern)
end
Kernel.ParallelRequire.files(spec_files)
ESpec.Configuration.add([file_opts: files_with_opts])
success = ESpec.run
System.at_exit fn _ ->
unless success, do: exit({:shutdown, 1})
end
end
def parse_files(files), do: files |> Enum.map(&parse_file(&1))
def parse_file(file) do
case Regex.run(~r/^(.+):(\d+)$/, file, capture: :all_but_first) do
[file, line_number] ->
{Path.absname(file), [line: String.to_integer(line_number)]}
nil ->
{Path.absname(file), []}
end
end
defp require_spec_helper(dir) do
file = Path.join(dir, "spec_helper.exs")
if File.exists?(file) do
Code.require_file file
else
Mix.raise "Cannot run tests because spec helper file #{inspect file} does not exist"
end
end
end