cantango 0.8.7 → 0.8.8

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile CHANGED
@@ -35,13 +35,12 @@ Run bundler in a terminal/console from the folder of your Gemfile (root folder o
35
35
 
36
36
  @$ bundle@
37
37
 
38
- h2. Update Oct 5, 2011
38
+ h2. Update Oct 6, 2011
39
39
 
40
- Version *0.8.7* has been released.
40
+ Version *0.8.8* has been released.
41
41
 
42
- * Enhanced Permits and Engines debugging.
43
-
44
- Now you can easily track which engines and permits are executed and which permits granted or declined certain abilities
42
+ * Fixed some bugs when using :user and :account permits
43
+ * Enhanced Permits debugging so you can now track the execution flow of the Permits engine.
45
44
 
46
45
  h2. Quickstart
47
46
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.7
1
+ 0.8.8
data/cantango.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "cantango"
8
- s.version = "0.8.7"
8
+ s.version = "0.8.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kristian Mandrup", "Stanislaw Pankevich"]
12
- s.date = "2011-10-05"
12
+ s.date = "2011-10-06"
13
13
  s.description = "Define your permission rules as role- or role group specific permits.\nIntegrates well with multiple Devise user acounts.\nIncludes rules caching.\nStore permissions in yaml file or key-value store"
14
14
  s.email = "kmandrup@gmail.com, s.pankevich@gmail.com"
15
15
  s.extra_rdoc_files = [
data/lib/cantango.rb CHANGED
@@ -40,6 +40,10 @@ module CanTango
40
40
  def debug!
41
41
  config.debug.set :on
42
42
  end
43
+
44
+ def debug?
45
+ config.debug.on?
46
+ end
43
47
  end
44
48
  end
45
49
 
@@ -32,12 +32,12 @@ module CanTango
32
32
 
33
33
  def [] label
34
34
  raise "Must be a label" if !label.kind_of_label?
35
- registered[label]
35
+ registered[label.to_s]
36
36
  end
37
37
 
38
38
  def []= label, value
39
39
  raise "Must be a label" if !label.kind_of_label?
40
- registered[label] = value
40
+ registered[label.to_s] = value
41
41
  end
42
42
 
43
43
  def register hash
@@ -56,7 +56,6 @@ module CanTango
56
56
  def default= hash
57
57
  @default = Hashie::Mash.new hash
58
58
  end
59
-
60
59
  end
61
60
  end
62
61
  end
@@ -9,6 +9,21 @@ module CanTango
9
9
  }
10
10
  end
11
11
 
12
+ def registered_for type, name = nil
13
+ name ? registered_by(type)[name.to_s] : registered_by(type)
14
+ end
15
+
16
+ def registered_by type
17
+ send(type).registered
18
+ end
19
+
20
+ def all
21
+ [user, account, role, role_group]
22
+ end
23
+
24
+ def show_all
25
+ all.map(&:registered)
26
+ end
12
27
  end
13
28
  end
14
29
  end
@@ -19,7 +19,9 @@ module CanTango
19
19
 
20
20
  def register_permit_class(permit_name, permit_clazz, permit_type, account_name)
21
21
  registry = account_name ? self.send(account_name.to_sym) : self
22
+ puts "Registering #{permit_type} permit: #{permit_name} of class #{permit_clazz}" if CanTango.debug?
22
23
  registry.send(permit_type)[permit_name] = permit_clazz
24
+ puts registry.send(permit_type).inspect if CanTango.debug?
23
25
  end
24
26
 
25
27
  def allowed candidate, actions, subjects, *extra_args
@@ -13,12 +13,14 @@ module CanTango
13
13
  end
14
14
 
15
15
  def file_name= file
16
- raise "Couldn't find permissions file: #{file}" if file.nil? || !File.file?(file)
16
+ raise "Couldn't find permissions file: #{file}. Either disable Permission engine or add this file." if file.nil? || !File.file?(file)
17
17
  @file_name = file
18
18
  end
19
19
 
20
20
  def yml_content
21
21
  YAML.load_file(file_name)
22
+ rescue
23
+ raise "Couldn't load permissions file: #{file_name}. Either disable Permission engine or add this file."
22
24
  end
23
25
 
24
26
  module ClassMethods
@@ -8,7 +8,10 @@ module CanTango
8
8
  end
9
9
 
10
10
  def execute!
11
- puts "Permit Engine executing..." if CanTango.config.debug.on?
11
+ if CanTango.config.debug.on?
12
+ puts "Permit Engine executing..."
13
+ puts "No permits found!" if permits.empty?
14
+ end
12
15
  # CanTango.config.permits.clear_executed! # should there be an option clear before each execution?
13
16
  permits.each do |permit|
14
17
  CanTango.config.permits.was_executed(permit, ability) if CanTango.config.debug.on?
@@ -1,6 +1,8 @@
1
1
  module CanTango
2
2
  class PermitEngine < Engine
3
3
  module Builder
4
+ class CreatePermitError < StandardError; end;
5
+
4
6
  class Base
5
7
  attr_accessor :ability
6
8
 
@@ -21,7 +23,7 @@ module CanTango
21
23
  self.class.to_s.gsub(/::Builder/, '').constantize
22
24
  end
23
25
 
24
- # Tries to create a new permit for the given role
26
+ # Tries to create a new permit for the given name
25
27
  # If no permit Class can be found, it should return nil
26
28
  # @param [Symbol] the name
27
29
  # @return the permit Class or nil if not found
@@ -29,12 +31,13 @@ module CanTango
29
31
  begin
30
32
  permit_clazz(name).new ability
31
33
  rescue RuntimeError => e
32
- #raise "Error instantiating Permit instance for role #{role}, cause #{e}"
34
+ # puts "Error instantiating Permit instance for #{name}, cause: #{e}" if CanTango.debug?
33
35
  nil
34
36
  end
35
37
  end
36
38
 
37
39
  def permit_clazz name
40
+ puts "Permit Finder: #{finder}" if CanTango.debug?
38
41
  finder.new(subject, name).get_permit
39
42
  end
40
43
 
@@ -3,6 +3,7 @@ module CanTango
3
3
  module Builder
4
4
  class SpecialPermits < Base
5
5
  def build
6
+ puts "Building special permits"
6
7
  special_permits.map{|role| create_permit(role)}.compact
7
8
  end
8
9
 
@@ -18,6 +18,10 @@ module CanTango
18
18
 
19
19
  protected
20
20
 
21
+ def valid_for? subject
22
+ permit.valid_for?(subject) if permit
23
+ end
24
+
21
25
  def options
22
26
  permit.options
23
27
  end
@@ -4,46 +4,13 @@ module CanTango
4
4
  class Base < Abstract
5
5
  # execute the permit
6
6
  def execute!
7
- role_execution
8
- #role_group_execution
9
- end
10
-
11
- # only execute the permit if the user has the role of the permit or is for any role
12
- def role_execution
13
- permit? if permit_for_user_role? || permit_for_user_group?
14
- end
15
-
16
- def permit_for_user_role?
17
- subject_in_role? || role == :any
18
- end
19
-
20
- def role_group_execution
21
- # could also use #user.is_member_of?
22
- permit? if permit_for_user_group?
23
- end
24
-
25
- def permit_for_user_group?
26
- subject_in_role_group? || false
7
+ valid_for?(subject) ? permit? : not_candidate_permit
27
8
  end
28
9
 
29
10
  protected
30
11
 
31
- def subject_in_role?
32
- return subject.send(has_role_meth, role) if subject.respond_to? has_role_meth
33
- return subject.send(roles_list_meth).include? role if subject.respond_to? roles_list_meth
34
- false
35
- end
36
-
37
- def subject_in_role_group?
38
- return subject.send(has_role_group_meth, role) if subject.respond_to? has_role_group_meth
39
- return subject.send(role_groups_list_meth).include? role if subject.respond_to? role_groups_list_meth
40
- false
41
- end
42
-
43
- include CanTango::Helpers::RoleMethods
44
-
45
- def role
46
- permit.role
12
+ def not_candidate_permit
13
+ puts "Permit #{permit} is not valid for #{subject}" if CanTango.debug?
47
14
  end
48
15
  end
49
16
  end
@@ -1,7 +1,7 @@
1
1
  module CanTango
2
2
  class PermitEngine < Engine
3
3
  class Factory
4
- attr_accessor :ability, :builders
4
+ attr_accessor :ability
5
5
 
6
6
  # creates the factory for the ability
7
7
  # note that the ability contains the roles and role groups of the user (or account)
@@ -11,10 +11,21 @@ module CanTango
11
11
  end
12
12
 
13
13
  def build!
14
- @builders ||= builders.inject([]) do |res, builder|
15
- res << create_builder(builder).build
16
- res
17
- end.flatten.compact
14
+ puts "PermitEngine Factory: No permits could be built" if permits.empty? && CanTango.debug?
15
+ permits
16
+ end
17
+
18
+ def permits
19
+ @permits ||= builders.inject([]) do |permits, builder|
20
+ puts "++ Permit Builder: #{builder_class builder}"
21
+ built_permits = permits_built_with(builder)
22
+ puts "== Permits built: #{built_permits.size}"
23
+ permits = permits + built_permits if built_permits
24
+ end.flatten
25
+ end
26
+
27
+ def permits_built_with builder
28
+ create_builder(builder).build
18
29
  end
19
30
 
20
31
  def create_builder builder
@@ -6,7 +6,7 @@ module CanTango
6
6
 
7
7
  def initialize user_account, name
8
8
  @user_account = user_account
9
- @name = name
9
+ @name = name.to_s.underscore.to_sym
10
10
  end
11
11
 
12
12
  def get_permit
@@ -17,37 +17,62 @@ module CanTango
17
17
  protected
18
18
 
19
19
  def find_error
20
- "Permit for #{type} #{name} could not be loaded. Define either class: #{account_permit_class} or #{permit_class}"
20
+ "Permit for #{type} #{name} could not be loaded. Define class: #{permit_class} (or wrapped in account scope)"
21
21
  end
22
22
 
23
23
  def retrieve_permit
24
- @found_permit ||= [account_permit(name), permit(name)].compact.first
24
+ @found_permit ||= permits_to_try.first
25
+ end
26
+
27
+ def permits_to_try
28
+ [account_permit, permit].compact
25
29
  end
26
30
 
27
- def account_permit name
28
-
29
31
  # TODO: User/Account cases should be handled somehow following is just interim measure
32
+ def account_permit
30
33
  return nil if !user_account.class.name =~ /Account/
31
- account_permits_for_account.send(type).registered[name]
34
+ found = account_permits_by(type)[name]
35
+ debug_msg account_permit_msg(found)
36
+ found
32
37
  rescue
33
38
  nil
34
39
  end
35
40
 
36
- def permit name
37
- permits.send(type).registered[name]
41
+ def account_permit_msg found
42
+ found.nil? ? "no account permits found for #{name}" : "account permits registered for name: #{name} -> #{found}"
38
43
  end
39
44
 
40
- def permits
41
- CanTango.config.permits
45
+ def permit
46
+ found = registered_permits.registered_for type, name
47
+ debug_msg permit_msg(found)
48
+ found
49
+ end
50
+
51
+ def debug_msg msg
52
+ puts msg if CanTango.debug?
53
+ end
54
+
55
+ def permit_msg found
56
+ found.nil? ? "no permits found for #{name}" : "permits registered for name: #{name} -> #{found}"
42
57
  end
43
58
 
44
- # TODO: make proper account touching
59
+ def account_permits_by type
60
+ account_permits_for_account.registered_for(type)
61
+ end
62
+
63
+ def permits_by type
64
+ registered_permits.registered_for(type)
65
+ end
66
+
67
+ def registered_permits
68
+ CanTango.config.permits
69
+ end
45
70
 
46
71
  def account_permits_for_account
47
- account_permits.send(account)
72
+ registered_account_permits.send(account)
48
73
  end
49
74
 
50
- def account_permits
75
+ def registered_account_permits
51
76
  CanTango.config.permits
52
77
  end
53
78
 
@@ -44,8 +44,27 @@ module CanTango
44
44
  def permit?
45
45
  super
46
46
  end
47
- end
48
47
 
48
+ def valid_for? subject
49
+ debug_invalid if CanTango.debug? && !(subject_name == account_name)
50
+ subject_name == account_name
51
+ end
52
+
53
+ protected
54
+
55
+ def debug_invalid
56
+ puts "Not a valid permit for subject: (account class) #{subject_account} != #{permit_account} (permit account)"
57
+ end
58
+
59
+ def subject_name
60
+ nm = subject.class.name.sub(/.*(Account)$/, '')
61
+ nm.underscore.to_sym
62
+ end
63
+
64
+ def account_name
65
+ self.class.account_type_name(self.class)
66
+ end
67
+ end
49
68
  end
50
69
  end
51
70
 
@@ -8,8 +8,18 @@ module CanTango
8
8
  # @return [Array<RoleGroupPermit::Base>] the role permits built for this ability
9
9
  def build
10
10
  return [] if !user_account
11
- # raise NoAvailableRoles, "no available roles are defined" if available_roles.empty?
12
- [] << create_permit(user_account.class.to_s)
11
+ puts debug_msg if CanTango.debug?
12
+ [permit].compact
13
+ end
14
+
15
+ protected
16
+
17
+ def debug_msg
18
+ permit ? "Building AccountPermit for #{user_account}, permit: #{permit}" : "Not building any AccountPermit"
19
+ end
20
+
21
+ def permit
22
+ create_permit(user_account.class.to_s)
13
23
  end
14
24
  end
15
25
  end
@@ -21,7 +21,6 @@ module CanTango
21
21
  clazz.to_s.gsub(/^([A-Za-z]+).*/, '\1').underscore.to_sym # first part of class name
22
22
  end
23
23
 
24
-
25
24
  def self.account_name clazz
26
25
  return nil if clazz.name == clazz.name.demodulize
27
26
  clazz.name.gsub(/::.*/,'').gsub(/(.*)Permits/, '\1').underscore.to_sym
@@ -34,11 +33,14 @@ module CanTango
34
33
  ability_sync!
35
34
  end
36
35
 
36
+ def valid_for? subject
37
+ raise NotImplementedError
38
+ end
39
+
37
40
  def category label
38
41
  config.models.by_category label
39
42
  end
40
43
 
41
-
42
44
  def any reg_exp
43
45
  config.models.by_reg_exp reg_exp
44
46
  end
@@ -44,6 +44,19 @@ module CanTango
44
44
  super
45
45
  end
46
46
 
47
+ def valid_for? subject
48
+ in_role_group? subject
49
+ end
50
+
51
+ protected
52
+
53
+ include CanTango::Helpers::RoleMethods
54
+
55
+ def in_role_group? subject
56
+ return subject.send(has_role_group_meth, role) if subject.respond_to? has_role_group_meth
57
+ return subject.send(role_groups_list_meth).include? role if subject.respond_to? role_groups_list_meth
58
+ false
59
+ end
47
60
  end
48
61
  end
49
62
  end
@@ -8,8 +8,13 @@ module CanTango
8
8
  # builds a list of Permits for each role group of the current ability user (or account)
9
9
  # @return [Array<RoleGroupPermit::Base>] the role group permits built for this ability
10
10
  def build
11
- # raise NoAvailableRoleGroups, "no available roles groups are defined" if available_role_groups.empty?
11
+ if roles.empty?
12
+ puts "Not building any RoleGroupPermit" if CanTango.debug?
13
+ return [] if role_groups.empty?
14
+ end
15
+
12
16
  role_groups.inject([]) do |permits, role_group|
17
+ puts "Building RoleGroupPermit for #{role_group}" if CanTango.debug?
13
18
  (permits << create_permit(role_group)) if valid?(role_group)
14
19
  permits
15
20
  end.compact
@@ -44,7 +44,20 @@ module CanTango
44
44
  def permit?
45
45
  super
46
46
  end
47
- end
48
47
 
48
+ def valid_for? subject
49
+ in_role? subject
50
+ end
51
+
52
+ protected
53
+
54
+ include CanTango::Helpers::RoleMethods
55
+
56
+ def in_role? subject
57
+ return subject.send(has_role_meth, role) if subject.respond_to? has_role_meth
58
+ return subject.send(roles_list_meth).include? role if subject.respond_to? roles_list_meth
59
+ false
60
+ end
61
+ end
49
62
  end
50
63
  end
@@ -5,7 +5,12 @@ module CanTango
5
5
  # builds a list of Permits for each role of the current ability user (or account)
6
6
  # @return [Array<RoleGroupPermit::Base>] the role permits built for this ability
7
7
  def build
8
+ if roles.empty?
9
+ puts "Not building any RolePermit" if CanTango.debug?
10
+ return [] if roles.empty?
11
+ end
8
12
  roles.inject([]) do |permits, role|
13
+ puts "Building RolePermit for #{role}" if CanTango.debug?
9
14
  (permits << create_permit(role)) if valid?(role.to_sym)
10
15
  permits
11
16
  end.compact
@@ -45,8 +45,26 @@ module CanTango
45
45
  def permit?
46
46
  super
47
47
  end
48
- end
49
48
 
49
+ def valid_for? subject
50
+ debug_invalid if CanTango.debug? && !(subject_user == permit_user)
51
+ subject_user == permit_user
52
+ end
53
+
54
+ protected
55
+
56
+ def debug_invalid
57
+ puts "Not a valid permit for subject: (user class) #{subject_user} != #{permit_user} (permit user)"
58
+ end
59
+
60
+ def subject_user
61
+ subject.class.name.underscore.to_sym
62
+ end
63
+
64
+ def permit_user
65
+ self.class.user_type_name(self.class)
66
+ end
67
+ end
50
68
  end
51
69
  end
52
70
 
@@ -5,10 +5,20 @@ module CanTango
5
5
  # class NoAvailableRoles < StandardError; end
6
6
 
7
7
  # builds a list of Permits for each role of the current ability user (or account)
8
- # @return [Array<RoleGroupPermit::Base>] the role permits built for this ability
8
+ # @return [Array<Permit::Base>] the role permits built for this ability
9
9
  def build
10
- # raise NoAvailableRoles, "no available roles are defined" if available_roles.empty?
11
- [] << create_permit(user.class.to_s)
10
+ puts debug_msg if CanTango.debug?
11
+ [permit].compact
12
+ end
13
+
14
+ protected
15
+
16
+ def debug_msg
17
+ permit ? "Building UserPermit for #{user}, permit: #{permit}" : "Not building any UserPermit"
18
+ end
19
+
20
+ def permit
21
+ @permit ||= create_permit(user.class.to_s)
12
22
  end
13
23
  end
14
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cantango
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.7
4
+ version: 0.8.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-10-05 00:00:00.000000000Z
13
+ date: 2011-10-06 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
17
- requirement: &2156522760 !ruby/object:Gem::Requirement
17
+ requirement: &2155232980 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 3.0.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2156522760
25
+ version_requirements: *2155232980
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: cancan
28
- requirement: &2156521480 !ruby/object:Gem::Requirement
28
+ requirement: &2155230180 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '1.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2156521480
36
+ version_requirements: *2155230180
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sugar-high
39
- requirement: &2156520860 !ruby/object:Gem::Requirement
39
+ requirement: &2155228180 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 0.6.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2156520860
47
+ version_requirements: *2155228180
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: sweetloader
50
- requirement: &2156520260 !ruby/object:Gem::Requirement
50
+ requirement: &2155225700 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 0.1.0
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *2156520260
58
+ version_requirements: *2155225700
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: hashie
61
- requirement: &2156519760 !ruby/object:Gem::Requirement
61
+ requirement: &2155224820 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0.4'
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *2156519760
69
+ version_requirements: *2155224820
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rspec-rails
72
- requirement: &2156519280 !ruby/object:Gem::Requirement
72
+ requirement: &2155223860 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 2.6.1
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2156519280
80
+ version_requirements: *2155223860
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: forgery
83
- requirement: &2156518640 !ruby/object:Gem::Requirement
83
+ requirement: &2155222500 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ! '>='
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: '0.3'
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *2156518640
91
+ version_requirements: *2155222500
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: factory_girl
94
- requirement: &2156518140 !ruby/object:Gem::Requirement
94
+ requirement: &2155220720 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: '0'
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *2156518140
102
+ version_requirements: *2155220720
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: sqlite3
105
- requirement: &2156517640 !ruby/object:Gem::Requirement
105
+ requirement: &2155219360 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ! '>='
@@ -110,10 +110,10 @@ dependencies:
110
110
  version: '0'
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *2156517640
113
+ version_requirements: *2155219360
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: sourcify
116
- requirement: &2156516960 !ruby/object:Gem::Requirement
116
+ requirement: &2155217480 !ruby/object:Gem::Requirement
117
117
  none: false
118
118
  requirements:
119
119
  - - ! '>='
@@ -121,10 +121,10 @@ dependencies:
121
121
  version: '0'
122
122
  type: :development
123
123
  prerelease: false
124
- version_requirements: *2156516960
124
+ version_requirements: *2155217480
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: dkastner-moneta
127
- requirement: &2156516480 !ruby/object:Gem::Requirement
127
+ requirement: &2155216560 !ruby/object:Gem::Requirement
128
128
  none: false
129
129
  requirements:
130
130
  - - ! '>='
@@ -132,10 +132,10 @@ dependencies:
132
132
  version: '1.0'
133
133
  type: :development
134
134
  prerelease: false
135
- version_requirements: *2156516480
135
+ version_requirements: *2155216560
136
136
  - !ruby/object:Gem::Dependency
137
137
  name: rspec
138
- requirement: &2156516000 !ruby/object:Gem::Requirement
138
+ requirement: &2155215080 !ruby/object:Gem::Requirement
139
139
  none: false
140
140
  requirements:
141
141
  - - ! '>='
@@ -143,10 +143,10 @@ dependencies:
143
143
  version: 2.4.0
144
144
  type: :development
145
145
  prerelease: false
146
- version_requirements: *2156516000
146
+ version_requirements: *2155215080
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: jeweler
149
- requirement: &2156515440 !ruby/object:Gem::Requirement
149
+ requirement: &2155213680 !ruby/object:Gem::Requirement
150
150
  none: false
151
151
  requirements:
152
152
  - - ! '>='
@@ -154,10 +154,10 @@ dependencies:
154
154
  version: 1.6.4
155
155
  type: :development
156
156
  prerelease: false
157
- version_requirements: *2156515440
157
+ version_requirements: *2155213680
158
158
  - !ruby/object:Gem::Dependency
159
159
  name: bundler
160
- requirement: &2156514780 !ruby/object:Gem::Requirement
160
+ requirement: &2155211640 !ruby/object:Gem::Requirement
161
161
  none: false
162
162
  requirements:
163
163
  - - ! '>='
@@ -165,10 +165,10 @@ dependencies:
165
165
  version: 1.0.1
166
166
  type: :development
167
167
  prerelease: false
168
- version_requirements: *2156514780
168
+ version_requirements: *2155211640
169
169
  - !ruby/object:Gem::Dependency
170
170
  name: rdoc
171
- requirement: &2156514300 !ruby/object:Gem::Requirement
171
+ requirement: &2155209840 !ruby/object:Gem::Requirement
172
172
  none: false
173
173
  requirements:
174
174
  - - ! '>='
@@ -176,7 +176,7 @@ dependencies:
176
176
  version: '0'
177
177
  type: :development
178
178
  prerelease: false
179
- version_requirements: *2156514300
179
+ version_requirements: *2155209840
180
180
  description: ! 'Define your permission rules as role- or role group specific permits.
181
181
 
182
182
  Integrates well with multiple Devise user acounts.
@@ -822,7 +822,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
822
822
  version: '0'
823
823
  segments:
824
824
  - 0
825
- hash: -1292324301236027620
825
+ hash: 4099714977896474782
826
826
  required_rubygems_version: !ruby/object:Gem::Requirement
827
827
  none: false
828
828
  requirements: