defmodule Versioce.Bumper do @options [pre: :string, build: :string, no_pre_hooks: :boolean, no_post_hooks: :boolean] @moduledoc """ Module responsible for the bumping itself. If you are interested in the process of writing and updating files check `Versioce.Bumper.Files` module. """ @doc """ Get current project version. ## Example iex> Versioce.Bumper.current_version {:ok, "0.1.0"} """ @spec current_version() :: {:ok, String.t} | {:error, String.t} def current_version do case Mix.Project.get() do nil -> {:error, "No project configured"} _ -> {:ok, Mix.Project.config()[:version]} end end defp add_build_pre(version, options) do build = case Keyword.get(options, :build) do nil -> nil build -> [build] end pre = case Keyword.get(options, :pre) do nil -> [] pre -> [pre] end Map.merge(version, %{ build: build, pre: pre }) end defp do_bump({[], []}, from) do IO.puts("Nothing to do") from end defp do_bump({options, ["patch"]}, from) do from_v = Version.parse!(from) new_version = Map.merge(from_v, %{ patch: from_v.patch + 1 }) |> add_build_pre(options) |> to_string Version.parse!(new_version) Versioce.Bumper.Files.update_version_files(from, new_version) new_version end defp do_bump({options, ["minor"]}, from) do from_v = Version.parse!(from) new_version = Map.merge(from_v, %{ minor: from_v.minor + 1, patch: 0 }) |> add_build_pre(options) |> to_string Version.parse!(new_version) Versioce.Bumper.Files.update_version_files(from, new_version) new_version end defp do_bump({options, ["major"]}, from) do from_v = Version.parse!(from) new_version = Map.merge(from_v, %{ major: from_v.major + 1, minor: 0, patch: 0 }) |> add_build_pre(options) |> to_string Version.parse!(new_version) Versioce.Bumper.Files.update_version_files(from, new_version) new_version end defp do_bump({_, [version]}, from) do new_version = Version.parse!(version) |> to_string Versioce.Bumper.Files.update_version_files(from, new_version) new_version end defp do_bump({options, []}, from) do from_v = Version.parse!(from) new_version = from_v |> add_build_pre(options) |> to_string Versioce.Bumper.Files.update_version_files(from, new_version) new_version end @doc """ Bumps versions in all the files specified in config + mix.exs ## Example iex> Versioce.Bumper.bump(["minor"], "0.0.1") "0.1.0" """ @spec bump([String.t], String.t) :: String.t def bump(options, from) do OptionParser.parse!(options, strict: @options) |> do_bump(from) end end