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
@@ -0,0 +1,28 @@
1
+ module CanTango
2
+ class Ability
3
+ module CacheHelpers
4
+
5
+ def cached_rules?
6
+ caching_on? && cache.key.same?(session)
7
+ end
8
+
9
+ def cache_rules!
10
+ cache.cache_rules!
11
+ end
12
+
13
+ def cached_rules
14
+ cache.cached_rules
15
+ end
16
+
17
+ def cache
18
+ @cache ||= Cache.new self
19
+ end
20
+
21
+ protected
22
+
23
+ def caching_on?
24
+ CanTango.config.cache_engine.on?
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,14 +1,19 @@
1
1
  module CanTango
2
2
  class Ability
3
3
  module MasqueradeHelpers
4
+
4
5
  def masquerade_user?
5
6
  return false if masquerading_off?
6
- @candidate.respond_to?(:active_user) && @candidate.masquerading?
7
+ candidate.respond_to?(:active_user) && masquerading?
8
+ end
9
+
10
+ def masquerading?
11
+ candidate.respond_to?(:masquerading?) && candidate.masquerading?
7
12
  end
8
13
 
9
14
  def masquerade_account?
10
15
  return false if masquerading_off?
11
- @candidate.respond_to?(:active_account)
16
+ candidate.respond_to?(:active_account)
12
17
  end
13
18
 
14
19
  def masquerading_off?
@@ -1,16 +1,8 @@
1
1
  module CanTango
2
2
  class Ability
3
3
  module PermissionHelpers
4
- def permissions
5
- permission_factory.build!
6
- end
7
-
8
4
  protected
9
5
 
10
- def permission_factory
11
- @permission_factory ||= CanTango::PermissionEngine::Factory.new self
12
- end
13
-
14
6
  def permissions?
15
7
  config.permissions.on?
16
8
  end
@@ -1,23 +1,6 @@
1
1
  module CanTango
2
2
  class Ability
3
3
  module PermitHelpers
4
- # by default, only execute permits for which the user
5
- # has a role or a role group
6
- # also execute any permit marked as special
7
- def permits
8
- permit_factory.build!
9
- end
10
-
11
- def permit_class_names
12
- @permit_class_names ||= permits.map{|p| p.class.to_s}
13
- end
14
-
15
- protected
16
-
17
- def permit_factory
18
- @permit_factory ||= CanTango::PermitEngine::Factory.new self
19
- end
20
-
21
4
  def permits?
22
5
  config.permits.on?
23
6
  end
@@ -5,7 +5,6 @@ module CanTango
5
5
  include CanTango::Helpers::RoleMethods
6
6
 
7
7
  # return list roles the user has
8
- # TODO: should also fetch roles of all role_groups! (or is this responsibility of roles_list?)
9
8
  def roles
10
9
  raise "#{subject.inspect} should have a #{roles_list_meth} method" if !subject.respond_to?(roles_list_meth)
11
10
  subj_roles = subject.send(roles_list_meth)
@@ -14,7 +13,6 @@ module CanTango
14
13
  end
15
14
 
16
15
  # return list of symbols for role groups the user belongs to
17
- # TODO: use roles filter here? or better in #valid? of selector ?
18
16
  def role_groups
19
17
  raise "#{subject.inspect} should have a #{role_groups_list_meth} method" if !subject.respond_to?(role_groups_list_meth)
20
18
  subj_role_groups = subject.send(role_groups_list_meth)
@@ -10,6 +10,7 @@ module CanTango
10
10
  return subject.active_account if subject.respond_to? :active_account
11
11
  subject
12
12
  end
13
+ alias_method :account, :user_account
13
14
 
14
15
  def user_key_field
15
16
  key_field = config.user.unique_key_field
@@ -0,0 +1,9 @@
1
+ module CanTango
2
+ class Ability
3
+ class Cache
4
+ autoload_modules :Kompiler
5
+ end
6
+ end
7
+ end
8
+
9
+ CanTango.config.adapters.register :compiler
@@ -0,0 +1,23 @@
1
+ require 'moneta'
2
+
3
+ module CanTango
4
+ module Cache
5
+ autoload_modules :MonetaCache
6
+ end
7
+ end
8
+
9
+ module CanTango
10
+ class Ability
11
+ class Cache
12
+ autoload_modules :MonetaCache
13
+ end
14
+ end
15
+ end
16
+
17
+ module CanTango
18
+ class PermissionEngine < Engine
19
+ autoload_modules :MonetaStore
20
+ end
21
+ end
22
+
23
+ CanTango.config.adapters.register :moneta
data/lib/cantango/api.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module CanTango
2
2
  module Api
3
- autoload_modules :User, :UserAccount, :Options, :Common
3
+ autoload_modules :User, :UserAccount, :Options, :Common, :Attributes
4
4
  end
5
5
  end
@@ -1,8 +1,4 @@
1
- $:.unshift File.dirname(__FILE__)
2
- require 'aliases/permit'
3
- require 'aliases/role_permit'
4
- require 'aliases/role_group_permit'
5
- require 'aliases/license'
6
- require 'aliases/user_permit'
7
- require 'aliases/account_permit'
8
-
1
+ ['', :role, :role_group, :user, :account].each do |type|
2
+ eval "CanTango::#{type.to_s.camelize}Permit = CanTango::Permits::#{type.to_s.camelize}Permit"
3
+ end
4
+ CanTango::License = CanTango::Permits::License
@@ -0,0 +1,17 @@
1
+ module CanTango
2
+ module Api
3
+ module Attributes
4
+ [:read, :edit].each do |action|
5
+ define_method :"#{action}_attribute" do |name|
6
+ :"#{action}_attr_\#{name}"
7
+ end
8
+
9
+ define_method :"#{action}_attributes" do |*names|
10
+ names.select_symbols.map { |name| send("#{action}_attribute", name) }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+
@@ -1,9 +1,15 @@
1
1
  module CanTango
2
2
  module Api
3
3
  module Common
4
+ include CanTango::Api::Attributes
5
+
4
6
  def create_ability candidate, opts = {}
5
7
  CanTango.config.ability.factory_build candidate, opts
6
8
  end
9
+
10
+ def category label
11
+ config.models.by_category label
12
+ end
7
13
  end
8
14
  end
9
15
  end
@@ -4,13 +4,17 @@ module CanTango
4
4
 
5
5
  def ability_options
6
6
  opts = {}
7
- opts.merge!(:session => session) if respond_to? :session
8
- opts.merge!(:request => request) if respond_to? :request
9
- opts.merge!(:params => params) if respond_to? :params
10
- opts.merge!(:controller => controller) if respond_to? :controller
11
- # puts "CanTango::Ability options:" << opts.keys.inspect
7
+ options_list.each do |option|
8
+ opts.merge!(option => send(option)) if respond_to? option
9
+ end
12
10
  opts
13
11
  end
12
+
13
+ private
14
+
15
+ def options_list
16
+ [:session, :request, :params, :controller, :domain]
17
+ end
14
18
  end
15
19
  end
16
20
  end
@@ -1,6 +1,6 @@
1
1
  module CanTango
2
2
  module Cache
3
- autoload_modules :MonetaCache
3
+ autoload_modules :HashCache
4
4
  end
5
5
  end
6
6
 
@@ -0,0 +1,34 @@
1
+ module CanTango
2
+ module Cache
3
+ class HashCache
4
+ include Singleton
5
+
6
+ attr_reader :options
7
+
8
+ def configure_with options = {}
9
+ @options ||= options
10
+ end
11
+
12
+ def load! key
13
+ cache[key]
14
+ end
15
+
16
+ def save! key, rules
17
+ cache[key] = rules
18
+ end
19
+
20
+ def delete key
21
+ cache[key].delete if cache[key]
22
+ end
23
+
24
+ def cache
25
+ @cache ||= {}
26
+ end
27
+
28
+ def type
29
+ :memory
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -6,8 +6,8 @@ module CanTango
6
6
  autoload_modules :Categories
7
7
  autoload_modules :Models, :Engines, :Ability
8
8
  autoload_modules :User, :Guest, :UserAccount
9
- autoload_modules :Roles, :RoleGroups, :Registry, :RoleRegistry, :HashRegistry, :Factory
10
- autoload_modules :SpecialPermits, :Autoload
9
+ autoload_modules :Roles, :RoleGroups, :Registry, :RoleRegistry, :HashRegistry, :PermitRegistry, :Factory
10
+ autoload_modules :SpecialPermits, :Autoload, :Adapters, :Permits
11
11
  autoload_modules :Users, :UserAccounts
12
12
 
13
13
  include Singleton
@@ -21,7 +21,7 @@ module CanTango
21
21
  def self.components
22
22
  [
23
23
  :guest, :autoload, :user, :user_account, :models, :roles, :role_groups,
24
- :engines, :users, :user_accounts, :categories
24
+ :engines, :users, :user_accounts, :categories, :adapters, :permits
25
25
  ]
26
26
  end
27
27
 
@@ -35,21 +35,26 @@ module CanTango
35
35
  }
36
36
  end
37
37
 
38
+ # Turn on all engines and enable compile adapter
39
+ # i.e compilation of rules via sourcify
40
+ def enable_defaults!
41
+ engines.all :on
42
+ adapters.use :compiler
43
+ end
44
+
38
45
  def clear!
39
- CanTango::Configuration.components.each do |c|
46
+ CanTango::Configuration.components.each do |c|
40
47
  comp = send(c)
41
48
  comp.send(:clear!) if comp.respond_to? :clear!
42
49
  end
43
50
  engines.clear!
44
51
  end
45
52
 
46
- CanTango::Configuration::Engines.available.each do |engine|
53
+ CanTango.config.engines.default_available.each do |engine|
47
54
  class_eval %{
48
- def #{engine}
55
+ def #{engine}_engine
49
56
  engine(:#{engine})
50
57
  end
51
-
52
- alias_method :#{engine.to_s.pluralize}, :#{engine}
53
58
  }
54
59
  end
55
60
 
@@ -0,0 +1,25 @@
1
+ module CanTango
2
+ class Configuration
3
+ class Adapters < Registry
4
+
5
+ include Singleton
6
+
7
+ def adapter name
8
+ raise "Unknown adapter #{name}" if !available_adapters.include? name.to_sym
9
+ require "cantango/adapter/#{name}"
10
+ end
11
+
12
+ def use *names
13
+ names.each {|name| adapter name }
14
+ end
15
+
16
+ def available_adapters
17
+ [:moneta, :compiler]
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+
24
+
25
+
@@ -1,7 +1,9 @@
1
1
  module CanTango
2
2
  class Configuration
3
3
  class Categories < HashRegistry
4
-
4
+
5
+ include Singleton
6
+
5
7
  def [] label
6
8
  models = super
7
9
  raise "Category '#{label}' either not exists or invalid!" if !models.kind_of?(Array)
@@ -6,18 +6,73 @@ module CanTango
6
6
  autoload_modules :Permission, :Permit, :Cache, :Store, :Engine
7
7
 
8
8
  include Singleton
9
+ include Enumerable
9
10
 
10
- # engines available
11
- def self.available
12
- [:permit, :permission, :cache]
11
+ # engine registry is a simple hash
12
+ def register hash
13
+ hash.each_pair do |name, engine_class|
14
+ raise "Class must implement the CanTango Engine API. You can start by sublclassing CanTango::Engine" if !engine? engine_class
15
+ raise "Name of engine must be a String or Symbol" if !name.kind_of_label?
16
+ registered[name.to_sym] = engine_class
17
+ end
18
+ end
19
+
20
+ # engine factories ?
21
+ # :cache => Cantango::Ability::Cache
22
+ def registered
23
+ @registered ||= default_register
24
+ end
25
+
26
+ def unregister name
27
+ @registered = {} if name == :all
28
+ @registered.delete(name)
29
+ end
30
+
31
+ def default_register
32
+ {:permit => CanTango::PermitEngine, :permission => CanTango::PermissionEngine }
33
+ end
34
+
35
+ # defines the order of execution of engine in ability
36
+ def execution_order= *names
37
+ @execution_order = names.to_symbols.select {|name| available? name }
38
+ end
39
+
40
+ def execute_first name
41
+ execution_order.insert(0, name)
42
+ end
43
+
44
+ def execute_last name
45
+ execution_order.insert(-1, name)
46
+ end
47
+
48
+ def execute_before existing, name
49
+ index = execution_order.index(existing) || 0
50
+ execution_order.insert(index, name)
51
+ end
52
+
53
+ def execute_after existing, name
54
+ index = execution_order.index(existing)
55
+ index ? execution_order.insert(index +1, name) : execute_last(name)
56
+ end
57
+
58
+ def execution_order
59
+ @execution_order ||= (self.class.default_available - [:cache])
60
+ end
61
+
62
+ def self.default_available
63
+ [:cache, :permission , :permit]
64
+ end
65
+
66
+ def default_available
67
+ self.class.default_available
13
68
  end
14
69
 
15
70
  def available
16
- self.class.available
71
+ (registered.keys + default_available).uniq
17
72
  end
18
73
 
19
74
  def available? name
20
- self.class.available.include? name.to_sym
75
+ available.include? name.to_sym
21
76
  end
22
77
 
23
78
  def all state
@@ -25,23 +80,40 @@ module CanTango
25
80
  end
26
81
 
27
82
  def clear!
28
- available.each {|engine| send(engine).reset! }
83
+ each {|engine| engine.reset! }
84
+ @registered = nil
85
+ @execution_order = nil
29
86
  end
30
87
 
31
- def each &block
32
- available.each {|engine| yield send(engine) if respond_to(engine) }
88
+ def each
89
+ available.each {|engine| yield send(engine) if respond_to?(engine) }
33
90
  end
34
91
 
35
- available.each do |engine|
92
+ def active? name
93
+ active.include? name.to_sym
94
+ end
95
+
96
+ def active
97
+ available.select {|engine| send(engine).on? if respond_to?(engine) }
98
+ end
99
+
100
+ default_available.each do |engine|
36
101
  # def permission
37
102
  # return Permission.instance
38
103
  # end
39
104
  class_eval %{
40
105
  def #{engine}
41
- #{engine.to_s.camelize}.instance
42
- end
106
+ CanTango::Configuration::Engines::#{engine.to_s.camelize}.instance
107
+ end
43
108
  }
44
109
  end
110
+
111
+ protected
112
+
113
+ # does it implement the basic Engine API?
114
+ def engine? engine_class
115
+ [:execute!, :ability].all? {|meth| engine_class.instance_methods.include? meth }
116
+ end
45
117
  end
46
118
  end
47
119
  end