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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 789d87077103358106ef05baa2f5b9e1092381f7
4
- data.tar.gz: 0faa56a65bf93a2b5188ab4955d3053d36827a15
3
+ metadata.gz: 8c259d40ca6b2cbd3305d2ab5a1c2ba425794886
4
+ data.tar.gz: 913b5c2043ae9b6c6c2ecea20666f0c82e3dc444
5
5
  SHA512:
6
- metadata.gz: a9ce9e3308dfc90b92ed293f4b0c15c0173af582431f07fb5b9d711cba1370599849f8288415fd1b1405938eef438126c5dcab4b9bf98bdd68e442cff5c2ecd8
7
- data.tar.gz: de554386d07953e2b7f70ee0dfb1d41032a9ed5bfcad582fd9223bc3531eef3766269f84a574d382af3d197ecd85451cd744be6949de71334ed93cbeac69c875
6
+ metadata.gz: 627e7caa8606d1d7b002f513553be1a5e0bea1647ae35d111ccc71962b496fb2b0f0b93669233fe67e97e283321a41dbb54f03d545a09b35c3e8fd9adc1041ce
7
+ data.tar.gz: 919ce1da13ee2f5e7353eb0f96b892aea75bf006b148cb125e0cbbed25ffec8c421a3658df4a9766a8210f741037a4f71744d6447cdd5ee9a16160546f508aa0
@@ -4,6 +4,15 @@ AllCops:
4
4
  - "vendor/**/*"
5
5
  TargetRubyVersion: 2.3
6
6
 
7
+ Metrics/AbcSize:
8
+ Max: 20
9
+
10
+ Metrics/ClassLength:
11
+ Max: 200
12
+
13
+ Metrics/MethodLength:
14
+ Max: 20
15
+
7
16
  Style/FrozenStringLiteralComment:
8
17
  EnforcedStyle: always
9
18
  Exclude:
@@ -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
@@ -15,4 +15,4 @@ rescue LoadError
15
15
  puts "rubocop not loaded"
16
16
  end
17
17
 
18
- task default: [:rubocop, :spec]
18
+ task default: %i[rubocop spec]
@@ -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", "~> 1.13"
25
- spec.add_development_dependency "rake", "~> 10.0"
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"
@@ -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
- :remove,
21
- :enable,
21
+ :breakdown,
22
+ :clear,
23
+ :disable,
22
24
  :enabled?,
23
25
  :exists?,
24
- :disable,
25
26
  :features,
26
- :breakdown,
27
- :clear
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.to_s] ||= {}
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.to_s
21
+ fkey = normalize(feature)
22
22
  gkey = group.to_s
23
- mutex = Mutex.new
24
23
 
25
- mutex.synchronize do
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.to_s]
33
- mutex = Mutex.new
31
+ rules = table[normalize(feature)]
34
32
 
35
- mutex.synchronize do
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.to_s].any? do |group, values|
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)
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flippant
4
+ Error = Class.new(StandardError)
5
+ end
@@ -14,6 +14,10 @@ module Flippant
14
14
  table
15
15
  end
16
16
 
17
+ def registered?(group)
18
+ table.key?(group.to_s)
19
+ end
20
+
17
21
  def clear
18
22
  @table = {}
19
23
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flippant
4
- VERSION = "0.5.1"
4
+ VERSION = "0.6.0"
5
5
  end
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.5.1
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-01-26 00:00:00.000000000 Z
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: '1.13'
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: '1.13'
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: '10.0'
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: '10.0'
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