permissionable 0.1.3 → 0.1.4

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: 2b3291aed21cc9e20392419b0ee512fa578fd335
4
- data.tar.gz: ca2dfd9bad69191f9ad342b01c721f4dbf23b42f
3
+ metadata.gz: 3f3fae2297371971e0aad5ccd33ad1c829e13138
4
+ data.tar.gz: 08999968d5e6a368127b7bed81b07825eb47c138
5
5
  SHA512:
6
- metadata.gz: c6fd05d537db592239652ed21919ca18f93c2ccfd918cfe6b789c012b5c521643d539b3c262b54bbdbedd7f1f4adc593018914cefd2221a5e2dfd48d9dbcac1d
7
- data.tar.gz: e819ee8e617b32b194036c8f9fd4c1acd79ec5e93450e050ebce154f859048f5cb946ec898997ec1bcc0d04261022486200a729430603df35efe5ad33964b5a7
6
+ metadata.gz: 7ca28cb7275e551aa82f4ee0c0149ca278f5ccf94d746915d574b2f4143c217dce794da58fe4b825b3e827632a1fcac7e49a1343b2e91984dd9e0f0ea59f2708
7
+ data.tar.gz: 5c70cbd690a1237cc9ff520a72c0d6b936ebe0b3384ee9155797a46206e7c4066db44c90ef329eb1312ac31201cb1933bd9da829fc2288c688e595bec8cfc994
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  ## Installation
5
5
 
6
6
  Permissionable is distributed as a gem. To install, just add this line to your Gemfile:
7
- `gem 'permissionable', '~> 0.1.2'`
7
+ `gem 'permissionable', '~> 0.1.3'`
8
8
 
9
9
 
10
10
  ## Usage
@@ -17,16 +17,16 @@ permissions read: 1,
17
17
  delete: 3
18
18
  ```
19
19
 
20
- Your model doesn't have to be an ActiveRecord (AR) model, but Permissionable works out of the box with AR to persist the permissions. Just throw in a `permissions` column in the mix.
20
+ Your model doesn't have to be an ActiveRecord (AR) model, but Permissionable works out of the box with AR to persist the permissions. Just throw in a `permissions_integer` column in the mix.
21
21
  ```
22
22
  class AddPermissionsToResource < ActiveRecord::Migration
23
23
  def change
24
- add_column :resources, :permissions, :integer
24
+ add_column :resources, :permissions_integer, :integer
25
25
  end
26
26
  end
27
27
  ```
28
28
 
29
- If your're not using AR can also implement your own `#read_attribute` and `#update_column` methods to handle `read_attribute(:permissions)` and `update_column(:permissions, permissions_integer)`
29
+ If your're not using AR can also implement your own `#read_attribute` and `#update_column` methods to handle `read_attribute(:permissions_integer)` and `update_column(:permissions_integer, permissions_integer)`
30
30
 
31
31
  ### Working with permissions
32
32
  #### Check for permissions
@@ -55,6 +55,9 @@ You can also add an array of permissions yo your array of permissions:
55
55
  Removing permissions from your resource is pretty straight forward:
56
56
  `user.permissions.remove(:delete_books)`
57
57
 
58
+ Or, if you would like to remove all permissions:
59
+ `user.permissions.clear!`
60
+
58
61
  ### Examples
59
62
  ```
60
63
  class User < ActiveRecord::Base
@@ -1,4 +1,5 @@
1
1
  require "permissionable/version"
2
+ require "permissionable/exceptions"
2
3
  require "permissionable/permissions"
3
4
 
4
5
  module Permissionable
@@ -6,14 +7,21 @@ module Permissionable
6
7
  def permissions
7
8
  @permissions ||= Permissions.new(self)
8
9
  end
10
+
11
+ def permissions=(*permissions)
12
+ permissions.flatten!
13
+ self.permissions.clear!
14
+ self.permissions << permissions
15
+ self.permissions.send(:sync_with_owner)
16
+ end
9
17
 
10
18
  # Class methods from here on
11
19
  module ClassMethods
20
+
12
21
  def permissions(permission_definitions)
13
22
  @permissions = {}
14
23
  permission_definitions.each do |permission,i|
15
- raise 'Can not assign 0' if i == 0
16
- raise "#{i} is not an integer" unless i.is_a?(Fixnum)
24
+ raise InvalidPermissionAssignment.new(i) if i == 0 || !i.is_a?(Fixnum)
17
25
  if i == 1
18
26
  @permissions[permission] = 1
19
27
  else
@@ -0,0 +1,11 @@
1
+ module Permissionable
2
+ class InvalidPermissionAssignment < StandardError
3
+ def initialize(object)
4
+ if object == 0
5
+ super "Can not assign a permission the value 0"
6
+ elsif !object.is_a?(Fixnum)
7
+ super "Can not assign permissions to values of type #{object.class.name} (only Fixnum allowed)"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -3,14 +3,14 @@ module Permissionable
3
3
  def initialize(owner)
4
4
  @owner = owner
5
5
  if @owner.respond_to?(:read_attribute)
6
- @permission_integer = @owner.read_attribute(:permissions)
6
+ @permissions_integer = @owner.read_attribute(:permissions_integer)
7
7
  else
8
- @permission_integer = 0
8
+ @permissions_integer = 0
9
9
  end
10
10
  end
11
11
 
12
12
  def to_i
13
- @permission_integer
13
+ @permissions_integer
14
14
  end
15
15
 
16
16
  # Add new permissions
@@ -23,7 +23,7 @@ module Permissionable
23
23
  control_definitions(permissions)
24
24
  permissions.each do |permission|
25
25
  new_permission = defined_permissions[permission]
26
- @permission_integer += new_permission unless include?(permission)
26
+ @permissions_integer += new_permission unless include?(permission)
27
27
  end
28
28
  sync_with_owner
29
29
  end
@@ -38,7 +38,7 @@ module Permissionable
38
38
  permissions.flatten!
39
39
  control_definitions(permissions)
40
40
  permissions.each do |permission|
41
- @permission_integer -= defined_permissions[permission] if include?(permission)
41
+ @permissions_integer -= defined_permissions[permission] if include?(permission)
42
42
  end
43
43
  sync_with_owner
44
44
  end
@@ -55,10 +55,15 @@ module Permissionable
55
55
  # Sum the corresponding int value of all
56
56
  # permissions provided in the argument list
57
57
  asserted = permissions.inject(0){ |mem, permission| mem + defined_permissions[permission] }
58
- @permission_integer & asserted == asserted
58
+ @permissions_integer & asserted == asserted
59
59
  end
60
60
  alias_method :[], :include?
61
61
 
62
+ def clear!
63
+ @permissions_integer = 0
64
+ sync_with_owner
65
+ end
66
+
62
67
  private
63
68
 
64
69
  def control_definitions(permissions)
@@ -68,8 +73,13 @@ module Permissionable
68
73
  end
69
74
 
70
75
  def sync_with_owner
76
+ if @owner.respond_to?(:permissions_integer=)
77
+ @owner.permissions_integer = @permissions_integer
78
+ end
71
79
  if @owner.respond_to?(:update_column)
72
- @owner.update_column(:permissions, @permission_integer)
80
+ if @owner.respond_to?(:persisted?) && @owner.persisted?
81
+ @owner.update_column(:permissions_integer, @permissions_integer)
82
+ end
73
83
  end
74
84
  end
75
85
 
@@ -1,3 +1,3 @@
1
1
  module Permissionable
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
data/spec/dummy.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'pry'
1
2
  class Dummy
2
3
  include Permissionable
3
4
 
@@ -7,4 +8,15 @@ class Dummy
7
8
  play: 4,
8
9
  eat: 5
9
10
 
11
+ def persisted?
12
+ true
13
+ end
14
+
15
+ def initialize(attributes={})
16
+ attributes.each do |attribute,value|
17
+ setter_method = "#{attribute}=".to_sym
18
+ self.send(setter_method, value)
19
+ end
20
+ end
21
+
10
22
  end
@@ -2,6 +2,8 @@ require 'permissionable'
2
2
  require 'dummy'
3
3
 
4
4
 
5
+ # This class is a bit unreliable because
6
+ # it has its permissions redefined in the tests
5
7
  class FlakyDummy
6
8
  include Permissionable
7
9
  end
@@ -31,13 +33,13 @@ describe Permissionable do
31
33
  it 'can not assign 0' do
32
34
  expect{
33
35
  FlakyDummy.permissions(nope: 0)
34
- }.to raise_exception
36
+ }.to raise_exception(Permissionable::InvalidPermissionAssignment)
35
37
  end
36
38
 
37
- it 'can only assign integers' do
39
+ it 'can not assign strings' do
38
40
  expect{
39
41
  FlakyDummy.permissions(nope: '1')
40
- }.to raise_exception
42
+ }.to raise_exception(Permissionable::InvalidPermissionAssignment)
41
43
  end
42
44
  end
43
45
  end
@@ -49,6 +51,10 @@ describe Permissionable do
49
51
  expect(dummy.permissions).to be_an_instance_of(Permissionable::Permissions)
50
52
  end
51
53
 
54
+ it 'can assign permissions on initializing' do
55
+ dummy = Dummy.new(permissions: [:sit, :eat])
56
+ expect(dummy.permissions[:sit, :eat]).to be true
57
+ end
52
58
  end
53
59
 
54
60
  end
@@ -6,7 +6,7 @@ class DummyWithPermissions
6
6
  permissions walk: 1
7
7
 
8
8
  def read_attribute(attribute)
9
- 1 if attribute == :permissions
9
+ 1 if attribute == :permissions_integer
10
10
  end
11
11
  end
12
12
 
@@ -53,7 +53,7 @@ describe Permissionable::Permissions do
53
53
  expect(@permissions.include?(:run, :walk)).to be true
54
54
  end
55
55
 
56
- it 'it is false when one of asserted is missing' do
56
+ it 'is false when one of asserted is missing' do
57
57
  @permissions << :run
58
58
  @permissions << :walk
59
59
  expect(@permissions.include?(:run, :play)).to be false
@@ -68,18 +68,27 @@ describe Permissionable::Permissions do
68
68
  end
69
69
 
70
70
  it 'updates column when adding permission' do
71
- @owner = Dummy.new
72
- @permissions = Permissionable::Permissions.new(@owner)
73
- expect(@owner).to receive(:update_column).with(:permissions, 2)
74
- @permissions << :walk
71
+ owner = Dummy.new
72
+ permissions = Permissionable::Permissions.new(owner)
73
+ expect(owner).to receive(:update_column).with(:permissions_integer, 2)
74
+ permissions << :walk
75
75
  end
76
76
 
77
77
  it 'updates column when removing permission' do
78
- @owner = Dummy.new
79
- @permissions = Permissionable::Permissions.new(@owner)
80
- @permissions << :run
81
- expect(@owner).to receive(:update_column).with(:permissions, 0)
82
- @permissions.remove :run
78
+ owner = Dummy.new
79
+ permissions = Permissionable::Permissions.new(owner)
80
+ permissions << :run
81
+ expect(owner).to receive(:update_column).with(:permissions_integer, 0)
82
+ permissions.remove :run
83
+ end
84
+
85
+ it 'can clear permissions' do
86
+ owner = Dummy.new
87
+ permissions = Permissionable::Permissions.new(owner)
88
+ permissions << :run
89
+ expect(permissions[:run]).to be true
90
+ permissions.clear!
91
+ expect(permissions.to_i).to be_zero
83
92
  end
84
93
 
85
94
  it 'can read permissions from owner' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: permissionable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Falkén
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-08 00:00:00.000000000 Z
11
+ date: 2015-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,7 @@ files:
66
66
  - README.md
67
67
  - Rakefile
68
68
  - lib/permissionable.rb
69
+ - lib/permissionable/exceptions.rb
69
70
  - lib/permissionable/permissions.rb
70
71
  - lib/permissionable/version.rb
71
72
  - permissionable.gemspec