hydra-access-controls 6.0.0.pre4 → 6.0.0.pre5

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.
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
18
18
  gem.required_ruby_version = '>= 1.9.3'
19
19
 
20
20
  gem.add_dependency 'activesupport'
21
- gem.add_dependency 'active-fedora', '>= 6.0.0.pre3'
21
+ gem.add_dependency "active-fedora", '>= 6.0.0.pre8'
22
22
  gem.add_dependency 'cancan'
23
23
  gem.add_dependency 'deprecation'
24
24
  gem.add_dependency 'blacklight'
data/lib/hydra/ability.rb CHANGED
@@ -65,7 +65,7 @@ module Hydra::Ability
65
65
  end
66
66
 
67
67
  can :edit, SolrDocument do |obj|
68
- @permissions_solr_document = obj
68
+ @permission_doc_cache[obj.id] = obj
69
69
  test_edit(obj.id)
70
70
  end
71
71
  end
@@ -80,7 +80,7 @@ module Hydra::Ability
80
80
  end
81
81
 
82
82
  can :read, SolrDocument do |obj|
83
- @permissions_solr_document = obj
83
+ @permission_doc_cache[obj.id] = obj
84
84
  test_read(obj.id)
85
85
  end
86
86
  end
@@ -93,51 +93,70 @@ module Hydra::Ability
93
93
  protected
94
94
 
95
95
  def test_edit(pid)
96
- permissions_doc(pid)
97
96
  logger.debug("[CANCAN] Checking edit permissions for user: #{current_user.user_key} with groups: #{user_groups.inspect}")
98
- group_intersection = user_groups & edit_groups
99
- result = !group_intersection.empty? || edit_persons.include?(current_user.user_key)
97
+ group_intersection = user_groups & edit_groups(pid)
98
+ result = !group_intersection.empty? || edit_persons(pid).include?(current_user.user_key)
100
99
  logger.debug("[CANCAN] decision: #{result}")
101
100
  result
102
101
  end
103
102
 
104
103
  def test_read(pid)
105
- permissions_doc(pid)
106
- logger.debug("[CANCAN] Checking edit permissions for user: #{current_user.user_key} with groups: #{user_groups.inspect}")
107
- group_intersection = user_groups & read_groups
108
- result = !group_intersection.empty? || read_persons.include?(current_user.user_key)
109
- logger.debug("[CANCAN] decision: #{result}")
104
+ logger.debug("[CANCAN] Checking read permissions for user: #{current_user.user_key} with groups: #{user_groups.inspect}")
105
+ group_intersection = user_groups & read_groups(pid)
106
+ result = !group_intersection.empty? || read_persons(pid).include?(current_user.user_key)
110
107
  result
111
108
  end
112
-
113
- def edit_groups
114
- edit_group_field = Hydra.config[:permissions][:edit][:group]
115
- eg = ((@permissions_solr_document == nil || @permissions_solr_document.fetch(edit_group_field,nil) == nil) ? [] : @permissions_solr_document.fetch(edit_group_field,nil))
109
+
110
+ def edit_groups(pid)
111
+ doc = permissions_doc(pid)
112
+ return [] if doc.nil?
113
+ eg = doc[self.class.edit_group_field] || []
116
114
  logger.debug("[CANCAN] edit_groups: #{eg.inspect}")
117
115
  return eg
118
116
  end
119
117
 
120
118
  # edit implies read, so read_groups is the union of edit and read groups
121
- def read_groups
122
- read_group_field = Hydra.config[:permissions][:read][:group]
123
- rg = edit_groups | ((@permissions_solr_document == nil || @permissions_solr_document.fetch(read_group_field,nil) == nil) ? [] : @permissions_solr_document.fetch(read_group_field,nil))
119
+ def read_groups(pid)
120
+ doc = permissions_doc(pid)
121
+ return [] if doc.nil?
122
+ rg = edit_groups(pid) | (doc[self.class.read_group_field] || [])
124
123
  logger.debug("[CANCAN] read_groups: #{rg.inspect}")
125
124
  return rg
126
125
  end
127
126
 
128
- def edit_persons
129
- edit_person_field = Hydra.config[:permissions][:edit][:individual]
130
- ep = ((@permissions_solr_document == nil || @permissions_solr_document.fetch(edit_person_field,nil) == nil) ? [] : @permissions_solr_document.fetch(edit_person_field,nil))
127
+ def edit_persons(pid)
128
+ doc = permissions_doc(pid)
129
+ return [] if doc.nil?
130
+ ep = doc[self.class.edit_person_field] || []
131
131
  logger.debug("[CANCAN] edit_persons: #{ep.inspect}")
132
132
  return ep
133
133
  end
134
134
 
135
135
  # edit implies read, so read_persons is the union of edit and read persons
136
- def read_persons
137
- read_individual_field = Hydra.config[:permissions][:read][:individual]
138
- rp = edit_persons | ((@permissions_solr_document == nil || @permissions_solr_document.fetch(read_individual_field,nil) == nil) ? [] : @permissions_solr_document.fetch(read_individual_field,nil))
136
+ def read_persons(pid)
137
+ doc = permissions_doc(pid)
138
+ return [] if doc.nil?
139
+ rp = edit_persons(pid) | (doc[self.class.read_person_field] || [])
139
140
  logger.debug("[CANCAN] read_persons: #{rp.inspect}")
140
141
  return rp
141
142
  end
142
143
 
144
+ module ClassMethods
145
+ def read_group_field
146
+ Hydra.config[:permissions][:read][:group]
147
+ end
148
+
149
+ def edit_person_field
150
+ Hydra.config[:permissions][:edit][:individual]
151
+ end
152
+
153
+ def read_person_field
154
+ Hydra.config[:permissions][:read][:individual]
155
+ end
156
+
157
+ def edit_group_field
158
+ Hydra.config[:permissions][:edit][:group]
159
+ end
160
+ end
161
+
143
162
  end
@@ -3,7 +3,6 @@ module Hydra::AccessControlsEnforcement
3
3
 
4
4
  included do
5
5
  include Hydra::AccessControlsEvaluation
6
- include Blacklight::SolrHelper # for force_to_utf8
7
6
  include Hydra::PermissionsQuery
8
7
  class_attribute :solr_access_filters_logic
9
8
 
@@ -19,6 +18,38 @@ module Hydra::AccessControlsEnforcement
19
18
 
20
19
  protected
21
20
 
21
+ def gated_discovery_filters
22
+ # Grant access to public content
23
+ permission_types = discovery_permissions
24
+ user_access_filters = []
25
+
26
+ permission_types.each do |type|
27
+ user_access_filters << ActiveFedora::SolrService.solr_name("#{type}_access_group", Hydra::Datastream::RightsMetadata.indexer) + ":public"
28
+ end
29
+
30
+ # Grant access based on user id & role
31
+ solr_access_filters_logic.each do |method_name|
32
+ user_access_filters += send(method_name, permission_types)
33
+ end
34
+ user_access_filters
35
+ end
36
+
37
+ def under_embargo?
38
+ load_permissions_from_solr
39
+ embargo_key = ActiveFedora::SolrService.solr_name("embargo_release_date", Hydra::Datastream::RightsMetadata.date_indexer)
40
+ if @permissions_solr_document[embargo_key]
41
+ embargo_date = Date.parse(@permissions_solr_document[embargo_key].split(/T/)[0])
42
+ return embargo_date > Date.parse(Time.now.to_s)
43
+ end
44
+ false
45
+ end
46
+
47
+ def is_public?
48
+ load_permissions_from_solr
49
+ access_key = ActiveFedora::SolrService.solr_name("access", Hydra::Datastream::RightsMetadata.indexer)
50
+ @permissions_solr_document[access_key].present? && @permissions_solr_document[access_key].first.downcase == "public"
51
+ end
52
+
22
53
 
23
54
  #
24
55
  # Action-specific enforcement
@@ -69,21 +100,10 @@ module Hydra::AccessControlsEnforcement
69
100
  # @param user_parameters the current user-subitted parameters
70
101
  def apply_gated_discovery(solr_parameters, user_parameters)
71
102
  solr_parameters[:fq] ||= []
72
- # Grant access to public content
73
- permission_types = discovery_permissions
74
- user_access_filters = []
75
-
76
- permission_types.each do |type|
77
- user_access_filters << ActiveFedora::SolrService.solr_name("#{type}_access_group", Hydra::Datastream::RightsMetadata.indexer) + ":public"
78
- end
79
-
80
- # Grant access based on user id & role
81
- solr_access_filters_logic.each do |method_name|
82
- user_access_filters += send(method_name, permission_types)
83
- end
84
- solr_parameters[:fq] << user_access_filters.join(" OR ")
103
+ solr_parameters[:fq] << gated_discovery_filters.join(" OR ")
85
104
  logger.debug("Solr parameters: #{ solr_parameters.inspect }")
86
105
  end
106
+
87
107
 
88
108
  def apply_role_permissions(permission_types)
89
109
  # for roles
@@ -1,7 +1,12 @@
1
1
  module Hydra::PermissionsQuery
2
-
2
+ extend ActiveSupport::Concern
3
+ included do
4
+ include Blacklight::SolrHelper # for force_to_utf8
5
+ end
6
+
3
7
  def permissions_doc(pid)
4
- @permissions_solr_document ||= get_permissions_solr_response_for_doc_id(pid)
8
+ @permission_doc_cache ||= {}
9
+ @permission_doc_cache[pid] ||= get_permissions_solr_response_for_doc_id(pid)
5
10
  end
6
11
 
7
12
 
@@ -38,9 +38,10 @@ module Hydra::PolicyAwareAbility
38
38
 
39
39
  # Returns the permissions solr document for policy_pid
40
40
  # The document is stored in an instance variable, so calling this multiple times will only query solr once.
41
- # To force reload, set @policy_permissions_solr_document to nil
41
+ # To force reload, set @policy_permissions_solr_cache to {}
42
42
  def policy_permissions_doc(policy_pid)
43
- @policy_permissions_solr_document ||= get_permissions_solr_response_for_doc_id(policy_pid)
43
+ @policy_permissions_solr_cache ||= {}
44
+ @policy_permissions_solr_cache[policy_pid] ||= get_permissions_solr_response_for_doc_id(policy_pid)
44
45
  end
45
46
 
46
47
  # Tests whether the object's governing policy object grants edit access for the current user
@@ -3,15 +3,15 @@ module Hydra::PolicyAwareAccessControlsEnforcement
3
3
 
4
4
  # Extends Hydra::AccessControlsEnforcement.apply_gated_discovery to reflect policy-provided access
5
5
  # appends the result of policy_clauses into the :fq
6
+ # @param solr_parameters the current solr parameters
7
+ # @param user_parameters the current user-subitted parameters
6
8
  def apply_gated_discovery(solr_parameters, user_parameters)
7
- super
8
- additional_clauses = policy_clauses
9
- unless additional_clauses.nil? || additional_clauses.empty?
10
- solr_parameters[:fq].first << " OR " + additional_clauses
11
- logger.debug("POLICY-aware Solr parameters: #{ solr_parameters.inspect }")
12
- end
9
+ solr_parameters[:fq] ||= []
10
+ solr_parameters[:fq] << gated_discovery_filters.join(" OR ")
11
+ logger.debug("POLICY-aware Solr parameters: #{ solr_parameters.inspect }")
13
12
  end
14
-
13
+
14
+
15
15
  # returns solr query for finding all objects whose policies grant discover access to current_user
16
16
  def policy_clauses
17
17
  policy_pids = policies_with_access
@@ -64,5 +64,16 @@ module Hydra::PolicyAwareAccessControlsEnforcement
64
64
  return Hydra.config[:permissions][:policy_class]
65
65
  end
66
66
  end
67
+
68
+ protected
69
+
70
+ def gated_discovery_filters
71
+ filters = super
72
+ additional_clauses = policy_clauses
73
+ unless additional_clauses.blank?
74
+ filters << additional_clauses
75
+ end
76
+ filters
77
+ end
67
78
 
68
79
  end
data/spec/factories.rb CHANGED
@@ -88,6 +88,10 @@ FactoryGirl.define do
88
88
  factory :dept_access_asset, :parent=>:asset do |a|
89
89
  permissions [{:name=>"africana-faculty", :access=>"read", :type=>"group"}, {:name=>"joe_creator", :access=>"edit", :type=>"user"}]
90
90
  end
91
+
92
+ factory :group_edit_asset, :parent=>:asset do |a|
93
+ permissions [{:name=>"africana-faculty", :access=>"edit", :type=>"group"}, {:name=>"calvin_collaborator", :access=>"edit", :type=>"user"}]
94
+ end
91
95
 
92
96
  factory :org_read_access_asset, :parent=>:asset do |a|
93
97
  permissions [{:name=>"registered", :access=>"read", :type=>"group"}, {:name=>"joe_creator", :access=>"edit", :type=>"user"}, {:name=>"calvin_collaborator", :access=>"edit", :type=>"user"}]
@@ -20,6 +20,14 @@ describe Ability do
20
20
  }})
21
21
  end
22
22
 
23
+ describe "class methods" do
24
+ subject { Ability }
25
+ its(:read_group_field) { should == 'read_access_group_tsim'}
26
+ its(:read_person_field) { should == 'read_access_person_tsim'}
27
+ its(:edit_group_field) { should == 'edit_access_group_tsim'}
28
+ its(:edit_person_field) { should == 'edit_access_person_tsim'}
29
+ end
30
+
23
31
  context "for a not-signed in user" do
24
32
  before do
25
33
  User.any_instance.stub(:email).and_return(nil)
@@ -166,10 +174,9 @@ describe Ability do
166
174
 
167
175
  describe "Given an asset with collaborator" do
168
176
  before do
169
- @asset = FactoryGirl.build(:org_read_access_asset)
170
- @asset.save
177
+ @asset = FactoryGirl.create(:group_edit_asset)
171
178
  end
172
- context "Then a collaborator with edit access" do
179
+ context "Then a collaborator with edit access (user permision)" do
173
180
  before do
174
181
  @user = FactoryGirl.build(:calvin_collaborator)
175
182
  end
@@ -187,6 +194,17 @@ describe Ability do
187
194
  subject.can?(:admin, @asset).should be_false
188
195
  end
189
196
  end
197
+ context "Then a collaborator with edit access (group permision)" do
198
+ before do
199
+ @user = FactoryGirl.build(:martia_morocco)
200
+ RoleMapper.stub(:roles).with(@user.user_key).and_return(@user.roles)
201
+ end
202
+ subject { Ability.new(@user) }
203
+
204
+ it "should be able to view the asset" do
205
+ subject.can?(:read, @asset).should be_true
206
+ end
207
+ end
190
208
  end
191
209
 
192
210
  describe "Given an asset where dept can read & registered users can discover" do
@@ -269,120 +287,18 @@ describe Ability do
269
287
 
270
288
  end
271
289
 
272
- #
273
- # Policy-based Access Controls
274
- #
275
- describe "When accessing assets with Policies associated" do
290
+ describe "calling ability on two separate objects" do
276
291
  before do
277
- @user = FactoryGirl.build(:martia_morocco)
278
- RoleMapper.stub(:roles).with(@user.user_key).and_return(@user.roles)
292
+ @asset1 = FactoryGirl.create(:org_read_access_asset)
293
+ @asset2 = FactoryGirl.create(:asset)
294
+ @user = FactoryGirl.build(:calvin_collaborator) # has access to @asset1, but not @asset2
279
295
  end
280
296
  subject { Ability.new(@user) }
281
- context "Given a policy grants read access to a group I belong to" do
282
- before do
283
- @policy = Hydra::AdminPolicy.new
284
- @policy.default_permissions = [{:type=>"group", :access=>"read", :name=>"africana-faculty"}]
285
- @policy.save
286
- end
287
- after { @policy.delete }
288
- context "And a subscribing asset does not grant access" do
289
- before do
290
- @asset = ModsAsset.new()
291
- @asset.admin_policy = @policy
292
- @asset.save
293
- end
294
- after { @asset.delete }
295
- it "Then I should be able to view the asset" do
296
- subject.can?(:read, @asset).should be_true
297
- end
298
- it "Then I should not be able to edit, update and destroy the asset" do
299
- subject.can?(:edit, @asset).should be_false
300
- subject.can?(:update, @asset).should be_false
301
- subject.can?(:destroy, @asset).should be_false
302
- end
303
- end
304
- end
305
- context "Given a policy grants edit access to a group I belong to" do
306
- before do
307
- @policy = Hydra::AdminPolicy.new
308
- @policy.default_permissions = [{:type=>"group", :access=>"edit", :name=>"africana-faculty"}]
309
- @policy.save
310
- end
311
- after { @policy.delete }
312
- context "And a subscribing asset does not grant access" do
313
- before do
314
- @asset = ModsAsset.new()
315
- @asset.admin_policy = @policy
316
- @asset.save
317
- end
318
- after { @asset.delete }
319
- it "Then I should be able to view the asset" do
320
- subject.can?(:read, @asset).should be_true
321
- end
322
- it "Then I should be able to edit/update/destroy the asset" do
323
- subject.can?(:edit, @asset).should be_true
324
- subject.can?(:update, @asset).should be_true
325
- subject.can?(:destroy, @asset).should be_true
326
- end
327
- end
328
- context "And a subscribing asset grants read access to me as an individual" do
329
- before do
330
- @asset = ModsAsset.new()
331
- @asset.read_users = [@user.uid]
332
- @asset.admin_policy = @policy
333
- @asset.save
334
- end
335
- after { @asset.delete }
336
- it "Then I should be able to view the asset" do
337
- subject.can?(:read, @asset).should be_true
338
- end
339
- it "Then I should be able to edit/update/destroy the asset" do
340
- subject.can?(:edit, @asset).should be_true
341
- subject.can?(:update, @asset).should be_true
342
- subject.can?(:destroy, @asset).should be_true
343
- end
344
- end
345
- end
346
-
347
- context "Given a policy does not grant access to any group I belong to" do
348
- before do
349
- @policy = Hydra::AdminPolicy.new
350
- @policy.save
351
- end
352
- after { @policy.delete }
353
- context "And a subscribing asset does not grant access" do
354
- before do
355
- @asset = ModsAsset.new()
356
- @asset.admin_policy = @policy
357
- @asset.save
358
- end
359
- after { @asset.delete }
360
- it "Then I should not be able to view the asset" do
361
- subject.can?(:read, @asset).should be_false
362
- end
363
- it "Then I should not be able to edit/update/destroy the asset" do
364
- subject.can?(:edit, @asset).should be_false
365
- subject.can?(:update, @asset).should be_false
366
- subject.can?(:destroy, @asset).should be_false
367
- end
368
- end
369
- context "And a subscribing asset grants read access to me as an individual" do
370
- before do
371
- @asset = ModsAsset.new()
372
- @asset.read_users = [@user.uid]
373
- @asset.admin_policy = @policy
374
- @asset.save
375
- end
376
- after { @asset.delete }
377
- it "Then I should be able to view the asset" do
378
- subject.can?(:read, @asset).should be_true
379
- end
380
- it "Then I should not be able to edit/update/destroy the asset" do
381
- subject.can?(:edit, @asset).should be_false
382
- subject.can?(:update, @asset).should be_false
383
- subject.can?(:destroy, @asset).should be_false
384
- end
385
- end
297
+ it "should be readable in the first instance and not in the second instance" do
298
+ # We had a bug around this where it keeps returning the access for the first object queried
299
+ subject.can?(:edit, @asset1).should be_true
300
+ subject.can?(:edit, @asset2).should be_false
386
301
  end
387
302
  end
303
+
388
304
  end
@@ -121,5 +121,121 @@ describe Hydra::AdminPolicy do
121
121
 
122
122
  end
123
123
 
124
+ #
125
+ # Policy-based Access Controls
126
+ #
127
+ describe "When accessing assets with Policies associated" do
128
+ before do
129
+ @user = FactoryGirl.build(:martia_morocco)
130
+ RoleMapper.stub(:roles).with(@user.user_key).and_return(@user.roles)
131
+ end
132
+ subject { Ability.new(@user) }
133
+ context "Given a policy grants read access to a group I belong to" do
134
+ before do
135
+ @policy = Hydra::AdminPolicy.new
136
+ @policy.default_permissions = [{:type=>"group", :access=>"read", :name=>"africana-faculty"}]
137
+ @policy.save
138
+ end
139
+ after { @policy.delete }
140
+ context "And a subscribing asset does not grant access" do
141
+ before do
142
+ @asset = ModsAsset.new()
143
+ @asset.admin_policy = @policy
144
+ @asset.save
145
+ end
146
+ after { @asset.delete }
147
+ it "Then I should be able to view the asset" do
148
+ subject.can?(:read, @asset).should be_true
149
+ end
150
+ it "Then I should not be able to edit, update and destroy the asset" do
151
+ subject.can?(:edit, @asset).should be_false
152
+ subject.can?(:update, @asset).should be_false
153
+ subject.can?(:destroy, @asset).should be_false
154
+ end
155
+ end
156
+ end
157
+ context "Given a policy grants edit access to a group I belong to" do
158
+ before do
159
+ @policy = Hydra::AdminPolicy.new
160
+ @policy.default_permissions = [{:type=>"group", :access=>"edit", :name=>"africana-faculty"}]
161
+ @policy.save
162
+ end
163
+ after { @policy.delete }
164
+ context "And a subscribing asset does not grant access" do
165
+ before do
166
+ @asset = ModsAsset.new()
167
+ @asset.admin_policy = @policy
168
+ @asset.save
169
+ end
170
+ after { @asset.delete }
171
+ it "Then I should be able to view the asset" do
172
+ subject.can?(:read, @asset).should be_true
173
+ end
174
+ it "Then I should be able to edit/update/destroy the asset" do
175
+ subject.can?(:edit, @asset).should be_true
176
+ subject.can?(:update, @asset).should be_true
177
+ subject.can?(:destroy, @asset).should be_true
178
+ end
179
+ end
180
+ context "And a subscribing asset grants read access to me as an individual" do
181
+ before do
182
+ @asset = ModsAsset.new()
183
+ @asset.read_users = [@user.uid]
184
+ @asset.admin_policy = @policy
185
+ @asset.save
186
+ end
187
+ after { @asset.delete }
188
+ it "Then I should be able to view the asset" do
189
+ subject.can?(:read, @asset).should be_true
190
+ end
191
+ it "Then I should be able to edit/update/destroy the asset" do
192
+ subject.can?(:edit, @asset).should be_true
193
+ subject.can?(:update, @asset).should be_true
194
+ subject.can?(:destroy, @asset).should be_true
195
+ end
196
+ end
197
+ end
198
+
199
+ context "Given a policy does not grant access to any group I belong to" do
200
+ before do
201
+ @policy = Hydra::AdminPolicy.new
202
+ @policy.save
203
+ end
204
+ after { @policy.delete }
205
+ context "And a subscribing asset does not grant access" do
206
+ before do
207
+ @asset = ModsAsset.new()
208
+ @asset.admin_policy = @policy
209
+ @asset.save
210
+ end
211
+ after { @asset.delete }
212
+ it "Then I should not be able to view the asset" do
213
+ subject.can?(:read, @asset).should be_false
214
+ end
215
+ it "Then I should not be able to edit/update/destroy the asset" do
216
+ subject.can?(:edit, @asset).should be_false
217
+ subject.can?(:update, @asset).should be_false
218
+ subject.can?(:destroy, @asset).should be_false
219
+ end
220
+ end
221
+ context "And a subscribing asset grants read access to me as an individual" do
222
+ before do
223
+ @asset = ModsAsset.new()
224
+ @asset.read_users = [@user.uid]
225
+ @asset.admin_policy = @policy
226
+ @asset.save
227
+ end
228
+ after { @asset.delete }
229
+ it "Then I should be able to view the asset" do
230
+ subject.can?(:read, @asset).should be_true
231
+ end
232
+ it "Then I should not be able to edit/update/destroy the asset" do
233
+ subject.can?(:edit, @asset).should be_false
234
+ subject.can?(:update, @asset).should be_false
235
+ subject.can?(:destroy, @asset).should be_false
236
+ end
237
+ end
238
+ end
239
+ end
124
240
 
125
241
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hydra-access-controls
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.pre4
4
+ version: 6.0.0.pre5
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-01-30 00:00:00.000000000 Z
14
+ date: 2013-02-02 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 6.0.0.pre3
39
+ version: 6.0.0.pre8
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,7 +44,7 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 6.0.0.pre3
47
+ version: 6.0.0.pre8
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cancan
50
50
  requirement: !ruby/object:Gem::Requirement