togls 3.0.0.pre.rc.5 → 3.0.0.pre.rc.6

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: 1d5cfdb23f6d9ccbe350c2873ced5a0a92cd8113
4
- data.tar.gz: 8d6b8a61e178ebbfb7bf2bfa0c6b2adb411a8c36
3
+ metadata.gz: 2ee73b04334051fd4cfa74b24dd639181dd80433
4
+ data.tar.gz: a28ffbf8cfa7968d31d755f250ba287f3ec4ad05
5
5
  SHA512:
6
- metadata.gz: 83a2799fbead2f62efaa7755d56133566e548e968d0fd77d9d728e506f6f15fd615c9f31802ce8ea1ce3f42d6077a4e1c2df2156970126a423d0c4b8294c3e79
7
- data.tar.gz: 1f2f5a523c90a468790f427eb0c6f95b079e86cd9ed39f7936192495b6565740a23d4831648dd5f5ac6bc8693b7515cfe915aa8aa9d3f318793da287dcfc71f6
6
+ metadata.gz: e5d9044189ee0e1ea1f19ce740da3bef438f01d4e0ae8b462b72d0a25eaa0db6cfc5f4c71efced54b2e4d2d3aa8aa5fc6486beb525575b26cfb69f4b59f9ab99
7
+ data.tar.gz: ee82fe7033ff9de9b91e062ff395886b8167897f0853d25bc8448ef92f6d3c45eece901478cceb1f88014b2264e01535022eb937b9ee7df9668b37e116a8f0dd
data/CHANGELOG.md CHANGED
@@ -10,6 +10,7 @@ that you can set version constraints properly.
10
10
 
11
11
  #### [Unreleased] - now
12
12
 
13
+ * `Changed`: Rules to be identified by an abstract given string id
13
14
  * `Changed`: Rule and Rule Type management to be global under Togls
14
15
  * `Changed`: The testing interface to allow for contract enforcement in tests
15
16
  and allow altering existing feature rules within tests.
@@ -18,6 +18,5 @@ module Togls
18
18
  end
19
19
  end
20
20
 
21
- class ToggleMissingToggle < NullToggle; end
22
21
  class RuleFeatureMismatchToggle < NullToggle; end
23
22
  end
data/lib/togls/rule.rb CHANGED
@@ -4,7 +4,7 @@ module Togls
4
4
  # The Rule is an abstract base class that is intended to act as an interface
5
5
  # for other rules to be implemented against.
6
6
  class Rule
7
- attr_reader :data, :type_id
7
+ attr_reader :data, :type_id, :id
8
8
 
9
9
  def self.title
10
10
  raise Togls::NotImplemented, "Rule type title not implemented"
@@ -18,7 +18,8 @@ module Togls
18
18
  Togls::TargetTypes::NOT_SET
19
19
  end
20
20
 
21
- def initialize(type_id, data = nil, target_type: Togls::TargetTypes::NOT_SET)
21
+ def initialize(id, type_id, data = nil, target_type: Togls::TargetTypes::NOT_SET)
22
+ @id = id
22
23
  @type_id = type_id
23
24
  @data = data
24
25
  @target_type = target_type
@@ -29,10 +30,6 @@ module Togls
29
30
  raise Togls::NotImplemented, "Rule's #run method must be implemented"
30
31
  end
31
32
 
32
- def id
33
- Togls::Helpers.sha1(@type_id, @data, target_type)
34
- end
35
-
36
33
  def target_type
37
34
  return @target_type if @target_type && @target_type != Togls::TargetTypes::NOT_SET
38
35
  return self.class.target_type unless self.class.target_type.nil?
@@ -14,8 +14,8 @@ module Togls
14
14
  rule_type_registry.get(type_id)
15
15
  end
16
16
 
17
- def rule(type_id, data = nil, target_type: Togls::TargetTypes::NOT_SET)
18
- rule_type(type_id).new(type_id, data, target_type: target_type)
17
+ def rule(id, type_id, data = nil, target_type: Togls::TargetTypes::NOT_SET)
18
+ rule_type(type_id).new(id, type_id, data, target_type: target_type)
19
19
  end
20
20
 
21
21
  private
@@ -18,14 +18,15 @@ module Togls
18
18
  def store(rule)
19
19
  rule_data = extract_storage_payload(rule)
20
20
  @drivers.each do |driver|
21
- driver.store(rule.id, rule_data)
21
+ driver.store(rule.id.to_s, rule_data)
22
22
  end
23
23
  end
24
24
 
25
25
  def extract_storage_payload(rule)
26
26
  {
27
+ 'id' => rule.id.to_s,
27
28
  'type_id' => ::Togls.send(:rule_type_registry).get_type_id(rule.class.to_s),
28
- 'data' => rule.data,
29
+ 'data' => rule.data,
29
30
  'target_type' => rule.target_type.to_s
30
31
  }
31
32
  end
@@ -51,14 +52,14 @@ module Togls
51
52
  raise Togls::RepositoryRuleDataInvalid, "None of the rule repository drivers claim to have the rule"
52
53
  end
53
54
 
54
- ['type_id', 'data', 'target_type'].each do |k|
55
+ ['id', 'type_id', 'data', 'target_type'].each do |k|
55
56
  if !rule_data.has_key? k
56
57
  Togls.logger.debug "One of the rule repository drivers returned rule data that is missing the '#{k}'"
57
58
  raise Togls::RepositoryRuleDataInvalid, "One of the rule repository drivers returned rule data that is missing the '#{k}'"
58
59
  end
59
60
  end
60
61
 
61
- ['type_id', 'target_type'].each do |k|
62
+ ['id', 'type_id', 'target_type'].each do |k|
62
63
  if !rule_data[k].is_a?(String)
63
64
  Togls.logger.debug "One of the rule repository drivers returned rule data with '#{k}' not being a string"
64
65
  raise Togls::RepositoryRuleDataInvalid, "One of the rule repository drivers returned rule data with '#{k}' not being a string"
@@ -69,10 +70,11 @@ module Togls
69
70
  def reconstitute_rule(rule_data)
70
71
  if rule_data.has_key?('target_type')
71
72
  ::Togls.rule_type(rule_data['type_id'])\
72
- .new(rule_data['type_id'].to_sym, rule_data['data'],
73
+ .new(rule_data['id'].to_sym, rule_data['type_id'].to_sym, rule_data['data'],
73
74
  target_type: rule_data['target_type'].to_sym)
74
75
  else
75
- ::Togls.rule_type(rule_data['type_id']).new(rule_data['type_id'].to_sym,
76
+ ::Togls.rule_type(rule_data['type_id']).new(rule_data['id'].to_sym,
77
+ rule_data['type_id'].to_sym,
76
78
  rule_data['data'])
77
79
  end
78
80
  end
@@ -9,12 +9,12 @@ module Togls
9
9
  end
10
10
 
11
11
  def get(rule_id)
12
- boolean_false = Togls::Rules::Boolean.new(:boolean, false)
13
- boolean_true = Togls::Rules::Boolean.new(:boolean, true)
14
- if rule_id == boolean_true.id
15
- return { 'type_id' => 'boolean', 'data' => true, 'target_type' => Togls::TargetTypes::NONE.to_s }
16
- elsif rule_id == boolean_false.id
17
- return { 'type_id' => 'boolean', 'data' => false, 'target_type' => Togls::TargetTypes::NONE.to_s }
12
+ boolean_false = Togls::Rules::Boolean.new(:off, :boolean, false)
13
+ boolean_true = Togls::Rules::Boolean.new(:on, :boolean, true)
14
+ if rule_id == boolean_true.id.to_s
15
+ return { 'id' => 'on', 'type_id' => 'boolean', 'data' => true, 'target_type' => Togls::TargetTypes::NONE.to_s }
16
+ elsif rule_id == boolean_false.id.to_s
17
+ return { 'id' => 'off', 'type_id' => 'boolean', 'data' => false, 'target_type' => Togls::TargetTypes::NONE.to_s }
18
18
  else
19
19
  nil
20
20
  end
@@ -6,7 +6,7 @@ module Togls
6
6
  # it's initialization data and when evaluated determines the toggle state
7
7
  # based on the initialization value. Example:
8
8
  #
9
- # always_on = Togls::Rules::Boolean.new(:boolean, true)
9
+ # always_on = Togls::Rules::Boolean.new(:on, :boolean, true)
10
10
  # Togls.features do
11
11
  # feature(:foo).on(always_on)
12
12
  # end
@@ -25,9 +25,9 @@ The Boolean rule type is the base line rule for Togls. It allows you to
25
25
  flag a feature on/off by specifing a boolean value as the initialization
26
26
  data. For example:
27
27
 
28
- Togls::Rules::Boolean.new(:boolean, true) # rule that always evaluates to on
28
+ Togls::Rules::Boolean.new(:on, :boolean, true) # rule that always evaluates to on
29
29
 
30
- Togls::Rules::Boolean.new(:boolean, false) # rule that always evaluates to off
30
+ Togls::Rules::Boolean.new(:off, :boolean, false) # rule that always evaluates to off
31
31
  }
32
32
  end
33
33
 
data/lib/togls/toggle.rb CHANGED
@@ -9,7 +9,7 @@ module Togls
9
9
 
10
10
  def initialize(feature)
11
11
  @feature = feature
12
- @rule = Togls::Rules::Boolean.new(:boolean, false)
12
+ @rule = Togls::Rules::Boolean.new(:off, :boolean, false)
13
13
  end
14
14
 
15
15
  def id
@@ -31,15 +31,7 @@ module Togls
31
31
  end
32
32
 
33
33
  def get(key)
34
- toggle = @toggle_repository.get(key.to_s)
35
- if toggle.is_a?(Togls::ToggleMissingToggle)
36
- Togls.logger.warn("Feature identified by '#{key}' has not been defined")
37
- end
38
- toggle
39
- end
40
-
41
- def all
42
- @toggle_repository.all
34
+ @toggle_repository.get(key.to_s)
43
35
  end
44
36
  end
45
37
  end
@@ -25,13 +25,18 @@ module Togls
25
25
  end
26
26
 
27
27
  def extract_storage_payload(toggle)
28
- { 'feature_id' => toggle.feature.id, 'rule_id' => toggle.rule.id }
28
+ { 'feature_id' => toggle.feature.id, 'rule_id' => toggle.rule.id.to_s }
29
29
  end
30
30
 
31
31
  def get(id)
32
- toggle_data = fetch_toggle_data(id)
33
- return reconstitute_toggle(toggle_data) if toggle_data
34
- Togls::ToggleMissingToggle.new
32
+ @drivers.reverse.each do |driver|
33
+ toggle_data = driver.get(id)
34
+ if toggle_data
35
+ toggle = reconstitute_toggle(toggle_data)
36
+ return toggle unless toggle.is_a?(::Togls::NullToggle)
37
+ end
38
+ end
39
+ Togls::NullToggle.new
35
40
  end
36
41
 
37
42
  def reconstitute_toggle(toggle_data)
@@ -56,30 +61,5 @@ module Togls
56
61
  return Togls::RuleFeatureMismatchToggle.new
57
62
  end
58
63
  end
59
-
60
- def fetch_toggle_data(id)
61
- toggle_data = nil
62
- @drivers.reverse.each do |driver|
63
- toggle_data = driver.get(id)
64
- break if toggle_data
65
- end
66
- toggle_data
67
- end
68
-
69
- def fetch_all_toggle_data
70
- toggle_data_collection = {}
71
- @drivers.each do |driver|
72
- toggle_data_collection.merge!(driver.all)
73
- end
74
- toggle_data_collection
75
- end
76
-
77
- def all
78
- toggle_data_collection = fetch_all_toggle_data.values
79
-
80
- toggle_data_collection.map do |toggle_data|
81
- reconstitute_toggle(toggle_data)
82
- end
83
- end
84
64
  end
85
65
  end
@@ -23,19 +23,15 @@ module Togls
23
23
  return nil if ENV[toggle_env_key(toggle_id)].nil?
24
24
  if ENV[toggle_env_key(toggle_id)] == 'true'
25
25
  return { 'feature_id' => toggle_id, 'rule_id' =>
26
- Togls::Rules::Boolean.new(:boolean, true).id }
26
+ Togls::Rules::Boolean.new(:on, :boolean, true).id.to_s }
27
27
  elsif ENV[toggle_env_key(toggle_id)] == 'false'
28
28
  return { 'feature_id' => toggle_id, 'rule_id' =>
29
- Togls::Rules::Boolean.new(:boolean, false).id }
29
+ Togls::Rules::Boolean.new(:off, :boolean, false).id.to_s }
30
30
  else
31
31
  return nil
32
32
  end
33
33
  end
34
34
 
35
- def all
36
- {}
37
- end
38
-
39
35
  private
40
36
 
41
37
  def toggle_env_key(toggle_id)
@@ -27,14 +27,6 @@ module Togls
27
27
  end
28
28
  end
29
29
  end
30
-
31
- def all
32
- result = {}
33
- @toggles_lock.synchronize do
34
- @toggles.each_pair { |k, v| result[k] = Marshal.load(v) }
35
- end
36
- result
37
- end
38
30
  end
39
31
  end
40
32
  end
data/lib/togls/toggler.rb CHANGED
@@ -14,14 +14,14 @@ module Togls
14
14
  end
15
15
 
16
16
  def on(rule = nil)
17
- rule = Togls::Rules::Boolean.new(:boolean, true) if rule.nil?
17
+ rule = Togls::Rules::Boolean.new(:on, :boolean, true) if rule.nil?
18
18
  @toggle.rule = rule
19
19
  @toggle_repository.store(@toggle)
20
20
  @toggle
21
21
  end
22
22
 
23
23
  def off
24
- rule = Togls::Rules::Boolean.new(:boolean, false)
24
+ rule = Togls::Rules::Boolean.new(:off, :boolean, false)
25
25
  @toggle.rule = rule
26
26
  @toggle_repository.store(@toggle)
27
27
  @toggle
data/lib/togls/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Togls
2
- VERSION = '3.0.0-rc.5'.freeze
2
+ VERSION = '3.0.0-rc.6'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: togls
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.pre.rc.5
4
+ version: 3.0.0.pre.rc.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Miller
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2016-06-28 00:00:00.000000000 Z
13
+ date: 2016-06-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler