defmodule Expublish do @moduledoc """ Main module putting everything together: ``` def major do Tests.run!() :major |> Project.get_version!() |> Semver.increase!() |> Project.update_version!() |> Changelog.write_entry!() |> Git.commit_and_tag() |> Git.push() |> Hex.publish() end ``` """ alias Expublish.Changelog alias Expublish.Git alias Expublish.Hex alias Expublish.Options alias Expublish.Project alias Expublish.Semver alias Expublish.Tests require Logger @doc """ Publish major version of current project. """ @spec major(Options.t()) :: :ok def major(options \\ %Options{}), do: run(:major, options) @doc """ Publish minor version of current project. """ @spec minor(Options.t()) :: :ok def minor(options \\ %Options{}), do: run(:minor, options) @doc """ Publish patch version of current project. """ @spec patch(Options.t()) :: :ok def patch(options \\ %Options{}), do: run(:patch, options) @doc """ Publish alpha version of current project. """ @spec alpha(Options.t()) :: :ok def alpha(options \\ %Options{}), do: run(:alpha, options) @doc """ Publish beta version of current project. """ @spec beta(Options.t()) :: :ok def beta(options \\ %Options{}), do: run(:beta, options) @doc """ Publish release-candidate version of current project. """ @spec rc(Options.t()) :: :ok def rc(options \\ %Options{}), do: run(:rc, options) @doc """ Removes pre-release and publish version of current project. """ @spec stable(Options.t()) :: :ok def stable(options \\ %Options{}), do: run(:stable, options) @type level() :: :major | :minor | :patch | :rc | :beta | :alpha | :stable @spec run(level(), Options.t()) :: :ok defp run(level, options) do with :ok <- Git.validate(options), :ok <- Options.validate(options, level), :ok <- Changelog.validate(options), :ok <- Tests.validate(options, level) do Project.get_version!(options) |> Semver.increase!(level, options) |> Project.update_version!(options) |> Changelog.write_entry!(options) |> Git.commit_and_tag(options) |> Git.push(options) |> Changelog.remove_release_file!(options) |> Hex.publish(options) |> finish(options) :ok else error -> Logger.error(error) exit({:shutdown, 1}) end end defp finish(version, %Options{dry_run: true}) do Logger.info("Finished dry run for new package version: #{version}.") end defp finish(version, _options) do Logger.info("Finished release for new package version: #{version}.") end end