README.md in envied-0.3.1 vs README.md in envied-0.4.0

- old
+ new

@@ -1,6 +1,6 @@ -# ENVied +# ENVied [![travis](https://secure.travis-ci.org/eval/envied.png?branch=master)](https://secure.travis-ci.org/#!/eval/envied) ### TL;DR ensure presence and type of your app's ENV-variables. For applications that are configured via ENV-variables, this gem will provide: @@ -18,37 +18,65 @@ Let's configure the ENV-variables we need: ```ruby # e.g. config/application.rb -ENVied.configure do |env| - env.variable :force_ssl, :Boolean - env.variable :port, :Integer +ENVied.configure do + variable :FORCE_SSL, :Boolean + variable :PORT, :Integer end ``` ### 2) Check for presence and type ```ruby -ENVied.require! +ENVied.require ``` -Excecution will halt unless ENV is something like -`{'FORCE_SSL' => 'false', 'PORT' => '3001'}`. -A meaningful error will in this case explain what key and type is needed. +This will throw an error if not: +* both `ENV['FORCE_SSL']` and `ENV['PORT']` are present +* both the values of `ENV['FORCE_SSL']` and `ENV['PORT']` can be coerced (to resp. Boolean or Integer). +(The error contains exactly what ENV-variables are missing/faulty.) + ### 3) Use typed variables Variables accessed via ENVied have the configured type: ```ruby -ENVied.port # => 3001 -ENVied.force_ssl # => false +ENVied.PORT # => 3001 +ENVied.FORCE_SSL # => false ``` ## Configuration +### Groups + +Groups give you more flexibility to define when variables are needed. +It's just like you Gemfile: + +```ruby +ENVied.configure do + variable :FORCE_SSL, :Boolean + + group :production do + variable :NEW_RELIC_LICENSE_KEY + end +end + +# For local development you would typically do: +ENVied.require(:default) #=> Only ENV['FORCE_SSL'] is required +# On the server: +ENVied.require(:default, :production) #=> ...also ENV['NEW_RELIC_LICENSE_KEY'] is required + +# BTW the following are equivalent: +ENVied.require +ENVied.require(:default) +ENVied.require('default') +ENVied.require(nil) +``` + ### Types The following types are supported: * `:String` (implied) @@ -61,22 +89,73 @@ ### Defaults In order to let other developers easily bootstrap the application, you can assign defaults to variables. Defaults can be a value or a `Proc` (see example below). -Note that 'easily bootstrap' is quite the opposite of 'fail-fast when not all ENV-variables are present'. Therefor it's disabled by default and you should explicitly state whén it is allowed: +Note that 'easily bootstrap' is quite the opposite of 'fail-fast when not all ENV-variables are present'. Therefor you should explicitly state whén defaults are allowed: ```ruby -ENVied.configure(enable_defaults: Rails.env.development?) do |env| - env.variable :port, :Integer, default: proc {|env, variable| env.force_ssl ? 443 : 80 } - env.variable :force_ssl, :Boolean, default: false +ENVied.configure(enable_defaults: ENV['RACK_ENV'] == 'development') do + variable :FORCE_SSL, :Boolean, default: false + variable :PORT, :Integer, default: proc {|envied| envied.FORCE_SSL ? 443 : 80 } end ``` -Please remember that ENVied only **reads** from ENV; don't let setting a default for, say `rails_env`, give you or your team the impression that `ENV['RAILS_ENV']` is set. -As a rule of thumb: you should only use defaults: -* in a development-environment +Please remember that ENVied only **reads** from ENV; it doesn't set ENV-variables. +Don't let setting a default for, say `RAILS_ENV`, give you the impression that `ENV['RAILS_ENV']` is set. +As a rule of thumb you should only use defaults: +* for local development * for ENV-variables that your application introduces (i.e. for `ENV['DEFAULT_SENDER']` not for `ENV['REDIS_URL']`) + +### A more extensive example: + +```ruby +# We allow defaults for local development (and local tests), but want our CI +# to mimic our production as much as possible. +# New developers that don't have RACK_ENV set, will in this way not be presented with a huge +# list of missing variables, as defaults are still enabled. +not_production_nor_ci = ->{ !(ENV['RACK_ENV'] == 'production' || ENV['CI']) } +ENVied.configure(enable_defaults: &not_production_nor_ci) do + # Your code will likely not use ENVied.RACK_ENV (better use Rails.env), + # we want it to be present though; heck, we're using it in this file! + variable :RACK_ENV + + variable :FORCE_SSL, :Boolean, default: false + variable :PORT, :Integer, default: 3000 + # generate the default value using the value of PORT: + variable :PUBLIC_HOST_WITH_PORT, :String, default: proc {|envied| "localhost:#{envied.PORT}" } + + group :production do + variable :MAIL_PAAS_USERNAME + variable :DATABASE_URL, :Symbol + end + + group :ci do + # ci-only stuff + end + + group :not_ci do + # CI needs no puma-threads, and sidekiq-stuff etc. + # Define that here: + variable :MIN_THREADS, :Integer, default: 1 + # more... + end +end + +# Depending on our situation, we can now require the groups needed: +# At local machines: +ENVied.require(:default, :development, :not_ci) or +ENVied.require(:default, :test, :not_ci) + +# At the server: +ENVied.require(:default, :production, :not_ci) + +# At CI: +ENVied.require(:default, :test, :ci) + +# All in one line: +ENVied.require(:default, ENV['RACK_ENV'], (ENV['CI'] ? :ci : :not_ci)) +``` ## Installation Add this line to your application's Gemfile: