envied 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -6
  3. data/lib/envied.rb +28 -11
  4. data/spec/envied_spec.rb +19 -2
  5. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4a2483497b0ea0cac789287167585eee37cfbd70
4
- data.tar.gz: fa76d7207586ed263d2b8f1ca284b18a5711b41f
3
+ metadata.gz: 2f0f26f023604dac352019bbee3aecde27fc9da2
4
+ data.tar.gz: 653204a1873319f4e4e15420fd17e659a98e187a
5
5
  SHA512:
6
- metadata.gz: c484a2e67953278b2d8ac7b50ccbc849a4b3eb22e4ec33715194fe42b58ab968cec2a808e6d5ff85d8797cbea3bb299770835c9db71cf9d9337c94e219afe475
7
- data.tar.gz: 16b0ab7de0f0b6185836fefe0ee82b4a179493be2ab702721f4e25ea2edf8e5a1f69e45b4731960d5799f75e8f0686091cd8756e158e7bcfedce3a83bc15b671
6
+ metadata.gz: 88c894f8addd2f09ce5406048f3010b7d4bd561aad6a0bd1b8461e6d5e8170c559f314edb45aab1d3d4efec2c9afe51b705e696dacde64eaa10a2ea2a5b4f92c
7
+ data.tar.gz: a43d8d92ef633b6fc1b390939ce440e768dac363a4ec05b229238cebc23894ca68d8b160bca65c93d9f9007328a81c53d82d2390a99411cb627653e193d63edb
data/README.md CHANGED
@@ -32,7 +32,7 @@ end
32
32
  ENVied.require!
33
33
  ```
34
34
  Excecution will halt unless ENV is something like
35
- `{'FORCE_SSL' => 'true', 'PORT' => '3000'}`.
35
+ `{'FORCE_SSL' => 'false', 'PORT' => '3001'}`.
36
36
 
37
37
  A meaningful error will in this case explain what key and type is needed.
38
38
 
@@ -41,7 +41,7 @@ A meaningful error will in this case explain what key and type is needed.
41
41
  Variables accessed via ENVied have the configured type:
42
42
 
43
43
  ```ruby
44
- ENVied.port # => 1
44
+ ENVied.port # => 3001
45
45
  ENVied.force_ssl # => false
46
46
  ```
47
47
 
@@ -60,16 +60,23 @@ The following types are supported:
60
60
 
61
61
  ### Defaults
62
62
 
63
- Variables can have defaults. It can be a value or a proc.
63
+ In order to let other developers easily bootstrap the application, you can assign defaults to variables.
64
+ Defaults can be a value or a `Proc` (see example below).
65
+
66
+ Note that 'easily bootstrap' is rather different than '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:
64
67
 
65
68
  ```ruby
66
- ENVied.configure do |env|
69
+ ENVied.configure(enable_defaults: Rails.env.development?) do |env|
67
70
  env.variable :port, :Integer, default: proc {|env, variable| env.force_ssl ? 443 : 80 }
68
- env.variable :force_ssl, :Boolean, default: true
71
+ env.variable :force_ssl, :Boolean, default: false
69
72
  end
70
73
  ```
71
74
 
72
- 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.
75
+ 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.
76
+ As a rule of thumb: you should only use defaults:
77
+ * in a development-environment
78
+ * for ENV-variables that your application introduces (i.e. for `ENV['DEFAULT_SENDER']` not for `ENV['REDIS_URL']`)
79
+
73
80
 
74
81
  ## Installation
75
82
 
@@ -1,5 +1,5 @@
1
1
  class ENVied
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  module Configurable
4
4
  require 'virtus'
5
5
 
@@ -30,6 +30,9 @@ class ENVied
30
30
  base.class_eval do
31
31
  include Virtus.model
32
32
 
33
+ class << self
34
+ attr_accessor :enable_defaults
35
+ end
33
36
  end
34
37
  base.extend ClassMethods
35
38
  end
@@ -58,19 +61,21 @@ class ENVied
58
61
  new(atts)
59
62
  end
60
63
 
64
+ # Define a variable.
65
+ #
66
+ # @param name [Symbol] name of the variable
67
+ # @param type [Symbol] type (one of :String (default), :Symbol, :Integer, :Boolean,
68
+ # :Date, :Time)
69
+ # @param options [Hash]
70
+ # @option options [String, Integer, Boolean, #call] :default (nil) what value will be
71
+ # used when no ENV-variable is present.
72
+ # @note Defaults are ignored by default, see {configure}.
73
+ #
61
74
  def variable(name, type = :String, options = {})
75
+ options.delete(:default) unless self.enable_defaults
62
76
  attribute name, type, { strict: true }.merge(options)
63
77
  end
64
78
 
65
- def default_if?(cond, value = nil, &block)
66
- options = { default: (value || block) }
67
- cond ? options : Hash.new
68
- end
69
-
70
- def default_unless?(cond, value = nil, &block)
71
- default_if?(!cond, value, &block)
72
- end
73
-
74
79
  private
75
80
  def try_coercion(variable, value, default)
76
81
  value ||= begin
@@ -90,8 +95,20 @@ class ENVied
90
95
  attr_accessor :configuration
91
96
  end
92
97
 
93
- def self.configure(&block)
98
+ # Configure ENVied.
99
+ #
100
+ # @param options [Hash]
101
+ # @option options [Boolean] :enable_defaults (false) whether or not defaults are used.
102
+ #
103
+ # @example
104
+ # ENVied.configure(enable_defaults: Rails.env.development?) do
105
+ # variable :force_ssl, :Boolean, default: false
106
+ # end
107
+ #
108
+ def self.configure(options = {}, &block)
109
+ options = { enable_defaults: false }.merge(options)
94
110
  @configuration = Class.new { include Configurable }.tap do |k|
111
+ k.enable_defaults = options[:enable_defaults]
95
112
  k.instance_eval(&block)
96
113
  end
97
114
  # or define this thing as ENVied::Configuration? prolly not threadsafe
@@ -13,6 +13,11 @@ describe ENVied do
13
13
  self
14
14
  end
15
15
 
16
+ def configure(options = {}, &block)
17
+ described_class.configure(options, &block)
18
+ self
19
+ end
20
+
16
21
  def configured_with(hash = {})
17
22
  described_class.configure do |env|
18
23
  hash.each do |name, type|
@@ -68,13 +73,25 @@ describe ENVied do
68
73
  end
69
74
 
70
75
  describe 'variable with default' do
71
- it 'can be a value' do
76
+ it "are disabled by default" do
72
77
  configured_with(a: [:Integer, default: 1]).and_no_ENV
78
+
79
+ expect { ENVied.a }.to raise_error
80
+ end
81
+
82
+ it 'can be a value' do
83
+ configure(enable_defaults: true) do
84
+ variable :a, :Integer, default: 1
85
+ end.and_no_ENV
86
+
73
87
  expect(ENVied.a).to eq 1
74
88
  end
75
89
 
76
90
  it "can be anything callable" do
77
- configured_with(a: [:Integer, default: proc { 1 }]).and_no_ENV
91
+ configure(enable_defaults: true) do
92
+ variable :a, :Integer, default: proc { 1 }
93
+ end.and_no_ENV
94
+
78
95
  expect(ENVied.a).to eq 1
79
96
  end
80
97
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: envied
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gert Goet