rails-canhaz 2.0.0.pre1 → 2.0.1

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
2
  SHA1:
3
- metadata.gz: bb6d2afdb656ffd883ae8b70ca29bb86b589fabd
4
- data.tar.gz: 4b3fb58b229967e0a8da3669caf424a03e6d4b08
3
+ metadata.gz: cba07dfae0b516985fc7cf3ece68027c4572b9f0
4
+ data.tar.gz: a30e785af6b55507a8496b75d1ce107715a7d2a4
5
5
  SHA512:
6
- metadata.gz: 059680e3b378d9e2aecda25b4a22e2677d5b11b61c0a5563375196c38f8ed581dc51cccbcfbd336afdf12b941a736b2a9c984b70e72ddedf2bdeaeef1a65c285
7
- data.tar.gz: 01bbe686a014bb82b22f312ae1a750fd60f4353dc824f933ba820e6506dd125ce8576100ee95c1328d15cb14ea0e8f4f3d557987b07482ed71d5c14af434a810
6
+ metadata.gz: 6ffb8e98b2af37e18cc2e9a8587b322e6a9fea5a64d1f70bdd7f294a6bd80adf4056e77d9168b6ace8abe6af9b487343573cfb92a69c5be689613987eb6e6852
7
+ data.tar.gz: 96ec2e1f01ed6cb2e042e141b05769b722edc00f8380c7e6a7aea74d42a5bbf1243bbaea3b46c458718f6d4a7d41fad5d03fe194ae8809824071ba6348f6146f
data/.travis.yml CHANGED
@@ -2,3 +2,12 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
+ - 2.1.1
6
+ gemfile:
7
+ - gemfiles/Gemfile.ar-3.2.x
8
+ - gemfiles/Gemfile.ar-4.0.x
9
+ - gemfiles/Gemfile.ar-4.1.x
10
+ - gemfiles/Gemfile.ar-edge
11
+ matrix:
12
+ allow_failures:
13
+ - gemfile: gemfiles/Gemfile.ar-edge
data/README.md CHANGED
@@ -1,21 +1,20 @@
1
1
  [A port of this gem working on mongoid](https://github.com/intrepidd/mongoid-canhaz) is now avaible.
2
-
3
- # Rails-Canhaz for Rails 4.0.0.beta1 !
2
+ # Rails-Canhaz [![Build Status](https://travis-ci.org/Intrepidd/rails-canhaz.png)](https://travis-ci.org/Intrepidd/rails-canhaz)
4
3
 
5
4
  This gem is a simple activerecord extention that allows any application using activerecord to manage permissions based roles.
6
5
 
7
- ## Installation (Prerelease gem !)
6
+ ## Installation
8
7
 
9
8
  Standard gem installation :
10
9
 
11
10
  ```
12
- gem install rails-canhaz -v 2.0.0.pre
11
+ gem install rails-canhaz
13
12
  ```
14
13
 
15
14
  Or in your Gemfile if you use bundler
16
15
 
17
16
  ```ruby
18
- gem 'rails-canhaz', '2.0.0.pre'
17
+ gem 'rails-canhaz'
19
18
  ```
20
19
 
21
20
  You then need to create a single table in order to make this gem to work
@@ -66,7 +65,10 @@ Now our models are marked as canhaz subjects and objects, we have access to some
66
65
 
67
66
  ```ruby
68
67
  user = User.find(42)
68
+ user2 = User.find(21)
69
+
69
70
  article = Article.find(1337)
71
+ article2 = Article.find(784)
70
72
 
71
73
  user.can?(:read, article) # Can the user read this article? false for now
72
74
 
@@ -77,8 +79,12 @@ user.can?(:read, article) # Will be true
77
79
 
78
80
  user.objects_with_permission(Article, :read) # Will return all the articles w/ read permissions for this user
79
81
 
82
+ User.objects_with_permission([user, user2], :read) # Will return all the articles w/ read permissions for these users
83
+
80
84
  article.subjects_with_permission(User, :read) # Will return all the users hat are able to read this article
81
85
 
86
+ Article.subjects_with_permission([article, article2], User, :read) # Will return all the users that are able to read theses articles
87
+
82
88
  #You can also remove permissions
83
89
 
84
90
  user.cannot!(:read, article)
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '..'
3
+
4
+ gem 'activerecord', '~> 3.2'
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '..'
3
+
4
+ gem 'activerecord', '~> 4.0'
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '..'
3
+
4
+ gem 'activerecord', '~> 4.1.0'
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '..'
3
+
4
+ git 'git://github.com/rails/rails.git' do
5
+ gem 'activerecord'
6
+ end
@@ -2,6 +2,11 @@ require 'active_record'
2
2
 
3
3
  class CanHazPermission < ActiveRecord::Base
4
4
 
5
+ # Only call attr_accessible for Rails 3.x
6
+ if ActiveRecord::VERSION::MAJOR == '3'
7
+ attr_accessible :csubject_id, :csubject_type, :cobject_type, :cobject_id, :permission_name
8
+ end
9
+
5
10
  validates :cobject_id, :uniqueness => {:scope => [:permission_name, :csubject_id, :csubject_type, :cobject_type]}
6
11
 
7
12
  # Gets the permission row between two objects
@@ -20,6 +20,7 @@ module CanHaz
20
20
  type.joins("INNER JOIN can_haz_permissions ON can_haz_permissions.csubject_id = #{type.table_name}.id").where('cobject_id = ? AND cobject_type = ?', self.id, self.class.to_s).where('csubject_type = ?', type.to_s).where('permission_name = ?', permission)
21
21
  end
22
22
 
23
+
23
24
  # Removes all rights on this object
24
25
  #
25
26
  def not_accessible
@@ -30,6 +31,23 @@ module CanHaz
30
31
  true
31
32
  end
32
33
 
34
+ module ClassMethods
35
+ # Gets the subjects that have the corresponding permission and type on this model
36
+ #
37
+ # params objects [Array or Object] The object(s) that you want subjects with permission
38
+ # @param type [Class] The type of the subjects we're looking for
39
+ # @param permission [String, Symbol] The permission
40
+ def subjects_with_permission(objects, type, permission)
41
+ class_name = (objects.is_a?(Array) ? objects.first.try(:class).try(:name) : objects.class.name)
42
+
43
+ type.joins("INNER JOIN can_haz_permissions ON can_haz_permissions.csubject_id = #{type.table_name}.id")
44
+ .where(:'can_haz_permissions.cobject_type' => class_name)
45
+ .where(:'can_haz_permissions.cobject_id' => objects)
46
+ .where('csubject_type = ?', type.to_s)
47
+ .where('permission_name = ?', permission)
48
+ .uniq
49
+ end
50
+ end
33
51
  end
34
52
  end
35
53
  end
@@ -73,6 +73,21 @@ module CanHaz
73
73
  true
74
74
  end
75
75
 
76
+ module ClassMethods
77
+ # Gets All objects that match a given type and permission
78
+ #
79
+ # params subjects [Array or Object] The subject(s) that you want objects with permission
80
+ # @param type [Class] The type of the objects
81
+ # @param permission [ String, Symbol] The name of the permission
82
+ # @return The macthing objects in an array
83
+ def objects_with_permission(subjects, type, permission)
84
+ type.joins("INNER JOIN can_haz_permissions ON can_haz_permissions.cobject_id = #{type.table_name}.id")
85
+ .where('cobject_type = ?', type.to_s)
86
+ .where(:'can_haz_permissions.csubject_id' => subjects)
87
+ .where('permission_name = ?', permission)
88
+ .uniq
89
+ end
90
+ end
76
91
  end
77
92
  end
78
93
  end
@@ -17,6 +17,7 @@ module CanHaz
17
17
  #
18
18
  def acts_as_canhaz_object
19
19
  include CanHaz::ModelExtensions::Object
20
+ extend CanHaz::ModelExtensions::Object::ClassMethods
20
21
  before_destroy :not_accessible # Removes permission before deleting the object
21
22
  end
22
23
 
@@ -25,6 +26,7 @@ module CanHaz
25
26
  #
26
27
  def acts_as_canhaz_subject
27
28
  include CanHaz::ModelExtensions::Subject
29
+ extend CanHaz::ModelExtensions::Subject::ClassMethods
28
30
  before_destroy :can_do_nothing # Removes permission before deleting the subject
29
31
  end
30
32
 
@@ -1,3 +1,3 @@
1
1
  module CanHaz
2
- VERSION = '2.0.0.pre1'
2
+ VERSION = '2.0.1'
3
3
  end
data/rails-canhaz.gemspec CHANGED
@@ -17,9 +17,8 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_dependency 'activerecord', '4.0.0.beta1'
21
- gem.add_dependency 'rake'
22
-
20
+ gem.add_dependency 'activerecord', '>= 3.1.0', '<5'
23
21
  gem.add_development_dependency 'rake'
24
22
  gem.add_development_dependency 'sqlite3'
23
+ gem.add_development_dependency 'minitest'
25
24
  end
data/test/init_tests.rb CHANGED
@@ -3,4 +3,3 @@ require 'active_record'
3
3
  require 'active_support'
4
4
 
5
5
  ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => 'test.sqlite3')
6
-
data/test/test_canhaz.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  require 'init_tests'
2
2
  require 'rails-canhaz'
3
- require 'test/unit'
3
+ require 'minitest/autorun'
4
4
  require 'models/object_model'
5
5
  require 'models/subject_model'
6
6
  require 'models/foo_model'
7
7
 
8
8
  load 'schema.rb'
9
9
 
10
- class CanHazTest < Test::Unit::TestCase
10
+ class CanHazTest < Minitest::Unit::TestCase
11
11
 
12
12
  def test_methods
13
13
  assert ActiveRecord::Base.respond_to? :acts_as_canhaz_object
@@ -38,21 +38,19 @@ class CanHazTest < Test::Unit::TestCase
38
38
 
39
39
  object = ObjectModel.new
40
40
 
41
- assert_raise CanHaz::Exceptions::NotACanHazObject do
41
+ assert_raises CanHaz::Exceptions::NotACanHazObject do
42
42
  subject.can!(:whatever, foo)
43
43
  end
44
44
 
45
- assert_nothing_raised RuntimeError do
46
- subject.can!(:whatever, object)
47
- end
48
45
 
49
- assert_raise CanHaz::Exceptions::NotACanHazObject do
46
+ subject.can!(:whatever, object)
47
+
48
+
49
+ assert_raises CanHaz::Exceptions::NotACanHazObject do
50
50
  subject.can?(:whatever, foo)
51
51
  end
52
52
 
53
- assert_nothing_raised RuntimeError do
54
- subject.can?(:whatever, object)
55
- end
53
+ subject.can?(:whatever, object)
56
54
 
57
55
  end
58
56
 
@@ -63,12 +61,27 @@ class CanHazTest < Test::Unit::TestCase
63
61
  subject2 = SubjectModel.new
64
62
  subject2.save
65
63
 
64
+ subject3 = SubjectModel.new
65
+ subject3.save
66
+
66
67
  object = ObjectModel.new
67
68
  object.save
68
69
 
70
+ object2 = ObjectModel.new
71
+ object2.save
72
+
73
+ object3 = ObjectModel.new
74
+ object3.save
75
+
69
76
  subject2.can!(:foo, object)
70
77
  subject2.can!(:bar, object)
71
78
 
79
+ subject2.can!(:foo, object2)
80
+ subject2.can!(:bar, object2)
81
+
82
+ subject3.can!(:foo, object)
83
+ subject3.cannot!(:bar, object)
84
+
72
85
  assert subject.can?(:foo, object) == false
73
86
  assert subject.can?(:bar, object) == false
74
87
 
@@ -92,9 +105,21 @@ class CanHazTest < Test::Unit::TestCase
92
105
 
93
106
  assert subject.objects_with_permission(ObjectModel, :bar).count == 1
94
107
  assert subject.objects_with_permission(ObjectModel, :bar).first == object
95
-
96
108
  assert subject.objects_with_permission(ObjectModel, :foobar).count == 0
97
109
 
110
+ assert SubjectModel.objects_with_permission(subject, ObjectModel, :bar).count == 1
111
+ assert SubjectModel.objects_with_permission([subject, subject2], ObjectModel, :bar).count == 2
112
+ assert SubjectModel.objects_with_permission([subject, subject2, subject3], ObjectModel, :bar).count == 2
113
+ assert SubjectModel.objects_with_permission([subject, subject2, subject3], ObjectModel, :foo).count == 2
114
+ assert SubjectModel.objects_with_permission([subject, subject3], ObjectModel, :foo).count == 1
115
+
116
+ assert object.subjects_with_permission(SubjectModel, :bar).count == 2
117
+ assert object.subjects_with_permission(SubjectModel, :foo).count == 3
118
+ assert object.subjects_with_permission(SubjectModel, :foo).count == 3
119
+
120
+ assert ObjectModel.subjects_with_permission([object, object2, object3], SubjectModel, :foo).count == 3
121
+ assert ObjectModel.subjects_with_permission(object2, SubjectModel, :foo).count == 1
122
+ assert ObjectModel.subjects_with_permission([object], SubjectModel, :bar).count == 2
98
123
  end
99
124
 
100
125
  def test_can_cannot
@@ -271,4 +296,3 @@ class CanHazTest < Test::Unit::TestCase
271
296
  end
272
297
 
273
298
  end
274
-
metadata CHANGED
@@ -1,69 +1,75 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-canhaz
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre1
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Intrepidd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-08 00:00:00.000000000 Z
11
+ date: 2014-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0.beta1
19
+ version: 3.1.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - '='
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.1.0
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: 4.0.0.beta1
32
+ version: '5'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - '>='
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '0'
34
- type: :runtime
40
+ type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - '>='
44
+ - - ">="
39
45
  - !ruby/object:Gem::Version
40
46
  version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
- name: rake
48
+ name: sqlite3
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - '>='
51
+ - - ">="
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
- - - '>='
58
+ - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: '0'
55
61
  - !ruby/object:Gem::Dependency
56
- name: sqlite3
62
+ name: minitest
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - '>='
65
+ - - ">="
60
66
  - !ruby/object:Gem::Version
61
67
  version: '0'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - '>='
72
+ - - ">="
67
73
  - !ruby/object:Gem::Version
68
74
  version: '0'
69
75
  description: A simple gem for managing permissions between rails models
@@ -73,11 +79,15 @@ executables: []
73
79
  extensions: []
74
80
  extra_rdoc_files: []
75
81
  files:
76
- - .gitignore
77
- - .travis.yml
82
+ - ".gitignore"
83
+ - ".travis.yml"
78
84
  - Gemfile
79
85
  - README.md
80
86
  - Rakefile
87
+ - gemfiles/Gemfile.ar-3.2.x
88
+ - gemfiles/Gemfile.ar-4.0.x
89
+ - gemfiles/Gemfile.ar-4.1.x
90
+ - gemfiles/Gemfile.ar-edge
81
91
  - lib/generators/can_haz/install/install_generator.rb
82
92
  - lib/generators/can_haz/install/templates/migrations/1_default_can_haz.rb
83
93
  - lib/rails-canhaz.rb
@@ -105,17 +115,17 @@ require_paths:
105
115
  - lib
106
116
  required_ruby_version: !ruby/object:Gem::Requirement
107
117
  requirements:
108
- - - '>='
118
+ - - ">="
109
119
  - !ruby/object:Gem::Version
110
120
  version: '0'
111
121
  required_rubygems_version: !ruby/object:Gem::Requirement
112
122
  requirements:
113
- - - '>'
123
+ - - ">="
114
124
  - !ruby/object:Gem::Version
115
- version: 1.3.1
125
+ version: '0'
116
126
  requirements: []
117
127
  rubyforge_project:
118
- rubygems_version: 2.0.0
128
+ rubygems_version: 2.2.2
119
129
  signing_key:
120
130
  specification_version: 4
121
131
  summary: A simple gem for managing permissions between rails models