savvy 0.1.1 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +11 -3
- data/lib/savvy.rb +1 -0
- data/lib/savvy/configuration.rb +7 -1
- data/lib/savvy/configurators/redis.rb +123 -8
- data/lib/savvy/error.rb +5 -0
- data/lib/savvy/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28fa85fba714b4b39fd3723a0e82d9e9f8cc738f
|
4
|
+
data.tar.gz: 62d432c2a84b8b971f22470e8e31b22956e712d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36c6c67963c9becef1b00424d30ac738e6de263ba21bff7b9dda27d2b90a7944237ead68804e6a3e7a001775d2015588644c12faaff663d287b7749494388e74
|
7
|
+
data.tar.gz: 9d6df66f86c22c58e82fc24951fdf2e88e606ffc6344958f391b510a15147d9ba1dd8a57f1452d7962f0ec828c229c6b1e29c1a951d47a95747e3eefb4579808
|
data/.travis.yml
CHANGED
@@ -3,7 +3,15 @@ dist: trusty
|
|
3
3
|
cache: bundler
|
4
4
|
language: ruby
|
5
5
|
rvm:
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
- 2.2
|
7
|
+
- 2.3
|
8
|
+
- 2.4.0
|
9
9
|
before_install: gem install bundler -v 1.14.6
|
10
|
+
services:
|
11
|
+
- redis-server
|
12
|
+
notifications:
|
13
|
+
email:
|
14
|
+
on_success: never
|
15
|
+
on_failure: always
|
16
|
+
slack:
|
17
|
+
secure: d4aMjEF4rS1UGUilgyxObX/t1ZGJfrunNbZiDTssB2GjRvg1g6Z9sO3YrslK4BHlW+PcijDvH7eIhGheOgKA21LaPSnxlp/rqzPeIEh0yEZMmto2rPwecQicIjq0vu1C/EV/HPv8twzX65YpBYQHf9xZnX9y54J7QRrYpKIogJoEFsErwqOGvjQA4cWCfQQH3TdDrg+NdayMaWFiINdMNGqyIE1pxM80m2bT+nlE6o+YxOBd1lZZgh+3+Mm7r8PLjq3q7U8U3Avw+dS45PoEXQbnoKpdaXR5SUWRFyx+uH5itygiYb6F6rpPG9xuM7iUzz7PIJsRRkPO7tVXCPvlmGgWEiTFDEGc9Tsw9Kp739iGplWKtOBQzbrvf9mJfV/gViJdOpfpCOG5JCJWqTK8iSHe/m1LA36NOFll7tzd1NR6QBPLN4nb2y3bYjFdDlEh5N91ftIJAhkJEvg0+uMRZb4gd2ez4KxwzfGXSyYjS3HswBXmeCHuLFsEWyHaq5KjSdA3DfREUdU7B8PwP0sbEvTnzCKMnrUem4RJMwhNg8A+TtbXqLJsrxfjbKA0TkPNKpHqos74BJ+kh+ZvfnR7gD3yuG/WCXAIYzx4ET7OY97etpaqK3qVDrz/Bd1K/SEh4TtCE+lMkk6tFMtse6kUgg+tBzpA4mKkl0yVUoEMQfE=
|
data/lib/savvy.rb
CHANGED
data/lib/savvy/configuration.rb
CHANGED
@@ -43,9 +43,15 @@ module Savvy
|
|
43
43
|
load_from_file!
|
44
44
|
end
|
45
45
|
|
46
|
+
# Build a namespace that takes environmental and application factors into account.
|
47
|
+
#
|
48
|
+
# @param [<String>] parts additional parts that will be suffixed after the generated namespace
|
49
|
+
# @param [String] prefix a component that will appear before the savvy-generated namepsace
|
50
|
+
# @param [String] separator what separates the components used in the namespace
|
46
51
|
# @return [String]
|
47
|
-
def build_namespace(*parts, separator: ?.)
|
52
|
+
def build_namespace(*parts, prefix: nil, separator: ?.)
|
48
53
|
[
|
54
|
+
prefix,
|
49
55
|
app_name,
|
50
56
|
( app_env if include_app_env? ),
|
51
57
|
*parts
|
@@ -3,41 +3,156 @@ module Savvy
|
|
3
3
|
class Redis
|
4
4
|
DEFAULT_SEPARATOR = ?:
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
PATH_PATTERN = %r{\A/(?<db>\d{1,2})(?:/(?<namespace_prefix>[^/]+))?}
|
7
|
+
|
8
|
+
# This is the namespace portion of a redis URI that
|
9
|
+
# is possibly set by the environment and will prefix
|
10
|
+
# the Savvy-generated namespace.
|
11
|
+
#
|
12
|
+
# @return [String, nil]
|
13
|
+
attr_reader :namespace_prefix
|
9
14
|
|
10
15
|
# @param [Savvy::Config] config
|
11
16
|
def initialize(config: Savvy.config)
|
12
17
|
@config = config
|
13
|
-
|
18
|
+
|
19
|
+
@db = 0
|
20
|
+
@namespace_prefix = nil
|
21
|
+
|
22
|
+
parse_url!
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param [<String>] parts
|
26
|
+
# @param [Boolean] without_namespace return a configuration hash *only* as defined
|
27
|
+
# @return [{Symbol => Object}]
|
28
|
+
def config_hash(*parts, without_namespace: false)
|
29
|
+
check_validity!
|
30
|
+
|
31
|
+
{
|
32
|
+
host: @host,
|
33
|
+
port: @port,
|
34
|
+
db: @db,
|
35
|
+
}.tap do |h|
|
36
|
+
ns = without_namespace ? @namespace_prefix : namespace(*parts)
|
37
|
+
|
38
|
+
h[:namespace] = ns unless ns.nil?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
alias to_h config_hash
|
43
|
+
|
44
|
+
# @!attribute [r] db
|
45
|
+
# The database number used by redis.
|
46
|
+
# @return [Integer]
|
47
|
+
def db
|
48
|
+
check_validity!
|
49
|
+
|
50
|
+
@db
|
51
|
+
end
|
52
|
+
|
53
|
+
# @!attribute [r] host
|
54
|
+
# @return [String]
|
55
|
+
def host
|
56
|
+
check_validity!
|
57
|
+
|
58
|
+
@host
|
14
59
|
end
|
15
60
|
|
16
61
|
def namespace(*parts, separator: DEFAULT_SEPARATOR)
|
17
|
-
|
62
|
+
check_validity!
|
63
|
+
|
64
|
+
@config.build_namespace(*parts, prefix: @namespace_prefix, separator: separator)
|
18
65
|
end
|
19
66
|
|
67
|
+
# @param [<String>] parts parts to add to the namespace
|
68
|
+
# @return [String]
|
20
69
|
def namespaced_url(*parts)
|
21
|
-
|
70
|
+
check_validity!
|
71
|
+
|
72
|
+
build_redis_url *parts
|
73
|
+
end
|
74
|
+
|
75
|
+
# @!attribute [r] port
|
76
|
+
# @return [Integer]
|
77
|
+
def port
|
78
|
+
check_validity!
|
79
|
+
|
80
|
+
@port
|
81
|
+
end
|
82
|
+
|
83
|
+
# The url as configured by the environment (sans namespace)
|
84
|
+
#
|
85
|
+
# @return [String]
|
86
|
+
def url
|
87
|
+
check_validity!
|
88
|
+
|
89
|
+
build_redis_url without_namespace: true
|
22
90
|
end
|
23
91
|
|
24
92
|
# @return [ConnectionPool]
|
25
93
|
def build_connection_pool(*namespace_parts, size: 5, timeout: 5)
|
26
|
-
raise 'Requires connection_pool gem' unless defined?(ConnectionPool)
|
94
|
+
raise Savvy::RedisError, 'Requires connection_pool gem' unless defined?(ConnectionPool)
|
27
95
|
|
28
96
|
::ConnectionPool.new size: size, timeout: timeout do
|
29
97
|
build_connection(*namespace_parts)
|
30
98
|
end
|
31
99
|
end
|
32
100
|
|
101
|
+
# @return [Redis::Namespace]
|
33
102
|
def build_connection(*namespace_parts)
|
34
|
-
raise 'Requires redis-namespace gem' unless defined?(::Redis::Namespace)
|
103
|
+
raise Savvy::RedisError, 'Requires redis-namespace gem' unless defined?(::Redis::Namespace)
|
35
104
|
|
36
105
|
::Redis::Namespace.new(namespace(*namespace_parts), redis: ::Redis.new(url: url))
|
37
106
|
end
|
38
107
|
|
108
|
+
def valid?
|
109
|
+
@error.nil?
|
110
|
+
end
|
111
|
+
|
39
112
|
private
|
40
113
|
|
114
|
+
# @return [String]
|
115
|
+
def build_redis_url(*parts, without_namespace: false)
|
116
|
+
ns = without_namespace ? @namespace_prefix : namespace(*parts)
|
117
|
+
|
118
|
+
path = ?/ + [db, ns].compact.join(?/)
|
119
|
+
|
120
|
+
URI.join(@base_uri, path).to_s
|
121
|
+
end
|
122
|
+
|
123
|
+
def check_validity!
|
124
|
+
raise Savvy::RedisError, "Redis configuration is invalid: #{@error}", caller unless valid?
|
125
|
+
end
|
126
|
+
|
127
|
+
# @return [void]
|
128
|
+
def parse_url!
|
129
|
+
@provided_url = read_url_from_config.freeze
|
130
|
+
|
131
|
+
@parsed_url = URI.parse @provided_url
|
132
|
+
|
133
|
+
@host = @parsed_url.host
|
134
|
+
@port = @parsed_url.port
|
135
|
+
|
136
|
+
path_match = PATH_PATTERN.match @parsed_url.path
|
137
|
+
|
138
|
+
if path_match
|
139
|
+
captures =
|
140
|
+
if path_match.respond_to?(:named_captures)
|
141
|
+
path_match.named_captures
|
142
|
+
else
|
143
|
+
Hash[path_match.names.zip(path_match.captures)]
|
144
|
+
end
|
145
|
+
|
146
|
+
@db = Integer(captures['db'])
|
147
|
+
|
148
|
+
@namespace_prefix = captures['namespace_prefix']
|
149
|
+
end
|
150
|
+
|
151
|
+
@base_uri = URI::Generic.new 'redis', nil, @host, @port, nil, '', nil, nil, nil
|
152
|
+
rescue URI::InvalidURIError => e
|
153
|
+
@error = "could not parse redis URL (#{@provided_url})"
|
154
|
+
end
|
155
|
+
|
41
156
|
def read_url_from_config
|
42
157
|
@config.read_from_env *@config.redis_env_vars, fallback: @config.redis_default_url
|
43
158
|
end
|
data/lib/savvy/error.rb
ADDED
data/lib/savvy/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: savvy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexa Grey
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cleanroom
|
@@ -169,6 +169,7 @@ files:
|
|
169
169
|
- lib/savvy/configurators/redis.rb
|
170
170
|
- lib/savvy/configurators/sidekiq.rb
|
171
171
|
- lib/savvy/environment_reader.rb
|
172
|
+
- lib/savvy/error.rb
|
172
173
|
- lib/savvy/root_finder.rb
|
173
174
|
- lib/savvy/templates/Savvyfile.rb.erb
|
174
175
|
- lib/savvy/utility.rb
|
@@ -194,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
195
|
version: '0'
|
195
196
|
requirements: []
|
196
197
|
rubyforge_project:
|
197
|
-
rubygems_version: 2.
|
198
|
+
rubygems_version: 2.4.5
|
198
199
|
signing_key:
|
199
200
|
specification_version: 4
|
200
201
|
summary: ENV-backed configuration helper for Redis, Sidekiq, etc
|