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.
- data/Gemfile +32 -19
- data/README.textile +79 -131
- data/VERSION +1 -1
- data/cantango.gemspec +94 -61
- data/lib/cantango.rb +4 -6
- data/lib/cantango/ability.rb +28 -17
- data/lib/cantango/ability/cache.rb +30 -60
- data/lib/cantango/ability/cache/base_cache.rb +1 -1
- data/lib/cantango/ability/cache/key.rb +39 -0
- data/lib/cantango/ability/cache/kompiler.rb +22 -6
- data/lib/cantango/ability/cache/moneta_cache.rb +1 -1
- data/lib/cantango/ability/cache/reader.rb +32 -0
- data/lib/cantango/ability/cache/rules_cache.rb +31 -0
- data/lib/cantango/ability/cache/session_cache.rb +3 -2
- data/lib/cantango/ability/cache/writer.rb +42 -0
- data/lib/cantango/ability/cache_helpers.rb +28 -0
- data/lib/cantango/ability/masquerade_helpers.rb +7 -2
- data/lib/cantango/ability/permission_helpers.rb +0 -8
- data/lib/cantango/ability/permit_helpers.rb +0 -17
- data/lib/cantango/ability/role_helpers.rb +0 -2
- data/lib/cantango/ability/user_helpers.rb +1 -0
- data/lib/cantango/adapter/compiler.rb +9 -0
- data/lib/cantango/adapter/moneta.rb +23 -0
- data/lib/cantango/api.rb +1 -1
- data/lib/cantango/api/aliases.rb +4 -8
- data/lib/cantango/api/attributes.rb +17 -0
- data/lib/cantango/api/common.rb +6 -0
- data/lib/cantango/api/options.rb +9 -5
- data/lib/cantango/cache.rb +1 -1
- data/lib/cantango/cache/hash_cache.rb +34 -0
- data/lib/cantango/configuration.rb +13 -8
- data/lib/cantango/configuration/adapters.rb +25 -0
- data/lib/cantango/configuration/categories.rb +3 -1
- data/lib/cantango/configuration/engines.rb +83 -11
- data/lib/cantango/configuration/engines/cache.rb +12 -1
- data/lib/cantango/configuration/engines/engine.rb +5 -5
- data/lib/cantango/configuration/engines/permission.rb +1 -1
- data/lib/cantango/configuration/permit_registry.rb +17 -0
- data/lib/cantango/configuration/permits.rb +29 -0
- data/lib/cantango/configuration/registry.rb +5 -2
- data/lib/cantango/configuration/role_groups.rb +3 -0
- data/lib/cantango/configuration/role_registry.rb +4 -0
- data/lib/cantango/configuration/roles.rb +2 -0
- data/lib/cantango/configuration/user_accounts.rb +1 -0
- data/lib/cantango/configuration/users.rb +1 -0
- data/lib/cantango/engine.rb +13 -0
- data/lib/cantango/filters.rb +5 -0
- data/lib/cantango/filters/filter.rb +34 -0
- data/lib/cantango/filters/role_filter.rb +29 -0
- data/lib/cantango/filters/role_group_filter.rb +28 -0
- data/lib/cantango/permission_engine.rb +26 -1
- data/lib/cantango/permission_engine/collector.rb +7 -2
- data/lib/cantango/permission_engine/compiler.rb +8 -1
- data/lib/cantango/permission_engine/evaluator.rb +2 -2
- data/lib/cantango/permission_engine/factory.rb +8 -12
- data/lib/cantango/permission_engine/loader.rb +1 -1
- data/lib/cantango/permission_engine/loader/base.rb +1 -1
- data/lib/cantango/permission_engine/loader/categories.rb +3 -3
- data/lib/cantango/permission_engine/loader/permissions.rb +8 -5
- data/lib/cantango/permission_engine/moneta_store.rb +2 -2
- data/lib/cantango/permission_engine/parser.rb +1 -1
- data/lib/cantango/permission_engine/parser/categories.rb +1 -1
- data/lib/cantango/permission_engine/parser/category.rb +1 -1
- data/lib/cantango/permission_engine/parser/default.rb +1 -2
- data/lib/cantango/permission_engine/parser/ownership.rb +1 -1
- data/lib/cantango/permission_engine/parser/permissions.rb +1 -1
- data/lib/cantango/permission_engine/parser/regex.rb +2 -2
- data/lib/cantango/permission_engine/parser/relationship.rb +1 -1
- data/lib/cantango/permission_engine/parser/rule.rb +1 -1
- data/lib/cantango/permission_engine/permission.rb +2 -2
- data/lib/cantango/permission_engine/selector.rb +3 -3
- data/lib/cantango/permission_engine/selector/account_types.rb +24 -0
- data/lib/cantango/permission_engine/selector/base.rb +3 -3
- data/lib/cantango/permission_engine/selector/licenses.rb +2 -2
- data/lib/cantango/permission_engine/selector/role_groups.rb +7 -6
- data/lib/cantango/permission_engine/selector/roles.rb +10 -6
- data/lib/cantango/permission_engine/selector/user_types.rb +23 -0
- data/lib/cantango/permission_engine/selector/users.rb +2 -2
- data/lib/cantango/permission_engine/statement.rb +10 -9
- data/lib/cantango/permission_engine/statements.rb +27 -25
- data/lib/cantango/permission_engine/store.rb +1 -1
- data/lib/cantango/permission_engine/yaml_store.rb +2 -2
- data/lib/cantango/permit_engine.rb +29 -4
- data/lib/cantango/permit_engine/builder.rb +2 -3
- data/lib/cantango/permit_engine/builder/base.rb +9 -1
- data/lib/cantango/permit_engine/builder/special_permits.rb +7 -8
- data/lib/cantango/permit_engine/compatibility.rb +1 -1
- data/lib/cantango/permit_engine/executor.rb +1 -1
- data/lib/cantango/permit_engine/executor/abstract.rb +1 -1
- data/lib/cantango/permit_engine/executor/base.rb +1 -1
- data/lib/cantango/permit_engine/executor/system.rb +1 -1
- data/lib/cantango/permit_engine/factory.rb +2 -7
- data/lib/cantango/permit_engine/finder.rb +43 -9
- data/lib/cantango/permit_engine/role_matcher.rb +1 -1
- data/lib/cantango/permit_engine/util.rb +2 -1
- data/lib/cantango/permits.rb +9 -0
- data/lib/cantango/{permit_engine → permits}/account_permit.rb +15 -4
- data/lib/cantango/{permit_engine → permits}/account_permit/builder.rb +2 -6
- data/lib/cantango/{permit_engine → permits}/account_permit/finder.rb +2 -2
- data/lib/cantango/{permit_engine → permits}/license.rb +1 -1
- data/lib/cantango/{permit_engine → permits}/license/loader.rb +1 -1
- data/lib/cantango/{permit_engine → permits}/license/rules.rb +1 -1
- data/lib/cantango/permits/macros.rb +19 -0
- data/lib/cantango/{permit_engine → permits}/permit.rb +13 -1
- data/lib/cantango/{permit_engine → permits}/role_group_permit.rb +15 -3
- data/lib/cantango/{permit_engine → permits}/role_group_permit/builder.rb +10 -22
- data/lib/cantango/{permit_engine → permits}/role_group_permit/finder.rb +2 -2
- data/lib/cantango/{permit_engine → permits}/role_permit.rb +15 -3
- data/lib/cantango/permits/role_permit/builder.rb +27 -0
- data/lib/cantango/{permit_engine → permits}/role_permit/finder.rb +2 -2
- data/lib/cantango/{permit_engine → permits}/user_permit.rb +15 -3
- data/lib/cantango/{permit_engine → permits}/user_permit/builder.rb +2 -6
- data/lib/cantango/{permit_engine → permits}/user_permit/finder.rb +2 -2
- data/lib/cantango/rails.rb +3 -1
- data/lib/cantango/rails/engine.rb +11 -6
- data/lib/cantango/rails/helpers/base_helper.rb +28 -0
- data/lib/cantango/rails/helpers/controller_helper.rb +17 -0
- data/lib/cantango/rails/helpers/rest_helper.rb +44 -0
- data/lib/cantango/rails/helpers/view_helper.rb +17 -0
- data/lib/cantango/rails/railtie.rb +1 -1
- data/lib/cantango/rspec/config.rb +1 -1
- data/lib/cantango/rspec/matchers/be_allowed_to.rb +5 -3
- data/lib/cantango/rules/user_relation.rb +1 -1
- data/lib/cantango/users/macros.rb +8 -2
- data/lib/cantango/users/user.rb +1 -1
- data/lib/generators/cantango/account_permit/account_permit_generator.rb +37 -0
- data/lib/generators/cantango/account_permit/templates/account_permit.erb +13 -0
- data/lib/generators/cantango/base.rb +15 -18
- data/lib/generators/cantango/basic.rb +41 -0
- data/lib/generators/cantango/install/install_generator.rb +37 -0
- data/lib/generators/cantango/install/templates/cantango.rb +4 -0
- data/{spec/active_record/scenarios/user_accounts/config/account_permits.yml → lib/generators/cantango/install/templates/categories.yml} +0 -0
- data/lib/generators/cantango/install/templates/permissions.yml +4 -0
- data/lib/generators/cantango/license/license_generator.rb +6 -11
- data/lib/generators/cantango/license/templates/license.erb +1 -1
- data/lib/generators/cantango/license_base.rb +2 -2
- data/lib/generators/cantango/licenses/licenses_generator.rb +2 -7
- data/lib/generators/cantango/permit_generator.rb +31 -10
- data/lib/generators/cantango/role_permit/role_permit_generator.rb +11 -14
- data/lib/generators/cantango/role_permit/templates/account_permit.erb +2 -2
- data/lib/generators/cantango/role_permit/templates/role_group_permit.erb +2 -2
- data/lib/generators/cantango/role_permit/templates/role_permit.erb +2 -2
- data/lib/generators/cantango/role_permits/role_permits_generator.rb +16 -98
- data/lib/generators/cantango/user_permit/templates/account_permit.erb +5 -0
- data/lib/generators/cantango/user_permit/templates/user_permit.erb +13 -0
- data/lib/generators/cantango/user_permit/user_permit_generator.rb +36 -0
- data/spec/TODO +1 -6
- data/spec/active_record/helper/permits_config.rb +1 -1
- data/spec/active_record/scenarios/engines/permission_engine/{cantango_permissions.yml → permissions.yml} +2 -1
- data/spec/active_record/scenarios/engines/permission_engine/tango_permission_yml_spec.rb +8 -9
- data/spec/active_record/scenarios/engines/permit_engine/licenses_spec.rb +2 -2
- data/spec/active_record/scenarios/engines/permit_engine/role_groups_permits_spec.rb +2 -2
- data/spec/active_record/scenarios/shared/{can_tango.rb → cantango.rb} +1 -1
- data/spec/active_record/scenarios/shared/models/items.rb +0 -1
- data/spec/active_record/scenarios/shared/models/users.rb +6 -1
- data/spec/active_record/spec_helper.rb +6 -4
- data/spec/cantango/ability/cache/key_spec.rb +64 -0
- data/spec/cantango/ability/cache/{compiler_spec.rb → kompiler_spec.rb} +9 -21
- data/spec/cantango/ability/cache/reader_compile_spec.rb +42 -0
- data/spec/cantango/ability/cache/reader_spec.rb +33 -0
- data/spec/cantango/ability/cache/rules_cache_spec.rb +15 -0
- data/spec/cantango/ability/cache/session_cache_spec.rb +1 -1
- data/spec/cantango/ability/cache/writer_spec.rb +21 -0
- data/spec/cantango/ability/cache_spec.rb +6 -2
- data/spec/cantango/ability_filters_spec.rb +5 -10
- data/spec/cantango/ability_spec.rb +2 -3
- data/spec/cantango/api/attributes_spec.rb +27 -0
- data/spec/cantango/api/user/can_api_spec.rb +2 -2
- data/spec/cantango/api/user_account/can_api_spec.rb +2 -2
- data/spec/cantango/configuration/adapter_spec.rb +28 -0
- data/spec/cantango/configuration/engines/cache_spec.rb +2 -2
- data/spec/cantango/configuration/engines/permission_spec.rb +3 -3
- data/spec/cantango/configuration/engines/permit_spec.rb +1 -1
- data/spec/cantango/configuration/engines/store_shared.rb +3 -1
- data/spec/cantango/configuration/engines_spec.rb +106 -3
- data/spec/cantango/configuration/hash_registry_spec.rb +1 -1
- data/spec/cantango/configuration/permit_registry_spec.rb +14 -0
- data/spec/cantango/configuration/permits_spec.rb +25 -0
- data/spec/cantango/configuration/registry_spec.rb +1 -1
- data/spec/cantango/configuration/shared/registry_ex.rb +2 -1
- data/spec/cantango/configuration_spec.rb +5 -5
- data/spec/cantango/permission_engine/compiler_spec.rb +8 -0
- data/spec/cantango/permission_engine/permission_spec.rb +1 -1
- data/spec/cantango/permission_engine/yaml_store_spec.rb +14 -4
- data/spec/cantango/permission_engine_spec.rb +0 -0
- data/spec/cantango/permit_engine/account_permit_spec.rb +2 -4
- data/spec/cantango/permit_engine/builder/role_group_permits_spec.rb +4 -7
- data/spec/cantango/permit_engine/builder/role_permits_spec.rb +5 -6
- data/spec/cantango/permit_engine/builder/special_permits_spec.rb +3 -4
- data/spec/cantango/permit_engine/executor/system_spec.rb +2 -2
- data/spec/cantango/permit_engine/factory_spec.rb +2 -3
- data/spec/cantango/permit_engine/finder_spec.rb +144 -23
- data/spec/cantango/permit_engine/permit/permit_static_and_dynamic_rules_spec.rb +4 -5
- data/spec/cantango/permit_engine/role_group_permit_spec.rb +1 -1
- data/spec/cantango/permit_engine/role_permit_spec.rb +6 -7
- data/spec/cantango/permit_engine/user_permit_spec.rb +2 -3
- data/spec/cantango/permit_engine_spec.rb +2 -0
- data/spec/cantango/permits/macros_spec.rb +41 -0
- data/spec/cantango/permits/permit_spec.rb +46 -0
- data/spec/cantango_spec.rb +13 -0
- data/spec/devise-dummy/app/helpers/application_helper.rb +7 -0
- data/spec/devise-dummy/app/views/articles/admin.html.haml +1 -1
- data/spec/devise-dummy/app/views/articles/admin_account.html.haml +1 -1
- data/spec/devise-dummy/app/views/articles/guest.html.haml +1 -1
- data/spec/devise-dummy/app/views/articles/index.html.haml +1 -1
- data/spec/devise-dummy/app/views/comments/guest.html.haml +1 -1
- data/spec/devise-dummy/app/views/comments/index.html.haml +1 -1
- data/spec/devise-dummy/app/views/concertos/admin.html.haml +1 -1
- data/spec/devise-dummy/app/views/concertos/admin_account.html.haml +1 -1
- data/spec/devise-dummy/app/views/concertos/guest.html.haml +1 -1
- data/spec/devise-dummy/app/views/concertos/index.html.haml +1 -1
- data/spec/devise-dummy/app/views/users/index.html.haml +1 -1
- data/spec/devise-dummy/config/initializers/cantango.rb +3 -3
- data/spec/devise-dummy/config/{cantango_permissions.yml → permissions.yml} +2 -1
- data/spec/devise-integration/concerto_spec.rb +1 -1
- data/spec/dummy/app/models/user.rb +1 -0
- data/spec/dummy/app/views/articles/admin.html.haml +1 -1
- data/spec/dummy/app/views/articles/admin_account.html.haml +1 -1
- data/spec/dummy/app/views/articles/guest.html.haml +1 -1
- data/spec/dummy/app/views/articles/index.html.haml +1 -1
- data/spec/dummy/app/views/comments/guest.html.haml +1 -1
- data/spec/dummy/app/views/comments/index.html.haml +1 -1
- data/spec/dummy/app/views/concertos/admin.html.haml +1 -1
- data/spec/dummy/app/views/concertos/admin_account.html.haml +1 -1
- data/spec/dummy/app/views/concertos/guest.html.haml +1 -1
- data/spec/dummy/app/views/concertos/index.html.haml +1 -1
- data/spec/dummy/app/views/posts/admin.html.haml +1 -1
- data/spec/dummy/app/views/posts/admin_account.html.haml +1 -1
- data/spec/dummy/app/views/posts/guest.html.haml +1 -1
- data/spec/dummy/app/views/posts/index.html.haml +1 -1
- data/spec/dummy/app/views/users/admin.html.haml +1 -1
- data/spec/dummy/app/views/users/admin_account.html.haml +1 -1
- data/spec/dummy/app/views/users/guest.html.haml +1 -1
- data/spec/dummy/app/views/users/index.html.haml +1 -1
- data/spec/dummy/config/application.rb +1 -0
- data/spec/dummy/config/initializers/cantango.rb +1 -3
- data/spec/dummy/config/{cantango_permissions.yml → permissions.yml} +2 -2
- data/spec/dummy_spec_helper.rb +2 -0
- data/spec/entire_suite_spec.rb +2 -0
- data/spec/factories/user.rb +8 -0
- data/spec/factories/user_account.rb +6 -0
- data/spec/fixtures/config/permissions.yml +60 -19
- data/spec/fixtures/models/admin.rb +2 -0
- data/spec/fixtures/models/admin_account.rb +22 -0
- data/spec/fixtures/models/simple_roles.rb +5 -0
- data/spec/fixtures/models/user.rb +4 -0
- data/spec/helpers/dummy_app_ability.rb +2 -5
- data/spec/integration/cache_using_moneta_spec.rb +3 -1
- data/spec/integration/cache_using_session_spec.rb +2 -2
- data/spec/integration/user/articles_spec.rb +1 -1
- data/spec/integration/user/concerto_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -5
- metadata +120 -95
- data/lib/cantango/ability/class_methods.rb +0 -27
- data/lib/cantango/api/aliases/account_permit.rb +0 -8
- data/lib/cantango/api/aliases/license.rb +0 -7
- data/lib/cantango/api/aliases/permit.rb +0 -9
- data/lib/cantango/api/aliases/role_group_permit.rb +0 -7
- data/lib/cantango/api/aliases/role_permit.rb +0 -7
- data/lib/cantango/api/aliases/user_permit.rb +0 -8
- data/lib/cantango/permission_engine/builder.rb +0 -6
- data/lib/cantango/permit_engine/role_permit/builder.rb +0 -46
- data/lib/cantango/rails/base_helpers.rb +0 -26
- data/lib/cantango/rails/controller_helpers.rb +0 -15
- data/lib/cantango/rails/view_helpers.rb +0 -15
- data/spec/active_record/scenarios/shared/permits/PERMITS README.textile +0 -3
- data/spec/active_record/scenarios/user_accounts/docs/USER_ACCOUNTS_SCENARIO.textile +0 -20
- data/spec/active_record/scenarios/user_accounts/docs/basic_rules_spec_possible_samples.txt +0 -84
- data/spec/factories.rb +0 -8
- 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
|
-
|
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
|
-
|
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)
|
@@ -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
data/lib/cantango/api/aliases.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
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
|
+
|
data/lib/cantango/api/common.rb
CHANGED
@@ -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
|
data/lib/cantango/api/options.rb
CHANGED
@@ -4,13 +4,17 @@ module CanTango
|
|
4
4
|
|
5
5
|
def ability_options
|
6
6
|
opts = {}
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
data/lib/cantango/cache.rb
CHANGED
@@ -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
|
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
|
+
|
@@ -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
|
-
#
|
11
|
-
def
|
12
|
-
|
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
|
-
|
71
|
+
(registered.keys + default_available).uniq
|
17
72
|
end
|
18
73
|
|
19
74
|
def available? name
|
20
|
-
|
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
|
-
|
83
|
+
each {|engine| engine.reset! }
|
84
|
+
@registered = nil
|
85
|
+
@execution_order = nil
|
29
86
|
end
|
30
87
|
|
31
|
-
def each
|
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
|
-
|
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
|
-
|
42
|
-
|
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
|