Skip to content

Commit

Permalink
Merge 625ad2f into deabff5
Browse files Browse the repository at this point in the history
  • Loading branch information
eksperimental committed May 15, 2017
2 parents deabff5 + 625ad2f commit 4b2993c
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 35 deletions.
46 changes: 37 additions & 9 deletions lib/ex_doc.ex
Original file line number Diff line number Diff line change
Expand Up @@ -93,17 +93,33 @@ defmodule ExDoc do
# Builds configuration by merging `options`, and normalizing the options.
@spec build_config(String.t, String.t, Keyword.t) :: ExDoc.Config.t
defp build_config(project, vsn, options) do
options = normalize_options(options)
options =
options
|> normalize_directory([:assets, :output, :source_root])
|> normalize_source_url_pattern()

preconfig = %Config{
project: project,
version: vsn,
main: options[:main],
homepage_url: options[:homepage_url],
source_root: options[:source_root] || File.cwd!,
}
struct(preconfig, options)
end

@doc """
Updates `field` in `options` if its value is `nil`.
"""
@spec normalize_options(keyword, atom, term) :: keyword
def normalize_options(options, field, default) do
if is_nil(options[field]) do
Keyword.put(options, field, default)
else
options
end
end

# Helpers

# Short path for programmatic interface
defp find_formatter(modname) when is_atom(modname), do: modname

Expand All @@ -126,14 +142,26 @@ defmodule ExDoc do
modname
end

# Helpers
@doc false
def normalize_directory(options, fields) when is_list(fields) do
Enum.reduce(fields, options, fn(field, options_acc) ->
normalize_directory(options_acc, field)
end)
end

defp normalize_options(options) do
pattern = options[:source_url_pattern] || guess_url(options[:source_url], options[:source_ref] || ExDoc.Config.default(:source_ref))
options = Keyword.put(options, :source_url_pattern, pattern)
def normalize_directory(options, field) when is_atom(field) do
if is_binary(options[field]) do
Keyword.put(options, field, String.trim_trailing(options[field], "/"))
else
options
end
end

if is_bitstring(options[:output]) do
Keyword.put(options, :output, String.trim_trailing(options[:output], "/"))
@doc false
def normalize_source_url_pattern(options, default_source_ref \\ ExDoc.Config.default(:source_ref)) do
if !options[:source_url_pattern] && options[:source_url] do
source_ref = options[:source_ref] || default_source_ref
Keyword.put(options, :source_url_pattern, guess_url(options[:source_url], source_ref))
else
options
end
Expand Down
13 changes: 4 additions & 9 deletions lib/mix/tasks/docs.ex
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,10 @@ defmodule Mix.Tasks.Docs do
config
|> get_docs_opts()
|> Keyword.merge(cli_opts)
|> normalize_source_url(config)
|> ExDoc.normalize_options(:source_ref, config[:source_ref] || ExDoc.Config.default(:source_ref))
|> ExDoc.normalize_options(:source_url, config[:source_url])
|> ExDoc.normalize_options(:source_url_pattern, config[:source_url_pattern])
|> ExDoc.normalize_source_url_pattern(config[:source_ref] || ExDoc.Config.default(:source_ref))
|> normalize_source_beam(config)
|> normalize_main()
|> normalize_deps()
Expand Down Expand Up @@ -157,14 +160,6 @@ defmodule Mix.Tasks.Docs do
Mix.shell.info [:green, "View them at #{inspect index}."]
end

defp normalize_source_url(options, config) do
if source_url = config[:source_url] do
Keyword.put(options, :source_url, source_url)
else
options
end
end

defp normalize_source_beam(options, config) do
compile_path =
if Mix.Project.umbrella?(config) do
Expand Down
1 change: 0 additions & 1 deletion test/ex_doc/cli_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ defmodule ExDoc.CLITest do

{project, version, opts} =
run(["ExDoc", "--extra-section", "Guides", "--extra", "README.md", "1.2.3", "...", "-c", "test.config"])

assert project == "ExDoc"
assert version == "1.2.3"
assert Enum.sort(opts) == [extra_section: "Guides", extras: ["README.md"], formatter_opts: [key: "val"], source_beam: "..."]
Expand Down
32 changes: 16 additions & 16 deletions test/mix/tasks/docs_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -10,75 +10,75 @@ defmodule Mix.Tasks.DocsTest do
end

test "inflects values from app and version" do
assert [{"ex_doc", "0.1.0", [formatter: "html", deps: _, source_beam: _]}] =
assert [{"ex_doc", "0.1.0", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]}] =
run([], [app: :ex_doc, version: "0.1.0"])
end

test "accepts multiple formatters from CLI" do
assert [{"ex_doc", "0.1.0", [formatter: "html", deps: _, source_beam: _]},
{"ex_doc", "0.1.0", [formatter: "epub", deps: _, source_beam: _]}] =
assert [{"ex_doc", "0.1.0", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]},
{"ex_doc", "0.1.0", [formatter: "epub", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]}] =
run(["-f", "html", "-f", "epub"], [app: :ex_doc, version: "0.1.0"])
end

test "accepts multiple formatters from config" do
assert [{"ex_doc", "0.1.0", [formatter: "html", deps: _, source_beam: _, formatters: _]},
{"ex_doc", "0.1.0", [formatter: "epub", deps: _, source_beam: _, formatters: _]}] =
assert [{"ex_doc", "0.1.0", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _ , formatters: _]},
{"ex_doc", "0.1.0", [formatter: "epub", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _ , formatters: _]}] =
run([], [app: :ex_doc, version: "0.1.0", docs: [formatters: ["html", "epub"]]])
end

test "uses the given name" do
assert [{"ExDoc", "0.1.0", [formatter: "html", deps: _, source_beam: _]}] =
assert [{"ExDoc", "0.1.0", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]}] =
run([], [app: :ex_doc, version: "0.1.0", name: "ExDoc"])
end

test "accepts modules in :main" do
assert [{"ex_doc", "dev", [formatter: "html", deps: _, main: "Sample", source_beam: _, ]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: _, main: "Sample", source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]}] =
run([], [app: :ex_doc, docs: [main: Sample]])
end

test "accepts files in :main" do
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, main: "another"]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _ , main: "another"]}] =
run([], [app: :ex_doc, docs: [main: "another"]])
end

test "accepts output in :output" do
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, output: "hello"]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _ , output: "hello"]}] =
run([], [app: :ex_doc, docs: [output: "hello"]])
end

test "parses output with lower preference than options" do
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, output: "world"]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _ , output: "world"]}] =
run(~w(-o world), [app: :ex_doc, docs: [output: "world"]])
end

test "includes dependencies" do
assert [{"ex_doc", "dev", [formatter: "html", deps: deps, source_beam: _]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: deps, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]}] =
run([], [app: :ex_doc, docs: []])
assert List.keyfind(deps, Application.app_dir(:earmark), 0) ==
{Application.app_dir(:earmark), "https://hexdocs.pm/earmark/#{Application.spec(:earmark, :vsn)}/"}
end

test "allows custom dependency paths" do
assert [{"ex_doc", "dev", [formatter: "html", deps: deps, source_beam: _]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: deps, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]}] =
run([], [app: :ex_doc, docs: [deps: [earmark: "foo"]]])
assert List.keyfind(deps, Application.app_dir(:earmark), 0) ==
{Application.app_dir(:earmark), "foo"}
end

test "accepts lazy docs" do
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, main: "another"]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _, main: "another"]}] =
run([], [app: :ex_doc, docs: fn -> [main: "another"] end])
end

test "accepts source_url from root" do
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _,
source_url: "http://github.com/elixir-lang/ex_doc"]}] =
assert [{"ex_doc", "dev", [formatter: "html", deps: _, source_beam: _, source_url_pattern: _,
source_url: "http://github.com/elixir-lang/ex_doc", source_ref: _]}] =
run([], [app: :ex_doc, source_url: "http://github.com/elixir-lang/ex_doc"])
end

test "supports umbrella project" do
Mix.Project.in_project(:umbrella, "test/fixtures/umbrella", fn _mod ->
assert [{"umbrella", "dev", [formatter: "html", deps: deps, source_beam: _]}] =
assert [{"umbrella", "dev", [formatter: "html", deps: deps, source_beam: _, source_url_pattern: _, source_url: _, source_ref: _]}] =
run([], [app: :umbrella, apps_path: "apps/"])

assert List.keyfind(deps, Application.app_dir(:foo), 0) ==
Expand Down

0 comments on commit 4b2993c

Please sign in to comment.