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 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