Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add support for mix env specific defaults #5

Merged
merged 2 commits into from
Mar 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 44 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Elixir 1.13+
```elixir
def deps do
[
{:mahaul, "~> 0.3.0"}
{:mahaul, "~> 0.4.0"}
]
end
```
Expand All @@ -45,9 +45,13 @@ config :mahaul, mix_env: Mix.env()
```elixir
defmodule MyApp.Env do
use Mahaul,
PORT: [type: :port, default_dev: "4000"],
DEPLOYMENT_ENV: [type: :enum, choices: [:dev, :staging, :live], default_dev: "dev"],
DATABASE_URL: [type: :uri, default_dev: "postgresql://user:pass@localhost:5432/app_dev"],
DEPLOYMENT_ENV: [
type: :enum,
defaults: [dev: "dev", test: "dev"],
choices: [:dev, :staging, :live]
],
PORT: [type: :port, defaults: [dev: "4000"]],
DATABASE_URL: [type: :uri, defaults: [dev: "postgresql://user:pass@localhost:5432/app_dev"]],
ANOTHER_ENV: [type: :host, default: "//localhost"]
end
```
Expand Down Expand Up @@ -108,7 +112,7 @@ The following type configurations are supported.

## Setting Defaults

Any defaults and fallback values can be set globally using the `default` or for development environment using the `default_dev` configuration options. Make sure to use the string values same as we set in the actual system environment, as it will be parsed depending upon the provided `type` configuration.
Any defaults and fallback values can be set globally using the `default` or for any mix environment using the `defaults` configuration options. Make sure to use the string values same as we set in the actual system environment, as it will be parsed depending upon the provided `type` configuration.

#### Globally

Expand All @@ -129,48 +133,71 @@ iex> MyApp.Env.my_env()
Hello Universe
```

#### For dev/test environment
#### For any mix environment

```elixir
defmodule MyApp.Env do
use Mahaul,
MY_ENV: [type: :str, dev_default: "Hello Dev"]
MY_ENV: [
type: :str,
defaults: [prod: "Hello Prod", dev: "Hello Dev", test: "Hello Test", custom: "Hello Custom"]
]
end
```

```
MIX_ENV=prod iex -S mix
iex> MyApp.Env.my_env()
Hello Prod

MIX_ENV=dev iex -S mix
iex> MyApp.Env.my_env()
Hello Dev

MIX_ENV=dev MY_ENV="Hello World" iex -S mix
MIX_ENV=test iex -S mix
iex> MyApp.Env.my_env()
Hello Test

MIX_ENV=custom iex -S mix
iex> MyApp.Env.my_env()
Hello Custom

MIX_ENV=prod MY_ENV="Hello World" iex -S mix
iex> MyApp.Env.my_env()
Hello World
```

#### Globally with dev/test environment overrides
#### For any mix environment with fallback

```elixir
defmodule MyApp.Env do
use Mahaul,
MY_ENV: [type: :str, default: "Hello World", dev_default: "Hello Dev"]
MY_ENV: [
type: :str,
default: "Hello World",
defaults: [prod: "Hello Prod", dev: "Hello Dev", test: "Hello Test"]
]
end
```

```
MIX_ENV=prod iex -S mix
iex> MyApp.Env.my_env()
Hello Prod

MIX_ENV=dev iex -S mix
iex> MyApp.Env.my_env()
Hello Dev

MIX_ENV=dev MY_ENV="Hello Universe" iex -S mix
MIX_ENV=test iex -S mix
iex> MyApp.Env.my_env()
Hello Universe
Hello Test

MIX_ENV=prod iex -S mix
MIX_ENV=custom iex -S mix
iex> MyApp.Env.my_env()
Hello World

MIX_ENV=prod MY_ENV="Hello Universe" iex -S mix
MIX_ENV=custom MY_ENV="Hello Universe" iex -S mix
iex> MyApp.Env.my_env()
Hello Universe
```
Expand Down Expand Up @@ -220,6 +247,9 @@ git clone https://github.com/emadalam/mahaul.git
cd mahaul
mix deps.get
mix test

# or with coverage threshold
# mix coveralls
```

### Building docs
Expand Down
2 changes: 1 addition & 1 deletion coveralls.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"coverage_options": {
"minimum_coverage": 90
"minimum_coverage": 95
}
}
2 changes: 1 addition & 1 deletion lib/mahaul.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ defmodule Mahaul do
@external_resource "README.md"
@moduledoc File.read!("README.md") |> String.replace("# Mahaul\n\n", "", global: false)

@version "0.3.0"
@version "0.4.0"

@doc false
def version, do: @version
Expand Down
33 changes: 25 additions & 8 deletions lib/mahaul/helpers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,20 @@ defmodule Mahaul.Helpers do

defp get_env_val_or_default(env_val, config, mix_env \\ get_mix_env())

defp get_env_val_or_default(env_val, config, mix_env) when mix_env in [:dev, :test] do
env_val || Keyword.get(config, :default_dev) || Keyword.get(config, :default)
end

defp get_env_val_or_default(env_val, config, _mix_env) do
env_val || Keyword.get(config, :default)
defp get_env_val_or_default(env_val, config, mix_env) do
# simplify this once we remove support for `:default_dev` option
# in favour of the `:defaults` option
if Keyword.has_key?(config, :default_dev) do
case mix_env do
env when env in [:dev, :test] ->
env_val || Keyword.get(config, :default_dev) || Keyword.get(config, :default)

_ ->
env_val || Keyword.get(config, :default)
end
else
env_val || config[:defaults][mix_env] || Keyword.get(config, :default)
end
end

defp get_mix_env, do: Application.get_env(:mahaul, :mix_env, :prod)
Expand Down Expand Up @@ -300,20 +308,29 @@ defmodule Mahaul.Helpers do
end

defp validate_opt!({:default_dev, default_dev}, name) do
IO.warn(
~s(#{name}: :default_dev option is deprecated, use :defaults instead. eg: defaults: [prod: "MY_VAL1", dev: "MY_VAL2", test: "MY_VAL3"]),
Macro.Env.stacktrace(__ENV__)
)

unless is_binary(default_dev) do
raise ArgumentError,
"#{name}: expected :default_dev to be a string, got: #{inspect(default_dev)}"
end
end

defp validate_opt!({:defaults, defaults}, name) do
validate_keyword!(defaults, name, ":defaults")
end

defp validate_opt!(option, name) do
raise ArgumentError, "#{name}: unknown option provided #{inspect(option)}"
end

defp validate_keyword!(opts, name \\ "Mahaul") do
defp validate_keyword!(opts, name \\ "Mahaul", opt_name \\ "options") do
unless Keyword.keyword?(opts) and not Enum.empty?(opts) do
raise ArgumentError,
"#{name}: expected options to be a non-empty keyword list, got: #{inspect(opts)}"
"#{name}: expected #{opt_name} to be a non-empty keyword list, got: #{inspect(opts)}"
end
end
end
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ defmodule Mahaul.MixProject do
use Mix.Project

@source_url "https://github.com/emadalam/mahaul"
@version "0.3.0"
@version "0.4.0"

def project do
[
Expand Down
Loading