/envar

📂 envar helps check and get environment variables in Elixir

Primary LanguageElixirGNU General Public License v2.0GPL-2.0

envar rainbow logo

A collection of functions for checking/getting/setting environment variables in Elixir.

GitHub Workflow Status codecov.io Hex.pm Dependencies: None contributions welcome HitCount


Why?

We needed a way of checking that environment variables were defined and improving the developer experience when they are not.

What?

envar is our solution to a very specific problem: the developer experience when a required environment variable is undefined.


How?

Installation

Install the package by adding envar to your list of dependencies in your mix.exs file:

def deps do
  [
    {:envar, "~> 1.1.0"}
  ]
end

Usage

Load an .env file containing a line-separated list of environment variables on your localhost:

Envar.load(".env")

That will locate the .env file in your project and set each environment variable in it.

If the .env must exist e.g. in a :test context, invoke:

Envar.require_env_file(".env")

That will log an Error if the file does not exist (or can't be found):

09:10:54.103 [error] Required .env file does not exist at path: /Alex/awesome/project/.env

When you need to retrieve a specific environment variable, use the following:

DATABASE_URL = Envar.get("DATABASE_URL")

If you want to define a default/fallback value for the environment variable when it's not set, simply add it as the second argument:

DATABASE_URL = Envar.get("DATABASE_URL", "postgres://uname:pass@host:5432/dbname"")

If you need to check that a variable is set, use is_set?/1

if Envar.is_set?("Heroku") do
  # do stuff on Heroku
end

To check if any of the variables in a List are set, invoke Envar.is_set_any?/1:

if Envar.is_set_any?(~w/HEROKU FLYIO/) do
  # Do something on non-prod environment
end

Conversely, to confirm that all the environment variables in a list are set, invoke Envar.is_set_all?/1:

if Envar.is_set_all?(~w/ADMIN_EMAIL AUTH_API_KEY/) do
  # Do something with the required environment variables
end

We needed a couple more convenience functions, so we wrote them!

If you need to read an .env file and get the keys & values as a Map, invoke Envar.read/1:

iex> Envar.read(".env")
%{
  "ADMIN_EMAIL" => "alex@gmail.com",
  "EVERYTHING" => "awesome!",
  "SECRET" => "master plan"
}

If you need just the keys of the list of environment variables in an .env file, invoke: Envar.keys/1:

iex> Envar.keys(".env")
["ADMIN_EMAIL", "EVERYTHING", "SECRET"]

And if you need just the values of the environment variables in an .env file, invoke: Envar.values/1:

iex> Envar.values(".env")
["alex@gmail.com", "awesome!", "master plan"]

For more detail, please see docs: https://hexdocs.pm/envar/Envar.html#functions



Happy Elixir Coding! 🚀



Context

We created this module after doing a search of the Elixir (Hex.pm) ecosystem,
see: dwyl/learn-environment-variables/issues/18

There are several modules available, we wanted something very basic/specific to our needs.
We don't expect anyone else to use this; it's Open Source because that's just what we do:
/manifesto.md#open-source-always