cancancan 2.1.2 → 2.2.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: a0cac57012f776fb962fcfa0fd97d92c11b47628
4
- data.tar.gz: c0c7f568a6307585076c3ffb622dd2f5d1f464e3
2
+ SHA256:
3
+ metadata.gz: cd789707449c90277a31d5808e55c36140b88b3aa3c2b9035640d777220b2d27
4
+ data.tar.gz: 64fbbaa5657ae8b334e7096f33eb12b975a224ea7c516c0091d3d7ac94c0acbd
5
5
  SHA512:
6
- metadata.gz: c5198aeba210ef606f29cb1c743edafa78c0022ad25ffa0c20363050e9fca225133f97ee1482fe50857182e90d0c70346bcb9880c02dedbe741270ecb10aad10
7
- data.tar.gz: 32ffcf4998583cce920d79d4f1401f5dcbfe6df0a15b6199591079cbd586cb57defc4f892d01f083b16471c700dd2ba377eb0a63ab6b995a3db4c27d8df55d4d
6
+ metadata.gz: 70ba8098042c7114a7cf419a892c12794089da88046873fb6abf1c45dac3854731adb860ff95d2556f7e9ffad4543b5f53dc05579defd5ff8273bcf51476e0ce
7
+ data.tar.gz: 5d390ebd7fa75ffbff3783502d6bf329d5949787b70ccd26559d40be4471c61efb8f4ea4adc2d53b6bac81f9e32e619d3569c268ff8a6277f16cab72ea162bf5
data/cancancan.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.files = `git ls-files lib init.rb cancancan.gemspec`.split($INPUT_RECORD_SEPARATOR)
19
19
  s.require_paths = ['lib']
20
20
 
21
- s.required_ruby_version = '>= 2.0.0'
21
+ s.required_ruby_version = '>= 2.2.0'
22
22
 
23
23
  s.add_development_dependency 'bundler', '~> 1.3'
24
24
  s.add_development_dependency 'rubocop', '~> 0.48.1'
@@ -173,7 +173,7 @@ module CanCan
173
173
  end
174
174
  if cannot?(action, subject, *args)
175
175
  message ||= unauthorized_message(action, subject)
176
- raise AccessDenied.new(message, action, subject)
176
+ raise AccessDenied.new(message, action, subject, args)
177
177
  end
178
178
  subject
179
179
  end
@@ -384,9 +384,6 @@ module CanCan
384
384
  end
385
385
  end
386
386
 
387
- if defined? ActionController
388
- %w[Base API].each do |klass|
389
- next unless ActionController.const_defined?(klass)
390
- ActionController.const_get(klass).class_eval { include CanCan::ControllerAdditions }
391
- end
387
+ ActiveSupport.on_load(:action_controller) do
388
+ include CanCan::ControllerAdditions
392
389
  end
@@ -33,13 +33,14 @@ module CanCan
33
33
  # See ControllerAdditions#authorized! for more information on rescuing from this exception
34
34
  # and customizing the message using I18n.
35
35
  class AccessDenied < Error
36
- attr_reader :action, :subject
36
+ attr_reader :action, :subject, :conditions
37
37
  attr_writer :default_message
38
38
 
39
- def initialize(message = nil, action = nil, subject = nil)
39
+ def initialize(message = nil, action = nil, subject = nil, conditions = nil)
40
40
  @message = message
41
41
  @action = action
42
42
  @subject = subject
43
+ @conditions = conditions
43
44
  @default_message = I18n.t(:"unauthorized.default", default: 'You are not authorized to access this page.')
44
45
  end
45
46
 
@@ -3,7 +3,7 @@ module CanCan
3
3
  class ActiveRecord4Adapter < AbstractAdapter
4
4
  include ActiveRecordAdapter
5
5
  def self.for_class?(model_class)
6
- model_class <= ActiveRecord::Base
6
+ ActiveRecord::VERSION::MAJOR == 4 && model_class <= ActiveRecord::Base
7
7
  end
8
8
 
9
9
  # TODO: this should be private
@@ -39,11 +39,8 @@ module CanCan
39
39
 
40
40
  # Rails 4.2 deprecates `sanitize_sql_hash_for_conditions`
41
41
  def sanitize_sql(conditions)
42
- if ActiveRecord::VERSION::MAJOR > 4 && conditions.is_a?(Hash)
43
- sanitize_sql_activerecord5(conditions)
44
- elsif ActiveRecord::VERSION::MINOR >= 2 && conditions.is_a?(Hash)
42
+ if ActiveRecord::VERSION::MINOR >= 2 && conditions.is_a?(Hash)
45
43
  sanitize_sql_activerecord4(conditions)
46
-
47
44
  else
48
45
  @model_class.send(:sanitize_sql, conditions)
49
46
  end
@@ -59,21 +56,6 @@ module CanCan
59
56
  @model_class.send(:connection).visitor.compile b
60
57
  end.join(' AND ')
61
58
  end
62
-
63
- def sanitize_sql_activerecord5(conditions)
64
- table = @model_class.send(:arel_table)
65
- table_metadata = ActiveRecord::TableMetadata.new(@model_class, table)
66
- predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
67
-
68
- conditions = predicate_builder.resolve_column_aliases(conditions)
69
- conditions = @model_class.send(:expand_hash_conditions_for_aggregates, conditions)
70
-
71
- conditions.stringify_keys!
72
-
73
- predicate_builder.build_from_hash(conditions).map do |b|
74
- @model_class.send(:connection).visitor.compile b
75
- end.join(' AND ')
76
- end
77
59
  end
78
60
  end
79
61
  end
@@ -0,0 +1,70 @@
1
+ module CanCan
2
+ module ModelAdapters
3
+ class ActiveRecord5Adapter < ActiveRecord4Adapter
4
+ AbstractAdapter.inherited(self)
5
+
6
+ def self.for_class?(model_class)
7
+ ActiveRecord::VERSION::MAJOR == 5 && model_class <= ActiveRecord::Base
8
+ end
9
+
10
+ # rails 5 is capable of using strings in enum
11
+ # but often people use symbols in rules
12
+ def self.matches_condition?(subject, name, value)
13
+ return super if Array.wrap(value).all? { |x| x.is_a? Integer }
14
+
15
+ attribute = subject.send(name)
16
+ if value.is_a?(Enumerable)
17
+ value.map(&:to_s).include? attribute
18
+ else
19
+ attribute == value.to_s
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ # As of rails 4, `includes()` no longer causes active record to
26
+ # look inside the where clause to decide to outer join tables
27
+ # you're using in the where. Instead, `references()` is required
28
+ # in addition to `includes()` to force the outer join.
29
+ def build_relation(*where_conditions)
30
+ relation = @model_class.where(*where_conditions)
31
+ relation = relation.includes(joins).references(joins) if joins.present?
32
+ relation
33
+ end
34
+
35
+ # Rails 4.2 deprecates `sanitize_sql_hash_for_conditions`
36
+ def sanitize_sql(conditions)
37
+ if conditions.is_a?(Hash)
38
+ sanitize_sql_activerecord5(conditions)
39
+ else
40
+ @model_class.send(:sanitize_sql, conditions)
41
+ end
42
+ end
43
+
44
+ def sanitize_sql_activerecord5(conditions)
45
+ table = @model_class.send(:arel_table)
46
+ table_metadata = ActiveRecord::TableMetadata.new(@model_class, table)
47
+ predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
48
+
49
+ conditions = predicate_builder.resolve_column_aliases(conditions)
50
+
51
+ conditions.stringify_keys!
52
+
53
+ predicate_builder.build_from_hash(conditions).map do |b|
54
+ visit_nodes(b)
55
+ end.join(' AND ')
56
+ end
57
+
58
+ def visit_nodes(b)
59
+ # Rails 5.2 adds a BindParam node that prevents the visitor method from properly compiling the SQL query
60
+ if ActiveRecord::VERSION::MINOR >= 2
61
+ connection = @model_class.send(:connection)
62
+ collector = Arel::Collectors::SubstituteBinds.new(connection, Arel::Collectors::SQLString.new)
63
+ connection.visitor.accept(b, collector).value
64
+ else
65
+ @model_class.send(:connection).visitor.compile(b)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,3 +1,3 @@
1
1
  module CanCan
2
- VERSION = '2.1.2'.freeze
2
+ VERSION = '2.2.0'.freeze
3
3
  end
data/lib/cancan.rb CHANGED
@@ -12,4 +12,5 @@ require 'cancan/model_adapters/default_adapter'
12
12
  if defined? ActiveRecord
13
13
  require 'cancan/model_adapters/active_record_adapter'
14
14
  require 'cancan/model_adapters/active_record_4_adapter'
15
+ require 'cancan/model_adapters/active_record_5_adapter'
15
16
  end
metadata CHANGED
@@ -1,47 +1,48 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cancancan
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alessandro Rodi (Renuo AG)
8
8
  - Bryan Rite
9
9
  - Ryan Bates
10
10
  - Richard Wilson
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-11-22 00:00:00.000000000 Z
14
+ date: 2018-04-15 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
+ name: bundler
17
18
  requirement: !ruby/object:Gem::Requirement
18
19
  requirements:
19
20
  - - "~>"
20
21
  - !ruby/object:Gem::Version
21
22
  version: '1.3'
22
- name: bundler
23
- prerelease: false
24
23
  type: :development
24
+ prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.3'
30
30
  - !ruby/object:Gem::Dependency
31
+ name: rubocop
31
32
  requirement: !ruby/object:Gem::Requirement
32
33
  requirements:
33
34
  - - "~>"
34
35
  - !ruby/object:Gem::Version
35
36
  version: 0.48.1
36
- name: rubocop
37
- prerelease: false
38
37
  type: :development
38
+ prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
43
  version: 0.48.1
44
44
  - !ruby/object:Gem::Dependency
45
+ name: rake
45
46
  requirement: !ruby/object:Gem::Requirement
46
47
  requirements:
47
48
  - - "~>"
@@ -50,9 +51,8 @@ dependencies:
50
51
  - - ">="
51
52
  - !ruby/object:Gem::Version
52
53
  version: 10.1.1
53
- name: rake
54
- prerelease: false
55
54
  type: :development
55
+ prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
@@ -62,6 +62,7 @@ dependencies:
62
62
  - !ruby/object:Gem::Version
63
63
  version: 10.1.1
64
64
  - !ruby/object:Gem::Dependency
65
+ name: rspec
65
66
  requirement: !ruby/object:Gem::Requirement
66
67
  requirements:
67
68
  - - "~>"
@@ -70,9 +71,8 @@ dependencies:
70
71
  - - ">="
71
72
  - !ruby/object:Gem::Version
72
73
  version: 3.2.0
73
- name: rspec
74
- prerelease: false
75
74
  type: :development
75
+ prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
@@ -82,6 +82,7 @@ dependencies:
82
82
  - !ruby/object:Gem::Version
83
83
  version: 3.2.0
84
84
  - !ruby/object:Gem::Dependency
85
+ name: appraisal
85
86
  requirement: !ruby/object:Gem::Requirement
86
87
  requirements:
87
88
  - - "~>"
@@ -90,9 +91,8 @@ dependencies:
90
91
  - - ">="
91
92
  - !ruby/object:Gem::Version
92
93
  version: 2.0.0
93
- name: appraisal
94
- prerelease: false
95
94
  type: :development
95
+ prerelease: false
96
96
  version_requirements: !ruby/object:Gem::Requirement
97
97
  requirements:
98
98
  - - "~>"
@@ -101,7 +101,8 @@ dependencies:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: 2.0.0
104
- description: Simple authorization solution for Rails. All permissions are stored in a single location.
104
+ description: Simple authorization solution for Rails. All permissions are stored in
105
+ a single location.
105
106
  email: alessandro.rodi@renuo.ch
106
107
  executables: []
107
108
  extensions: []
@@ -125,6 +126,7 @@ files:
125
126
  - lib/cancan/matchers.rb
126
127
  - lib/cancan/model_adapters/abstract_adapter.rb
127
128
  - lib/cancan/model_adapters/active_record_4_adapter.rb
129
+ - lib/cancan/model_adapters/active_record_5_adapter.rb
128
130
  - lib/cancan/model_adapters/active_record_adapter.rb
129
131
  - lib/cancan/model_adapters/can_can/model_adapters/active_record_adapter/joins.rb
130
132
  - lib/cancan/model_adapters/default_adapter.rb
@@ -139,7 +141,7 @@ homepage: https://github.com/CanCanCommunity/cancancan
139
141
  licenses:
140
142
  - MIT
141
143
  metadata: {}
142
- post_install_message:
144
+ post_install_message:
143
145
  rdoc_options: []
144
146
  require_paths:
145
147
  - lib
@@ -147,16 +149,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
149
  requirements:
148
150
  - - ">="
149
151
  - !ruby/object:Gem::Version
150
- version: 2.0.0
152
+ version: 2.2.0
151
153
  required_rubygems_version: !ruby/object:Gem::Requirement
152
154
  requirements:
153
155
  - - ">="
154
156
  - !ruby/object:Gem::Version
155
157
  version: '0'
156
158
  requirements: []
157
- rubyforge_project:
158
- rubygems_version: 2.4.8
159
- signing_key:
159
+ rubyforge_project:
160
+ rubygems_version: 2.7.4
161
+ signing_key:
160
162
  specification_version: 4
161
163
  summary: Simple authorization solution for Rails.
162
164
  test_files: []