permissionable 0.1.3 → 0.1.4

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
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