env_vars 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +12 -1
  3. data/README.md +29 -3
  4. data/env_vars.gemspec +1 -0
  5. data/lib/env_vars.rb +66 -16
  6. metadata +17 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: edb62ff44a63e4c934b684ce185c368f5c7e033d
4
- data.tar.gz: 3ea149485a9c4e3a6de43346e86089344b997eea
3
+ metadata.gz: ea60318c5b3551b75421b50696aeda6d9fe2262d
4
+ data.tar.gz: 58a80b5e1c90243a78921512ce6f1b6b579dc459
5
5
  SHA512:
6
- metadata.gz: de7f9410fce327186d147d664630417ddc153338b726ccf81afafd8d3a970762ffccf910ce99e5fc400e00641006c6617194401841781bca1dad748c72adfdce
7
- data.tar.gz: b566be6e2e9f4a2479d2def53c9ff68c10dd7e7b5fc478802d896e6c73ae5cf0a02d7e1359e8942bc6d5ebd9582b9180ee1a24d66f8b91406dfcacf3237eb4d7
6
+ metadata.gz: fd932edac1256b348f2575243632971f496e07e561a3e5edfc52180aa118c770357e052c556bc4bb2d84a8a148825435bf514a367689debdadbee8b241046e19
7
+ data.tar.gz: b04854b098b359b9a38a1e621b38d3d05ebe814a65cd0621abee30c41ce70099d62cb22e581ab25fb900568c83773eafa76b556123e06260b4682e3b6c910bab
@@ -4,5 +4,16 @@ sudo: false
4
4
  notifications:
5
5
  email: false
6
6
  rvm:
7
- - 2.2.2
7
+ - 2.4.2
8
+ - 2.3.5
9
+ - 2.2.8
8
10
  before_install: gem install bundler
11
+ before_script:
12
+ - "curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter"
13
+ - "chmod +x ./cc-test-reporter"
14
+ - "./cc-test-reporter before-build"
15
+ after_script:
16
+ - "./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT"
17
+ env:
18
+ global:
19
+ secure: hRsybxCL3vUEhYtEdUIJ6pPyFaeVH/Tc1crVXJ0JCmem/rSv/PHS0jUzb8R4EiQKdwFFDgEciASW71XwpesIoY+KbUPfjvG9M8NnKscSuTpX/9CAVvoEoLzUtHYV5VNx6St2YTb1nStXhvGqBN0y5VNil9t5q9NIEM65eSgZuO7lvzAGgvUHYOkmljHqHb2rXejdAJ5k3NVbKPU3fByGGxvO9SiJ4RLWWpNhCwCWjVlds5+wffiHO2ojWdfLYikaIIcuqZzcyYuKUch16guPfz8+AsYpqHTsf+s81UnNKLk3Ut9zl5JoxCkkTSt1ZzAHNEceR4KXgRYxFZh3uHg8fXrYqdc4A4tgHqsndXeZnEFFnmAlOvjbGldtYoSjzJGBaSxKei9mZbeFy6ytlwZeMp22hBwflFUlbxF/O8IpvSRAq1M4QG1nfEfKCXhyFCmOaeS1BcgcFLzXiDYibCnAfLmK/EMa5V+zo4USjiRmzSBmQFdNk91x+zOGRQOz6lt3s6OEm98FHh/J9Y4tQ9DkkhwS6x9MuSfdjEQkyhvB2xsl9SOfdlU5Ork+FBkRFGlYtiAcHwVa6e0ikJCAGFW2xVqKwq9dT/Wvg4VNtkCmJORdsuxZf/Jtgh2k5gjFi7ZO4mViIxMjIAQqUA/+XR9dFxuAfSZC6FJG4l4ixqvmNoM=
data/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # Env::Vars
2
2
 
3
- [![build status](https://travis-ci.org/fnando/env_vars.svg)](https://travis-ci.org/fnando/env_vars)
3
+ [![Travis-CI](https://travis-ci.org/fnando/env_vars.png)](https://travis-ci.org/fnando/env_vars)
4
+ [![Code Climate](https://codeclimate.com/github/fnando/env_vars/badges/gpa.svg)](https://codeclimate.com/github/fnando/env_vars)
5
+ [![Test Coverage](https://codeclimate.com/github/fnando/env_vars/badges/coverage.svg)](https://codeclimate.com/github/fnando/env_vars/coverage)
6
+ [![Gem](https://img.shields.io/gem/v/env_vars.svg)](https://rubygems.org/gems/env_vars)
7
+ [![Gem](https://img.shields.io/gem/dt/env_vars.svg)](https://rubygems.org/gems/env_vars)
4
8
 
5
9
  Access environment variables. Also includes presence validation, type coercion and default values.
6
10
 
@@ -40,7 +44,8 @@ If you're going to use `env_vars` as your main configuration object, you can als
40
44
  ```ruby
41
45
  Config = Env::Vars.new do
42
46
  optional :redis_url, string, "redis://127.0.0.1"
43
- property :redis, -> { Redis.new }
47
+ property :redis, -> { Redis.new } # pass an object that responds to #call
48
+ property(:now) { Time.now } # or pass a block.
44
49
  end
45
50
 
46
51
  Config.redis.set("key", "value")
@@ -48,6 +53,27 @@ Config.redis.get("key")
48
53
  #=> "value"
49
54
  ```
50
55
 
56
+ Values are cached by default. If you want to dynamically generate new values, set `cache: false`.
57
+
58
+ ```ruby
59
+ Config = Env::Vars.new do
60
+ property(:uuid, cache: false) { SecureRandom.uuid }
61
+ end
62
+ ```
63
+
64
+ ### Types
65
+
66
+ You can coerce values to the following types:
67
+
68
+ - `string`: Is the default. E.g. `optional :name, string`.
69
+ - `int`: E.g. `optional :timeout, int`.
70
+ - `float`: E.g. `optional :wait, float`.
71
+ - `bool`: E.g. `optional :force_ssl, bool`. Any of `yes`, `true` or `1` is considered as `true`. Any other value will be coerced to `false`.
72
+ - `symbol`: E.g. `optional :app_name, symbol`.
73
+ - `array`: E.g. `optional :chars, array` or `optional :numbers, array(int)`. The environment variable must be something like `a,b,c`.
74
+
75
+ ### Dotenv integration
76
+
51
77
  If you're using [dotenv](https://rubygems.org/gems/dotenv), you can simply require `env_vars/dotenv`. This will load environment variables from `.env.local.%{environment}`, `.env.local`, `.env.%{environment}` and `.env` files, respectively. You _must_ add `dotenv` to your `Gemfile`.
52
78
 
53
79
  ```ruby
@@ -77,7 +103,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
77
103
 
78
104
  ## Contributing
79
105
 
80
- Bug reports and pull requests are welcome on GitHub at https://github.com/fnando/env_vars. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
106
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fnando/env_vars. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
81
107
 
82
108
 
83
109
  ## License
@@ -19,4 +19,5 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency "rake", "~> 10.0"
20
20
  spec.add_development_dependency "minitest"
21
21
  spec.add_development_dependency "minitest-utils"
22
+ spec.add_development_dependency "simplecov"
22
23
  end
@@ -1,12 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Env
2
4
  class Vars
3
- VERSION = "0.4.0"
5
+ VERSION = "0.5.0"
4
6
  BOOL_TRUE = ["yes", "true", "1", true]
5
7
  BOOL_FALSE = ["no", "false"]
6
8
 
7
9
  MissingEnvironmentVariable = Class.new(StandardError)
10
+ MissingCallable = Class.new(StandardError)
8
11
 
9
- def initialize(&block)
12
+ def initialize(env = ENV, &block)
13
+ @env = env
10
14
  instance_eval(&block)
11
15
  end
12
16
 
@@ -18,16 +22,8 @@ module Env
18
22
  validate!(env_var, required)
19
23
 
20
24
  define_singleton_method(name) do
21
- value = ENV[env_var] || default
22
-
23
- case type
24
- when bool
25
- BOOL_TRUE.include?(value)
26
- when int
27
- Integer(value) if !BOOL_FALSE.include?(value) && value
28
- else
29
- value
30
- end
25
+ return default unless @env.key?(env_var)
26
+ coerce(type, @env[env_var])
31
27
  end
32
28
 
33
29
  aliases.each do |alias_name|
@@ -36,7 +32,8 @@ module Env
36
32
  end
37
33
 
38
34
  def validate!(env_var, required)
39
- raise MissingEnvironmentVariable, "#{env_var} is not defined" if required && !ENV.key?(env_var)
35
+ return unless required
36
+ raise MissingEnvironmentVariable, "#{env_var} is not defined" unless @env.key?(env_var)
40
37
  end
41
38
 
42
39
  def mandatory(name, type, aliases: [])
@@ -47,9 +44,16 @@ module Env
47
44
  set(name, type, default, aliases: aliases)
48
45
  end
49
46
 
50
- def property(name, func)
51
- value = func.call
52
- define_singleton_method(name) { value }
47
+ def property(name, func = nil, cache: true, &block)
48
+ callable = (func || block)
49
+ raise MissingCallable, "arg[1] must respond to #call or pass a block" unless callable
50
+
51
+ if cache
52
+ value = callable.call
53
+ define_singleton_method(name) { value }
54
+ else
55
+ define_singleton_method(name) { callable.call }
56
+ end
53
57
  end
54
58
 
55
59
  def int
@@ -63,5 +67,51 @@ module Env
63
67
  def bool
64
68
  :bool
65
69
  end
70
+
71
+ def symbol
72
+ :symbol
73
+ end
74
+
75
+ def float
76
+ :float
77
+ end
78
+
79
+ def array(type = string)
80
+ [:array, type]
81
+ end
82
+
83
+ private
84
+
85
+ def coerce_to_string(value)
86
+ value
87
+ end
88
+
89
+ def coerce_to_bool(value)
90
+ BOOL_TRUE.include?(value)
91
+ end
92
+
93
+ def coerce_to_int(value)
94
+ Integer(value) if !BOOL_FALSE.include?(value) && value
95
+ end
96
+
97
+ def coerce_to_float(value)
98
+ Float(value) if value
99
+ end
100
+
101
+ def coerce_to_symbol(value)
102
+ value && value.to_sym
103
+ end
104
+
105
+ def coerce_to_array(value, type)
106
+ value && value.split(/, */).map {|v| coerce(type, v) }
107
+ end
108
+
109
+ def coerce(type, value)
110
+ main_type, sub_type = type
111
+ args = [value]
112
+ args << sub_type if sub_type
113
+
114
+ send("coerce_to_#{main_type}", *args)
115
+ end
66
116
  end
67
117
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: env_vars
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-12 00:00:00.000000000 Z
11
+ date: 2017-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Access environment variables. Also includes presence validation, type
70
84
  coercion and default values.
71
85
  email:
@@ -104,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
118
  version: '0'
105
119
  requirements: []
106
120
  rubyforge_project:
107
- rubygems_version: 2.5.1
121
+ rubygems_version: 2.6.13
108
122
  signing_key:
109
123
  specification_version: 4
110
124
  summary: Access environment variables. Also includes presence validation, type coercion