time_pilot 0.1.1 → 1.0.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
- SHA1:
3
- metadata.gz: 3b6d20c82889dfce170d8168c8db232fcd61c703
4
- data.tar.gz: 86af86c17563c51b7ef3f2be04610363f592de69
2
+ SHA256:
3
+ metadata.gz: 1035c965584954a3de7fbee71027d0d081c2c8a99521f1590fd9f6ad00f84438
4
+ data.tar.gz: 01bc1de61e0911ca0e60f464d2869028a9b22556ea0f6c5ec71163d5d3b4b979
5
5
  SHA512:
6
- metadata.gz: 99701db558c49b80d094c5f305061bd7813f7c46005fae1be51ac7febd9ada7044854e2e446f36e572f1bfea68e323a3f17a69fb03be266c48e08580b2796d79
7
- data.tar.gz: 02b59644df562992cbe371516fc07ab8241c28291ee30caf8e993893c7de7ad8e74a8e11ce131e064fc9acb541a40af881087fb016b53e7bd9ce53d700c9c2fa
6
+ metadata.gz: 5d477c3f65330966a93de7ba0088b24771f38d6cbc9a280a1dfa6382d30ce01fe025df2f31d9aa734a366587e545f2bc2e7e7d85aeb9220c77513603ab9ecc36
7
+ data.tar.gz: 2f790748fcdcd320ee06fdfafacef5facd3400dce9a807f1f6998647622b3155519b865e8f9a6f139491d3b9a291f1947b49c866568774362fa9b990d3416dec
@@ -16,21 +16,23 @@ module TimePilot
16
16
  def self.configure
17
17
  @config ||= Configuration.new
18
18
  yield @config
19
- @config.features.each { |f| define_feature_method(f) }
19
+ @config.features.each { |f| define_feature_methods(f) }
20
20
  end
21
21
 
22
- def self.define_feature_method(feature_name)
22
+ def self.define_feature_methods(feature_name)
23
23
  Features.module_eval do
24
- define_method "enable_#{feature_name}" do
25
- pilot_enable_feature(feature_name)
26
- end
24
+ unless method_defined?("enable_#{feature_name}")
25
+ define_method "enable_#{feature_name}" do
26
+ pilot_enable_feature(feature_name)
27
+ end
27
28
 
28
- define_method "disable_#{feature_name}" do
29
- pilot_disable_feature(feature_name)
30
- end
29
+ define_method "disable_#{feature_name}" do
30
+ pilot_disable_feature(feature_name)
31
+ end
31
32
 
32
- define_method "#{feature_name}_enabled?" do
33
- pilot_feature_enabled?(feature_name)
33
+ define_method "#{feature_name}_enabled?" do
34
+ pilot_feature_enabled?(feature_name)
35
+ end
34
36
  end
35
37
  end
36
38
  end
@@ -70,22 +72,36 @@ module TimePilot
70
72
  def pilot_enable_feature(feature_name)
71
73
  key_name = "#{feature_name}:#{self.class.to_s.underscore}_ids"
72
74
  TimePilot.redis.sadd TimePilot.key(key_name), id
75
+ instance_variable_set("@#{feature_name}_enabled", true)
73
76
  end
74
77
 
75
78
  def pilot_disable_feature(feature_name)
76
79
  key_name = "#{feature_name}:#{self.class.to_s.underscore}_ids"
77
80
  TimePilot.redis.srem TimePilot.key(key_name), id
81
+ instance_variable_set("@#{feature_name}_enabled", false)
78
82
  end
79
83
 
80
84
  def pilot_feature_enabled?(feature_name)
85
+ unless instance_variable_defined?("@#{feature_name}_enabled")
86
+ instance_variable_set("@#{feature_name}_enabled",
87
+ pilot_member_in_any_group?(feature_name))
88
+ end
89
+ instance_variable_get("@#{feature_name}_enabled")
90
+ end
91
+
92
+ def pilot_member_in_any_group?(feature_name)
81
93
  TimePilot.redis.pipelined do
82
94
  self.class.time_pilot_groups.each do |group|
83
- method = group.to_s == self.class.to_s.underscore ? 'id' : group + '_id'
84
- TimePilot.redis.sismember TimePilot.key("#{feature_name}:#{group}_ids"), send(method)
95
+ TimePilot.redis.sismember(
96
+ TimePilot.key("#{feature_name}:#{group}_ids"),
97
+ send(pilot_method_for_group(group))
98
+ )
85
99
  end
86
100
  end.include? true
87
101
  end
88
102
 
103
+ def pilot_method_for_group(group_name)
104
+ group_name.to_s == self.class.to_s.underscore ? 'id' : group_name + '_id'
105
+ end
89
106
  end
90
-
91
107
  end
@@ -1,3 +1,3 @@
1
1
  module TimePilot
2
- VERSION = '0.1.1'
2
+ VERSION = '1.0.0'.freeze
3
3
  end
@@ -59,6 +59,7 @@ describe TimePilot do
59
59
  it 'defines a getter on company' do
60
60
  TimePilot.redis.sadd 'timepilot:planning:company_ids', @acme.id
61
61
  @acme.planning_enabled?.must_equal true
62
+ @acme.instance_variable_get("@planning_enabled").must_equal true
62
63
  end
63
64
 
64
65
  it 'defines an enabler on company' do
@@ -69,8 +70,10 @@ describe TimePilot do
69
70
  it 'defines a disabler on employee' do
70
71
  @nedap.enable_planning
71
72
  @nedap.planning_enabled?.must_equal true
73
+ @nedap.instance_variable_get("@planning_enabled").must_equal true
72
74
  @nedap.disable_planning
73
75
  @nedap.planning_enabled?.must_equal false
76
+ @nedap.instance_variable_get("@planning_enabled").must_equal false
74
77
  end
75
78
 
76
79
  it 'defines a getter on team' do
@@ -86,13 +89,16 @@ describe TimePilot do
86
89
  it 'defines a disabler on team' do
87
90
  @retail.enable_planning
88
91
  @retail.planning_enabled?.must_equal true
92
+ @retail.instance_variable_get("@planning_enabled").must_equal true
89
93
  @retail.disable_planning
90
94
  @retail.planning_enabled?.must_equal false
95
+ @retail.instance_variable_get("@planning_enabled").must_equal false
91
96
  end
92
97
 
93
98
  it 'defines a getter on employee' do
94
99
  TimePilot.redis.sadd 'timepilot:planning:employee_ids', @john.id
95
100
  @john.planning_enabled?.must_equal true
101
+ @john.instance_variable_get("@planning_enabled").must_equal true
96
102
  end
97
103
 
98
104
  it 'defines an enabler on employee' do
@@ -103,8 +109,10 @@ describe TimePilot do
103
109
  it 'defines a disabler on employee' do
104
110
  @jane.enable_planning
105
111
  @jane.planning_enabled?.must_equal true
112
+ @jane.instance_variable_get("@planning_enabled").must_equal true
106
113
  @jane.disable_planning
107
114
  @jane.planning_enabled?.must_equal false
115
+ @jane.instance_variable_get("@planning_enabled").must_equal false
108
116
  end
109
117
 
110
118
  it 'defines a cardinality count on the classes' do
@@ -125,16 +133,19 @@ describe TimePilot do
125
133
  specify 'company overrides team' do
126
134
  @nedap.enable_planning
127
135
  @retail.planning_enabled?.must_equal true
136
+ @retail.instance_variable_get("@planning_enabled").must_equal true
128
137
  end
129
138
 
130
139
  specify 'team overrides employee' do
131
140
  @healthcare.enable_planning
132
141
  @john.planning_enabled?.must_equal true
142
+ @john.instance_variable_get("@planning_enabled").must_equal true
133
143
  end
134
144
 
135
145
  specify 'company overrides employee' do
136
146
  @nedap.enable_planning
137
147
  @jane.planning_enabled?.must_equal true
148
+ @jane.instance_variable_get("@planning_enabled").must_equal true
138
149
  end
139
150
  end
140
151
 
@@ -148,3 +159,51 @@ describe TimePilot, 'converting CamelCase to camel_case' do
148
159
  CamelCasedModel.time_pilot_groups.must_equal ['camel_cased_model']
149
160
  end
150
161
  end
162
+
163
+ describe TimePilot do
164
+ before do
165
+ @acme = Company.new(1)
166
+
167
+ @mock = MiniTest::Mock.new
168
+ TimePilot.configure do |config|
169
+ config.redis(@mock)
170
+ end
171
+ end
172
+
173
+ after do
174
+ TimePilot.configure do |config|
175
+ config.redis(Redis.new)
176
+ end
177
+ end
178
+
179
+ specify 'calls redis only once' do
180
+ @mock.expect(:pipelined, [true])
181
+
182
+ @acme.planning_enabled?.must_equal true
183
+ # Call the feature a second time
184
+ # If it calls redis you will get
185
+ # MockExpectationError: No more expects available for :pipelined: []
186
+ @acme.planning_enabled?.must_equal true
187
+ end
188
+
189
+ specify 'does not call redis to get status after disabling' do
190
+ @mock.expect(:srem, true, ['timepilot:planning:company_ids', @acme.id])
191
+
192
+ @acme.disable_planning
193
+ # Call the feature again it should hit the instance variable
194
+ # If it calls redis you will get
195
+ # MockExpectationError: No more expects available for :pipelined: []
196
+ @acme.planning_enabled?.must_equal false
197
+ end
198
+
199
+ specify 'does not call redis to get status after enabling' do
200
+ @mock.expect(:sadd, true, ['timepilot:planning:company_ids', @acme.id])
201
+
202
+ @acme.enable_planning
203
+ # Call the feature again it should hit the instance variable
204
+ # If it calls redis you will get
205
+ # MockExpectationError: No more expects available for :pipelined: []
206
+ @acme.planning_enabled?.must_equal true
207
+ end
208
+ end
209
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_pilot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "@mlangenberg"
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-27 00:00:00.000000000 Z
12
+ date: 2018-09-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
@@ -100,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  version: '0'
101
101
  requirements: []
102
102
  rubyforge_project:
103
- rubygems_version: 2.4.6
103
+ rubygems_version: 2.7.6
104
104
  signing_key:
105
105
  specification_version: 4
106
106
  summary: Configure enabled features for a specific set of users.