cancan-2 2.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/CHANGELOG.rdoc +381 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +108 -0
  5. data/Rakefile +18 -0
  6. data/init.rb +1 -0
  7. data/lib/cancan.rb +13 -0
  8. data/lib/cancan/ability.rb +348 -0
  9. data/lib/cancan/controller_additions.rb +392 -0
  10. data/lib/cancan/controller_resource.rb +265 -0
  11. data/lib/cancan/exceptions.rb +53 -0
  12. data/lib/cancan/inherited_resource.rb +20 -0
  13. data/lib/cancan/matchers.rb +14 -0
  14. data/lib/cancan/model_adapters/abstract_adapter.rb +56 -0
  15. data/lib/cancan/model_adapters/active_record_adapter.rb +172 -0
  16. data/lib/cancan/model_adapters/data_mapper_adapter.rb +34 -0
  17. data/lib/cancan/model_adapters/default_adapter.rb +7 -0
  18. data/lib/cancan/model_adapters/mongoid_adapter.rb +54 -0
  19. data/lib/cancan/model_additions.rb +29 -0
  20. data/lib/cancan/rule.rb +178 -0
  21. data/lib/generators/cancan/ability/USAGE +5 -0
  22. data/lib/generators/cancan/ability/ability_generator.rb +16 -0
  23. data/lib/generators/cancan/ability/templates/ability.rb +24 -0
  24. data/lib/generators/cancan/ability/templates/ability_spec.rb +16 -0
  25. data/lib/generators/cancan/ability/templates/ability_test.rb +10 -0
  26. data/spec/README.rdoc +28 -0
  27. data/spec/cancan/ability_spec.rb +541 -0
  28. data/spec/cancan/controller_additions_spec.rb +118 -0
  29. data/spec/cancan/controller_resource_spec.rb +535 -0
  30. data/spec/cancan/exceptions_spec.rb +58 -0
  31. data/spec/cancan/inherited_resource_spec.rb +58 -0
  32. data/spec/cancan/matchers_spec.rb +33 -0
  33. data/spec/cancan/model_adapters/active_record_adapter_spec.rb +278 -0
  34. data/spec/cancan/model_adapters/data_mapper_adapter_spec.rb +120 -0
  35. data/spec/cancan/model_adapters/default_adapter_spec.rb +7 -0
  36. data/spec/cancan/model_adapters/mongoid_adapter_spec.rb +227 -0
  37. data/spec/cancan/rule_spec.rb +55 -0
  38. data/spec/matchers.rb +13 -0
  39. data/spec/spec_helper.rb +49 -0
  40. metadata +212 -0
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe CanCan::ModelAdapters::DefaultAdapter do
4
+ it "is default for generic classes" do
5
+ CanCan::ModelAdapters::AbstractAdapter.adapter_class(Object).should == CanCan::ModelAdapters::DefaultAdapter
6
+ end
7
+ end
@@ -0,0 +1,227 @@
1
+ if ENV["MODEL_ADAPTER"] == "mongoid"
2
+ require "spec_helper"
3
+
4
+ class MongoidCategory
5
+ include Mongoid::Document
6
+ references_many :mongoid_projects
7
+ end
8
+
9
+ class MongoidProject
10
+ include Mongoid::Document
11
+ referenced_in :mongoid_category
12
+ end
13
+
14
+ Mongoid.configure do |config|
15
+ config.master = Mongo::Connection.new('127.0.0.1', 27017).db("cancan_mongoid_spec")
16
+ end
17
+
18
+ describe CanCan::ModelAdapters::MongoidAdapter do
19
+ context "Mongoid defined" do
20
+ before(:each) do
21
+ @ability = Object.new
22
+ @ability.extend(CanCan::Ability)
23
+ end
24
+
25
+ after(:each) do
26
+ Mongoid.master.collections.select do |collection|
27
+ collection.name !~ /system/
28
+ end.each(&:drop)
29
+ end
30
+
31
+ it "is for only Mongoid classes" do
32
+ CanCan::ModelAdapters::MongoidAdapter.should_not be_for_class(Object)
33
+ CanCan::ModelAdapters::MongoidAdapter.should be_for_class(MongoidProject)
34
+ CanCan::ModelAdapters::AbstractAdapter.adapter_class(MongoidProject).should == CanCan::ModelAdapters::MongoidAdapter
35
+ end
36
+
37
+ it "finds record" do
38
+ project = MongoidProject.create
39
+ CanCan::ModelAdapters::MongoidAdapter.find(MongoidProject, project.id).should == project
40
+ end
41
+
42
+ it "compares properties on mongoid documents with the conditions hash" do
43
+ model = MongoidProject.new
44
+ @ability.can :read, :mongoid_projects, :id => model.id
45
+ @ability.should be_able_to(:read, model)
46
+ end
47
+
48
+ it "is able to read hashes when field is array" do
49
+ one_to_three = MongoidProject.create(:numbers => ['one', 'two', 'three'])
50
+ two_to_five = MongoidProject.create(:numbers => ['two', 'three', 'four', 'five'])
51
+
52
+ @ability.can :foo, :mongoid_projects, :numbers => 'one'
53
+ @ability.should be_able_to(:foo, one_to_three)
54
+ @ability.should_not be_able_to(:foo, two_to_five)
55
+ end
56
+
57
+ it "returns [] when no ability is defined so no records are found" do
58
+ MongoidProject.create(:title => 'Sir')
59
+ MongoidProject.create(:title => 'Lord')
60
+ MongoidProject.create(:title => 'Dude')
61
+
62
+ MongoidProject.accessible_by(@ability, :read).entries.should == []
63
+ end
64
+
65
+ it "returns the correct records based on the defined ability" do
66
+ @ability.can :read, :mongoid_projects, :title => "Sir"
67
+ sir = MongoidProject.create(:title => 'Sir')
68
+ lord = MongoidProject.create(:title => 'Lord')
69
+ dude = MongoidProject.create(:title => 'Dude')
70
+
71
+ MongoidProject.accessible_by(@ability, :read).entries.should == [sir]
72
+ end
73
+
74
+ it "returns the correct records when a mix of can and cannot rules in defined ability" do
75
+ pending "TODO figure out why this isn't working"
76
+ @ability.can :manage, :mongoid_projects, :title => 'Sir'
77
+ @ability.cannot :destroy, :mongoid_projects
78
+
79
+ sir = MongoidProject.create(:title => 'Sir')
80
+ lord = MongoidProject.create(:title => 'Lord')
81
+ dude = MongoidProject.create(:title => 'Dude')
82
+
83
+ MongoidProject.accessible_by(@ability, :destroy).entries.should == [sir]
84
+ end
85
+
86
+ it "is able to mix empty conditions and hashes" do
87
+ pending "TODO figure out why this isn't working"
88
+ @ability.can :read, :mongoid_projects
89
+ @ability.can :read, :mongoid_projects, :title => 'Sir'
90
+ sir = MongoidProject.create(:title => 'Sir')
91
+ lord = MongoidProject.create(:title => 'Lord')
92
+
93
+ MongoidProject.accessible_by(@ability, :read).count.should == 2
94
+ end
95
+
96
+ it "returns everything when the defined ability is access all" do
97
+ @ability.can :access, :all
98
+ sir = MongoidProject.create(:title => 'Sir')
99
+ lord = MongoidProject.create(:title => 'Lord')
100
+ dude = MongoidProject.create(:title => 'Dude')
101
+
102
+ MongoidProject.accessible_by(@ability, :read).entries.should == [sir, lord, dude]
103
+ end
104
+
105
+ it "allows a scope for conditions" do
106
+ @ability.can :read, :mongoid_projects, MongoidProject.where(:title => 'Sir')
107
+ sir = MongoidProject.create(:title => 'Sir')
108
+ lord = MongoidProject.create(:title => 'Lord')
109
+ dude = MongoidProject.create(:title => 'Dude')
110
+
111
+ MongoidProject.accessible_by(@ability, :read).entries.should == [sir]
112
+ end
113
+
114
+ describe "Mongoid::Criteria where clause Symbol extensions using MongoDB expressions" do
115
+ it "handles :field.in" do
116
+ obj = MongoidProject.create(:title => 'Sir')
117
+ @ability.can :read, :mongoid_projects, :title.in => ["Sir", "Madam"]
118
+ @ability.can?(:read, obj).should == true
119
+ MongoidProject.accessible_by(@ability, :read).should == [obj]
120
+
121
+ obj2 = MongoidProject.create(:title => 'Lord')
122
+ @ability.can?(:read, obj2).should == false
123
+ end
124
+
125
+ describe "activates only when there are Criteria in the hash" do
126
+ it "Calls where on the model class when there are criteria" do
127
+ obj = MongoidProject.create(:title => 'Bird')
128
+ @conditions = {:title.nin => ["Fork", "Spoon"]}
129
+
130
+ @ability.can :read, :mongoid_projects, @conditions
131
+ @ability.should be_able_to(:read, obj)
132
+ end
133
+ it "Calls the base version if there are no mongoid criteria" do
134
+ obj = MongoidProject.new(:title => 'Bird')
135
+ @conditions = {:id => obj.id}
136
+ @ability.can :read, :mongoid_projects, @conditions
137
+ @ability.should be_able_to(:read, obj)
138
+ end
139
+ end
140
+
141
+ it "handles :field.nin" do
142
+ obj = MongoidProject.create(:title => 'Sir')
143
+ @ability.can :read, :mongoid_projects, :title.nin => ["Lord", "Madam"]
144
+ @ability.can?(:read, obj).should == true
145
+ MongoidProject.accessible_by(@ability, :read).should == [obj]
146
+
147
+ obj2 = MongoidProject.create(:title => 'Lord')
148
+ @ability.can?(:read, obj2).should == false
149
+ end
150
+
151
+ it "handles :field.size" do
152
+ obj = MongoidProject.create(:titles => ['Palatin', 'Margrave'])
153
+ @ability.can :read, :mongoid_projects, :titles.size => 2
154
+ @ability.can?(:read, obj).should == true
155
+ MongoidProject.accessible_by(@ability, :read).should == [obj]
156
+
157
+ obj2 = MongoidProject.create(:titles => ['Palatin', 'Margrave', 'Marquis'])
158
+ @ability.can?(:read, obj2).should == false
159
+ end
160
+
161
+ it "handles :field.exists" do
162
+ obj = MongoidProject.create(:titles => ['Palatin', 'Margrave'])
163
+ @ability.can :read, :mongoid_projects, :titles.exists => true
164
+ @ability.can?(:read, obj).should == true
165
+ MongoidProject.accessible_by(@ability, :read).should == [obj]
166
+
167
+ obj2 = MongoidProject.create
168
+ @ability.can?(:read, obj2).should == false
169
+ end
170
+
171
+ it "handles :field.gt" do
172
+ obj = MongoidProject.create(:age => 50)
173
+ @ability.can :read, :mongoid_projects, :age.gt => 45
174
+ @ability.can?(:read, obj).should == true
175
+ MongoidProject.accessible_by(@ability, :read).should == [obj]
176
+
177
+ obj2 = MongoidProject.create(:age => 40)
178
+ @ability.can?(:read, obj2).should == false
179
+ end
180
+
181
+ it "handles instance not saved to database" do
182
+ obj = MongoidProject.new(:title => 'Sir')
183
+ @ability.can :read, :mongoid_projects, :title.in => ["Sir", "Madam"]
184
+ @ability.can?(:read, obj).should == true
185
+
186
+ # accessible_by only returns saved records
187
+ MongoidProject.accessible_by(@ability, :read).entries.should == []
188
+
189
+ obj2 = MongoidProject.new(:title => 'Lord')
190
+ @ability.can?(:read, obj2).should == false
191
+ end
192
+ end
193
+
194
+ it "calls where with matching ability conditions" do
195
+ obj = MongoidProject.create(:foo => {:bar => 1})
196
+ @ability.can :read, :mongoid_projects, :foo => {:bar => 1}
197
+ MongoidProject.accessible_by(@ability, :read).entries.first.should == obj
198
+ end
199
+
200
+ it "excludes from the result if set to cannot" do
201
+ obj = MongoidProject.create(:bar => 1)
202
+ obj2 = MongoidProject.create(:bar => 2)
203
+ @ability.can :read, :mongoid_projects
204
+ @ability.cannot :read, :mongoid_projects, :bar => 2
205
+ MongoidProject.accessible_by(@ability, :read).entries.should == [obj]
206
+ end
207
+
208
+ it "combines the rules" do
209
+ obj = MongoidProject.create(:bar => 1)
210
+ obj2 = MongoidProject.create(:bar => 2)
211
+ obj3 = MongoidProject.create(:bar => 3)
212
+ @ability.can :read, :mongoid_projects, :bar => 1
213
+ @ability.can :read, :mongoid_projects, :bar => 2
214
+ MongoidProject.accessible_by(@ability, :read).entries.should =~ [obj, obj2]
215
+ end
216
+
217
+ it "does not allow to fetch records when ability with just block present" do
218
+ @ability.can :read, :mongoid_projects do
219
+ false
220
+ end
221
+ lambda {
222
+ MongoidProject.accessible_by(@ability)
223
+ }.should raise_error(CanCan::Error)
224
+ end
225
+ end
226
+ end
227
+ end
@@ -0,0 +1,55 @@
1
+ require "spec_helper"
2
+ require "ostruct" # for OpenStruct below
3
+
4
+ # Most of Rule functionality is tested in Ability specs
5
+ describe CanCan::Rule do
6
+ before(:each) do
7
+ @conditions = {}
8
+ @rule = CanCan::Rule.new(true, :read, :integers, @conditions)
9
+ end
10
+
11
+ it "returns no association joins if none exist" do
12
+ @rule.associations_hash.should == {}
13
+ end
14
+
15
+ it "returns no association for joins if just attributes" do
16
+ @conditions[:foo] = :bar
17
+ @rule.associations_hash.should == {}
18
+ end
19
+
20
+ it "returns single association for joins" do
21
+ @conditions[:foo] = {:bar => 1}
22
+ @rule.associations_hash.should == {:foo => {}}
23
+ end
24
+
25
+ it "returns multiple associations for joins" do
26
+ @conditions[:foo] = {:bar => 1}
27
+ @conditions[:test] = {1 => 2}
28
+ @rule.associations_hash.should == {:foo => {}, :test => {}}
29
+ end
30
+
31
+ it "returns nested associations for joins" do
32
+ @conditions[:foo] = {:bar => {1 => 2}}
33
+ @rule.associations_hash.should == {:foo => {:bar => {}}}
34
+ end
35
+
36
+ it "returns no association joins if conditions is nil" do
37
+ rule = CanCan::Rule.new(true, :read, :integers)
38
+ rule.associations_hash.should == {}
39
+ end
40
+
41
+ it "has higher specificity for attributes/conditions" do
42
+ CanCan::Rule.new(true, :read, :integers).specificity.should eq(1)
43
+ CanCan::Rule.new(true, :read, :integers, :foo => :bar).specificity.should eq(2)
44
+ CanCan::Rule.new(true, :read, :integers, :foo).specificity.should eq(2)
45
+ CanCan::Rule.new(false, :read, :integers).specificity.should eq(3)
46
+ CanCan::Rule.new(false, :read, :integers, :foo => :bar).specificity.should eq(4)
47
+ CanCan::Rule.new(false, :read, :integers, :foo).specificity.should eq(4)
48
+ end
49
+
50
+ it "should not be mergeable if conditions are not simple hashes" do
51
+ meta_where = OpenStruct.new(:name => 'metawhere', :column => 'test')
52
+ @conditions[meta_where] = :bar
53
+ @rule.should be_unmergeable
54
+ end
55
+ end
@@ -0,0 +1,13 @@
1
+ RSpec::Matchers.define :orderlessly_match do |original_string|
2
+ match do |given_string|
3
+ original_string.split('').sort == given_string.split('').sort
4
+ end
5
+
6
+ failure_message_for_should do |given_string|
7
+ "expected \"#{given_string}\" to have the same characters as \"#{original_string}\""
8
+ end
9
+
10
+ failure_message_for_should_not do |given_string|
11
+ "expected \"#{given_string}\" not to have the same characters as \"#{original_string}\""
12
+ end
13
+ end
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require "sqlite3"
5
+ require "active_record"
6
+
7
+ case ENV["MODEL_ADAPTER"]
8
+ when "data_mapper"
9
+ require "dm-core"
10
+ require "dm-sqlite-adapter"
11
+ require "dm-migrations"
12
+ when "mongoid"
13
+ require "mongoid"
14
+ end
15
+
16
+ require 'active_support/all'
17
+ require 'matchers'
18
+ require 'cancan'
19
+ require 'cancan/matchers'
20
+
21
+ RSpec.configure do |config|
22
+ config.treat_symbols_as_metadata_keys_with_true_values = true
23
+ config.filter_run :focus => true
24
+ config.run_all_when_everything_filtered = true
25
+ end
26
+
27
+ class Ability
28
+ include CanCan::Ability
29
+
30
+ def initialize(user)
31
+ end
32
+ end
33
+
34
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
35
+
36
+ class Category < ActiveRecord::Base
37
+ connection.create_table(table_name) do |t|
38
+ t.boolean :visible
39
+ end
40
+ has_many :projects
41
+ end
42
+
43
+ class Project < ActiveRecord::Base
44
+ connection.create_table(table_name) do |t|
45
+ t.integer :category_id
46
+ t.string :name
47
+ end
48
+ belongs_to :category
49
+ end
metadata ADDED
@@ -0,0 +1,212 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cancan-2
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0.alpha
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Bates
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.9.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.9.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 3.2.6
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 3.2.6
46
+ - !ruby/object:Gem::Dependency
47
+ name: sqlite3
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.3.5
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.5
62
+ - !ruby/object:Gem::Dependency
63
+ name: dm-core
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.2.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.2.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: dm-sqlite-adapter
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 1.2.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.2.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: dm-migrations
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 1.2.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.2.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: mongoid
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 2.4.8
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 2.4.8
126
+ - !ruby/object:Gem::Dependency
127
+ name: bson_ext
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.6.2
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 1.6.2
142
+ description: Simple authorization solution for Rails which is decoupled from user
143
+ roles. All permissions are stored in a single location.
144
+ email: ryan@railscasts.com
145
+ executables: []
146
+ extensions: []
147
+ extra_rdoc_files: []
148
+ files:
149
+ - lib/cancan/controller_resource.rb
150
+ - lib/cancan/exceptions.rb
151
+ - lib/cancan/rule.rb
152
+ - lib/cancan/model_adapters/mongoid_adapter.rb
153
+ - lib/cancan/model_adapters/active_record_adapter.rb
154
+ - lib/cancan/model_adapters/default_adapter.rb
155
+ - lib/cancan/model_adapters/abstract_adapter.rb
156
+ - lib/cancan/model_adapters/data_mapper_adapter.rb
157
+ - lib/cancan/ability.rb
158
+ - lib/cancan/matchers.rb
159
+ - lib/cancan/inherited_resource.rb
160
+ - lib/cancan/controller_additions.rb
161
+ - lib/cancan/model_additions.rb
162
+ - lib/cancan.rb
163
+ - lib/generators/cancan/ability/USAGE
164
+ - lib/generators/cancan/ability/ability_generator.rb
165
+ - lib/generators/cancan/ability/templates/ability_test.rb
166
+ - lib/generators/cancan/ability/templates/ability.rb
167
+ - lib/generators/cancan/ability/templates/ability_spec.rb
168
+ - spec/cancan/controller_additions_spec.rb
169
+ - spec/cancan/matchers_spec.rb
170
+ - spec/cancan/inherited_resource_spec.rb
171
+ - spec/cancan/controller_resource_spec.rb
172
+ - spec/cancan/model_adapters/active_record_adapter_spec.rb
173
+ - spec/cancan/model_adapters/default_adapter_spec.rb
174
+ - spec/cancan/model_adapters/data_mapper_adapter_spec.rb
175
+ - spec/cancan/model_adapters/mongoid_adapter_spec.rb
176
+ - spec/cancan/exceptions_spec.rb
177
+ - spec/cancan/rule_spec.rb
178
+ - spec/cancan/ability_spec.rb
179
+ - spec/README.rdoc
180
+ - spec/spec_helper.rb
181
+ - spec/matchers.rb
182
+ - README.rdoc
183
+ - Gemfile
184
+ - Rakefile
185
+ - CHANGELOG.rdoc
186
+ - LICENSE
187
+ - init.rb
188
+ homepage: http://github.com/ryanb/cancan
189
+ licenses: []
190
+ post_install_message:
191
+ rdoc_options: []
192
+ require_paths:
193
+ - lib
194
+ required_ruby_version: !ruby/object:Gem::Requirement
195
+ none: false
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: 1.3.4
206
+ requirements: []
207
+ rubyforge_project: cancan-2
208
+ rubygems_version: 1.8.24
209
+ signing_key:
210
+ specification_version: 3
211
+ summary: Simple authorization solution for Rails.
212
+ test_files: []