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.
Files changed (166) hide show
  1. data/.rspec +1 -0
  2. data/Gemfile +39 -0
  3. data/Gemfile.lock +155 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.mdown +362 -0
  6. data/Rakefile +45 -0
  7. data/VERSION +1 -0
  8. data/lib/cantango/executor.rb +5 -0
  9. data/lib/cantango/executor/base.rb +9 -0
  10. data/lib/cantango/executor/permit.rb +7 -0
  11. data/lib/cantango/executor/permit/abstract.rb +27 -0
  12. data/lib/cantango/executor/permit/base.rb +19 -0
  13. data/lib/cantango/executor/permit/special.rb +9 -0
  14. data/lib/cantango/executor/permit_type.rb +50 -0
  15. data/lib/cantango/license.rb +19 -0
  16. data/lib/cantango/license/rules.rb +17 -0
  17. data/lib/cantango/permit.mdown +4 -0
  18. data/lib/cantango/permit.rb +5 -0
  19. data/lib/cantango/permit/account_type.rb +44 -0
  20. data/lib/cantango/permit/attribute.rb +71 -0
  21. data/lib/cantango/permit/base.rb +94 -0
  22. data/lib/cantango/permit/class_methods.rb +49 -0
  23. data/lib/cantango/permit/helper.rb +11 -0
  24. data/lib/cantango/permit/helper/execution.rb +38 -0
  25. data/lib/cantango/permit/helper/host.rb +13 -0
  26. data/lib/cantango/permit/helper/license.rb +34 -0
  27. data/lib/cantango/permit/helper/naming.rb +38 -0
  28. data/lib/cantango/permit/helper/state.rb +21 -0
  29. data/lib/cantango/permit/special.rb +17 -0
  30. data/lib/cantango/permit/user.rb +36 -0
  31. data/lib/cantango/permit/user_type.rb +34 -0
  32. data/lib/cantango/permits.rb +20 -0
  33. data/lib/cantango/permits_ext.rb +7 -0
  34. data/lib/cantango/permits_ext/ability.rb +7 -0
  35. data/lib/cantango/permits_ext/ability/helper.rb +9 -0
  36. data/lib/cantango/permits_ext/ability/helper/permits.rb +8 -0
  37. data/lib/cantango/permits_ext/builder.rb +7 -0
  38. data/lib/cantango/permits_ext/builder/permit.rb +9 -0
  39. data/lib/cantango/permits_ext/builder/permit/account_type.rb +13 -0
  40. data/lib/cantango/permits_ext/builder/permit/base.rb +94 -0
  41. data/lib/cantango/permits_ext/builder/permit/special.rb +13 -0
  42. data/lib/cantango/permits_ext/builder/permit/user_type.rb +7 -0
  43. data/lib/cantango/permits_ext/class_methods.rb +28 -0
  44. data/lib/cantango/permits_ext/config.rb +11 -0
  45. data/lib/cantango/permits_ext/config/engines.rb +9 -0
  46. data/lib/cantango/permits_ext/config/engines/permit.rb +20 -0
  47. data/lib/cantango/permits_ext/config/permits.rb +43 -0
  48. data/lib/cantango/permits_ext/config/permits/accounts.rb +15 -0
  49. data/lib/cantango/permits_ext/config/permits/disabling.rb +22 -0
  50. data/lib/cantango/permits_ext/config/permits/enabling.rb +14 -0
  51. data/lib/cantango/permits_ext/config/permits/execution.rb +21 -0
  52. data/lib/cantango/permits_ext/config/permits/key.rb +19 -0
  53. data/lib/cantango/permits_ext/config/permits/registration.rb +33 -0
  54. data/lib/cantango/permits_ext/config/permits/tracking.rb +19 -0
  55. data/lib/cantango/permits_ext/config/permits/types.rb +25 -0
  56. data/lib/cantango/permits_ext/engine.rb +7 -0
  57. data/lib/cantango/permits_ext/engine/permits.rb +75 -0
  58. data/lib/cantango/permits_ext/factory.rb +7 -0
  59. data/lib/cantango/permits_ext/factory/permits.rb +40 -0
  60. data/lib/cantango/permits_ext/finder.rb +7 -0
  61. data/lib/cantango/permits_ext/finder/base.rb +35 -0
  62. data/lib/cantango/permits_ext/finder/permit.rb +7 -0
  63. data/lib/cantango/permits_ext/finder/permit/account.rb +47 -0
  64. data/lib/cantango/permits_ext/finder/permit/base.rb +53 -0
  65. data/lib/cantango/permits_ext/loader.rb +7 -0
  66. data/lib/cantango/permits_ext/loader/categories.rb +50 -0
  67. data/lib/cantango/permits_ext/loader/license.rb +19 -0
  68. data/lib/cantango/permits_ext/macros.rb +7 -0
  69. data/lib/cantango/permits_ext/macros/permit.rb +32 -0
  70. data/lib/cantango/permits_ext/parser.rb +7 -0
  71. data/lib/cantango/permits_ext/parser/categories.rb +15 -0
  72. data/lib/cantango/permits_ext/registry.rb +7 -0
  73. data/lib/cantango/permits_ext/registry/permit.rb +45 -0
  74. data/lib/generators/cantango/account_permit/account_permit_generator.rb +37 -0
  75. data/lib/generators/cantango/account_permit/templates/account_permit.erb +23 -0
  76. data/lib/generators/cantango/base.rb +71 -0
  77. data/lib/generators/cantango/basic.rb +41 -0
  78. data/lib/generators/cantango/license/license_generator.rb +29 -0
  79. data/lib/generators/cantango/license/templates/license.erb +10 -0
  80. data/lib/generators/cantango/license_base.rb +15 -0
  81. data/lib/generators/cantango/licenses/licenses_generator.rb +26 -0
  82. data/lib/generators/cantango/permit_generator.rb +58 -0
  83. data/lib/generators/cantango/role_permit/role_permit_generator.rb +39 -0
  84. data/lib/generators/cantango/role_permit/templates/account_permit.erb +4 -0
  85. data/lib/generators/cantango/role_permit/templates/role_group_permit.erb +24 -0
  86. data/lib/generators/cantango/role_permit/templates/role_permit.erb +23 -0
  87. data/lib/generators/cantango/role_permits/role_permits_generator.rb +45 -0
  88. data/lib/generators/cantango/user_permit/templates/account_permit.erb +5 -0
  89. data/lib/generators/cantango/user_permit/templates/user_permit.erb +23 -0
  90. data/lib/generators/cantango/user_permit/user_permit_generator.rb +36 -0
  91. data/lib/tasks/permits_tasks.rake +4 -0
  92. data/spec/cantango/ability/helper/permits_spec.rb +14 -0
  93. data/spec/cantango/builder/permit/account_type_spec.rb +25 -0
  94. data/spec/cantango/builder/permit/base_spec.rb +30 -0
  95. data/spec/cantango/builder/permit/special_spec.rb +25 -0
  96. data/spec/cantango/builder/permit/user_type_spec.rb +27 -0
  97. data/spec/cantango/config/engines/permit_spec.rb +14 -0
  98. data/spec/cantango/config/engines_spec.rb +142 -0
  99. data/spec/cantango/config/permit_registry_ex.rb +9 -0
  100. data/spec/cantango/config/permit_registry_spec.rb +8 -0
  101. data/spec/cantango/config/permits/accounts_spec.rb +23 -0
  102. data/spec/cantango/config/permits/disabling_spec.rb +38 -0
  103. data/spec/cantango/config/permits/enabling_spec.rb +19 -0
  104. data/spec/cantango/config/permits/execution_spec.rb +27 -0
  105. data/spec/cantango/config/permits/registration_spec.rb +15 -0
  106. data/spec/cantango/config/permits/tracking_spec.rb +19 -0
  107. data/spec/cantango/config/permits/types_spec.rb +27 -0
  108. data/spec/cantango/config/permits_spec.rb +76 -0
  109. data/spec/cantango/engine/permit_cached_spec.rb +52 -0
  110. data/spec/cantango/engine/permit_spec.rb +58 -0
  111. data/spec/cantango/engine/permit_static_dynamic_spec.rb +65 -0
  112. data/spec/cantango/executor/custom_permit_spec.rb +65 -0
  113. data/spec/cantango/executor/more_permit_spec.rb +45 -0
  114. data/spec/cantango/executor/permit_base_spec.rb +46 -0
  115. data/spec/cantango/executor/permit_spec.rb +53 -0
  116. data/spec/cantango/executor/special_permit_spec.rb +36 -0
  117. data/spec/cantango/factory/permits_spec.rb +70 -0
  118. data/spec/cantango/finder/account_permit_spec.rb +30 -0
  119. data/spec/cantango/finder/permit_spec.rb +23 -0
  120. data/spec/cantango/license/save_license_spec.rb +24 -0
  121. data/spec/cantango/license_spec.rb +0 -0
  122. data/spec/cantango/loader/categories_spec.rb +47 -0
  123. data/spec/cantango/loader/license_spec.rb +7 -0
  124. data/spec/cantango/macros/permit_spec.rb +38 -0
  125. data/spec/cantango/parser/categories_spec.rb +19 -0
  126. data/spec/cantango/permit/account_type_spec.rb +34 -0
  127. data/spec/cantango/permit/attribute_permit_spec.rb +65 -0
  128. data/spec/cantango/permit/base_spec.rb +106 -0
  129. data/spec/cantango/permit/class_methods_spec.rb +34 -0
  130. data/spec/cantango/permit/helper/execution_spec.rb +54 -0
  131. data/spec/cantango/permit/helper/host_spec.rb +29 -0
  132. data/spec/cantango/permit/helper/license_spec.rb +37 -0
  133. data/spec/cantango/permit/helper/naming_spec.rb +56 -0
  134. data/spec/cantango/permit/helper/state_spec.rb +24 -0
  135. data/spec/cantango/permit/special_default_spec.rb +2 -0
  136. data/spec/cantango/permit/special_first_spec.rb +2 -0
  137. data/spec/cantango/permit/user_type_spec.rb +78 -0
  138. data/spec/cantango/registry/permit_spec.rb +67 -0
  139. data/spec/fixtures/config/cantango_permissions.yml +49 -0
  140. data/spec/fixtures/config/categories.yml +6 -0
  141. data/spec/fixtures/config/evaluator_fixtures.yml +18 -0
  142. data/spec/fixtures/config/licenses.yml +4 -0
  143. data/spec/fixtures/config/permissions.yml +60 -0
  144. data/spec/fixtures/config/role_group.yml +4 -0
  145. data/spec/fixtures/config/roles.yml +4 -0
  146. data/spec/fixtures/config/test_permissions.yml +55 -0
  147. data/spec/fixtures/config/user_permissions.yml +8 -0
  148. data/spec/fixtures/models.rb +15 -0
  149. data/spec/fixtures/models/admin.rb +2 -0
  150. data/spec/fixtures/models/admin_account.rb +22 -0
  151. data/spec/fixtures/models/items.rb +11 -0
  152. data/spec/fixtures/models/permission.rb +12 -0
  153. data/spec/fixtures/models/simple_roles.rb +49 -0
  154. data/spec/fixtures/models/user.rb +52 -0
  155. data/spec/fixtures/models/user_account.rb +21 -0
  156. data/spec/fixtures/tango_fixtures.rb +29 -0
  157. data/spec/generators/cantango/account_role_permit_generator_spec.rb +35 -0
  158. data/spec/generators/cantango/account_role_permits_generator_spec.rb +59 -0
  159. data/spec/generators/cantango/license_generator_spec.rb +33 -0
  160. data/spec/generators/cantango/licenses_generator_spec.rb +58 -0
  161. data/spec/generators/cantango/role_permit_generator_spec.rb +35 -0
  162. data/spec/generators/cantango/role_permits_generator_spec.rb +58 -0
  163. data/spec/helpers/current_user_accounts.rb +20 -0
  164. data/spec/helpers/current_users.rb +10 -0
  165. data/spec/spec_helper.rb +24 -0
  166. 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,11 @@
1
+ module CanTango
2
+ module Permit
3
+ module Helper
4
+ def self.modules
5
+ [:State, :Execution, :License, :Naming, :Host]
6
+ end
7
+
8
+ sweetload *modules
9
+ end
10
+ end
11
+ end
@@ -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,13 @@
1
+ module CanTango::Permit
2
+ module Helper
3
+ module Host
4
+ def local_host?
5
+ CanTango.config.localhosts.registered.include? request.host
6
+ end
7
+
8
+ def public_host?
9
+ !local_host?
10
+ end
11
+ end
12
+ end
13
+ 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,17 @@
1
+ module CanTango
2
+ module Permit
3
+ class Special < Base
4
+ def initialize ability
5
+ super
6
+ end
7
+
8
+ def self.hash_key
9
+ nil
10
+ end
11
+
12
+ def valid?
13
+ true
14
+ end
15
+ end
16
+ end
17
+ 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,7 @@
1
+ module CanTango
2
+ sweet_scope :ns => {:CanTango => 'cantango/permits_ext'} do
3
+ sweetload :Ability, :Registry, :Config, :Builder, :Factory
4
+ sweetload :Finder, :Engine, :Macros, :Parser, :Loader
5
+ sweetload :ClassMethods
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module CanTango
2
+ module Ability
3
+ sweet_scope :ns => {:CanTango => 'cantango/permits_ext'} do
4
+ sweetload :Helper
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module CanTango
2
+ module Ability
3
+ module Helper
4
+ sweet_scope :ns => {:CanTango => 'cantango/permits_ext'} do
5
+ sweetload :Permits
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ module CanTango::Ability::Helper
2
+ module Permits
3
+ def permits?
4
+ CanTango.config.permits.on?
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,7 @@
1
+ module CanTango
2
+ module Builder
3
+ sweet_scope :ns => {:CanTango => 'cantango/permits_ext'} do
4
+ sweetload :Permit
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module CanTango
2
+ module Builder
3
+ module Permit
4
+ sweet_scope :ns => {:CanTango => 'cantango/permits_ext'} do
5
+ sweetload :Base, :UserType, :AccountType
6
+ end
7
+ end
8
+ end
9
+ 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