cantango-permits 0.1.1
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.
- data/.rspec +1 -0
- data/Gemfile +39 -0
- data/Gemfile.lock +155 -0
- data/MIT-LICENSE +20 -0
- data/README.mdown +362 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/lib/cantango/executor.rb +5 -0
- data/lib/cantango/executor/base.rb +9 -0
- data/lib/cantango/executor/permit.rb +7 -0
- data/lib/cantango/executor/permit/abstract.rb +27 -0
- data/lib/cantango/executor/permit/base.rb +19 -0
- data/lib/cantango/executor/permit/special.rb +9 -0
- data/lib/cantango/executor/permit_type.rb +50 -0
- data/lib/cantango/license.rb +19 -0
- data/lib/cantango/license/rules.rb +17 -0
- data/lib/cantango/permit.mdown +4 -0
- data/lib/cantango/permit.rb +5 -0
- data/lib/cantango/permit/account_type.rb +44 -0
- data/lib/cantango/permit/attribute.rb +71 -0
- data/lib/cantango/permit/base.rb +94 -0
- data/lib/cantango/permit/class_methods.rb +49 -0
- data/lib/cantango/permit/helper.rb +11 -0
- data/lib/cantango/permit/helper/execution.rb +38 -0
- data/lib/cantango/permit/helper/host.rb +13 -0
- data/lib/cantango/permit/helper/license.rb +34 -0
- data/lib/cantango/permit/helper/naming.rb +38 -0
- data/lib/cantango/permit/helper/state.rb +21 -0
- data/lib/cantango/permit/special.rb +17 -0
- data/lib/cantango/permit/user.rb +36 -0
- data/lib/cantango/permit/user_type.rb +34 -0
- data/lib/cantango/permits.rb +20 -0
- data/lib/cantango/permits_ext.rb +7 -0
- data/lib/cantango/permits_ext/ability.rb +7 -0
- data/lib/cantango/permits_ext/ability/helper.rb +9 -0
- data/lib/cantango/permits_ext/ability/helper/permits.rb +8 -0
- data/lib/cantango/permits_ext/builder.rb +7 -0
- data/lib/cantango/permits_ext/builder/permit.rb +9 -0
- data/lib/cantango/permits_ext/builder/permit/account_type.rb +13 -0
- data/lib/cantango/permits_ext/builder/permit/base.rb +94 -0
- data/lib/cantango/permits_ext/builder/permit/special.rb +13 -0
- data/lib/cantango/permits_ext/builder/permit/user_type.rb +7 -0
- data/lib/cantango/permits_ext/class_methods.rb +28 -0
- data/lib/cantango/permits_ext/config.rb +11 -0
- data/lib/cantango/permits_ext/config/engines.rb +9 -0
- data/lib/cantango/permits_ext/config/engines/permit.rb +20 -0
- data/lib/cantango/permits_ext/config/permits.rb +43 -0
- data/lib/cantango/permits_ext/config/permits/accounts.rb +15 -0
- data/lib/cantango/permits_ext/config/permits/disabling.rb +22 -0
- data/lib/cantango/permits_ext/config/permits/enabling.rb +14 -0
- data/lib/cantango/permits_ext/config/permits/execution.rb +21 -0
- data/lib/cantango/permits_ext/config/permits/key.rb +19 -0
- data/lib/cantango/permits_ext/config/permits/registration.rb +33 -0
- data/lib/cantango/permits_ext/config/permits/tracking.rb +19 -0
- data/lib/cantango/permits_ext/config/permits/types.rb +25 -0
- data/lib/cantango/permits_ext/engine.rb +7 -0
- data/lib/cantango/permits_ext/engine/permits.rb +75 -0
- data/lib/cantango/permits_ext/factory.rb +7 -0
- data/lib/cantango/permits_ext/factory/permits.rb +40 -0
- data/lib/cantango/permits_ext/finder.rb +7 -0
- data/lib/cantango/permits_ext/finder/base.rb +35 -0
- data/lib/cantango/permits_ext/finder/permit.rb +7 -0
- data/lib/cantango/permits_ext/finder/permit/account.rb +47 -0
- data/lib/cantango/permits_ext/finder/permit/base.rb +53 -0
- data/lib/cantango/permits_ext/loader.rb +7 -0
- data/lib/cantango/permits_ext/loader/categories.rb +50 -0
- data/lib/cantango/permits_ext/loader/license.rb +19 -0
- data/lib/cantango/permits_ext/macros.rb +7 -0
- data/lib/cantango/permits_ext/macros/permit.rb +32 -0
- data/lib/cantango/permits_ext/parser.rb +7 -0
- data/lib/cantango/permits_ext/parser/categories.rb +15 -0
- data/lib/cantango/permits_ext/registry.rb +7 -0
- data/lib/cantango/permits_ext/registry/permit.rb +45 -0
- data/lib/generators/cantango/account_permit/account_permit_generator.rb +37 -0
- data/lib/generators/cantango/account_permit/templates/account_permit.erb +23 -0
- data/lib/generators/cantango/base.rb +71 -0
- data/lib/generators/cantango/basic.rb +41 -0
- data/lib/generators/cantango/license/license_generator.rb +29 -0
- data/lib/generators/cantango/license/templates/license.erb +10 -0
- data/lib/generators/cantango/license_base.rb +15 -0
- data/lib/generators/cantango/licenses/licenses_generator.rb +26 -0
- data/lib/generators/cantango/permit_generator.rb +58 -0
- data/lib/generators/cantango/role_permit/role_permit_generator.rb +39 -0
- data/lib/generators/cantango/role_permit/templates/account_permit.erb +4 -0
- data/lib/generators/cantango/role_permit/templates/role_group_permit.erb +24 -0
- data/lib/generators/cantango/role_permit/templates/role_permit.erb +23 -0
- data/lib/generators/cantango/role_permits/role_permits_generator.rb +45 -0
- data/lib/generators/cantango/user_permit/templates/account_permit.erb +5 -0
- data/lib/generators/cantango/user_permit/templates/user_permit.erb +23 -0
- data/lib/generators/cantango/user_permit/user_permit_generator.rb +36 -0
- data/lib/tasks/permits_tasks.rake +4 -0
- data/spec/cantango/ability/helper/permits_spec.rb +14 -0
- data/spec/cantango/builder/permit/account_type_spec.rb +25 -0
- data/spec/cantango/builder/permit/base_spec.rb +30 -0
- data/spec/cantango/builder/permit/special_spec.rb +25 -0
- data/spec/cantango/builder/permit/user_type_spec.rb +27 -0
- data/spec/cantango/config/engines/permit_spec.rb +14 -0
- data/spec/cantango/config/engines_spec.rb +142 -0
- data/spec/cantango/config/permit_registry_ex.rb +9 -0
- data/spec/cantango/config/permit_registry_spec.rb +8 -0
- data/spec/cantango/config/permits/accounts_spec.rb +23 -0
- data/spec/cantango/config/permits/disabling_spec.rb +38 -0
- data/spec/cantango/config/permits/enabling_spec.rb +19 -0
- data/spec/cantango/config/permits/execution_spec.rb +27 -0
- data/spec/cantango/config/permits/registration_spec.rb +15 -0
- data/spec/cantango/config/permits/tracking_spec.rb +19 -0
- data/spec/cantango/config/permits/types_spec.rb +27 -0
- data/spec/cantango/config/permits_spec.rb +76 -0
- data/spec/cantango/engine/permit_cached_spec.rb +52 -0
- data/spec/cantango/engine/permit_spec.rb +58 -0
- data/spec/cantango/engine/permit_static_dynamic_spec.rb +65 -0
- data/spec/cantango/executor/custom_permit_spec.rb +65 -0
- data/spec/cantango/executor/more_permit_spec.rb +45 -0
- data/spec/cantango/executor/permit_base_spec.rb +46 -0
- data/spec/cantango/executor/permit_spec.rb +53 -0
- data/spec/cantango/executor/special_permit_spec.rb +36 -0
- data/spec/cantango/factory/permits_spec.rb +70 -0
- data/spec/cantango/finder/account_permit_spec.rb +30 -0
- data/spec/cantango/finder/permit_spec.rb +23 -0
- data/spec/cantango/license/save_license_spec.rb +24 -0
- data/spec/cantango/license_spec.rb +0 -0
- data/spec/cantango/loader/categories_spec.rb +47 -0
- data/spec/cantango/loader/license_spec.rb +7 -0
- data/spec/cantango/macros/permit_spec.rb +38 -0
- data/spec/cantango/parser/categories_spec.rb +19 -0
- data/spec/cantango/permit/account_type_spec.rb +34 -0
- data/spec/cantango/permit/attribute_permit_spec.rb +65 -0
- data/spec/cantango/permit/base_spec.rb +106 -0
- data/spec/cantango/permit/class_methods_spec.rb +34 -0
- data/spec/cantango/permit/helper/execution_spec.rb +54 -0
- data/spec/cantango/permit/helper/host_spec.rb +29 -0
- data/spec/cantango/permit/helper/license_spec.rb +37 -0
- data/spec/cantango/permit/helper/naming_spec.rb +56 -0
- data/spec/cantango/permit/helper/state_spec.rb +24 -0
- data/spec/cantango/permit/special_default_spec.rb +2 -0
- data/spec/cantango/permit/special_first_spec.rb +2 -0
- data/spec/cantango/permit/user_type_spec.rb +78 -0
- data/spec/cantango/registry/permit_spec.rb +67 -0
- data/spec/fixtures/config/cantango_permissions.yml +49 -0
- data/spec/fixtures/config/categories.yml +6 -0
- data/spec/fixtures/config/evaluator_fixtures.yml +18 -0
- data/spec/fixtures/config/licenses.yml +4 -0
- data/spec/fixtures/config/permissions.yml +60 -0
- data/spec/fixtures/config/role_group.yml +4 -0
- data/spec/fixtures/config/roles.yml +4 -0
- data/spec/fixtures/config/test_permissions.yml +55 -0
- data/spec/fixtures/config/user_permissions.yml +8 -0
- data/spec/fixtures/models.rb +15 -0
- data/spec/fixtures/models/admin.rb +2 -0
- data/spec/fixtures/models/admin_account.rb +22 -0
- data/spec/fixtures/models/items.rb +11 -0
- data/spec/fixtures/models/permission.rb +12 -0
- data/spec/fixtures/models/simple_roles.rb +49 -0
- data/spec/fixtures/models/user.rb +52 -0
- data/spec/fixtures/models/user_account.rb +21 -0
- data/spec/fixtures/tango_fixtures.rb +29 -0
- data/spec/generators/cantango/account_role_permit_generator_spec.rb +35 -0
- data/spec/generators/cantango/account_role_permits_generator_spec.rb +59 -0
- data/spec/generators/cantango/license_generator_spec.rb +33 -0
- data/spec/generators/cantango/licenses_generator_spec.rb +58 -0
- data/spec/generators/cantango/role_permit_generator_spec.rb +35 -0
- data/spec/generators/cantango/role_permits_generator_spec.rb +58 -0
- data/spec/helpers/current_user_accounts.rb +20 -0
- data/spec/helpers/current_users.rb +10 -0
- data/spec/spec_helper.rb +24 -0
- metadata +325 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Permit
|
|
3
|
+
module ClassMethods
|
|
4
|
+
def inherited(subclass)
|
|
5
|
+
unless [CanTango::Permit::Base, CanTango::Permit::Attribute].include?(subclass.superclass)
|
|
6
|
+
subclass.extend CanTango::Permit::ClassMethods
|
|
7
|
+
register(subclass)
|
|
8
|
+
else
|
|
9
|
+
register_type subclass
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def modes *names
|
|
14
|
+
@modes ||= []
|
|
15
|
+
return @modes if names.empty?
|
|
16
|
+
@modes = names.to_symbols
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def type
|
|
20
|
+
:abstract
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def hash_key
|
|
24
|
+
raise NotImplementedError
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def finder
|
|
28
|
+
@finder ||= CanTango::Finder::Permit::Base.new permit_name(self), :account => account_name(self)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
protected
|
|
32
|
+
|
|
33
|
+
include CanTango::Permit::Helper::Naming
|
|
34
|
+
|
|
35
|
+
def register subclass, options = {}
|
|
36
|
+
permits.register_permit subclass, options.merge(:account => account_name)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def register_type clazz
|
|
40
|
+
CanTango.config.permits.types.register permit_name(clazz)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def permits
|
|
44
|
+
CanTango.config.permits
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module CanTango::Permit
|
|
2
|
+
module Helper
|
|
3
|
+
module Execution
|
|
4
|
+
include CanTango::Helpers::Debug
|
|
5
|
+
include CanTango::Permit::Helper::State
|
|
6
|
+
|
|
7
|
+
# executes the permit
|
|
8
|
+
def execute
|
|
9
|
+
return if disabled?
|
|
10
|
+
debug "Execute Permit: #{self}"
|
|
11
|
+
|
|
12
|
+
# check current mode and execute accordingly!?
|
|
13
|
+
calc_rules
|
|
14
|
+
mode_rules
|
|
15
|
+
end
|
|
16
|
+
alias_method :execute!, :execute
|
|
17
|
+
|
|
18
|
+
def mode_rules
|
|
19
|
+
return unless modes.include? mode
|
|
20
|
+
calc_rules_method = "#{mode}_rules"
|
|
21
|
+
send(calc_rules_method) if respond_to?(calc_rules_method)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# return the executor used to execute the permit
|
|
25
|
+
def executor
|
|
26
|
+
@executor ||= case self.class.name
|
|
27
|
+
when /System/
|
|
28
|
+
then CanTango::Executor::Permit::System.new self
|
|
29
|
+
else
|
|
30
|
+
CanTango::Executor::Permit::Base.new self
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def calc_rules
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module CanTango::Permit
|
|
2
|
+
module Helper
|
|
3
|
+
module License
|
|
4
|
+
def licenses *names
|
|
5
|
+
names.to_strings.each do |name|
|
|
6
|
+
try_license name
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def license name
|
|
11
|
+
raise ArgumentError, "Argument must be a single label" if !name.kind_of_label?
|
|
12
|
+
licenses name
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
protected
|
|
16
|
+
|
|
17
|
+
def license_const name
|
|
18
|
+
license_class(name).constantize
|
|
19
|
+
rescue NameError
|
|
20
|
+
raise "License #{license_class(name)} is not defined"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def license_class name
|
|
24
|
+
"#{name.camelize}License"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def try_license name
|
|
28
|
+
license_const(name).new(self).calc_rules
|
|
29
|
+
rescue Exception => e
|
|
30
|
+
raise "License #{license_const(name)} could not be executed: #{e}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module CanTango::Permit
|
|
2
|
+
module Helper
|
|
3
|
+
module Naming
|
|
4
|
+
def permit_name clazz = nil
|
|
5
|
+
clazz ||= is_class?(self) ? self : self.class
|
|
6
|
+
return nil unless clazz.name =~ /Permit/
|
|
7
|
+
namespaces = clazz.name.split('::')
|
|
8
|
+
name = (namespaces[-2] == 'Permit') ? namespaces.last : namespaces.last.sub(/Permit$/, '')
|
|
9
|
+
name.underscore.to_sym
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def account_name clazz = nil
|
|
13
|
+
clazz ||= is_class?(self) ? self : self.class
|
|
14
|
+
return nil if clazz.name == clazz.name.demodulize
|
|
15
|
+
top_module = clazz.name.gsub(/::.*/,'')
|
|
16
|
+
return nil unless /Permits$/ =~ top_module
|
|
17
|
+
top_module.gsub!(/Account/, '')
|
|
18
|
+
top_module.gsub(/(.*)Permits/, '\1').underscore.to_sym
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def permit_type clazz = nil
|
|
22
|
+
clazz ||= is_class?(self) ? self : self.class
|
|
23
|
+
permit_name clazz.superclass
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
protected
|
|
27
|
+
|
|
28
|
+
def first_name clazz = nil
|
|
29
|
+
clazz ||= is_class?(self) ? self : self.class
|
|
30
|
+
clazz.to_s.gsub(/^([A-Za-z]+).*/, '\1').underscore.to_sym # first part of class name
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def is_class? clazz
|
|
34
|
+
!clazz.nil? && clazz.respond_to?(:new)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module CanTango::Permit
|
|
2
|
+
module Helper
|
|
3
|
+
module State
|
|
4
|
+
def disable!
|
|
5
|
+
@enabled = false
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def disabled?
|
|
9
|
+
!enabled?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def enable!
|
|
13
|
+
@enabled = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def enabled?
|
|
17
|
+
@enabled == true
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Permit
|
|
3
|
+
class User < Base
|
|
4
|
+
attr_accessor :key, :match_value
|
|
5
|
+
|
|
6
|
+
# creates the permit
|
|
7
|
+
# @param [Permits::Ability] the ability
|
|
8
|
+
# @param [Hash] the options
|
|
9
|
+
def initialize ability
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.hash_key
|
|
14
|
+
nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def valid?
|
|
18
|
+
debug_invalid if !match?
|
|
19
|
+
true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
protected
|
|
23
|
+
|
|
24
|
+
def match?
|
|
25
|
+
return false if !subject.respond_to? key
|
|
26
|
+
subject.send(key) == match_value
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def debug_invalid
|
|
30
|
+
debug "Not a valid permit for subject: #{key} != #{match_value}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Permit
|
|
3
|
+
class UserType < Base
|
|
4
|
+
module ClassMethods
|
|
5
|
+
def hash_key
|
|
6
|
+
permit_name(self)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
extend ClassMethods
|
|
10
|
+
|
|
11
|
+
# creates the permit
|
|
12
|
+
# @param [Ability] the ability
|
|
13
|
+
def initialize ability
|
|
14
|
+
super
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def valid?
|
|
18
|
+
debug_invalid unless user_type == name
|
|
19
|
+
user_type == name
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
protected
|
|
23
|
+
|
|
24
|
+
def debug_invalid
|
|
25
|
+
debug "Not a valid permit for subject: (user class) #{user_type} != #{name} (permit user)"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def user_type
|
|
29
|
+
user.class.name.underscore.to_sym
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'sugar-high/array'
|
|
2
|
+
require 'sugar-high/blank'
|
|
3
|
+
require 'hashie'
|
|
4
|
+
require 'sweetloader'
|
|
5
|
+
|
|
6
|
+
SweetLoader.namespaces = {:CanTango => 'cantango'}
|
|
7
|
+
SweetLoader.mode = :require
|
|
8
|
+
|
|
9
|
+
module CanTango
|
|
10
|
+
sweetload :License, :Permit, :Executor
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
require 'cantango/permits_ext'
|
|
14
|
+
|
|
15
|
+
module CanTango
|
|
16
|
+
module Permit
|
|
17
|
+
sweetload :Base, :Attribute
|
|
18
|
+
sweetload :UserType, :AccountType, :Special, :User
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Builder::Permit
|
|
3
|
+
class AccountType < Base
|
|
4
|
+
# builds a list of Permits for each role of the current ability user (or account)
|
|
5
|
+
# @return [Array<RoleGroupPermit::Base>] the role permits built for this ability
|
|
6
|
+
def build
|
|
7
|
+
return [] if !account
|
|
8
|
+
super
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Builder::Permit
|
|
3
|
+
class Base
|
|
4
|
+
class CreatePermitError < StandardError; end
|
|
5
|
+
|
|
6
|
+
include CanTango::Helpers::Debug
|
|
7
|
+
|
|
8
|
+
attr_accessor :ability, :options
|
|
9
|
+
|
|
10
|
+
# delegate to ability
|
|
11
|
+
delegate :options, :subject, :user, :account, :to => :ability
|
|
12
|
+
|
|
13
|
+
# creates the factory for the ability
|
|
14
|
+
# note that the ability contains the roles and role groups of the user (or account)
|
|
15
|
+
# @param [Permits::Ability] the ability
|
|
16
|
+
def initialize ability, options = {}
|
|
17
|
+
@ability, @options = [ability, options]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module ClassMethods
|
|
21
|
+
include CanTango::Permit::Helper::Naming
|
|
22
|
+
end
|
|
23
|
+
extend ClassMethods
|
|
24
|
+
|
|
25
|
+
def permit_type
|
|
26
|
+
self.class.permit_name
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# builds a list of Permits for each role of the current ability user (or account)
|
|
30
|
+
# @return [Array<Permit::Base>] the role permits built for this ability
|
|
31
|
+
def build
|
|
32
|
+
debug debug_msg
|
|
33
|
+
permits
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
protected
|
|
37
|
+
|
|
38
|
+
# Tries to create a new permit
|
|
39
|
+
# If no permit Class can be found, it should return nil
|
|
40
|
+
# @param [Symbol] the name
|
|
41
|
+
# @return the permit Class or nil if not found
|
|
42
|
+
def create_permits
|
|
43
|
+
begin
|
|
44
|
+
names.inject([]) do |res, name|
|
|
45
|
+
permit = permit(name)
|
|
46
|
+
res << permit if valid?(permit)
|
|
47
|
+
res
|
|
48
|
+
end
|
|
49
|
+
rescue RuntimeError => e
|
|
50
|
+
debug "Error instantiating Permit instance for #{name}, cause: #{e}"
|
|
51
|
+
nil
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def valid? permit
|
|
56
|
+
return false if permit.disabled?
|
|
57
|
+
permit.valid?
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def debug_msg
|
|
61
|
+
permits ? msg(:building) : msg(:not_building)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def permits
|
|
65
|
+
@permit ||= create_permits
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def permit name
|
|
69
|
+
clazz = permit_class(name)
|
|
70
|
+
permit = clazz.new ability if clazz
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def names
|
|
74
|
+
CanTango.config.permits.registered_for(permit_type).registered_names
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def finder name
|
|
78
|
+
CanTango::Finder::Permit::Base.new name, options.merge(:type => permit_type)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def permit_class name
|
|
82
|
+
finder(name).find_permit
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def msg type
|
|
86
|
+
type == :building ? "Building #{htype} permits" : "Not building any #{htype} permits"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def htype
|
|
90
|
+
permit_type.to_s.humanize
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|