time_pilot 0.1.1 → 1.0.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
- 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.