cancancan 1.8.4 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +15 -0
- data/Appraisals +28 -0
- data/CHANGELOG.rdoc +7 -0
- data/README.rdoc +1 -1
- data/gemfiles/activerecord_4.0.gemfile +17 -0
- data/gemfiles/activerecord_4.1.gemfile +17 -0
- data/lib/cancan.rb +11 -1
- data/lib/cancan/controller_additions.rb +1 -1
- data/lib/cancan/controller_resource.rb +14 -7
- data/lib/cancan/model_adapters/active_record_3_adapter.rb +47 -0
- data/lib/cancan/model_adapters/active_record_4_adapter.rb +21 -0
- data/lib/cancan/model_adapters/active_record_adapter.rb +8 -40
- data/lib/cancan/version.rb +1 -1
- data/spec/cancan/controller_resource_spec.rb +36 -25
- data/spec/cancan/model_adapters/active_record_adapter_spec.rb +37 -5
- data/spec/spec_helper.rb +3 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59fd5f683924f32658036d91ec731a03dc2620f0
|
4
|
+
data.tar.gz: 80ada1d8d82e08dae4f39afa0f4fc6e0bba1a43b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7854cb0fd225fc65ca36e2ae8b3d257e2509ebc092801a1802686bd2537dcb3c53f0e522f3d9a43b15ded9765a026c9d11c3588f4a4ff28bd752606fa01788c
|
7
|
+
data.tar.gz: e98f2b6d8defb75df838a82a5c0a28befdec610db7be82f119e70a922d953963fc7c268d014668ccf28c5fd54ccabbda9ca8d8bba4e175b587a36093f4da76b4
|
data/.travis.yml
CHANGED
@@ -11,6 +11,8 @@ gemfile:
|
|
11
11
|
- gemfiles/activerecord_3.0.gemfile
|
12
12
|
- gemfiles/activerecord_3.1.gemfile
|
13
13
|
- gemfiles/activerecord_3.2.gemfile
|
14
|
+
- gemfiles/activerecord_4.0.gemfile
|
15
|
+
- gemfiles/activerecord_4.1.gemfile
|
14
16
|
- gemfiles/datamapper_1.x.gemfile
|
15
17
|
- gemfiles/mongoid_2.x.gemfile
|
16
18
|
- gemfiles/sequel_3.x.gemfile
|
@@ -19,6 +21,19 @@ services:
|
|
19
21
|
matrix:
|
20
22
|
allow_failures:
|
21
23
|
- rvm: rbx
|
24
|
+
exclude:
|
25
|
+
- rvm: 1.8.7
|
26
|
+
gemfile: gemfiles/activerecord_4.0.gemfile
|
27
|
+
- rvm: 1.8.7
|
28
|
+
gemfile: gemfiles/activerecord_4.1.gemfile
|
29
|
+
- rvm: 1.9.2
|
30
|
+
gemfile: gemfiles/activerecord_4.0.gemfile
|
31
|
+
- rvm: 1.9.2
|
32
|
+
gemfile: gemfiles/activerecord_4.1.gemfile
|
33
|
+
- rvm: ree
|
34
|
+
gemfile: gemfiles/activerecord_4.0.gemfile
|
35
|
+
- rvm: ree
|
36
|
+
gemfile: gemfiles/activerecord_4.1.gemfile
|
22
37
|
notifications:
|
23
38
|
recipients:
|
24
39
|
- bryan@bryanrite.com
|
data/Appraisals
CHANGED
@@ -39,6 +39,34 @@ appraise "activerecord_3.2" do
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
appraise "activerecord_4.0" do
|
43
|
+
gem "activerecord", "~> 4.0.5", :require => "active_record"
|
44
|
+
gem 'activesupport', '~> 4.0.5', :require => 'active_support/all'
|
45
|
+
|
46
|
+
gemfile.platforms :jruby do
|
47
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
48
|
+
gem "jdbc-sqlite3"
|
49
|
+
end
|
50
|
+
|
51
|
+
gemfile.platforms :ruby, :mswin, :mingw do
|
52
|
+
gem "sqlite3"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
appraise "activerecord_4.1" do
|
57
|
+
gem "activerecord", "~> 4.1.1", :require => "active_record"
|
58
|
+
gem 'activesupport', '~> 4.1.1', :require => 'active_support/all'
|
59
|
+
|
60
|
+
gemfile.platforms :jruby do
|
61
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
62
|
+
gem "jdbc-sqlite3"
|
63
|
+
end
|
64
|
+
|
65
|
+
gemfile.platforms :ruby, :mswin, :mingw do
|
66
|
+
gem "sqlite3"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
42
70
|
appraise "datamapper_1.x" do
|
43
71
|
gem 'activesupport', '~> 3.0', :require => 'active_support/all'
|
44
72
|
gem "dm-core", "~> 1.0.2"
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
Develop
|
2
2
|
|
3
3
|
|
4
|
+
1.9.0 (July 20th, 2014)
|
5
|
+
|
6
|
+
* Fix cancancan#59 - Parameters are automatically detected and santitized for all actions, not just create and update. (bryanrite)
|
7
|
+
|
8
|
+
* Fix cancancan#97, 72, 40, 39, 26 - Support Active Record 4 properly with references on nested permissions. (scpike, tdg5, Crystark)
|
9
|
+
|
10
|
+
|
4
11
|
1.8.4 (June 24th, 2014)
|
5
12
|
|
6
13
|
* Fix cancancan#86 - Fixes previous RSpec 3 update as there was a bug in the fix for RSpec 2.99. (bryanrite)
|
data/README.rdoc
CHANGED
@@ -22,7 +22,7 @@ Any help is greatly appreciated, feel free to submit pull-requests or open issue
|
|
22
22
|
|
23
23
|
In <b>Rails 3 and 4</b>, add this to your Gemfile and run the +bundle+ command.
|
24
24
|
|
25
|
-
gem 'cancancan', '~> 1.
|
25
|
+
gem 'cancancan', '~> 1.9'
|
26
26
|
|
27
27
|
In <b>Rails 2</b>, add this to your environment.rb file.
|
28
28
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "activerecord", "~> 4.0.5", :require => "active_record"
|
6
|
+
gem "activesupport", "~> 4.0.5", :require => "active_support/all"
|
7
|
+
|
8
|
+
platforms :jruby do
|
9
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
10
|
+
gem "jdbc-sqlite3"
|
11
|
+
end
|
12
|
+
|
13
|
+
platforms :ruby, :mswin, :mingw do
|
14
|
+
gem "sqlite3"
|
15
|
+
end
|
16
|
+
|
17
|
+
gemspec :path => "../"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "activerecord", "~> 4.1.1", :require => "active_record"
|
6
|
+
gem "activesupport", "~> 4.1.1", :require => "active_support/all"
|
7
|
+
|
8
|
+
platforms :jruby do
|
9
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
10
|
+
gem "jdbc-sqlite3"
|
11
|
+
end
|
12
|
+
|
13
|
+
platforms :ruby, :mswin, :mingw do
|
14
|
+
gem "sqlite3"
|
15
|
+
end
|
16
|
+
|
17
|
+
gemspec :path => "../"
|
data/lib/cancan.rb
CHANGED
@@ -9,7 +9,17 @@ require 'cancan/inherited_resource'
|
|
9
9
|
|
10
10
|
require 'cancan/model_adapters/abstract_adapter'
|
11
11
|
require 'cancan/model_adapters/default_adapter'
|
12
|
-
|
12
|
+
|
13
|
+
if defined? ActiveRecord
|
14
|
+
require 'cancan/model_adapters/active_record_adapter'
|
15
|
+
if ActiveRecord.respond_to?(:version) &&
|
16
|
+
ActiveRecord.version >= Gem::Version.new("4")
|
17
|
+
require 'cancan/model_adapters/active_record_4_adapter'
|
18
|
+
else
|
19
|
+
require 'cancan/model_adapters/active_record_3_adapter'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
13
23
|
require 'cancan/model_adapters/data_mapper_adapter' if defined? DataMapper
|
14
24
|
require 'cancan/model_adapters/mongoid_adapter' if defined?(Mongoid) && defined?(Mongoid::Document)
|
15
25
|
require 'cancan/model_adapters/sequel_adapter' if defined? Sequel
|
@@ -294,7 +294,7 @@ module CanCan
|
|
294
294
|
|
295
295
|
def self.included(base)
|
296
296
|
base.extend ClassMethods
|
297
|
-
base.helper_method :can?, :cannot?, :current_ability
|
297
|
+
base.helper_method :can?, :cannot?, :current_ability if base.respond_to? :helper_method
|
298
298
|
end
|
299
299
|
|
300
300
|
# Raises a CanCan::AccessDenied exception if the current_ability cannot
|
@@ -220,22 +220,29 @@ module CanCan
|
|
220
220
|
end
|
221
221
|
|
222
222
|
def resource_params
|
223
|
-
if
|
223
|
+
if parameters_require_sanitizing? && params_method.present?
|
224
224
|
return case params_method
|
225
225
|
when Symbol then @controller.send(params_method)
|
226
226
|
when String then @controller.instance_eval(params_method)
|
227
227
|
when Proc then params_method.call(@controller)
|
228
228
|
end
|
229
|
-
|
230
|
-
|
231
|
-
return @params[params_key] if @params[params_key]
|
229
|
+
else
|
230
|
+
resource_params_by_namespaced_name
|
232
231
|
end
|
232
|
+
end
|
233
233
|
|
234
|
-
|
234
|
+
def parameters_require_sanitizing?
|
235
|
+
save_actions.include?(@params[:action].to_sym) || resource_params_by_namespaced_name.present?
|
235
236
|
end
|
236
237
|
|
237
238
|
def resource_params_by_namespaced_name
|
238
|
-
@params
|
239
|
+
if @options[:instance_name] && @params.has_key?(extract_key(@options[:instance_name]))
|
240
|
+
@params[extract_key(@options[:instance_name])]
|
241
|
+
elsif @options[:class] && @params.has_key?(extract_key(@options[:class]))
|
242
|
+
@params[extract_key(@options[:class])]
|
243
|
+
else
|
244
|
+
@params[extract_key(namespaced_name)]
|
245
|
+
end
|
239
246
|
end
|
240
247
|
|
241
248
|
def params_method
|
@@ -277,7 +284,7 @@ module CanCan
|
|
277
284
|
[:new, :create] + Array(@options[:new])
|
278
285
|
end
|
279
286
|
|
280
|
-
def
|
287
|
+
def save_actions
|
281
288
|
[:create, :update]
|
282
289
|
end
|
283
290
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module CanCan
|
2
|
+
module ModelAdapters
|
3
|
+
class ActiveRecord3Adapter < AbstractAdapter
|
4
|
+
include ActiveRecordAdapter
|
5
|
+
def self.for_class?(model_class)
|
6
|
+
model_class <= ActiveRecord::Base
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.override_condition_matching?(subject, name, value)
|
10
|
+
name.kind_of?(MetaWhere::Column) if defined? MetaWhere
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.matches_condition?(subject, name, value)
|
14
|
+
subject_value = subject.send(name.column)
|
15
|
+
if name.method.to_s.ends_with? "_any"
|
16
|
+
value.any? { |v| meta_where_match? subject_value, name.method.to_s.sub("_any", ""), v }
|
17
|
+
elsif name.method.to_s.ends_with? "_all"
|
18
|
+
value.all? { |v| meta_where_match? subject_value, name.method.to_s.sub("_all", ""), v }
|
19
|
+
else
|
20
|
+
meta_where_match? subject_value, name.method, value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.meta_where_match?(subject_value, method, value)
|
25
|
+
case method.to_sym
|
26
|
+
when :eq then subject_value == value
|
27
|
+
when :not_eq then subject_value != value
|
28
|
+
when :in then value.include?(subject_value)
|
29
|
+
when :not_in then !value.include?(subject_value)
|
30
|
+
when :lt then subject_value < value
|
31
|
+
when :lteq then subject_value <= value
|
32
|
+
when :gt then subject_value > value
|
33
|
+
when :gteq then subject_value >= value
|
34
|
+
when :matches then subject_value =~ Regexp.new("^" + Regexp.escape(value).gsub("%", ".*") + "$", true)
|
35
|
+
when :does_not_match then !meta_where_match?(subject_value, :matches, value)
|
36
|
+
else raise NotImplemented, "The #{method} MetaWhere condition is not supported."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def build_relation(*where_conditions)
|
43
|
+
@model_class.where(*where_conditions).includes(joins)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CanCan
|
2
|
+
module ModelAdapters
|
3
|
+
class ActiveRecord4Adapter < AbstractAdapter
|
4
|
+
include ActiveRecordAdapter
|
5
|
+
def self.for_class?(model_class)
|
6
|
+
model_class <= ActiveRecord::Base
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
# As of rails 4, `includes()` no longer causes active record to
|
12
|
+
# look inside the where clause to decide to outer join tables
|
13
|
+
# you're using in the where. Instead, `references()` is required
|
14
|
+
# in addition to `includes()` to force the outer join.
|
15
|
+
#
|
16
|
+
def build_relation(*where_conditions)
|
17
|
+
@model_class.where(*where_conditions).includes(joins).references(joins)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,41 +1,6 @@
|
|
1
1
|
module CanCan
|
2
2
|
module ModelAdapters
|
3
|
-
|
4
|
-
def self.for_class?(model_class)
|
5
|
-
model_class <= ActiveRecord::Base
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.override_condition_matching?(subject, name, value)
|
9
|
-
name.kind_of?(MetaWhere::Column) if defined? MetaWhere
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.matches_condition?(subject, name, value)
|
13
|
-
subject_value = subject.send(name.column)
|
14
|
-
if name.method.to_s.ends_with? "_any"
|
15
|
-
value.any? { |v| meta_where_match? subject_value, name.method.to_s.sub("_any", ""), v }
|
16
|
-
elsif name.method.to_s.ends_with? "_all"
|
17
|
-
value.all? { |v| meta_where_match? subject_value, name.method.to_s.sub("_all", ""), v }
|
18
|
-
else
|
19
|
-
meta_where_match? subject_value, name.method, value
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.meta_where_match?(subject_value, method, value)
|
24
|
-
case method.to_sym
|
25
|
-
when :eq then subject_value == value
|
26
|
-
when :not_eq then subject_value != value
|
27
|
-
when :in then value.include?(subject_value)
|
28
|
-
when :not_in then !value.include?(subject_value)
|
29
|
-
when :lt then subject_value < value
|
30
|
-
when :lteq then subject_value <= value
|
31
|
-
when :gt then subject_value > value
|
32
|
-
when :gteq then subject_value >= value
|
33
|
-
when :matches then subject_value =~ Regexp.new("^" + Regexp.escape(value).gsub("%", ".*") + "$", true)
|
34
|
-
when :does_not_match then !meta_where_match?(subject_value, :matches, value)
|
35
|
-
else raise NotImplemented, "The #{method} MetaWhere condition is not supported."
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
3
|
+
module ActiveRecordAdapter
|
39
4
|
# Returns conditions intended to be used inside a database query. Normally you will not call this
|
40
5
|
# method directly, but instead go through ModelAdditions#accessible_by.
|
41
6
|
#
|
@@ -99,11 +64,10 @@ module CanCan
|
|
99
64
|
if override_scope
|
100
65
|
@model_class.where(nil).merge(override_scope)
|
101
66
|
elsif @model_class.respond_to?(:where) && @model_class.respond_to?(:joins)
|
102
|
-
mergeable_conditions
|
103
|
-
|
104
|
-
@model_class.where(conditions).includes(joins)
|
67
|
+
if mergeable_conditions?
|
68
|
+
build_relation(conditions)
|
105
69
|
else
|
106
|
-
|
70
|
+
build_relation(*(@rules.map(&:conditions)))
|
107
71
|
end
|
108
72
|
else
|
109
73
|
@model_class.all(:conditions => conditions, :joins => joins)
|
@@ -112,6 +76,10 @@ module CanCan
|
|
112
76
|
|
113
77
|
private
|
114
78
|
|
79
|
+
def mergeable_conditions?
|
80
|
+
@rules.find {|rule| rule.unmergeable? }.blank?
|
81
|
+
end
|
82
|
+
|
115
83
|
def override_scope
|
116
84
|
conditions = @rules.map(&:conditions).compact
|
117
85
|
if defined?(ActiveRecord::Relation) && conditions.any? { |c| c.kind_of?(ActiveRecord::Relation) }
|
data/lib/cancan/version.rb
CHANGED
@@ -125,8 +125,11 @@ describe CanCan::ControllerResource do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
context "with a strong parameters method" do
|
128
|
+
before :each do
|
129
|
+
params.merge!(:controller => "model", :model => { :name => 'test'})
|
130
|
+
end
|
131
|
+
|
128
132
|
it "accepts and uses the specified symbol for santitizing input" do
|
129
|
-
params.merge!(:controller => "model")
|
130
133
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
131
134
|
allow(controller).to receive(:model_params).and_return(:model => 'params')
|
132
135
|
allow(controller).to receive(:create_params).and_return(:create => 'params')
|
@@ -136,19 +139,16 @@ describe CanCan::ControllerResource do
|
|
136
139
|
end
|
137
140
|
|
138
141
|
it "accepts the specified string for sanitizing input" do
|
139
|
-
params.merge!(:controller => "model")
|
140
142
|
resource = CanCan::ControllerResource.new(controller, {:param_method => "{:custom => 'params'}"})
|
141
143
|
expect(resource.send("resource_params")).to eq(:custom => 'params')
|
142
144
|
end
|
143
145
|
|
144
146
|
it "accepts the specified proc for sanitizing input" do
|
145
|
-
params.merge!(:controller => "model")
|
146
147
|
resource = CanCan::ControllerResource.new(controller, {:param_method => Proc.new { |c| {:custom => 'params'}}})
|
147
148
|
expect(resource.send("resource_params")).to eq(:custom => 'params')
|
148
149
|
end
|
149
150
|
|
150
151
|
it "prefers to use the create_params method for santitizing input" do
|
151
|
-
params.merge!(:controller => "model")
|
152
152
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
153
153
|
allow(controller).to receive(:model_params).and_return(:model => 'params')
|
154
154
|
allow(controller).to receive(:create_params).and_return(:create => 'params')
|
@@ -158,7 +158,6 @@ describe CanCan::ControllerResource do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
it "prefers to use the <model_name>_params method for santitizing input if create is not found" do
|
161
|
-
params.merge!(:controller => "model")
|
162
161
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
163
162
|
allow(controller).to receive(:model_params).and_return(:model => 'params')
|
164
163
|
allow(controller).to receive(:custom_params).and_return(:custom => 'params')
|
@@ -167,7 +166,6 @@ describe CanCan::ControllerResource do
|
|
167
166
|
end
|
168
167
|
|
169
168
|
it "prefers to use the resource_params method for santitizing input if create or model is not found" do
|
170
|
-
params.merge!(:controller => "model")
|
171
169
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
172
170
|
allow(controller).to receive(:custom_params).and_return(:custom => 'params')
|
173
171
|
resource = CanCan::ControllerResource.new(controller)
|
@@ -508,28 +506,41 @@ describe CanCan::ControllerResource do
|
|
508
506
|
end
|
509
507
|
end
|
510
508
|
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
end
|
509
|
+
it "calls the santitizer when the parameter hash matches our object" do
|
510
|
+
params.merge!(:action => 'create', :model => { :name => 'test' })
|
511
|
+
allow(controller).to receive(:create_params).and_return({})
|
515
512
|
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
allow(resource).to receive(:param_actions) { [:create] }
|
513
|
+
resource = CanCan::ControllerResource.new(controller)
|
514
|
+
resource.load_resource
|
515
|
+
expect(controller.instance_variable_get(:@model).name).to eq nil
|
516
|
+
end
|
521
517
|
|
522
|
-
|
523
|
-
|
524
|
-
|
518
|
+
it "santitizes correctly when the instance name is overriden" do
|
519
|
+
params.merge!(:action => 'create', :custom_name => {:name => "foobar"})
|
520
|
+
allow(controller).to receive(:create_params).and_return({})
|
525
521
|
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
522
|
+
resource = CanCan::ControllerResource.new(controller, :instance_name => :custom_name)
|
523
|
+
resource.load_resource
|
524
|
+
expect(controller.instance_variable_get(:@custom_name).name).to eq nil
|
525
|
+
end
|
526
|
+
|
527
|
+
it "calls the santitize method on non-save actions when required" do
|
528
|
+
params.merge!(:action => 'new', :model => { :name => 'test' })
|
529
|
+
|
530
|
+
allow(controller).to receive(:resource_params).and_return({})
|
531
|
+
resource = CanCan::ControllerResource.new(controller)
|
532
|
+
resource.load_resource
|
533
|
+
expect(controller.instance_variable_get(:@model).name).to eq nil
|
534
|
+
end
|
535
|
+
|
536
|
+
it "doesn't sanitize parameters on non-save actions when not required" do
|
537
|
+
params.merge!(:action => 'new', :not_our_model => { :name => 'test' })
|
538
|
+
allow(controller).to receive(:resource_params).and_raise
|
539
|
+
|
540
|
+
resource = CanCan::ControllerResource.new(controller)
|
541
|
+
expect {
|
542
|
+
resource.load_resource
|
543
|
+
}.to_not raise_error
|
533
544
|
end
|
534
545
|
|
535
546
|
it "is a parent resource when name is provided which doesn't match controller" do
|
@@ -35,6 +35,12 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
35
35
|
t.timestamps
|
36
36
|
end
|
37
37
|
|
38
|
+
create_table(:legacy_mentions) do |t|
|
39
|
+
t.integer :user_id
|
40
|
+
t.integer :article_id
|
41
|
+
t.timestamps
|
42
|
+
end
|
43
|
+
|
38
44
|
create_table(:users) do |t|
|
39
45
|
t.timestamps
|
40
46
|
end
|
@@ -50,9 +56,17 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
50
56
|
class Article < ActiveRecord::Base
|
51
57
|
belongs_to :category
|
52
58
|
has_many :comments
|
59
|
+
has_many :mentions
|
60
|
+
has_many :mentioned_users, :through => :mentions, :source => :user
|
53
61
|
belongs_to :user
|
54
62
|
end
|
55
63
|
|
64
|
+
class Mention < ActiveRecord::Base
|
65
|
+
self.table_name = 'legacy_mentions'
|
66
|
+
belongs_to :user
|
67
|
+
belongs_to :article
|
68
|
+
end
|
69
|
+
|
56
70
|
class Comment < ActiveRecord::Base
|
57
71
|
belongs_to :article
|
58
72
|
end
|
@@ -67,14 +81,22 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
67
81
|
end
|
68
82
|
|
69
83
|
it "is for only active record classes" do
|
70
|
-
|
71
|
-
|
72
|
-
|
84
|
+
if ActiveRecord.respond_to?(:version) &&
|
85
|
+
ActiveRecord.version > Gem::Version.new("4")
|
86
|
+
expect(CanCan::ModelAdapters::ActiveRecord4Adapter).to_not be_for_class(Object)
|
87
|
+
expect(CanCan::ModelAdapters::ActiveRecord4Adapter).to be_for_class(Article)
|
88
|
+
expect(CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)).to eq(CanCan::ModelAdapters::ActiveRecord4Adapter)
|
89
|
+
else
|
90
|
+
expect(CanCan::ModelAdapters::ActiveRecord3Adapter).to_not be_for_class(Object)
|
91
|
+
expect(CanCan::ModelAdapters::ActiveRecord3Adapter).to be_for_class(Article)
|
92
|
+
expect(CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)).to eq(CanCan::ModelAdapters::ActiveRecord3Adapter)
|
93
|
+
end
|
73
94
|
end
|
74
95
|
|
75
96
|
it "finds record" do
|
76
97
|
article = Article.create!
|
77
|
-
|
98
|
+
adapter = CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)
|
99
|
+
expect(adapter.find(Article, article.id)).to eq(article)
|
78
100
|
end
|
79
101
|
|
80
102
|
it "does not fetch any records when no abilities are defined" do
|
@@ -105,6 +127,16 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
105
127
|
expect(Article.accessible_by(@ability)).to eq([article1, article2, article3])
|
106
128
|
end
|
107
129
|
|
130
|
+
it "fetches any articles which we are cited in" do
|
131
|
+
user = User.create!
|
132
|
+
cited = Article.create!
|
133
|
+
not_cited = Article.create!
|
134
|
+
cited.mentioned_users << user
|
135
|
+
@ability.can :read, Article, { :mentioned_users => { :id => user.id } }
|
136
|
+
@ability.can :read, Article, { :mentions => { :user_id => user.id } }
|
137
|
+
expect(Article.accessible_by(@ability)).to eq([cited])
|
138
|
+
end
|
139
|
+
|
108
140
|
it "fetches only the articles that are published and not secret" do
|
109
141
|
@ability.can :read, Article, :published => true
|
110
142
|
@ability.cannot :read, Article, :secret => true
|
@@ -337,7 +369,7 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
337
369
|
end
|
338
370
|
|
339
371
|
it "matches any MetaWhere condition" do
|
340
|
-
adapter = CanCan::ModelAdapters::
|
372
|
+
adapter = CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)
|
341
373
|
article1 = Article.new(:priority => 1, :name => "Hello World")
|
342
374
|
expect(adapter.matches_condition?(article1, :priority.eq, 1)).to be(true)
|
343
375
|
expect(adapter.matches_condition?(article1, :priority.eq, 2)).to be(false)
|
data/spec/spec_helper.rb
CHANGED
@@ -7,7 +7,9 @@ require 'matchers'
|
|
7
7
|
require 'cancan/matchers'
|
8
8
|
|
9
9
|
# I8n setting to fix deprecation.
|
10
|
-
|
10
|
+
if defined?(I18n) && I18n.respond_to?('enforce_available_locales=')
|
11
|
+
I18n.enforce_available_locales = false
|
12
|
+
end
|
11
13
|
|
12
14
|
# Add support to load paths
|
13
15
|
$:.unshift File.expand_path('../support', __FILE__)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cancancan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Rite
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -88,6 +88,8 @@ files:
|
|
88
88
|
- gemfiles/activerecord_3.0.gemfile
|
89
89
|
- gemfiles/activerecord_3.1.gemfile
|
90
90
|
- gemfiles/activerecord_3.2.gemfile
|
91
|
+
- gemfiles/activerecord_4.0.gemfile
|
92
|
+
- gemfiles/activerecord_4.1.gemfile
|
91
93
|
- gemfiles/datamapper_1.x.gemfile
|
92
94
|
- gemfiles/mongoid_2.x.gemfile
|
93
95
|
- gemfiles/sequel_3.x.gemfile
|
@@ -100,6 +102,8 @@ files:
|
|
100
102
|
- lib/cancan/inherited_resource.rb
|
101
103
|
- lib/cancan/matchers.rb
|
102
104
|
- lib/cancan/model_adapters/abstract_adapter.rb
|
105
|
+
- lib/cancan/model_adapters/active_record_3_adapter.rb
|
106
|
+
- lib/cancan/model_adapters/active_record_4_adapter.rb
|
103
107
|
- lib/cancan/model_adapters/active_record_adapter.rb
|
104
108
|
- lib/cancan/model_adapters/data_mapper_adapter.rb
|
105
109
|
- lib/cancan/model_adapters/default_adapter.rb
|
@@ -158,6 +162,8 @@ test_files:
|
|
158
162
|
- gemfiles/activerecord_3.0.gemfile
|
159
163
|
- gemfiles/activerecord_3.1.gemfile
|
160
164
|
- gemfiles/activerecord_3.2.gemfile
|
165
|
+
- gemfiles/activerecord_4.0.gemfile
|
166
|
+
- gemfiles/activerecord_4.1.gemfile
|
161
167
|
- gemfiles/datamapper_1.x.gemfile
|
162
168
|
- gemfiles/mongoid_2.x.gemfile
|
163
169
|
- gemfiles/sequel_3.x.gemfile
|