cantango 0.8.0 → 0.8.5.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 (270) hide show
  1. data/Gemfile +32 -19
  2. data/README.textile +79 -131
  3. data/VERSION +1 -1
  4. data/cantango.gemspec +94 -61
  5. data/lib/cantango.rb +4 -6
  6. data/lib/cantango/ability.rb +28 -17
  7. data/lib/cantango/ability/cache.rb +30 -60
  8. data/lib/cantango/ability/cache/base_cache.rb +1 -1
  9. data/lib/cantango/ability/cache/key.rb +39 -0
  10. data/lib/cantango/ability/cache/kompiler.rb +22 -6
  11. data/lib/cantango/ability/cache/moneta_cache.rb +1 -1
  12. data/lib/cantango/ability/cache/reader.rb +32 -0
  13. data/lib/cantango/ability/cache/rules_cache.rb +31 -0
  14. data/lib/cantango/ability/cache/session_cache.rb +3 -2
  15. data/lib/cantango/ability/cache/writer.rb +42 -0
  16. data/lib/cantango/ability/cache_helpers.rb +28 -0
  17. data/lib/cantango/ability/masquerade_helpers.rb +7 -2
  18. data/lib/cantango/ability/permission_helpers.rb +0 -8
  19. data/lib/cantango/ability/permit_helpers.rb +0 -17
  20. data/lib/cantango/ability/role_helpers.rb +0 -2
  21. data/lib/cantango/ability/user_helpers.rb +1 -0
  22. data/lib/cantango/adapter/compiler.rb +9 -0
  23. data/lib/cantango/adapter/moneta.rb +23 -0
  24. data/lib/cantango/api.rb +1 -1
  25. data/lib/cantango/api/aliases.rb +4 -8
  26. data/lib/cantango/api/attributes.rb +17 -0
  27. data/lib/cantango/api/common.rb +6 -0
  28. data/lib/cantango/api/options.rb +9 -5
  29. data/lib/cantango/cache.rb +1 -1
  30. data/lib/cantango/cache/hash_cache.rb +34 -0
  31. data/lib/cantango/configuration.rb +13 -8
  32. data/lib/cantango/configuration/adapters.rb +25 -0
  33. data/lib/cantango/configuration/categories.rb +3 -1
  34. data/lib/cantango/configuration/engines.rb +83 -11
  35. data/lib/cantango/configuration/engines/cache.rb +12 -1
  36. data/lib/cantango/configuration/engines/engine.rb +5 -5
  37. data/lib/cantango/configuration/engines/permission.rb +1 -1
  38. data/lib/cantango/configuration/permit_registry.rb +17 -0
  39. data/lib/cantango/configuration/permits.rb +29 -0
  40. data/lib/cantango/configuration/registry.rb +5 -2
  41. data/lib/cantango/configuration/role_groups.rb +3 -0
  42. data/lib/cantango/configuration/role_registry.rb +4 -0
  43. data/lib/cantango/configuration/roles.rb +2 -0
  44. data/lib/cantango/configuration/user_accounts.rb +1 -0
  45. data/lib/cantango/configuration/users.rb +1 -0
  46. data/lib/cantango/engine.rb +13 -0
  47. data/lib/cantango/filters.rb +5 -0
  48. data/lib/cantango/filters/filter.rb +34 -0
  49. data/lib/cantango/filters/role_filter.rb +29 -0
  50. data/lib/cantango/filters/role_group_filter.rb +28 -0
  51. data/lib/cantango/permission_engine.rb +26 -1
  52. data/lib/cantango/permission_engine/collector.rb +7 -2
  53. data/lib/cantango/permission_engine/compiler.rb +8 -1
  54. data/lib/cantango/permission_engine/evaluator.rb +2 -2
  55. data/lib/cantango/permission_engine/factory.rb +8 -12
  56. data/lib/cantango/permission_engine/loader.rb +1 -1
  57. data/lib/cantango/permission_engine/loader/base.rb +1 -1
  58. data/lib/cantango/permission_engine/loader/categories.rb +3 -3
  59. data/lib/cantango/permission_engine/loader/permissions.rb +8 -5
  60. data/lib/cantango/permission_engine/moneta_store.rb +2 -2
  61. data/lib/cantango/permission_engine/parser.rb +1 -1
  62. data/lib/cantango/permission_engine/parser/categories.rb +1 -1
  63. data/lib/cantango/permission_engine/parser/category.rb +1 -1
  64. data/lib/cantango/permission_engine/parser/default.rb +1 -2
  65. data/lib/cantango/permission_engine/parser/ownership.rb +1 -1
  66. data/lib/cantango/permission_engine/parser/permissions.rb +1 -1
  67. data/lib/cantango/permission_engine/parser/regex.rb +2 -2
  68. data/lib/cantango/permission_engine/parser/relationship.rb +1 -1
  69. data/lib/cantango/permission_engine/parser/rule.rb +1 -1
  70. data/lib/cantango/permission_engine/permission.rb +2 -2
  71. data/lib/cantango/permission_engine/selector.rb +3 -3
  72. data/lib/cantango/permission_engine/selector/account_types.rb +24 -0
  73. data/lib/cantango/permission_engine/selector/base.rb +3 -3
  74. data/lib/cantango/permission_engine/selector/licenses.rb +2 -2
  75. data/lib/cantango/permission_engine/selector/role_groups.rb +7 -6
  76. data/lib/cantango/permission_engine/selector/roles.rb +10 -6
  77. data/lib/cantango/permission_engine/selector/user_types.rb +23 -0
  78. data/lib/cantango/permission_engine/selector/users.rb +2 -2
  79. data/lib/cantango/permission_engine/statement.rb +10 -9
  80. data/lib/cantango/permission_engine/statements.rb +27 -25
  81. data/lib/cantango/permission_engine/store.rb +1 -1
  82. data/lib/cantango/permission_engine/yaml_store.rb +2 -2
  83. data/lib/cantango/permit_engine.rb +29 -4
  84. data/lib/cantango/permit_engine/builder.rb +2 -3
  85. data/lib/cantango/permit_engine/builder/base.rb +9 -1
  86. data/lib/cantango/permit_engine/builder/special_permits.rb +7 -8
  87. data/lib/cantango/permit_engine/compatibility.rb +1 -1
  88. data/lib/cantango/permit_engine/executor.rb +1 -1
  89. data/lib/cantango/permit_engine/executor/abstract.rb +1 -1
  90. data/lib/cantango/permit_engine/executor/base.rb +1 -1
  91. data/lib/cantango/permit_engine/executor/system.rb +1 -1
  92. data/lib/cantango/permit_engine/factory.rb +2 -7
  93. data/lib/cantango/permit_engine/finder.rb +43 -9
  94. data/lib/cantango/permit_engine/role_matcher.rb +1 -1
  95. data/lib/cantango/permit_engine/util.rb +2 -1
  96. data/lib/cantango/permits.rb +9 -0
  97. data/lib/cantango/{permit_engine → permits}/account_permit.rb +15 -4
  98. data/lib/cantango/{permit_engine → permits}/account_permit/builder.rb +2 -6
  99. data/lib/cantango/{permit_engine → permits}/account_permit/finder.rb +2 -2
  100. data/lib/cantango/{permit_engine → permits}/license.rb +1 -1
  101. data/lib/cantango/{permit_engine → permits}/license/loader.rb +1 -1
  102. data/lib/cantango/{permit_engine → permits}/license/rules.rb +1 -1
  103. data/lib/cantango/permits/macros.rb +19 -0
  104. data/lib/cantango/{permit_engine → permits}/permit.rb +13 -1
  105. data/lib/cantango/{permit_engine → permits}/role_group_permit.rb +15 -3
  106. data/lib/cantango/{permit_engine → permits}/role_group_permit/builder.rb +10 -22
  107. data/lib/cantango/{permit_engine → permits}/role_group_permit/finder.rb +2 -2
  108. data/lib/cantango/{permit_engine → permits}/role_permit.rb +15 -3
  109. data/lib/cantango/permits/role_permit/builder.rb +27 -0
  110. data/lib/cantango/{permit_engine → permits}/role_permit/finder.rb +2 -2
  111. data/lib/cantango/{permit_engine → permits}/user_permit.rb +15 -3
  112. data/lib/cantango/{permit_engine → permits}/user_permit/builder.rb +2 -6
  113. data/lib/cantango/{permit_engine → permits}/user_permit/finder.rb +2 -2
  114. data/lib/cantango/rails.rb +3 -1
  115. data/lib/cantango/rails/engine.rb +11 -6
  116. data/lib/cantango/rails/helpers/base_helper.rb +28 -0
  117. data/lib/cantango/rails/helpers/controller_helper.rb +17 -0
  118. data/lib/cantango/rails/helpers/rest_helper.rb +44 -0
  119. data/lib/cantango/rails/helpers/view_helper.rb +17 -0
  120. data/lib/cantango/rails/railtie.rb +1 -1
  121. data/lib/cantango/rspec/config.rb +1 -1
  122. data/lib/cantango/rspec/matchers/be_allowed_to.rb +5 -3
  123. data/lib/cantango/rules/user_relation.rb +1 -1
  124. data/lib/cantango/users/macros.rb +8 -2
  125. data/lib/cantango/users/user.rb +1 -1
  126. data/lib/generators/cantango/account_permit/account_permit_generator.rb +37 -0
  127. data/lib/generators/cantango/account_permit/templates/account_permit.erb +13 -0
  128. data/lib/generators/cantango/base.rb +15 -18
  129. data/lib/generators/cantango/basic.rb +41 -0
  130. data/lib/generators/cantango/install/install_generator.rb +37 -0
  131. data/lib/generators/cantango/install/templates/cantango.rb +4 -0
  132. data/{spec/active_record/scenarios/user_accounts/config/account_permits.yml → lib/generators/cantango/install/templates/categories.yml} +0 -0
  133. data/lib/generators/cantango/install/templates/permissions.yml +4 -0
  134. data/lib/generators/cantango/license/license_generator.rb +6 -11
  135. data/lib/generators/cantango/license/templates/license.erb +1 -1
  136. data/lib/generators/cantango/license_base.rb +2 -2
  137. data/lib/generators/cantango/licenses/licenses_generator.rb +2 -7
  138. data/lib/generators/cantango/permit_generator.rb +31 -10
  139. data/lib/generators/cantango/role_permit/role_permit_generator.rb +11 -14
  140. data/lib/generators/cantango/role_permit/templates/account_permit.erb +2 -2
  141. data/lib/generators/cantango/role_permit/templates/role_group_permit.erb +2 -2
  142. data/lib/generators/cantango/role_permit/templates/role_permit.erb +2 -2
  143. data/lib/generators/cantango/role_permits/role_permits_generator.rb +16 -98
  144. data/lib/generators/cantango/user_permit/templates/account_permit.erb +5 -0
  145. data/lib/generators/cantango/user_permit/templates/user_permit.erb +13 -0
  146. data/lib/generators/cantango/user_permit/user_permit_generator.rb +36 -0
  147. data/spec/TODO +1 -6
  148. data/spec/active_record/helper/permits_config.rb +1 -1
  149. data/spec/active_record/scenarios/engines/permission_engine/{cantango_permissions.yml → permissions.yml} +2 -1
  150. data/spec/active_record/scenarios/engines/permission_engine/tango_permission_yml_spec.rb +8 -9
  151. data/spec/active_record/scenarios/engines/permit_engine/licenses_spec.rb +2 -2
  152. data/spec/active_record/scenarios/engines/permit_engine/role_groups_permits_spec.rb +2 -2
  153. data/spec/active_record/scenarios/shared/{can_tango.rb → cantango.rb} +1 -1
  154. data/spec/active_record/scenarios/shared/models/items.rb +0 -1
  155. data/spec/active_record/scenarios/shared/models/users.rb +6 -1
  156. data/spec/active_record/spec_helper.rb +6 -4
  157. data/spec/cantango/ability/cache/key_spec.rb +64 -0
  158. data/spec/cantango/ability/cache/{compiler_spec.rb → kompiler_spec.rb} +9 -21
  159. data/spec/cantango/ability/cache/reader_compile_spec.rb +42 -0
  160. data/spec/cantango/ability/cache/reader_spec.rb +33 -0
  161. data/spec/cantango/ability/cache/rules_cache_spec.rb +15 -0
  162. data/spec/cantango/ability/cache/session_cache_spec.rb +1 -1
  163. data/spec/cantango/ability/cache/writer_spec.rb +21 -0
  164. data/spec/cantango/ability/cache_spec.rb +6 -2
  165. data/spec/cantango/ability_filters_spec.rb +5 -10
  166. data/spec/cantango/ability_spec.rb +2 -3
  167. data/spec/cantango/api/attributes_spec.rb +27 -0
  168. data/spec/cantango/api/user/can_api_spec.rb +2 -2
  169. data/spec/cantango/api/user_account/can_api_spec.rb +2 -2
  170. data/spec/cantango/configuration/adapter_spec.rb +28 -0
  171. data/spec/cantango/configuration/engines/cache_spec.rb +2 -2
  172. data/spec/cantango/configuration/engines/permission_spec.rb +3 -3
  173. data/spec/cantango/configuration/engines/permit_spec.rb +1 -1
  174. data/spec/cantango/configuration/engines/store_shared.rb +3 -1
  175. data/spec/cantango/configuration/engines_spec.rb +106 -3
  176. data/spec/cantango/configuration/hash_registry_spec.rb +1 -1
  177. data/spec/cantango/configuration/permit_registry_spec.rb +14 -0
  178. data/spec/cantango/configuration/permits_spec.rb +25 -0
  179. data/spec/cantango/configuration/registry_spec.rb +1 -1
  180. data/spec/cantango/configuration/shared/registry_ex.rb +2 -1
  181. data/spec/cantango/configuration_spec.rb +5 -5
  182. data/spec/cantango/permission_engine/compiler_spec.rb +8 -0
  183. data/spec/cantango/permission_engine/permission_spec.rb +1 -1
  184. data/spec/cantango/permission_engine/yaml_store_spec.rb +14 -4
  185. data/spec/cantango/permission_engine_spec.rb +0 -0
  186. data/spec/cantango/permit_engine/account_permit_spec.rb +2 -4
  187. data/spec/cantango/permit_engine/builder/role_group_permits_spec.rb +4 -7
  188. data/spec/cantango/permit_engine/builder/role_permits_spec.rb +5 -6
  189. data/spec/cantango/permit_engine/builder/special_permits_spec.rb +3 -4
  190. data/spec/cantango/permit_engine/executor/system_spec.rb +2 -2
  191. data/spec/cantango/permit_engine/factory_spec.rb +2 -3
  192. data/spec/cantango/permit_engine/finder_spec.rb +144 -23
  193. data/spec/cantango/permit_engine/permit/permit_static_and_dynamic_rules_spec.rb +4 -5
  194. data/spec/cantango/permit_engine/role_group_permit_spec.rb +1 -1
  195. data/spec/cantango/permit_engine/role_permit_spec.rb +6 -7
  196. data/spec/cantango/permit_engine/user_permit_spec.rb +2 -3
  197. data/spec/cantango/permit_engine_spec.rb +2 -0
  198. data/spec/cantango/permits/macros_spec.rb +41 -0
  199. data/spec/cantango/permits/permit_spec.rb +46 -0
  200. data/spec/cantango_spec.rb +13 -0
  201. data/spec/devise-dummy/app/helpers/application_helper.rb +7 -0
  202. data/spec/devise-dummy/app/views/articles/admin.html.haml +1 -1
  203. data/spec/devise-dummy/app/views/articles/admin_account.html.haml +1 -1
  204. data/spec/devise-dummy/app/views/articles/guest.html.haml +1 -1
  205. data/spec/devise-dummy/app/views/articles/index.html.haml +1 -1
  206. data/spec/devise-dummy/app/views/comments/guest.html.haml +1 -1
  207. data/spec/devise-dummy/app/views/comments/index.html.haml +1 -1
  208. data/spec/devise-dummy/app/views/concertos/admin.html.haml +1 -1
  209. data/spec/devise-dummy/app/views/concertos/admin_account.html.haml +1 -1
  210. data/spec/devise-dummy/app/views/concertos/guest.html.haml +1 -1
  211. data/spec/devise-dummy/app/views/concertos/index.html.haml +1 -1
  212. data/spec/devise-dummy/app/views/users/index.html.haml +1 -1
  213. data/spec/devise-dummy/config/initializers/cantango.rb +3 -3
  214. data/spec/devise-dummy/config/{cantango_permissions.yml → permissions.yml} +2 -1
  215. data/spec/devise-integration/concerto_spec.rb +1 -1
  216. data/spec/dummy/app/models/user.rb +1 -0
  217. data/spec/dummy/app/views/articles/admin.html.haml +1 -1
  218. data/spec/dummy/app/views/articles/admin_account.html.haml +1 -1
  219. data/spec/dummy/app/views/articles/guest.html.haml +1 -1
  220. data/spec/dummy/app/views/articles/index.html.haml +1 -1
  221. data/spec/dummy/app/views/comments/guest.html.haml +1 -1
  222. data/spec/dummy/app/views/comments/index.html.haml +1 -1
  223. data/spec/dummy/app/views/concertos/admin.html.haml +1 -1
  224. data/spec/dummy/app/views/concertos/admin_account.html.haml +1 -1
  225. data/spec/dummy/app/views/concertos/guest.html.haml +1 -1
  226. data/spec/dummy/app/views/concertos/index.html.haml +1 -1
  227. data/spec/dummy/app/views/posts/admin.html.haml +1 -1
  228. data/spec/dummy/app/views/posts/admin_account.html.haml +1 -1
  229. data/spec/dummy/app/views/posts/guest.html.haml +1 -1
  230. data/spec/dummy/app/views/posts/index.html.haml +1 -1
  231. data/spec/dummy/app/views/users/admin.html.haml +1 -1
  232. data/spec/dummy/app/views/users/admin_account.html.haml +1 -1
  233. data/spec/dummy/app/views/users/guest.html.haml +1 -1
  234. data/spec/dummy/app/views/users/index.html.haml +1 -1
  235. data/spec/dummy/config/application.rb +1 -0
  236. data/spec/dummy/config/initializers/cantango.rb +1 -3
  237. data/spec/dummy/config/{cantango_permissions.yml → permissions.yml} +2 -2
  238. data/spec/dummy_spec_helper.rb +2 -0
  239. data/spec/entire_suite_spec.rb +2 -0
  240. data/spec/factories/user.rb +8 -0
  241. data/spec/factories/user_account.rb +6 -0
  242. data/spec/fixtures/config/permissions.yml +60 -19
  243. data/spec/fixtures/models/admin.rb +2 -0
  244. data/spec/fixtures/models/admin_account.rb +22 -0
  245. data/spec/fixtures/models/simple_roles.rb +5 -0
  246. data/spec/fixtures/models/user.rb +4 -0
  247. data/spec/helpers/dummy_app_ability.rb +2 -5
  248. data/spec/integration/cache_using_moneta_spec.rb +3 -1
  249. data/spec/integration/cache_using_session_spec.rb +2 -2
  250. data/spec/integration/user/articles_spec.rb +1 -1
  251. data/spec/integration/user/concerto_spec.rb +1 -1
  252. data/spec/spec_helper.rb +5 -5
  253. metadata +120 -95
  254. data/lib/cantango/ability/class_methods.rb +0 -27
  255. data/lib/cantango/api/aliases/account_permit.rb +0 -8
  256. data/lib/cantango/api/aliases/license.rb +0 -7
  257. data/lib/cantango/api/aliases/permit.rb +0 -9
  258. data/lib/cantango/api/aliases/role_group_permit.rb +0 -7
  259. data/lib/cantango/api/aliases/role_permit.rb +0 -7
  260. data/lib/cantango/api/aliases/user_permit.rb +0 -8
  261. data/lib/cantango/permission_engine/builder.rb +0 -6
  262. data/lib/cantango/permit_engine/role_permit/builder.rb +0 -46
  263. data/lib/cantango/rails/base_helpers.rb +0 -26
  264. data/lib/cantango/rails/controller_helpers.rb +0 -15
  265. data/lib/cantango/rails/view_helpers.rb +0 -15
  266. data/spec/active_record/scenarios/shared/permits/PERMITS README.textile +0 -3
  267. data/spec/active_record/scenarios/user_accounts/docs/USER_ACCOUNTS_SCENARIO.textile +0 -20
  268. data/spec/active_record/scenarios/user_accounts/docs/basic_rules_spec_possible_samples.txt +0 -84
  269. data/spec/factories.rb +0 -8
  270. data/spec/fixtures/config/cantango_permissions.yml +0 -48
@@ -6,9 +6,20 @@ module CanTango
6
6
  class Cache < Engine
7
7
  include Singleton
8
8
 
9
+ def compile state
10
+ raise "Must be set to :on or :off" if ![:on, :off].include? state
11
+ @compile = state
12
+ end
13
+
14
+ def compile?
15
+ @compile ||= :on
16
+ @compile == :on
17
+ end
18
+
9
19
  def store &block
10
20
  @store ||= ns::Store.new
11
- @store.default_class ||= CanTango::Ability::Cache::MonetaCache
21
+ # CanTango::Ability::Cache::MonetaCache
22
+ @store.default_class ||= CanTango::Ability::Cache::SessionCache
12
23
  yield @store if block
13
24
  @store
14
25
  end
@@ -7,18 +7,18 @@ module CanTango
7
7
  @state = state || :on
8
8
  end
9
9
 
10
- def reset!
10
+ def reset!
11
11
  @state = nil
12
12
  end
13
13
 
14
- def on?
14
+ def on?
15
15
  @state == :on
16
16
  end
17
-
18
- def off?
17
+
18
+ def off?
19
19
  !on?
20
20
  end
21
-
21
+
22
22
  protected
23
23
 
24
24
  def ns
@@ -14,7 +14,7 @@ module CanTango
14
14
  end
15
15
 
16
16
  def types
17
- [:roles, :role_groups, :licenses, :users]
17
+ [:roles, :role_groups, :licenses, :users, :user_types, :account_types]
18
18
  end
19
19
 
20
20
  attr_reader :config_path
@@ -0,0 +1,17 @@
1
+ module CanTango
2
+ class Configuration
3
+ class PermitRegistry
4
+ [:user, :account, :role, :role_group].each do |permit|
5
+ class_eval %{
6
+ def #{permit}
7
+ @#{permit} ||= HashRegistry.new
8
+ end
9
+ }
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+
16
+
17
+
@@ -0,0 +1,29 @@
1
+ module CanTango
2
+ class Configuration
3
+ class Permits < PermitRegistry
4
+ include Singleton
5
+
6
+ attr_reader :accounts
7
+ # CanTango.config.permits.accounts[:admin].role => {}
8
+
9
+ def accounts
10
+ @accounts ||= Hash.new
11
+ end
12
+
13
+ def account_hash name
14
+ accounts[name]
15
+ end
16
+
17
+ def method_missing method_name, *args
18
+ accounts[method_name] ||= PermitRegistry.new
19
+ end
20
+
21
+ def register_permit_class(permit_name, permit_clazz, permit_type, account_name)
22
+ registry = account_name ? self.send(account_name.to_sym) : self
23
+ registry.send(permit_type)[permit_name] = permit_clazz
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+
@@ -4,11 +4,10 @@ require 'sugar-high/kind_of'
4
4
  module CanTango
5
5
  class Configuration
6
6
  class Registry
7
+
7
8
  attr_writer :default
8
9
  attr_accessor :registered
9
10
 
10
- include Singleton
11
-
12
11
  def types= *types
13
12
  @types = types.select {|t| t.is_a? Class }
14
13
  end
@@ -43,6 +42,10 @@ module CanTango
43
42
  @registered ||= default
44
43
  end
45
44
 
45
+ def registered? label
46
+ registered.map(&:to_s).include? label.to_s
47
+ end
48
+
46
49
  def default
47
50
  @default ||= []
48
51
  end
@@ -1,6 +1,9 @@
1
1
  module CanTango
2
2
  class Configuration
3
3
  class RoleGroups < RoleRegistry
4
+
5
+ include Singleton
6
+
4
7
  def default_has_method
5
8
  :in_role_group?
6
9
  end
@@ -32,6 +32,10 @@ module CanTango
32
32
  @excluded = names.select_labels
33
33
  end
34
34
 
35
+ def filter?
36
+ !(excluded + onlies).empty?
37
+ end
38
+
35
39
  def clear!
36
40
  super
37
41
  @excluded = []
@@ -1,6 +1,8 @@
1
1
  module CanTango
2
2
  class Configuration
3
3
  class Roles < RoleRegistry
4
+ include Singleton
5
+
4
6
  def default_has_method
5
7
  :has_role?
6
8
  end
@@ -1,6 +1,7 @@
1
1
  module CanTango
2
2
  class Configuration
3
3
  class UserAccounts < Registry
4
+ include Singleton
4
5
  end
5
6
  end
6
7
  end
@@ -1,6 +1,7 @@
1
1
  module CanTango
2
2
  class Configuration
3
3
  class Users < Registry
4
+ include Singleton
4
5
  end
5
6
  end
6
7
  end
@@ -0,0 +1,13 @@
1
+ module CanTango
2
+ class Engine
3
+ attr_reader :ability
4
+
5
+ def initialize ability
6
+ @ability = ability
7
+ end
8
+
9
+ def execute!
10
+ # raise NotImplementedError
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ module CanTango
2
+ module Filters
3
+ autoload_modules :Filter, :RoleFilter, :RoleGroupFilter
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ module CanTango
2
+ module Filters
3
+ class Filter
4
+ attr_reader :item, :include_list
5
+
6
+ def initialize item, list = nil
7
+ @item = item.to_sym
8
+ @include_list = list || []
9
+ end
10
+
11
+ def valid?
12
+ return false if !in_include_list?
13
+ return false if not_only?
14
+ !excluded?
15
+ end
16
+
17
+ def in_include_list?
18
+ return true if include_list.empty?
19
+ include_list.include? item
20
+ end
21
+
22
+ def not_only?
23
+ false
24
+ end
25
+
26
+ def excluded?
27
+ false
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+
34
+
@@ -0,0 +1,29 @@
1
+ module CanTango
2
+ module Filters
3
+ class RoleFilter < Filter
4
+ alias_method :role, :item
5
+
6
+ def initialize role, roles = nil
7
+ super
8
+ end
9
+
10
+ def not_only?
11
+ !only_roles.empty? && !only_roles.include?(role)
12
+ end
13
+
14
+ def excluded?
15
+ !excluded_roles.empty? && excluded_roles.include?(role)
16
+ end
17
+
18
+ def only_roles
19
+ CanTango.config.roles.onlies
20
+ end
21
+
22
+ def excluded_roles
23
+ CanTango.config.roles.excluded
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+
@@ -0,0 +1,28 @@
1
+ module CanTango
2
+ module Filters
3
+ class RoleGroupFilter < Filter
4
+ alias_method :role_group, :item
5
+
6
+ def initialize role_group, role_groups = nil
7
+ super
8
+ end
9
+
10
+ def not_only?
11
+ !only_role_groups.empty? && !only_role_groups.include?(role_group)
12
+ end
13
+
14
+ def excluded?
15
+ !excluded_role_groups.empty? && excluded_role_groups.include?(role_group)
16
+ end
17
+
18
+ def only_role_groups
19
+ CanTango.config.role_groups.onlies
20
+ end
21
+
22
+ def excluded_role_groups
23
+ CanTango.config.role_groups.excluded
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -1,7 +1,32 @@
1
1
  module CanTango
2
- module PermissionEngine
2
+ class PermissionEngine < Engine
3
3
  autoload_modules :Collector, :Compiler, :Evaluator, :Selector
4
4
  autoload_modules :Factory, :Loader, :Parser, :Permission
5
5
  autoload_modules :RulesParser, :Store, :YamlStore, :Statements, :Statement
6
+
7
+ def initialize ability
8
+ super
9
+ end
10
+
11
+ def execute!
12
+ puts "permissions"
13
+ permissions.each do |permission|
14
+ permission.evaluate! user
15
+ end
16
+ end
17
+
18
+ def permissions
19
+ permission_factory.build!
20
+ end
21
+
22
+ protected
23
+
24
+ def user
25
+ ability.user
26
+ end
27
+
28
+ def permission_factory
29
+ @permission_factory ||= CanTango::PermissionEngine::Factory.new ability
30
+ end
6
31
  end
7
32
  end
@@ -1,5 +1,5 @@
1
1
  module CanTango
2
- module PermissionEngine
2
+ class PermissionEngine < Engine
3
3
  class Collector
4
4
  attr_reader :ability, :permissions, :type
5
5
 
@@ -10,7 +10,7 @@ module CanTango
10
10
  end
11
11
 
12
12
  def build
13
- relevant_rules.inject([]){|evaluators, (name, rules)|
13
+ relevant_rules.inject([]){|evaluators, (name, rules)|
14
14
  evaluators << CanTango::PermissionEngine::Evaluator.new(ability, rules)
15
15
  }
16
16
  end
@@ -35,6 +35,11 @@ module CanTango
35
35
  ability.user
36
36
  end
37
37
 
38
+ def user_account
39
+ ability.user_account
40
+ end
41
+ alias_method :account, :user_account
42
+
38
43
  def user_key_field
39
44
  ability.user_key_field
40
45
  end
@@ -1,5 +1,5 @@
1
1
  module CanTango
2
- module PermissionEngine
2
+ class PermissionEngine < Engine
3
3
  class Compiler
4
4
  attr_reader :permission, :categories
5
5
 
@@ -36,7 +36,14 @@ module CanTango
36
36
  statements(method)
37
37
  end
38
38
 
39
+ # TODO: make cleaner!
40
+ def check_actions method
41
+ permission_actions = permission.static_rules.send(method).keys.to_symbols
42
+ raise "valid actions are: #{valid_actions}" if (permission_actions - valid_actions).size > 0
43
+ end
44
+
39
45
  def statements method
46
+ check_actions method
40
47
  valid_actions.map do |action|
41
48
  statements_string(method, :action => action)
42
49
  end.compact.join("\n")
@@ -1,5 +1,5 @@
1
1
  module CanTango
2
- module PermissionEngine
2
+ class PermissionEngine < Engine
3
3
  class Evaluator
4
4
  attr_reader :ability, :rule
5
5
 
@@ -20,7 +20,7 @@ module CanTango
20
20
  def rules
21
21
  ability.send :rules
22
22
  end
23
-
23
+
24
24
  def user
25
25
  @user
26
26
  end
@@ -1,10 +1,6 @@
1
- require 'sugar-high/class_ext'
2
-
3
1
  module CanTango
4
- module PermissionEngine
2
+ class PermissionEngine < Engine
5
3
  class Factory
6
- include ClassExt
7
-
8
4
  attr_accessor :ability
9
5
 
10
6
  # creates the factory for the ability
@@ -31,29 +27,29 @@ module CanTango
31
27
  end
32
28
 
33
29
  def store
34
- store_class.new :cantango_permissions, store_options
30
+ store_class.new :permissions, store_options
35
31
  end
36
32
 
37
33
  def store_class
38
- permissions_engine.store.default_class
34
+ permission_engine.store.default_class
39
35
  end
40
36
 
41
37
  def store_options
42
- permissions_engine.store.options.merge(:path => config_path)
38
+ permission_engine.store.options.merge(:path => config_path)
43
39
  end
44
40
 
45
41
  def permission_types
46
- permissions_engine.types
42
+ permission_engine.types
47
43
  end
48
44
 
49
45
  def config_path
50
- permissions_engine.config_path
46
+ permission_engine.config_path
51
47
  end
52
48
 
53
49
  private
54
50
 
55
- def permissions_engine
56
- CanTango.config.permissions
51
+ def permission_engine
52
+ CanTango.config.permission_engine
57
53
  end
58
54
  end
59
55
  end