envconfig 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bab3863c92e99c5ec5099cf70cea3610bff70573
4
- data.tar.gz: ab4889f5e57ec968e69132bce59c0c1e1e062059
3
+ metadata.gz: 4ae15014bb2a42caac46541701ad0eeedecf4945
4
+ data.tar.gz: 291af5950eae465a0ebe2a411374ddcde9ddff16
5
5
  SHA512:
6
- metadata.gz: f2635ee6821835730fbe326bd40eebde910429ead9346034740bcfe0d2be969dfdd20a1083692054f5321e315538d9395cd516a1a9cff204073a8770591ef227
7
- data.tar.gz: e17b8d96f140dc99061f40f3d5f5e1eb68158fc5ebfa80ae6c692a70f6066c35c7a57637288ee76174ad81e7ddbc4c037a8bb7e0086f0be05cce3998463b2da1
6
+ metadata.gz: 5d227e3a0307aad586efe1dc3c81ee7f089920fbea191ff6e0f00a9659f7c6c8089745e1fda711d56316e299446b4c307d8eb7db809d1077a6033deaaf02265b
7
+ data.tar.gz: 9ef22e14457b7fc0297061d0a9a97fb1f1cf1bf45701d8dbb4c5135772cc3082cf1aa2ede4163a99699e9c0e0fc544c3fd76eaff034bc462a7f4b558c8cf5fc4
data/README.md CHANGED
@@ -17,12 +17,13 @@ POSTMARK_API_KEY="bcca0a78abbaed6533f3c8017b804bda"
17
17
  Then envconfig's SMTP configuration will look like this:
18
18
 
19
19
  ```ruby
20
- Envconfig.load(ENV).smtp.to_h # =>
20
+ Envconfig.load.smtp.to_h # =>
21
21
  {
22
- "address" => "smtp.example.org",
23
- "port" => 25,
24
- "username" => "bcca0a78abbaed6533f3c8017b804bda",
25
- "password" => "bcca0a78abbaed6533f3c8017b804bda",
22
+ port: "25",
23
+ authentication: :plain,
24
+ address: "smtp.example.org",
25
+ user_name: "bcca0a78abbaed6533f3c8017b804bda",
26
+ password: "bcca0a78abbaed6533f3c8017b804bda"
26
27
  }
27
28
  ```
28
29
 
@@ -41,17 +42,106 @@ or `gem install envconfig`.
41
42
  Add `envconfig-rails` to your `Gemfile` and go.
42
43
 
43
44
  If you're not using Rails, add the base `envconfig` gem, and access the
44
- normalized configuration directly.
45
+ configuration like this:
46
+
47
+ ```ruby
48
+ Envconfig.load.smtp[:address] => "example.org"
49
+ Envconfig.load.smtp.to_h # => {address: "example.org", ...}
50
+ ```
45
51
 
46
52
 
47
53
  ## Supported Add-ons
48
54
 
55
+ ### Database
56
+
57
+ * Generic (`DATABASE_URL` in `ENV`)
58
+
59
+ Database example:
60
+
61
+ ```ruby
62
+ ENV["DATABASE_URL"] = "postgres://ab:secret@example.org:1234/db?encoding=utf-8"
63
+
64
+ Envconfig.load.database.to_h # =>
65
+ {
66
+ url: "postgres://ab:secret@example.org:1234/db?encoding=utf-8",
67
+ adapter: "postgresql",
68
+ database: "db",
69
+ username: "ab",
70
+ password: "secret",
71
+ host: "example.org",
72
+ port: 1234,
73
+ encoding: "utf-8"
74
+ }
75
+
76
+
77
+ ```
78
+
79
+
49
80
  ### SMTP
50
81
 
51
82
  * Postmark ([Broadstack](https://broadstack.com/addons/postmark), [Heroku](https://addons.heroku.com/postmark))
52
83
  * Mandrill ([Heroku](https://addons.heroku.com/mandrill))
53
84
  * SendGrid ([Heroku](https://addons.heroku.com/sendgrid))
54
- * Custom (`SMTP_HOST`, `SMTP_PORT`, `SMTP_USERNAME`, `SMTP_PASSWORD` in `ENV`)
85
+ * Mailgun ([Heroku](https://address.Heroku.com/mailgun))
86
+ * Generic (`SMTP_HOST`, `SMTP_PORT`, `SMTP_USERNAME`, `SMTP_PASSWORD` in `ENV`)
87
+
88
+ SMTP example:
89
+
90
+ ```ruby
91
+ ENV["MANDRILL_USERNAME"] = "mandrilluser"
92
+ ENV["MANDRILL_APIKEY"] = SecureRandom.hex
93
+
94
+ Envconfig.load.smtp.to_h # =>
95
+ {
96
+ address: "smtp.mandrillapp.com",
97
+ port: "587",
98
+ user_name: "mandrilluser",
99
+ password: "14941007dfdc2af76e2fafe1383cf33b"
100
+ }
101
+ ```
102
+
103
+ ### memcached
104
+
105
+ * MemCachier ([Broadstack](https://broadstack.com/addons/memcachier), [Heroku](https://addons.heroku.com/memcachier))
106
+
107
+ memcached example:
108
+
109
+ ```ruby
110
+ ENV["MEMCACHIER_SERVERS"] = "a.example.org:11211,b.example.com:11211"
111
+ ENV["MEMCACHIER_USERNAME"] = "memcachieruser"
112
+ ENV["MEMCACHIER_PASSWORD"] = SecureRandom.hex
113
+
114
+ Envconfig.load.memcached.to_h # =>
115
+ {
116
+ servers: "a.example.org:11211,b.example.com:11211",
117
+ username: "memcachieruser",
118
+ password: "9d1d72d6828ed59bab3d1496da71ba59",
119
+ server_strings: ["a.example.org:11211", "b.example.com:11211"]
120
+ }
121
+ ```
122
+
123
+
124
+ ### Redis
125
+
126
+ * openredis ([Heroku](https://addons.heroku.com/openredis))
127
+ * RedisCloud ([Heroku](https://addons.heroku.com/rediscloud))
128
+ * RedisGreen ([Heroku](https://addons.heroku.com/redisgreen))
129
+ * Redis To Go ([Heroku](https://addons.heroku.com/redistogo))
130
+
131
+ Redis example:
132
+
133
+ ```ruby
134
+ ENV["OPENREDIS_URL"] = "redis://:secrettoken@127.0.0.1:6379"
135
+
136
+ Envconfig.load.redis.to_h # =>
137
+ {
138
+ url: "redis://:secrettoken@127.0.0.1:6379",
139
+ host: "127.0.0.1",
140
+ port: 6379,
141
+ user: "",
142
+ password: "secrettoken",
143
+ }
144
+ ```
55
145
 
56
146
 
57
147
  ## Contributing
@@ -0,0 +1,32 @@
1
+ module Envconfig
2
+ class Database
3
+
4
+ include Service
5
+
6
+ def self.providers
7
+ [
8
+ Generic,
9
+ ]
10
+ end
11
+
12
+ class Generic
13
+ include Provider
14
+ def mapping
15
+ {url: "DATABASE_URL"}
16
+ end
17
+ def filter_config(config)
18
+ url = UrlParser.new(config[:url])
19
+ parts = url.extract_as(
20
+ adapter: ->(u){ (u.scheme || "").sub(/\Apostgres\z/, "postgresql") },
21
+ database: ->(u){ (u.path || "").split("/")[1] },
22
+ username: :user,
23
+ password: :password,
24
+ host: :host,
25
+ port: :port,
26
+ )
27
+ config.merge!(parts).merge!(url.query_values)
28
+ end
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ module Envconfig
2
+ class Memcached
3
+
4
+ include Service
5
+
6
+ def self.providers
7
+ [
8
+ Memcachier,
9
+ ]
10
+ end
11
+
12
+ class Memcachier
13
+ include Provider
14
+ def name; "MemCachier" end
15
+ def mapping
16
+ {
17
+ servers: "MEMCACHIER_SERVERS",
18
+ username: "MEMCACHIER_USERNAME",
19
+ password: "MEMCACHIER_PASSWORD",
20
+ }
21
+ end
22
+ def filter_config(hash)
23
+ hash.merge!(
24
+ server_strings: hash[:servers].split(",")
25
+ )
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -42,7 +42,12 @@ module Envconfig
42
42
 
43
43
  # The configuration derived from the environment for this provider.
44
44
  def config
45
- static.merge(dynamic)
45
+ filter_config(static.merge(dynamic))
46
+ end
47
+
48
+ # A hook for arbitrary changes to the config hash.
49
+ def filter_config(config)
50
+ config
46
51
  end
47
52
 
48
53
  private
@@ -0,0 +1,61 @@
1
+ require "uri"
2
+
3
+ module Envconfig
4
+ class Redis
5
+
6
+ include Service
7
+
8
+ def self.providers
9
+ [
10
+ Openredis,
11
+ Rediscloud,
12
+ Redisgreen,
13
+ Redistogo,
14
+ ]
15
+ end
16
+
17
+ module ConfigFilter
18
+ def filter_config(config)
19
+ url = UrlParser.new(config[:url])
20
+ config.merge!(url.extract(:host, :port, :user, :password))
21
+ end
22
+ end
23
+
24
+ class Openredis
25
+ include Provider
26
+ include ConfigFilter
27
+ def name; "openredis" end
28
+ def mapping
29
+ {url: "OPENREDIS_URL"}
30
+ end
31
+ end
32
+
33
+ class Rediscloud
34
+ include Provider
35
+ include ConfigFilter
36
+ def name; "Redis Cloud" end
37
+ def mapping
38
+ {url: "REDISCLOUD_URL"}
39
+ end
40
+ end
41
+
42
+ class Redisgreen
43
+ include Provider
44
+ include ConfigFilter
45
+ def name; "RedisGreen" end
46
+ def mapping
47
+ {url: "REDISGREEN_URL"}
48
+ end
49
+ end
50
+
51
+ class Redistogo
52
+ include Provider
53
+ include ConfigFilter
54
+ def name; "Redis To Go" end
55
+ def mapping
56
+ {url: "REDISTOGO_URL"}
57
+ end
58
+ end
59
+
60
+ end
61
+ end
@@ -5,7 +5,8 @@ module Envconfig
5
5
 
6
6
  def self.providers
7
7
  [
8
- Custom,
8
+ Generic,
9
+ Mailgun,
9
10
  Mandrill,
10
11
  Postmark,
11
12
  Sendgrid,
@@ -13,7 +14,7 @@ module Envconfig
13
14
  end
14
15
 
15
16
  # A custom configuration, for local or self-managed SMTP servers.
16
- class Custom
17
+ class Generic
17
18
  include Provider
18
19
  def valid?
19
20
  mapping.values.any? { |k| env.key?(k) } #any? instead of #all?
@@ -28,6 +29,18 @@ module Envconfig
28
29
  end
29
30
  end
30
31
 
32
+ class Mailgun
33
+ include Provider
34
+ def mapping
35
+ {
36
+ port: "MAILGUN_SMTP_PORT",
37
+ address: "MAILGUN_SMTP_SERVER",
38
+ user_name: "MAILGUN_SMTP_LOGIN",
39
+ password: "MAILGUN_SMTP_PASSWORD",
40
+ }
41
+ end
42
+ end
43
+
31
44
  class Mandrill
32
45
  include Provider
33
46
  def mapping
@@ -0,0 +1,50 @@
1
+ require "uri"
2
+ require "cgi"
3
+
4
+ module Envconfig
5
+ class UrlParser
6
+
7
+ def initialize(url)
8
+ @url = url
9
+ end
10
+
11
+ # Extract the given keys verbatim from the URL.
12
+ # These map to public instance methods on URI.
13
+ def extract(*keys)
14
+ keys.inject({}) do |hash, key|
15
+ hash.merge!(key => parsed_url.public_send(key))
16
+ end
17
+ end
18
+
19
+ # Extract and rename the given keys.
20
+ # The mapping keys are the wanted keys, the mapping values
21
+ # are public instance methods on URI.
22
+ def extract_as(mapping)
23
+ mapping.inject({}) do |hash, (key, method)|
24
+ hash.merge!(key => extract_value(method))
25
+ end
26
+ end
27
+
28
+ # Query string as hash with symbol keys.
29
+ def query_values
30
+ CGI.parse(parsed_url.query || "").inject({}) do |hash, (key, values)|
31
+ hash.merge!(key.to_sym => values.first)
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def parsed_url
38
+ @_parsed_url ||= URI.parse(@url)
39
+ end
40
+
41
+ def extract_value(method)
42
+ if method.respond_to?(:call)
43
+ method.call(parsed_url)
44
+ else
45
+ parsed_url.public_send(method)
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module Envconfig
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/envconfig.rb CHANGED
@@ -1,11 +1,17 @@
1
- require "envconfig/provider"
2
1
  require "envconfig/service"
2
+ require "envconfig/provider"
3
+ require "envconfig/url_parser"
4
+
5
+ require "envconfig/database"
6
+ require "envconfig/memcached"
7
+ require "envconfig/redis"
3
8
  require "envconfig/smtp"
9
+
4
10
  require "envconfig/version"
5
11
 
6
12
  module Envconfig
7
13
 
8
- def self.load(env)
14
+ def self.load(env = ENV)
9
15
  Root.new(env)
10
16
  end
11
17
 
@@ -13,14 +19,60 @@ module Envconfig
13
19
 
14
20
  def initialize(env)
15
21
  @env = env
22
+ @_services = {}
23
+ end
24
+
25
+ def to_h
26
+ [
27
+ :database,
28
+ :memcached,
29
+ :redis,
30
+ :smtp,
31
+ ].inject({}) do |hash, service|
32
+ hash.merge!(service => public_send(service).to_h)
33
+ end
34
+ end
35
+
36
+ def database
37
+ service_for(:database, Database)
38
+ end
39
+
40
+ def database?
41
+ predicate_for(:database)
42
+ end
43
+
44
+ def memcached
45
+ service_for(:memcached, Memcached)
46
+ end
47
+
48
+ def memcached?
49
+ predicate_for(:memcached)
50
+ end
51
+
52
+ def redis
53
+ service_for(:redis, Redis)
54
+ end
55
+
56
+ def redis?
57
+ predicate_for(:redis)
16
58
  end
17
59
 
18
60
  def smtp
19
- @_smtp ||= ::Envconfig::Smtp.new(@env)
61
+ service_for(:smtp, Smtp)
20
62
  end
21
63
 
22
64
  def smtp?
23
- smtp.to_h.any?
65
+ predicate_for(:smtp)
66
+ end
67
+
68
+ private
69
+
70
+ def service_for(name, klass)
71
+ @_services[name] || klass.new(@env)
72
+ end
73
+
74
+ def predicate_for(name)
75
+ public_send(name).to_h.any?
24
76
  end
25
77
 
26
78
  end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe "database configuration" do
4
+
5
+ database_url = "postgres://user:pass@example.org:5432/db?a=b&c=d"
6
+
7
+ let(:env) { {} }
8
+ let(:config) { Envconfig.load(env).database }
9
+
10
+ context "with nothing relevant in ENV" do
11
+ it_behaves_like "empty configuration"
12
+ end
13
+
14
+ context "with DATABASE_URL='#{database_url}' in ENV" do
15
+ before do
16
+ env["DATABASE_URL"] = database_url
17
+ end
18
+
19
+ {
20
+ url: database_url,
21
+ adapter: "postgresql", # transformed like heroku-buildpack-ruby
22
+ database: "db",
23
+ username: "user",
24
+ password: "pass",
25
+ host: "example.org",
26
+ port: 5432,
27
+ a: "b",
28
+ c: "d",
29
+ }.each do |key, value|
30
+ it "sets :#{key} to #{value.inspect}" do
31
+ expect(config[key]).to eq(value)
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe Envconfig do
4
+
5
+ it "loads from an ENV-like hash" do
6
+ result = Envconfig.load({"KEY" => "value"})
7
+ expect(result.class).to eq(Envconfig::Root)
8
+ end
9
+
10
+ # I don't want to modify or make assumptions about ENV,
11
+ # but at least test that Envconfig.load() handles zero arguments.
12
+ it "loads without an argument (defaulting to ENV)" do
13
+ result = Envconfig.load()
14
+ expect(result.class).to eq(Envconfig::Root)
15
+ end
16
+
17
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe "memcached configuration" do
4
+
5
+ let(:env) { {} }
6
+ subject(:config) { Envconfig.load(env).memcached }
7
+
8
+ context "with nothing relevant in ENV" do
9
+ it_behaves_like "empty configuration"
10
+ end
11
+
12
+ context "with MemCachier in ENV" do
13
+ before do
14
+ env["MEMCACHIER_SERVERS"] = "m1.example.org:11211,m2.example.org:11211"
15
+ env["MEMCACHIER_USERNAME"] = "memcachieruser"
16
+ env["MEMCACHIER_PASSWORD"] = "memcachierpass"
17
+ end
18
+
19
+ {
20
+ servers: "m1.example.org:11211,m2.example.org:11211",
21
+ username: "memcachieruser",
22
+ password: "memcachierpass",
23
+ server_strings: ["m1.example.org:11211", "m2.example.org:11211"],
24
+ }.each do |key, value|
25
+ it "sets :#{key} to #{value.inspect}" do
26
+ expect(config[key]).to eq(value)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe "redis configuration" do
4
+
5
+ let(:env) { {} }
6
+ subject(:config) { Envconfig.load(env).redis }
7
+
8
+ context "with nothing relevant in ENV" do
9
+ it_behaves_like "empty configuration"
10
+ end
11
+
12
+ %w{
13
+ OPENREDIS_URL
14
+ REDISCLOUD_URL
15
+ REDISGREEN_URL
16
+ REDISTOGO_URL
17
+ }.each do |env_key|
18
+ it_behaves_like "redis configuration", env_key
19
+ end
20
+
21
+ end
data/spec/root_spec.rb CHANGED
@@ -3,27 +3,120 @@ require "spec_helper"
3
3
  describe Envconfig::Root do
4
4
 
5
5
  let(:env) { {} }
6
- subject(:root) { Envconfig.load(env) }
6
+ subject(:root) { Envconfig::Root.new(env) }
7
7
 
8
8
  context "with nothing in ENV" do
9
9
 
10
- describe "#smtp?" do
11
- it "is false" do
12
- expect(root.smtp?).to eq(false)
10
+ service_methods = [
11
+ :database,
12
+ :memcached,
13
+ :redis,
14
+ :smtp,
15
+ ]
16
+
17
+ service_methods.each do |service_method|
18
+ predicate_method = :"#{service_method}?"
19
+
20
+ describe "##{predicate_method}" do
21
+ it "is false" do
22
+ expect(root.public_send(predicate_method)).to eq(false)
23
+ end
13
24
  end
14
- end
15
25
 
16
- describe "#smtp" do
17
- [:to_h, :provider, :[]].each do |m|
18
- it "responds to :#{m}" do
19
- expect(root.smtp.respond_to?(m)).to eq(true)
26
+ describe "##{service_method}" do
27
+ [:to_h, :provider, :[]].each do |m|
28
+ it "claims to respond to :#{m}" do
29
+ expect(root.smtp.respond_to?(m)).to eq(true)
30
+ end
31
+ end
32
+ it "has an empty #to_h result" do
33
+ expect(root.smtp.to_h).to eq({})
34
+ end
35
+ it "responds to #provider with an object with no name" do
36
+ expect(root.smtp.provider.name).to eq(nil)
20
37
  end
21
38
  end
22
- it "has an empty #to_h result" do
23
- expect(root.smtp.to_h).to eq({})
39
+ end
40
+
41
+ describe "#to_h" do
42
+ it "returns a nested hash of all configuration" do
43
+ expect(root.to_h).to eq(
44
+ database: {},
45
+ memcached: {},
46
+ redis: {},
47
+ smtp: {},
48
+ )
24
49
  end
25
50
  end
26
51
 
27
52
  end
28
53
 
54
+ context "with all of the things in ENV" do
55
+ let(:env) do
56
+ # Note: actual precedence is defined in the service classes,
57
+ # generally based on alphabetical sorting.
58
+ # This example ENV intentionally mixes up the precedence ordering.
59
+ # e.g. the Redis services match their actual precedence,
60
+ # but the SMTP services reverse their actual precedence.
61
+ {
62
+ "DATABASE_URL" => "postgres://u:p@db.example.org:1234/db",
63
+ "MEMCACHIER_SERVERS" => "mc.example.org:11211",
64
+ "MEMCACHIER_USERNAME" => "mcuser",
65
+ "MEMCACHIER_PASSWORD" => "mcpass",
66
+ "OPENREDIS_URL" => "redis://:orpass@or.example.org:2345",
67
+ "REDISTOGO_URL" => "redis://:rtgpass@rtg.example.org:3456",
68
+ "SENDGRID_USERNAME" => "sguser",
69
+ "SENDGRID_PASSWORD" => "sgpass",
70
+ "POSTMARK_SMTP_SERVER" => "pm.example.org",
71
+ "POSTMARK_API_KEY" => "pmkey",
72
+ }
73
+ end
74
+
75
+ {
76
+ database: "Generic",
77
+ memcached: "MemCachier",
78
+ redis: "openredis",
79
+ smtp: "Postmark"
80
+ }.each do |service, name|
81
+ it "configures #{service} with #{name}" do
82
+ expect(root.public_send(service).provider.name).to eq(name)
83
+ end
84
+ end
85
+
86
+ it "has a giant #to_h" do
87
+ expect(root.to_h).to eq(
88
+ database: {
89
+ url: "postgres://u:p@db.example.org:1234/db",
90
+ adapter: "postgresql",
91
+ database: "db",
92
+ username: "u",
93
+ password: "p",
94
+ host: "db.example.org",
95
+ port: 1234
96
+ },
97
+ memcached: {
98
+ servers: "mc.example.org:11211",
99
+ username: "mcuser",
100
+ password: "mcpass",
101
+ server_strings: ["mc.example.org:11211"]
102
+ },
103
+ redis: {
104
+ url: "redis://:orpass@or.example.org:2345",
105
+ host: "or.example.org",
106
+ port: 2345,
107
+ user: "",
108
+ password: "orpass"
109
+ },
110
+ smtp: {
111
+ port: "25",
112
+ authentication: :plain,
113
+ address: "pm.example.org",
114
+ user_name: "pmkey",
115
+ password: "pmkey"
116
+ }
117
+ )
118
+ end
119
+
120
+ end
121
+
29
122
  end
@@ -0,0 +1,37 @@
1
+ shared_examples "empty configuration" do
2
+
3
+ it "returns nil for keys" do
4
+ [:url, :test].each do |k|
5
+ expect(config[k]).to eq(nil)
6
+ end
7
+ end
8
+
9
+ it "responds to #to_h with empty hash" do
10
+ expect(config.to_h).to eq({})
11
+ end
12
+
13
+ it "has nil provider name" do
14
+ expect(config.provider.name).to eq(nil)
15
+ end
16
+
17
+ end
18
+
19
+ shared_examples "redis configuration" do |env_key|
20
+ context "with openredis in ENV" do
21
+ before do
22
+ env[env_key] = "redis://:secrettoken@127.0.0.1:1234"
23
+ end
24
+
25
+ {
26
+ url: "redis://:secrettoken@127.0.0.1:1234",
27
+ host: "127.0.0.1",
28
+ port: 1234,
29
+ user: "",
30
+ password: "secrettoken",
31
+ }.each do |key, value|
32
+ it "sets :#{key} to #{value.inspect}" do
33
+ expect(config[key]).to eq(value)
34
+ end
35
+ end
36
+ end
37
+ end
data/spec/smtp_spec.rb CHANGED
@@ -6,16 +6,26 @@ describe "SMTP configuration" do
6
6
  subject(:config) { Envconfig.load(env).smtp }
7
7
 
8
8
  context "with nothing relevant in ENV" do
9
- it "returns nil for keys" do
10
- [:address, :port, :user_name, :password].each do |k|
11
- expect(config[k]).to eq(nil)
12
- end
9
+ it_behaves_like "empty configuration"
10
+ end
11
+
12
+ context "with Mailgun in ENV" do
13
+ before do
14
+ env['MAILGUN_SMTP_PORT'] = 2468
15
+ env['MAILGUN_SMTP_SERVER'] = "mailgun.example.org"
16
+ env['MAILGUN_SMTP_LOGIN'] = "mailgunuser"
17
+ env['MAILGUN_SMTP_PASSWORD'] = "a493216c9ced751d6bc38fd6f5c3930b"
13
18
  end
14
- it "responds to #to_h with empty hash" do
15
- expect(config.to_h).to eq({})
19
+ it "identifies as Mailgun" do
20
+ expect(config.provider.name).to eq("Mailgun")
16
21
  end
17
- it "has nil provider name" do
18
- expect(config.provider.name).to eq(nil)
22
+ it "sets port, address, user_name, password" do
23
+ expect(config.to_h).to eq(
24
+ address: "mailgun.example.org",
25
+ port: 2468,
26
+ user_name: "mailgunuser",
27
+ password: "a493216c9ced751d6bc38fd6f5c3930b",
28
+ )
19
29
  end
20
30
  end
21
31
 
@@ -27,7 +37,7 @@ describe "SMTP configuration" do
27
37
  it "sets address, port, user_name, password" do
28
38
  expect(config.to_h).to eq(
29
39
  address: "smtp.mandrillapp.com",
30
- port: "25",
40
+ port: "587",
31
41
  user_name: "mandrilluser",
32
42
  password: "mandrillkey",
33
43
  )
data/spec/spec_helper.rb CHANGED
@@ -1 +1,3 @@
1
1
  require "envconfig"
2
+
3
+ require "shared_examples"
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ module Envconfig
4
+ describe UrlParser do
5
+
6
+ let(:url) { "postgres://john:pass@a.example.org:1234/db?a=b&c=d" }
7
+ subject(:parser) { UrlParser.new(url) }
8
+
9
+ describe "#extract" do
10
+ it "returns hash of requested keys" do
11
+ expect(parser.extract(:password, :host, :port)).to eq(
12
+ password: "pass",
13
+ host: "a.example.org",
14
+ port: 1234
15
+ )
16
+ end
17
+ end
18
+
19
+ describe "#extract_as" do
20
+ it "returns hash with renamed keys" do
21
+ result = parser.extract_as(
22
+ adapter: ->(u){ u.scheme.sub(/\Apostgres\z/, "postgresql") },
23
+ username: :user,
24
+ port: :port,
25
+ )
26
+ expect(result).to eq(
27
+ adapter: "postgresql",
28
+ username: "john",
29
+ port: 1234,
30
+ )
31
+ end
32
+ end
33
+
34
+ describe "#query_values" do
35
+ it "returns query string as a hash with symbol keys" do
36
+ expect(parser.query_values).to eq(
37
+ a: "b",
38
+ c: "d"
39
+ )
40
+ end
41
+ end
42
+
43
+ end
44
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: envconfig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Annesley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-15 00:00:00.000000000 Z
11
+ date: 2013-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,15 +70,25 @@ files:
70
70
  - envconfig.gemspec
71
71
  - lib/envconfig-rails.rb
72
72
  - lib/envconfig.rb
73
+ - lib/envconfig/database.rb
74
+ - lib/envconfig/memcached.rb
73
75
  - lib/envconfig/provider.rb
74
76
  - lib/envconfig/railtie.rb
77
+ - lib/envconfig/redis.rb
75
78
  - lib/envconfig/service.rb
76
79
  - lib/envconfig/smtp.rb
80
+ - lib/envconfig/url_parser.rb
77
81
  - lib/envconfig/version.rb
82
+ - spec/database_spec.rb
83
+ - spec/envconfig_spec.rb
84
+ - spec/memcached_spec.rb
78
85
  - spec/provider_resolver_spec.rb
86
+ - spec/redis_spec.rb
79
87
  - spec/root_spec.rb
88
+ - spec/shared_examples.rb
80
89
  - spec/smtp_spec.rb
81
90
  - spec/spec_helper.rb
91
+ - spec/url_parser_spec.rb
82
92
  homepage: https://github.com/broadstack/envconfig
83
93
  licenses:
84
94
  - MIT
@@ -104,8 +114,14 @@ signing_key:
104
114
  specification_version: 4
105
115
  summary: Connect your app to backing services via Broadstack/Heroku-style ENV vars.
106
116
  test_files:
117
+ - spec/database_spec.rb
118
+ - spec/envconfig_spec.rb
119
+ - spec/memcached_spec.rb
107
120
  - spec/provider_resolver_spec.rb
121
+ - spec/redis_spec.rb
108
122
  - spec/root_spec.rb
123
+ - spec/shared_examples.rb
109
124
  - spec/smtp_spec.rb
110
125
  - spec/spec_helper.rb
126
+ - spec/url_parser_spec.rb
111
127
  has_rdoc: