flippant 0.5.1 → 0.6.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/.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
|