can-do 1.0.0 → 1.1.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 +2 -0
- data/can_do.gemspec +1 -1
- data/lib/can_do.rb +56 -54
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bff3d57eaf45561bc031a0fc69b6204ee12fc95f
|
4
|
+
data.tar.gz: ae8b80fee8aff5b8faab98e34b7d91724fe1c3ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24b18790e7043f62fc2171b689f285e5a9953af0b2127c8d20618621e96c6a813650229b4a452715e975911983521abf914d8243b06710b312546036c6c78633
|
7
|
+
data.tar.gz: 9d05c3df6ba44e2e5c2b790bc071f3e443c7152f45b87a3d6c6e50b4d9f7ec4ad2ef414450103bf090a5f238fa9fc3f2632f8c9cd6d7d9647091086cd0035552
|
data/.travis.yml
CHANGED
data/can_do.gemspec
CHANGED
data/lib/can_do.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "connection_pool"
|
2
2
|
require "redis"
|
3
|
-
require "singleton"
|
4
3
|
require "yaml"
|
5
4
|
|
6
5
|
# Flips your features based on either a redis key, a config/features.yml file or environment variables.
|
@@ -27,8 +26,6 @@ require "yaml"
|
|
27
26
|
# end
|
28
27
|
#
|
29
28
|
class CanDo
|
30
|
-
include Singleton
|
31
|
-
FEATURE_KEY_PREFIX = "features:"
|
32
29
|
CONNECTION_POOL_SIZE = ENV.fetch("CANDO_CONNECTION_POOL_SIZE", 5)
|
33
30
|
CONNECTION_POOL = ConnectionPool.new(size: CONNECTION_POOL_SIZE, timeout: 5) do
|
34
31
|
Redis.new(url: ENV["CANDO_REDIS_URL"])
|
@@ -37,66 +34,71 @@ class CanDo
|
|
37
34
|
THE_TRUTH = /^(true|t|yes|y|1)$/i
|
38
35
|
DEFAULT_NAMESPACE = "defaults".freeze
|
39
36
|
|
40
|
-
|
37
|
+
class << self
|
38
|
+
def feature?(feature)
|
39
|
+
is_enabled = read(feature)
|
40
|
+
# If no block is passed, return true or false
|
41
|
+
return is_enabled unless block_given?
|
42
|
+
# If a block is passed, return block or nil
|
43
|
+
yield if is_enabled
|
44
|
+
end
|
41
45
|
|
42
|
-
|
43
|
-
|
44
|
-
|
46
|
+
def read(feature)
|
47
|
+
name = feature.to_s
|
48
|
+
shared_feature = pool.with { |redis| redis.get(redis_key(name)) }
|
49
|
+
|
50
|
+
fallback_value = fallback.fetch(name, false)
|
45
51
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
nil
|
52
|
-
end
|
52
|
+
return !!(shared_feature =~ THE_TRUTH) unless shared_feature.nil?
|
53
|
+
write(name, fallback_value)
|
54
|
+
fallback_value
|
55
|
+
rescue Redis::CannotConnectError
|
56
|
+
fallback_value
|
53
57
|
end
|
54
|
-
end
|
55
58
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
is_enabled =
|
62
|
-
if !shared_feature.nil?
|
63
|
-
!!(shared_feature =~ THE_TRUTH)
|
64
|
-
elsif ENV.key?(env_name)
|
65
|
-
!!(ENV[env_name] =~ THE_TRUTH)
|
66
|
-
else
|
67
|
-
features[name] == true
|
68
|
-
end
|
69
|
-
|
70
|
-
# If no block is passed, return true or false
|
71
|
-
return is_enabled unless block_given?
|
72
|
-
|
73
|
-
# If a block is passed, return block or nil
|
74
|
-
yield if is_enabled
|
75
|
-
end
|
59
|
+
def write(name, val)
|
60
|
+
pool.with { |redis| redis.set(redis_key(name), val) } == "OK"
|
61
|
+
rescue Redis::CannotConnectError
|
62
|
+
false
|
63
|
+
end
|
76
64
|
|
77
|
-
|
65
|
+
def features
|
66
|
+
keys = pool.with { |redis| redis.keys(redis_key("*")) }
|
67
|
+
keys.map { |key| key.sub(redis_key(nil), "") }
|
68
|
+
rescue Redis::CannotConnectError
|
69
|
+
[]
|
70
|
+
end
|
78
71
|
|
79
|
-
|
80
|
-
yaml_file = File.expand_path("config/features.yml", Dir.pwd)
|
72
|
+
private
|
81
73
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
data.fetch(DEFAULT_NAMESPACE, {}).merge(data.fetch(env, {}))
|
86
|
-
else
|
87
|
-
{}
|
88
|
-
end
|
89
|
-
end
|
74
|
+
def redis_key(name)
|
75
|
+
"#{redis_namespace}:#{name}"
|
76
|
+
end
|
90
77
|
|
91
|
-
|
92
|
-
|
93
|
-
|
78
|
+
def pool
|
79
|
+
CONNECTION_POOL
|
80
|
+
end
|
94
81
|
|
95
|
-
|
96
|
-
|
97
|
-
|
82
|
+
def fallback
|
83
|
+
@fallback ||= load_yaml_features
|
84
|
+
end
|
85
|
+
|
86
|
+
def yaml_file_path
|
87
|
+
File.expand_path("config/features.yml", Dir.pwd)
|
88
|
+
end
|
98
89
|
|
99
|
-
|
100
|
-
|
90
|
+
def load_yaml_features
|
91
|
+
return {} unless File.exist?(yaml_file_path)
|
92
|
+
data = YAML.safe_load(File.read(yaml_file_path))
|
93
|
+
data.fetch(DEFAULT_NAMESPACE, {}).merge(data.fetch(env, {}))
|
94
|
+
end
|
95
|
+
|
96
|
+
def env
|
97
|
+
ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
|
98
|
+
end
|
99
|
+
|
100
|
+
def redis_namespace
|
101
|
+
"features"
|
102
|
+
end
|
101
103
|
end
|
102
104
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: can-do
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blacklane
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|