cantango-api 0.0.0 → 0.1.0

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 (51) hide show
  1. data/Gemfile +8 -5
  2. data/Gemfile.lock +20 -24
  3. data/README.mdown +73 -0
  4. data/VERSION +1 -1
  5. data/cantango-api.gemspec +42 -23
  6. data/lib/cantango/api/ability/account.rb +6 -6
  7. data/lib/cantango/api/ability/user.rb +1 -0
  8. data/lib/cantango/api/account.rb +9 -11
  9. data/lib/cantango/api/attributes.rb +1 -1
  10. data/lib/cantango/api/can/account.rb +2 -2
  11. data/lib/cantango/api/can/dsl/relation.rb +67 -0
  12. data/lib/cantango/api/can/dsl/scope.rb +24 -0
  13. data/lib/cantango/api/can/dsl.rb +26 -0
  14. data/lib/cantango/api/can/user.rb +1 -1
  15. data/lib/cantango/api/can.rb +1 -1
  16. data/lib/cantango/api/common.rb +16 -3
  17. data/lib/cantango/api/model/account.rb +9 -16
  18. data/lib/cantango/api/model/user.rb +10 -17
  19. data/lib/cantango/api/model.rb +3 -1
  20. data/lib/cantango/api/scope/account.rb +8 -5
  21. data/lib/cantango/api/scope/user.rb +1 -0
  22. data/lib/cantango/api/session/account.rb +1 -1
  23. data/lib/cantango/api/user.rb +9 -11
  24. data/lib/cantango/api.rb +7 -4
  25. data/lib/cantango/api_ext/macros/account.rb +8 -0
  26. data/lib/cantango/api_ext/macros/clazz.rb +17 -0
  27. data/lib/cantango/api_ext/macros/user.rb +8 -0
  28. data/lib/cantango/api_ext/macros.rb +12 -0
  29. data/lib/cantango/api_ext.rb +5 -0
  30. data/spec/cantango/api/ability/account_spec.rb +14 -15
  31. data/spec/cantango/api/ability/user_spec.rb +18 -22
  32. data/spec/cantango/api/account_spec.rb +40 -0
  33. data/spec/cantango/api/attributes_spec.rb +13 -14
  34. data/spec/cantango/api/can/account_spec.rb +40 -47
  35. data/spec/cantango/api/can/user_spec.rb +56 -83
  36. data/spec/cantango/api/common_spec.rb +37 -0
  37. data/spec/cantango/api/model/account_spec.rb +38 -0
  38. data/spec/cantango/api/model/user_spec.rb +35 -0
  39. data/spec/cantango/api/options_spec.rb +23 -0
  40. data/spec/cantango/api/scope/account_spec.rb +43 -0
  41. data/spec/cantango/api/scope/user_spec.rb +19 -51
  42. data/spec/cantango/api/session/account_spec.rb +0 -0
  43. data/spec/cantango/api/session/user_spec.rb +0 -0
  44. data/spec/cantango/api/user_spec.rb +40 -0
  45. data/spec/cantango/api_ext/macros/account_spec.rb +16 -0
  46. data/spec/cantango/api_ext/macros/clazz_spec.rb +26 -0
  47. data/spec/cantango/api_ext/macros/user_spec.rb +17 -0
  48. data/spec/fixtures/models/user_account.rb +1 -15
  49. data/spec/helpers/current_user_accounts.rb +1 -1
  50. data/spec/spec_helper.rb +0 -1
  51. metadata +55 -28
@@ -1,113 +1,86 @@
1
- require 'rspec'
2
- require 'cantango'
3
- require 'simple_roles'
1
+ require 'cantango/config'
4
2
  require 'fixtures/models'
5
- require 'cantango/api/current_users'
6
- # require 'cantango/configuration/engines/store_engine_shared'
7
-
8
- class User
9
- include CanTango::Users::Masquerade
10
- include_and_extend SimpleRoles
11
-
12
- tango_user
13
- end
14
-
15
- class Admin < User
16
- tango_user
17
- end
18
3
 
19
4
  CanTango.configure do |config|
20
- config.cache_engine.set :off
21
- config.permit_engine.set :on
5
+ config.users.register :user, User
6
+ config.users.register :admin, Admin
7
+
8
+ config.accounts.register :user, UserAccount
9
+ config.accounts.register :admin, AdminAccount
10
+
11
+ config.modes.register :no_cache, CanTango::Ability::Mode::NoCache
12
+ config.ability.mode = :no_cache
22
13
  end
23
14
 
24
- # puts "#{CanTango.config.users.registered_classes} : #{CanTango.config.users.registered}"
15
+ require 'spec_helper'
16
+ require 'helpers/current_user_accounts'
25
17
 
26
- class UserRolePermit < CanTango::RolePermit
27
- def initialize ability
28
- super
29
- end
18
+ class Context
19
+ include CanTango::Api::Can::User
30
20
 
31
- def permit_rules
32
- can :edit, Article
33
- cannot :edit, User
34
- end
21
+ include_and_extend ::CurrentUserAccounts
35
22
  end
36
23
 
37
- class AdminRolePermit < CanTango::RolePermit
38
- def initialize ability
39
- super
40
- end
41
-
42
- def permit_rules
43
- can :edit, Article
44
- cannot :edit, User
24
+ module CanTango::Ability::Mode
25
+ class NoCache
26
+ def calculate_rules
27
+ can :edit, Article
28
+ cannot :edit, User
29
+ end
45
30
  end
46
31
  end
47
32
 
48
- class Context
49
- include CanTango::Api::User::Can
50
-
51
- include_and_extend ::CurrentUsers
52
- end
53
-
54
- describe CanTango::Api::User::Can do
33
+ describe CanTango::Api::Can::Account do
55
34
  subject { Context.new }
56
35
 
57
- describe 'user_ability' do
58
- specify { subject.user_ability(subject.current_user).should be_a CanTango::Ability }
59
- specify { subject.user_ability(subject.current_admin).should be_a CanTango::Ability }
60
- end
61
-
62
- describe 'current_user_ability :user' do
63
- specify { subject.current_user_ability(:user).should be_a CanTango::Ability }
64
-
65
- it 'should set the :user user correctly on ability' do
66
- subject.current_user_ability(:user).user.should == subject.current_user
36
+ describe 'user_account' do
37
+ specify do
38
+ subject.current_user_ability(:user).should be_a CanTango::Ability::Executor::Modal
67
39
  end
68
- end
69
40
 
70
- describe 'current_user_ability :admin' do
71
- specify { subject.current_user_ability(:admin).should be_a CanTango::Ability }
41
+ specify do
42
+ subject.current_user_ability(:user).modes.should == [:no_cache]
43
+ end
72
44
 
73
- it 'should set the :admin user correctly on ability' do
74
- subject.current_user_ability(:admin).user.should == subject.current_admin
45
+ specify do
46
+ subject.current_user_ability(:user).should respond_to(:can?)
75
47
  end
76
- end
77
48
 
78
- describe 'user' do
79
- specify { subject.current_user.role.should == 'user' }
49
+ specify do
50
+ subject.current_user_ability(:user).rules.should_not be_empty
51
+ end
80
52
 
53
+ specify do
54
+ subject.current_user_ability(:user).can?(:edit, Article).should be_true
55
+ end
56
+
57
+ specify do
58
+ CanTango.config.users.registered.should include(:user)
59
+ end
60
+
81
61
  # user can edit Article, not Admin
82
- specify { subject.user_can?(:edit, Article).should be_true }
83
- specify { subject.user_can?(:edit, User).should be_false }
62
+ specify do
63
+ subject.user_can?(:edit, Article).should be_true
64
+ subject.user_can?(:edit, User).should be_false
84
65
 
85
- specify { subject.user_cannot?(:edit, User).should be_true }
86
- specify { subject.user_cannot?(:edit, Article).should be_false }
87
- end
88
-
89
- describe 'admin' do
90
- specify { subject.current_admin.role.should == 'admin' }
91
-
92
- specify { subject.admin_can?(:edit, Article).should be_true }
93
- specify { subject.admin_can?(:edit, User).should be_false }
94
-
95
- specify { subject.admin_cannot?(:edit, User).should be_true }
96
- specify { subject.admin_cannot?(:edit, Article).should be_false }
66
+ subject.user_cannot?(:edit, User).should be_true
67
+ subject.user_cannot?(:edit, Article).should be_false
68
+ end
97
69
  end
98
70
 
99
- describe 'admin masquerades as user' do
100
- before do
101
- Context.new.current_admin.masquerade_as Context.new.current_user
71
+ describe 'admin_user' do
72
+ specify do
73
+ CanTango.config.users.registered.should include(:admin)
102
74
  end
103
75
 
104
- # admin masquerading as user can do same as user
105
- specify { subject.admin_can?(:edit, Article).should be_true }
76
+ specify do
77
+ subject.admin_can?(:edit, Article).should be_true
78
+ subject.admin_can?(:edit, User).should be_false
106
79
 
107
- specify { subject.admin_can?(:edit, User).should be_false }
108
-
109
- specify { subject.admin_cannot?(:edit, User).should be_true }
110
- specify { subject.admin_cannot?(:edit, Article).should be_false }
80
+ subject.admin_cannot?(:edit, User).should be_true
81
+ subject.admin_cannot?(:edit, Article).should be_false
82
+ end
111
83
  end
112
84
  end
113
85
 
86
+
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ require 'fixtures/models'
3
+
4
+ class CommonContext
5
+ include CanTango::Api::Common
6
+ end
7
+
8
+ class Wheat
9
+ end
10
+
11
+ class Barley
12
+ end
13
+
14
+ describe CanTango::Api::Common do
15
+ before do
16
+ @user = User.new 'kris', 'kris@mail.ru'
17
+ end
18
+
19
+ subject { CommonContext.new }
20
+
21
+ describe 'create_ability(candidate)' do
22
+ specify do
23
+ subject.create_ability(@user).should be_a CanTango::Ability::Executor
24
+ end
25
+ end
26
+
27
+ describe 'category(label)' do
28
+ before do
29
+ CanTango.config.categories.register :grains => ['Wheat', 'Barley']
30
+ end
31
+
32
+ specify do
33
+ lambda { subject.category('unknown') }.should raise_error
34
+ end
35
+ specify { subject.category('grains').should_not be_empty }
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ require 'cantango/config'
2
+ require 'fixtures/models'
3
+
4
+ CanTango.configure do |config|
5
+ config.users.register :user, User
6
+ config.users.register :admin, Admin
7
+
8
+ config.accounts.register :user, UserAccount
9
+ config.accounts.register :admin, AdminAccount
10
+ end
11
+
12
+ require 'spec_helper'
13
+
14
+ class UserAccount
15
+ tango_account
16
+ end
17
+
18
+ class AdminAccount
19
+ tango_account
20
+ end
21
+
22
+ class Context
23
+ include CanTango::Api::Model::Account
24
+ end
25
+
26
+ describe CanTango::Api::Model::Account do
27
+ subject { Context.new }
28
+
29
+ specify do
30
+ CanTango.config.accounts.registered.should include(:admin, :user)
31
+ end
32
+
33
+ describe 'Model API included' do
34
+ [:active_user, :can?, :cannot?].each do |name|
35
+ specify { subject.should respond_to name }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ require 'cantango/config'
2
+ require 'fixtures/models'
3
+
4
+ require 'spec_helper'
5
+
6
+ class Context
7
+ include CanTango::Api::Model::User
8
+ end
9
+
10
+ class User
11
+ tango_user
12
+ end
13
+
14
+ class Editor
15
+ tango_user
16
+ end
17
+
18
+ class BadUser
19
+ tango_user
20
+ end
21
+
22
+
23
+ describe CanTango::Api::Model::User do
24
+ subject { Context.new }
25
+
26
+ specify do
27
+ CanTango.config.users.registered.should include(:editor, :user, :bad)
28
+ end
29
+
30
+ describe 'Model API included' do
31
+ [:active_user, :can?, :cannot?].each do |name|
32
+ specify { subject.should respond_to name }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ class Context
4
+ include CanTango::Api::Options
5
+
6
+ def session
7
+ {}
8
+ end
9
+ end
10
+
11
+ describe CanTango::Api::Options do
12
+ subject { Context.new }
13
+
14
+ describe 'ability_options' do
15
+ specify do
16
+ subject.ability_options[:session].should == {}
17
+ end
18
+ end
19
+
20
+ describe 'options_list' do
21
+ specify { subject.options_list.should == [:session, :request, :params, :controller, :domain, :cookies] }
22
+ end
23
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'fixtures/models'
3
+ require 'helpers/current_user_accounts'
4
+
5
+ class Context
6
+ include CanTango::Api::Scope::Account
7
+ include CanTango::Api::Masquerade::Account
8
+
9
+ include_and_extend ::CurrentUserAccounts
10
+ end
11
+
12
+ class UserAccount
13
+ tango_account
14
+ end
15
+
16
+ class AdminAccount
17
+ cantango_account
18
+ end
19
+
20
+ describe CanTango::Api::Scope::Account do
21
+ subject { Context.new }
22
+
23
+ before do
24
+ subject.masquerade_as subject.current_admin_account
25
+ end
26
+
27
+ describe 'scope_account(scope, options)' do
28
+ specify do
29
+ subject.scope_account :user do |user|
30
+ user.candidate.class.should == subject.current_admin_account.class
31
+ end
32
+ end
33
+ end
34
+
35
+ describe 'real_account(scope, options)' do
36
+ specify do
37
+ subject.real_account :user do |user|
38
+ user.candidate.class.should == subject.current_user_account.class
39
+ user.candidate.user.should == subject.current_user_account.user
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,73 +1,41 @@
1
- require 'rspec'
2
- require 'cantango'
3
- require 'simple_roles'
1
+ require 'spec_helper'
4
2
  require 'fixtures/models'
5
- require 'cantango/api/current_users'
6
- # require 'cantango/configuration/engines/store_engine_shared'
3
+ require 'helpers/current_users'
7
4
 
8
- CanTango.configure do |config|
9
- config.users.register :user, User
10
- config.users.register :admin, Admin
5
+ class Context
6
+ include CanTango::Api::Scope::User
11
7
 
12
- config.cache_engine.set :off
13
- config.permit_engine.set :on
8
+ include_and_extend ::CurrentUsers
14
9
  end
15
10
 
16
- # puts "#{CanTango.config.users.registered_classes} : #{CanTango.config.users.registered}"
17
-
18
11
  class User
19
- include CanTango::Users::Masquerade
20
- include_and_extend ::SimpleRoles
12
+ cantango
21
13
  end
22
14
 
23
- class Context
24
- include CanTango::Api::User::Ability
25
- include CanTango::Api::User::Scope
26
-
27
- include_and_extend ::CurrentUsers
15
+ class AdminUser
16
+ cantango
28
17
  end
29
18
 
30
- describe CanTango::Api::User::Scope do
19
+ describe CanTango::Api::Scope::User do
31
20
  subject { Context.new }
32
21
 
33
- describe 'scope_user' do
34
- before do
35
- subject.current_admin.masquerade_as subject.current_user
36
- end
22
+ before do
23
+ subject.current_user.active_account = subject.current_admin
24
+ end
37
25
 
26
+ describe 'scope_user(scope, options)' do
38
27
  specify do
39
- subject.scope_user(:admin) do |user|
40
- user.should be_a CanTango::Ability::Scope
41
- user.ability.user.name.should == 'admin'
28
+ subject.scope_user :user do |user|
29
+ user.candidate.should == subject.current_admin
42
30
  end
43
31
  end
44
-
45
- specify do
46
- admin = subject.scope_user(:user)
47
- admin.should be_a CanTango::Ability::Scope
48
- admin.ability.user.name.should == 'stan'
49
- end
50
32
  end
51
33
 
52
- describe 'real_user' do
53
- before do
54
- subject.current_user.masquerade_as subject.current_admin
55
- end
56
-
34
+ describe 'real_user(scope, options)' do
57
35
  specify do
58
- subject.real_user(:user) do |user|
59
- user.should be_a CanTango::Ability::Scope
60
- user.ability.user.name.should == 'stan'
36
+ subject.real_user :user do |user|
37
+ user.candidate.should == subject.current_user
61
38
  end
62
39
  end
63
-
64
- specify do
65
- admin = subject.real_user(:admin)
66
- admin.should be_a CanTango::Ability::Scope
67
- admin.ability.user.name.should == 'admin'
68
- end
69
40
  end
70
- end
71
-
72
-
73
-
41
+ end
File without changes
File without changes
@@ -0,0 +1,40 @@
1
+ require 'cantango/config'
2
+ require 'fixtures/models'
3
+
4
+ CanTango.configure do |config|
5
+ config.users.register :user, User
6
+ end
7
+
8
+ require 'spec_helper'
9
+
10
+ class UserContext
11
+ include CanTango::Api::User
12
+ end
13
+
14
+ describe CanTango::Api::User do
15
+ subject { UserContext.new }
16
+
17
+ describe 'Ability API included' do
18
+ [:user_ability, :current_user_ability].each do |name|
19
+ specify { subject.should respond_to name }
20
+ end
21
+ end
22
+
23
+ describe 'Can API included' do
24
+ [:user_can?, :user_cannot?].each do |name|
25
+ specify { subject.should respond_to name }
26
+ end
27
+ end
28
+
29
+ describe 'Scope API included' do
30
+ [:scope_user, :user_scope, :real_user].each do |name|
31
+ specify { subject.should respond_to name }
32
+ end
33
+ end
34
+
35
+ describe 'Session API included' do
36
+ [:any_user, :active_user, :active_user=].each do |name|
37
+ specify { subject.should respond_to name }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,16 @@
1
+ require 'cantango/config'
2
+ require 'fixtures/models'
3
+
4
+ require 'spec_helper'
5
+
6
+ class UserAccount
7
+ tango_account
8
+ end
9
+
10
+ class AdminAccount
11
+ cantango_account
12
+ end
13
+
14
+ describe CanTango::Macros::Account do
15
+ specify { CanTango.config.accounts.registered.should include(:user, :admin) }
16
+ end
@@ -0,0 +1,26 @@
1
+ require 'cantango/config'
2
+ require 'fixtures/models'
3
+
4
+ require 'spec_helper'
5
+
6
+ class UserAccount
7
+ cantango
8
+ end
9
+
10
+ class AdminAccount
11
+ cantango
12
+ end
13
+
14
+ class AdminUser
15
+ cantango
16
+ end
17
+
18
+ class Publisher
19
+ cantango
20
+ end
21
+
22
+
23
+ describe CanTango::Macros::Account do
24
+ specify { CanTango.config.users.registered.should include(:publisher, :admin) }
25
+ specify { CanTango.config.accounts.registered.should include(:user, :admin) }
26
+ end
@@ -0,0 +1,17 @@
1
+ require 'cantango/config'
2
+ require 'fixtures/models'
3
+
4
+ require 'spec_helper'
5
+
6
+ class User
7
+ tango_user
8
+ end
9
+
10
+ class EditorUser
11
+ tango_user
12
+ end
13
+
14
+ describe CanTango::Macros::User do
15
+ specify { CanTango.config.users.registered.should include(:user, :editor) }
16
+ end
17
+
@@ -1,21 +1,7 @@
1
1
  class UserAccount
2
- attr_accessor :user, :roles, :role_groups
2
+ attr_accessor :user
3
3
 
4
4
  def initialize user, options = {}
5
5
  @user = user
6
- @roles = options[:roles]
7
- @role_groups = options[:role_groups]
8
- end
9
-
10
- def has_role? name
11
- true
12
- end
13
-
14
- def roles_list
15
- roles
16
- end
17
-
18
- def role_groups_list
19
- role_groups
20
6
  end
21
7
  end
@@ -14,7 +14,7 @@ module CurrentUserAccounts
14
14
  end
15
15
 
16
16
  def current_admin_account
17
- ::UserAccount.new(current_admin, :roles => [:admin])
17
+ ::AdminAccount.new(current_admin, :roles => [:admin])
18
18
  end
19
19
  end
20
20
 
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'rspec'
2
2
  require 'require_all'
3
3
 
4
-
5
4
  require 'cantango/core'
6
5
  require 'cantango/configuration'
7
6
  require 'cantango/api'