flippant 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +9 -0
- data/CHANGELOG.md +9 -0
- data/Rakefile +1 -1
- data/flippant.gemspec +3 -2
- data/lib/flippant.rb +17 -5
- data/lib/flippant/adapters/memory.rb +20 -9
- data/lib/flippant/adapters/redis.rb +21 -2
- data/lib/flippant/errors.rb +5 -0
- data/lib/flippant/registry.rb +4 -0
- data/lib/flippant/version.rb +1 -1
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c259d40ca6b2cbd3305d2ab5a1c2ba425794886
|
4
|
+
data.tar.gz: 913b5c2043ae9b6c6c2ecea20666f0c82e3dc444
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 627e7caa8606d1d7b002f513553be1a5e0bea1647ae35d111ccc71962b496fb2b0f0b93669233fe67e97e283321a41dbb54f03d545a09b35c3e8fd9adc1041ce
|
7
|
+
data.tar.gz: 919ce1da13ee2f5e7353eb0f96b892aea75bf006b148cb125e0cbbed25ffec8c421a3658df4a9766a8210f741037a4f71744d6447cdd5ee9a16160546f508aa0
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## v0.6.0 - 2017-08-08
|
2
|
+
|
3
|
+
### Changes
|
4
|
+
|
5
|
+
* [Flippant] - Allow passing symbols to disable a feature.
|
6
|
+
* [Flippant] - Raise an error when enabling a feature for a group that doesn't
|
7
|
+
exist. This forces an order of defining groups before enabling features, but
|
8
|
+
it will prevent trying to register groups that don't exist or with typos.
|
9
|
+
|
1
10
|
## v0.5.1 - 2017-01-26
|
2
11
|
|
3
12
|
### Changes
|
data/Rakefile
CHANGED
data/flippant.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
|
2
3
|
lib = File.expand_path("../lib", __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require "flippant/version"
|
@@ -21,8 +22,8 @@ Gem::Specification.new do |spec|
|
|
21
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
23
|
spec.require_paths = ["lib"]
|
23
24
|
|
24
|
-
spec.add_development_dependency "bundler"
|
25
|
-
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "bundler"
|
26
|
+
spec.add_development_dependency "rake"
|
26
27
|
spec.add_development_dependency "rspec", "~> 3.2"
|
27
28
|
spec.add_development_dependency "redis", "~> 3.3"
|
28
29
|
spec.add_development_dependency "rubocop", "~> 0.47"
|
data/lib/flippant.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require "json"
|
4
4
|
|
5
5
|
module Flippant
|
6
|
+
autoload :Error, "flippant/errors"
|
6
7
|
autoload :Registry, "flippant/registry"
|
7
8
|
|
8
9
|
module Adapter
|
@@ -17,20 +18,31 @@ module Flippant
|
|
17
18
|
|
18
19
|
def_delegators :adapter,
|
19
20
|
:add,
|
20
|
-
:
|
21
|
-
:
|
21
|
+
:breakdown,
|
22
|
+
:clear,
|
23
|
+
:disable,
|
22
24
|
:enabled?,
|
23
25
|
:exists?,
|
24
|
-
:disable,
|
25
26
|
:features,
|
26
|
-
:
|
27
|
-
:
|
27
|
+
:remove,
|
28
|
+
:rename
|
28
29
|
|
29
30
|
def_delegators :registry,
|
30
31
|
:register,
|
31
32
|
:registered,
|
33
|
+
:registered?,
|
32
34
|
:clear
|
33
35
|
|
36
|
+
# Guarded Delegation
|
37
|
+
|
38
|
+
def enable(feature, group, values = [])
|
39
|
+
raise Flippant::Error, "Unknown group: #{group}" unless registered?(group)
|
40
|
+
|
41
|
+
adapter.enable(feature, group, values)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Configuration
|
45
|
+
|
34
46
|
def adapter
|
35
47
|
@adapter ||= Flippant::Adapter::Memory.new
|
36
48
|
end
|
@@ -10,7 +10,7 @@ module Flippant
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def add(feature)
|
13
|
-
table[feature
|
13
|
+
table[normalize(feature)] ||= {}
|
14
14
|
end
|
15
15
|
|
16
16
|
def remove(feature)
|
@@ -18,21 +18,19 @@ module Flippant
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def enable(feature, group, values = [])
|
21
|
-
fkey = feature
|
21
|
+
fkey = normalize(feature)
|
22
22
|
gkey = group.to_s
|
23
|
-
mutex = Mutex.new
|
24
23
|
|
25
|
-
|
24
|
+
Mutex.new.synchronize do
|
26
25
|
table[fkey][gkey] ||= []
|
27
26
|
table[fkey][gkey] = (table[fkey][gkey] | values).sort
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
31
30
|
def disable(feature, group, values = [])
|
32
|
-
rules = table[feature
|
33
|
-
mutex = Mutex.new
|
31
|
+
rules = table[normalize(feature)]
|
34
32
|
|
35
|
-
|
33
|
+
Mutex.new.synchronize do
|
36
34
|
if values.any?
|
37
35
|
remove_values(rules, group, values)
|
38
36
|
else
|
@@ -41,8 +39,15 @@ module Flippant
|
|
41
39
|
end
|
42
40
|
end
|
43
41
|
|
42
|
+
def rename(old_feature, new_feature)
|
43
|
+
old_feature = normalize(old_feature)
|
44
|
+
new_feature = normalize(new_feature)
|
45
|
+
|
46
|
+
table[new_feature] = table.delete(old_feature)
|
47
|
+
end
|
48
|
+
|
44
49
|
def enabled?(feature, actor, registered = Flippant.registered)
|
45
|
-
table[feature
|
50
|
+
table[normalize(feature)].any? do |group, values|
|
46
51
|
if (block = registered[group.to_s])
|
47
52
|
block.call(actor, values)
|
48
53
|
end
|
@@ -50,6 +55,8 @@ module Flippant
|
|
50
55
|
end
|
51
56
|
|
52
57
|
def exists?(feature, group = nil)
|
58
|
+
feature = normalize(feature)
|
59
|
+
|
53
60
|
if group.nil?
|
54
61
|
table.key?(feature)
|
55
62
|
else
|
@@ -81,12 +88,16 @@ module Flippant
|
|
81
88
|
|
82
89
|
private
|
83
90
|
|
91
|
+
def normalize(feature)
|
92
|
+
feature.to_s.downcase.strip
|
93
|
+
end
|
94
|
+
|
84
95
|
def remove_group(rules, to_remove)
|
85
96
|
rules.reject! { |(group, _)| group == to_remove.to_s }
|
86
97
|
end
|
87
98
|
|
88
99
|
def remove_values(rules, group, values)
|
89
|
-
rules[group] = (rules[group] - values)
|
100
|
+
rules[group.to_s] = (rules[group.to_s] - values)
|
90
101
|
end
|
91
102
|
end
|
92
103
|
end
|
@@ -22,7 +22,7 @@ module Flippant
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def add(feature)
|
25
|
-
client.sadd(key, feature)
|
25
|
+
client.sadd(key, normalize(feature))
|
26
26
|
end
|
27
27
|
|
28
28
|
def remove(feature)
|
@@ -54,6 +54,21 @@ module Flippant
|
|
54
54
|
maybe_cleanup(feature)
|
55
55
|
end
|
56
56
|
|
57
|
+
def rename(old_feature, new_feature)
|
58
|
+
old_feature = normalize(old_feature)
|
59
|
+
new_feature = normalize(new_feature)
|
60
|
+
old_namespaced = namespace(old_feature)
|
61
|
+
new_namespaced = namespace(new_feature)
|
62
|
+
|
63
|
+
client.watch(old_namespaced, new_namespaced) do
|
64
|
+
client.multi do
|
65
|
+
client.srem(key, old_feature)
|
66
|
+
client.sadd(key, new_feature)
|
67
|
+
client.rename(old_namespaced, new_namespaced)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
57
72
|
def enabled?(feature, actor, registered = Flippant.registered)
|
58
73
|
client.hgetall(namespace(feature)).any? do |group, values|
|
59
74
|
if (block = registered[group])
|
@@ -111,7 +126,11 @@ module Flippant
|
|
111
126
|
end
|
112
127
|
|
113
128
|
def namespace(feature)
|
114
|
-
"#{key}-#{feature}"
|
129
|
+
"#{key}-#{normalize(feature)}"
|
130
|
+
end
|
131
|
+
|
132
|
+
def normalize(feature)
|
133
|
+
feature.to_s.downcase.strip
|
115
134
|
end
|
116
135
|
|
117
136
|
def change_values(namespaced, group)
|
data/lib/flippant/registry.rb
CHANGED
data/lib/flippant/version.rb
CHANGED
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flippant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Parker Selbert
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- lib/flippant.rb
|
105
105
|
- lib/flippant/adapters/memory.rb
|
106
106
|
- lib/flippant/adapters/redis.rb
|
107
|
+
- lib/flippant/errors.rb
|
107
108
|
- lib/flippant/registry.rb
|
108
109
|
- lib/flippant/rules.rb
|
109
110
|
- lib/flippant/version.rb
|