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
data/Gemfile CHANGED
@@ -1,12 +1,13 @@
1
1
  source :rubygems
2
2
 
3
3
  group :default do
4
- gem 'rails', '>= 3.1'
5
- gem 'sugar-high', '>= 0.6.0'
6
- gem 'sweetloader', '~> 0.1.0'
7
- gem 'hashie'
4
+ gem 'rails', '>= 3.1'
5
+ gem 'sugar-high', '~> 0.6.2'
6
+ gem 'sweetloader', '~> 0.1.6'
7
+ gem 'hashie', '~> 1.2'
8
8
 
9
- gem 'cantango-config', :git => 'git://github.com/kristianmandrup/cantango-config.git'
9
+ gem 'cantango-config', '>= 0.1.8.1'
10
+ gem 'cantango-core', '>= 0.1.9.1'
10
11
  end
11
12
 
12
13
  group :development do
@@ -18,6 +19,8 @@ end
18
19
  group :test do
19
20
  gem 'require_all', '~> 1.2.0'
20
21
 
22
+ # gem 'cantango-masquerade', :git => 'git://github.com/kristianmandrup/cantango-masquerade.git'
23
+
21
24
  gem 'forgery'
22
25
  gem 'sqlite3'
23
26
  # Data
data/Gemfile.lock CHANGED
@@ -1,14 +1,3 @@
1
- GIT
2
- remote: git://github.com/kristianmandrup/cantango-config.git
3
- revision: 852141acab7fec0eb61930bdda07c16461140a7e
4
- specs:
5
- cantango-config (0.1.0)
6
- cantango-core
7
- hashie
8
- rails (>= 3.1)
9
- sugar-high (>= 0.6.0)
10
- sweetloader (~> 0.1.0)
11
-
12
1
  GEM
13
2
  remote: http://rubygems.org/
14
3
  specs:
@@ -43,12 +32,18 @@ GEM
43
32
  arel (2.2.1)
44
33
  builder (3.0.0)
45
34
  cancan (1.6.7)
46
- cantango-core (0.1.0)
35
+ cantango-config (0.1.9.2)
36
+ cantango-core (~> 0.1.9)
37
+ hashie (~> 1.2)
38
+ rails (>= 3.1)
39
+ sugar-high (>= 0.6.1)
40
+ sweetloader (~> 0.1.6)
41
+ cantango-core (0.1.9.2)
47
42
  cancan (>= 1.4)
48
- hashie
43
+ hashie (~> 1.2)
49
44
  rails (>= 3.0.1)
50
45
  sugar-high (>= 0.6.0)
51
- sweetloader (~> 0.1.0)
46
+ sweetloader (~> 0.1.5)
52
47
  colorize (0.5.8)
53
48
  cutter (0.8.2)
54
49
  activesupport (>= 2.3.5)
@@ -56,7 +51,7 @@ GEM
56
51
  database_cleaner (0.7.0)
57
52
  diff-lcs (1.1.3)
58
53
  erubis (2.7.0)
59
- factory_girl (2.3.1)
54
+ factory_girl (2.3.2)
60
55
  activesupport
61
56
  forgery (0.5.0)
62
57
  git (1.2.5)
@@ -67,13 +62,13 @@ GEM
67
62
  bundler (~> 1.0)
68
63
  git (>= 1.2.5)
69
64
  rake
70
- json (1.6.1)
65
+ json (1.6.3)
71
66
  mail (2.3.0)
72
67
  i18n (>= 0.4.0)
73
68
  mime-types (~> 1.16)
74
69
  treetop (~> 1.4.8)
75
70
  mime-types (1.17.2)
76
- multi_json (1.0.3)
71
+ multi_json (1.0.4)
77
72
  polyglot (0.3.3)
78
73
  rack (1.3.5)
79
74
  rack-cache (1.1)
@@ -117,10 +112,10 @@ GEM
117
112
  hike (~> 1.2)
118
113
  rack (~> 1.0)
119
114
  tilt (~> 1.1, != 1.3.0)
120
- sqlite3 (1.3.4)
121
- sugar-high (0.6.0)
115
+ sqlite3 (1.3.5)
116
+ sugar-high (0.6.2.1)
122
117
  activesupport (>= 3.0.1)
123
- sweetloader (0.1.1)
118
+ sweetloader (0.1.6)
124
119
  activesupport (>= 3.0.1)
125
120
  i18n
126
121
  thor (0.14.6)
@@ -135,12 +130,13 @@ PLATFORMS
135
130
 
136
131
  DEPENDENCIES
137
132
  bundler (>= 1.1.rc)
138
- cantango-config!
133
+ cantango-config (>= 0.1.8.1)
134
+ cantango-core (>= 0.1.9.1)
139
135
  cutter
140
136
  database_cleaner
141
137
  factory_girl
142
138
  forgery
143
- hashie
139
+ hashie (~> 1.2)
144
140
  jeweler (>= 1.6.4)
145
141
  rails (>= 3.1)
146
142
  rcov
@@ -148,5 +144,5 @@ DEPENDENCIES
148
144
  rspec (>= 2.6.0)
149
145
  spork
150
146
  sqlite3
151
- sugar-high (>= 0.6.0)
152
- sweetloader (~> 0.1.0)
147
+ sugar-high (~> 0.6.2)
148
+ sweetloader (~> 0.1.6)
data/README.mdown CHANGED
@@ -2,6 +2,79 @@
2
2
 
3
3
  The main API for [CanTango](https://github.com/kristianmandrup/cantango)
4
4
 
5
+ ## Status: Dec 1 2011
6
+
7
+ The API is being spec'ed...
8
+
9
+ ## Dependencies
10
+
11
+ This extension depends on the CanTango [core](https://github.com/kristianmandrup/cantango-core) and follows the extension conventions as described there.
12
+
13
+ ## Core extensions
14
+
15
+ * Macros
16
+ * User
17
+ * Account
18
+
19
+ These macros allow registration os CanTango User and Account models.
20
+
21
+ Usage example:
22
+
23
+ ```ruby
24
+ class User
25
+ tango_user
26
+ end
27
+
28
+ class Admin
29
+ tango_user
30
+ end
31
+
32
+ class UserAccount
33
+ tango_account
34
+ end
35
+
36
+ class AdminAccount
37
+ tango_account
38
+ end
39
+ ```
40
+
41
+ ## Main APIs
42
+
43
+ The main API consists of the following:
44
+
45
+ * Ability
46
+ * Can
47
+ * Model
48
+ * Scope
49
+ * Session
50
+
51
+ Each of these have a specific variant for both `Account` and `User`.
52
+
53
+ ### Can API
54
+
55
+ * Dsl
56
+ * Relation
57
+ * Scope
58
+
59
+ The Dsl API extends the CanCan Ability API with Relation and Scope APIs.
60
+
61
+ ## Model APIs
62
+
63
+ * Account
64
+ * User
65
+
66
+ Use by including the `All` module
67
+
68
+ Usage example:
69
+
70
+ ```ruby
71
+ class User
72
+ include Cantango::Api::User::All
73
+ end
74
+ ```
75
+
76
+ Note: The `tango_user` and `tango_account` macros should include the relevant All module.
77
+
5
78
  ## Contributing to cantango-api
6
79
 
7
80
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.1.0
data/cantango-api.gemspec CHANGED
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = "cantango-api"
8
- s.version = "0.0.0"
7
+ s.name = %q{cantango-api}
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Kristian Mandrup"]
12
- s.date = "2011-11-25"
13
- s.description = "Ability, Can, Scope, Session, User, Account and more APIs for CanTango"
14
- s.email = "kristian@unity3d.com"
11
+ s.authors = [%q{Kristian Mandrup}]
12
+ s.date = %q{2011-12-08}
13
+ s.description = %q{Ability, Can, Scope, Session, User, Account and more APIs for CanTango}
14
+ s.email = %q{kristian@unity3d.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
17
17
  "README.mdown"
@@ -34,6 +34,9 @@ Gem::Specification.new do |s|
34
34
  "lib/cantango/api/attributes.rb",
35
35
  "lib/cantango/api/can.rb",
36
36
  "lib/cantango/api/can/account.rb",
37
+ "lib/cantango/api/can/dsl.rb",
38
+ "lib/cantango/api/can/dsl/relation.rb",
39
+ "lib/cantango/api/can/dsl/scope.rb",
37
40
  "lib/cantango/api/can/user.rb",
38
41
  "lib/cantango/api/common.rb",
39
42
  "lib/cantango/api/model.rb",
@@ -47,16 +50,29 @@ Gem::Specification.new do |s|
47
50
  "lib/cantango/api/session/account.rb",
48
51
  "lib/cantango/api/session/user.rb",
49
52
  "lib/cantango/api/user.rb",
53
+ "lib/cantango/api_ext.rb",
54
+ "lib/cantango/api_ext/macros.rb",
55
+ "lib/cantango/api_ext/macros/account.rb",
56
+ "lib/cantango/api_ext/macros/clazz.rb",
57
+ "lib/cantango/api_ext/macros/user.rb",
50
58
  "spec/cantango/api/ability/account_spec.rb",
51
59
  "spec/cantango/api/ability/user_spec.rb",
52
60
  "spec/cantango/api/account_spec.rb",
53
61
  "spec/cantango/api/attributes_spec.rb",
54
62
  "spec/cantango/api/can/account_spec.rb",
55
63
  "spec/cantango/api/can/user_spec.rb",
64
+ "spec/cantango/api/common_spec.rb",
65
+ "spec/cantango/api/model/account_spec.rb",
66
+ "spec/cantango/api/model/user_spec.rb",
56
67
  "spec/cantango/api/options_spec.rb",
57
68
  "spec/cantango/api/scope/account_spec.rb",
58
69
  "spec/cantango/api/scope/user_spec.rb",
70
+ "spec/cantango/api/session/account_spec.rb",
71
+ "spec/cantango/api/session/user_spec.rb",
59
72
  "spec/cantango/api/user_spec.rb",
73
+ "spec/cantango/api_ext/macros/account_spec.rb",
74
+ "spec/cantango/api_ext/macros/clazz_spec.rb",
75
+ "spec/cantango/api_ext/macros/user_spec.rb",
60
76
  "spec/cantango/api_spec.rb",
61
77
  "spec/cantango_api_spec.rb",
62
78
  "spec/fixtures/models.rb",
@@ -72,31 +88,33 @@ Gem::Specification.new do |s|
72
88
  "spec/helpers/current_users.rb",
73
89
  "spec/spec_helper.rb"
74
90
  ]
75
- s.homepage = "http://github.com/kristianmandrup/cantango-api"
76
- s.licenses = ["MIT"]
77
- s.require_paths = ["lib"]
78
- s.rubygems_version = "1.8.10"
79
- s.summary = "The main API for CanTango"
91
+ s.homepage = %q{http://github.com/kristianmandrup/cantango-api}
92
+ s.licenses = [%q{MIT}]
93
+ s.require_paths = [%q{lib}]
94
+ s.rubygems_version = %q{1.8.6}
95
+ s.summary = %q{The main API for CanTango}
80
96
 
81
97
  if s.respond_to? :specification_version then
82
98
  s.specification_version = 3
83
99
 
84
100
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
85
101
  s.add_runtime_dependency(%q<rails>, [">= 3.1"])
86
- s.add_runtime_dependency(%q<sugar-high>, [">= 0.6.0"])
87
- s.add_runtime_dependency(%q<sweetloader>, ["~> 0.1.0"])
88
- s.add_runtime_dependency(%q<hashie>, [">= 0"])
89
- s.add_runtime_dependency(%q<cantango-config>, [">= 0"])
102
+ s.add_runtime_dependency(%q<sugar-high>, ["~> 0.6.2"])
103
+ s.add_runtime_dependency(%q<sweetloader>, ["~> 0.1.6"])
104
+ s.add_runtime_dependency(%q<hashie>, ["~> 1.2"])
105
+ s.add_runtime_dependency(%q<cantango-config>, [">= 0.1.8.1"])
106
+ s.add_runtime_dependency(%q<cantango-core>, [">= 0.1.9.1"])
90
107
  s.add_development_dependency(%q<bundler>, [">= 1.1.rc"])
91
108
  s.add_development_dependency(%q<jeweler>, [">= 1.6.4"])
92
109
  s.add_development_dependency(%q<rcov>, [">= 0"])
93
110
  s.add_development_dependency(%q<rspec>, [">= 2.6.0"])
94
111
  else
95
112
  s.add_dependency(%q<rails>, [">= 3.1"])
96
- s.add_dependency(%q<sugar-high>, [">= 0.6.0"])
97
- s.add_dependency(%q<sweetloader>, ["~> 0.1.0"])
98
- s.add_dependency(%q<hashie>, [">= 0"])
99
- s.add_dependency(%q<cantango-config>, [">= 0"])
113
+ s.add_dependency(%q<sugar-high>, ["~> 0.6.2"])
114
+ s.add_dependency(%q<sweetloader>, ["~> 0.1.6"])
115
+ s.add_dependency(%q<hashie>, ["~> 1.2"])
116
+ s.add_dependency(%q<cantango-config>, [">= 0.1.8.1"])
117
+ s.add_dependency(%q<cantango-core>, [">= 0.1.9.1"])
100
118
  s.add_dependency(%q<bundler>, [">= 1.1.rc"])
101
119
  s.add_dependency(%q<jeweler>, [">= 1.6.4"])
102
120
  s.add_dependency(%q<rcov>, [">= 0"])
@@ -104,10 +122,11 @@ Gem::Specification.new do |s|
104
122
  end
105
123
  else
106
124
  s.add_dependency(%q<rails>, [">= 3.1"])
107
- s.add_dependency(%q<sugar-high>, [">= 0.6.0"])
108
- s.add_dependency(%q<sweetloader>, ["~> 0.1.0"])
109
- s.add_dependency(%q<hashie>, [">= 0"])
110
- s.add_dependency(%q<cantango-config>, [">= 0"])
125
+ s.add_dependency(%q<sugar-high>, ["~> 0.6.2"])
126
+ s.add_dependency(%q<sweetloader>, ["~> 0.1.6"])
127
+ s.add_dependency(%q<hashie>, ["~> 1.2"])
128
+ s.add_dependency(%q<cantango-config>, [">= 0.1.8.1"])
129
+ s.add_dependency(%q<cantango-core>, [">= 0.1.9.1"])
111
130
  s.add_dependency(%q<bundler>, [">= 1.1.rc"])
112
131
  s.add_dependency(%q<jeweler>, [">= 1.6.4"])
113
132
  s.add_dependency(%q<rcov>, [">= 0"])
@@ -1,21 +1,21 @@
1
1
  module CanTango::Api
2
2
  module Ability
3
3
  module Account
4
- def user_account_ability user_account, options = {}
5
- @account_ability ||= create_ability(user_account, ability_options.merge(options))
4
+ def account_ability account, options = {}
5
+ @account_ability ||= create_ability(account, ability_options.merge(options))
6
6
  end
7
- alias_method :account_ability, :user_account_ability
8
7
 
9
8
  def current_account_ability user_type = :user
10
- user_account_ability get_ability_user_account
9
+ account_ability(get_ability_account user_type)
11
10
  end
12
11
 
13
12
  protected
14
13
 
15
14
  include CanTango::Api::Common
15
+ include CanTango::Api::Attributes
16
16
  include CanTango::Api::Options
17
17
 
18
- def get_ability_user_account user_type = :user
18
+ def get_ability_account user_type = :user
19
19
  account_meth = :"current_#{user_type}_account"
20
20
  return AbilityAccount.guest if !respond_to?(account_meth)
21
21
  AbilityAccount.resolve_account(send account_meth)
@@ -31,7 +31,7 @@ module CanTango::Api
31
31
  end
32
32
 
33
33
  def self.is_account? account
34
- ::CanTango.config.user_accounts.registered_class? account.class
34
+ ::CanTango.config.accounts.registered_class? account.class
35
35
  end
36
36
 
37
37
  def self.guest
@@ -12,6 +12,7 @@ module CanTango::Api
12
12
  protected
13
13
 
14
14
  include CanTango::Api::Common
15
+ include CanTango::Api::Attributes
15
16
  include CanTango::Api::Options
16
17
 
17
18
  def get_ability_user user_type
@@ -1,19 +1,17 @@
1
1
  module CanTango::Api
2
2
  module Account
3
- module All
4
- def self.included base
5
- apis.each do |api|
6
- base.send :include, clazz(api)
7
- end
3
+ def self.included base
4
+ apis.each do |api|
5
+ base.send :include, clazz(api)
8
6
  end
7
+ end
9
8
 
10
- def self.apis
11
- [:ability, :can, :scope, :session]
12
- end
9
+ def self.apis
10
+ [:ability, :can, :scope, :session]
11
+ end
13
12
 
14
- def clazz api
15
- "CanTango::Api::#{api.to_s.camelize}::UserAccount".constantize
16
- end
13
+ def self.clazz api
14
+ "CanTango::Api::#{api.to_s.camelize}::Account".constantize
17
15
  end
18
16
  end
19
17
  end
@@ -2,7 +2,7 @@ module CanTango::Api
2
2
  module Attributes
3
3
  [:read, :edit].each do |action|
4
4
  define_method :"#{action}_attribute" do |name|
5
- :"#{action}_attr_\#{name}"
5
+ :"#{action}_attr_#{name}"
6
6
  end
7
7
 
8
8
  define_method :"#{action}_attributes" do |*names|
@@ -1,13 +1,13 @@
1
1
  module CanTango::Api
2
2
  module Can
3
3
  module Account
4
- include Ability
4
+ include CanTango::Api::Ability::Account
5
5
  # Example: generated from types of accounts! (see below)
6
6
  # def admin_account_can?(*args)
7
7
  # current_account_ability(:admin).can?(*args)
8
8
  # end
9
9
  def self.included(base)
10
- ::CanTango.config.user_accounts.registered.each do |account|
10
+ ::CanTango.config.accounts.registered.each do |account|
11
11
 
12
12
  # by default alias call to current_xxx_account to current_xxx (devise user method) unless already defined!
13
13
  unless base.methods.include? :"current_#{account}_account"
@@ -0,0 +1,67 @@
1
+ require 'active_support/inflector'
2
+
3
+ module CanTango
4
+ module Dsl
5
+ class Relation
6
+ attr_reader :attribute, :permit, :scope, :models
7
+
8
+ include CanTango::Adaptor
9
+ include CanTango::CanCan::RuleClass
10
+
11
+ def initialize attribute, permit, scope, *models, &block
12
+ @attribute = attribute
13
+ @scope = scope
14
+ @permit = permit
15
+ @models = models
16
+
17
+ check_models
18
+ use_adaptor! self, user_scope
19
+ end
20
+
21
+ def can(action)
22
+ models.each do |model|
23
+ rules << rule_class.new(true, action, model, nil, condition_block(model))
24
+ end
25
+ end
26
+
27
+ def cannot(action)
28
+ models.each do |model|
29
+ rules << rule_class.new(false, action, model, nil, condition_block(model))
30
+ end
31
+ end
32
+
33
+ protected
34
+
35
+ def condition_block model
36
+ return attribute_condition(attribute, user_scope) if model.new.respond_to?(attribute)
37
+ return include_condition(plural_attribute, user_scope) if model.new.respond_to?(plural_attribute)
38
+ end
39
+
40
+ def user_scope
41
+ @user_scope ||= (scope == :account) ? permit.user_account : permit.user
42
+ end
43
+
44
+ def scope_key
45
+ @scope_key ||= (scope == :account) ? :user_account : :user
46
+ end
47
+
48
+ def ability
49
+ permit.ability
50
+ end
51
+
52
+ def rules
53
+ ability.send :rules
54
+ end
55
+
56
+ def plural_attribute
57
+ :"#{attribute.to_s.pluralize}"
58
+ end
59
+
60
+ def check_models
61
+ models.each do |model|
62
+ raise "#{model} has no :#{attribute} or :#{plural_attribute} defined" if !model.new.respond_to?(attribute) && !model.new.respond_to?(plural_attribute)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,24 @@
1
+ module CanTango
2
+ module Dsl
3
+ class Scope
4
+ attr_reader :name, :permit
5
+
6
+ def initialize name, permit, &block
7
+ @name = name.to_sym
8
+ @permit = permit
9
+ end
10
+
11
+ ::CanTango.config.user.relations.each do |relationship|
12
+ class_eval %{
13
+ def #{relationship}_of *models, &block
14
+ options = models.extract_options!
15
+ scope = options[:scope] || name
16
+ relation = UserRelation.new :#{relationship}, permit, scope, models, &block
17
+ yield relation if block
18
+ relation
19
+ end
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ module CanTango::Api
2
+ module Can
3
+ module Dsl
4
+ autoload_modules :Relation, :Scope
5
+
6
+ def self.included(base)
7
+ ::CanTango.config.user.relations.each do |relationship|
8
+ base.class_eval %{
9
+ def #{relationship}_of *models, &block
10
+ options = models.extract_options!
11
+ scope = options[:scope] || :user_account
12
+ relation = Relation.new :#{relationship}, self, scope, *models, &block
13
+ yield relation if block
14
+ relation
15
+ end
16
+ }
17
+ end
18
+ end
19
+
20
+ # creates a scope that enforces either using the user or user_account for determining relationship matches on the models
21
+ def scope name, &block
22
+ yield Scope.new name, self, &block
23
+ end
24
+ end
25
+ end
26
+ end
@@ -2,7 +2,7 @@ module CanTango
2
2
  module Api
3
3
  module Can
4
4
  module User
5
- include Ability
5
+ include CanTango::Api::Ability::User
6
6
  # Example: generated from types of accounts! (see below)
7
7
  # def admin_can?(*args)
8
8
  # current_user_ability(:admin).can?(*args)
@@ -1,5 +1,5 @@
1
1
  module CanTango::Api
2
2
  module Can
3
- autoload_modules :User, :Account
3
+ autoload_modules :User, :Account, :Dsl
4
4
  end
5
5
  end
@@ -1,14 +1,27 @@
1
1
  module CanTango::Api
2
2
  module Common
3
- include CanTango::Api::Attributes
4
-
5
3
  def create_ability candidate, opts = {}
6
- CanTango.config.ability.factory_build candidate, opts
4
+ ability = default_ability_class.new candidate, opts
5
+ config.ability.factory_build ability, opts.merge(:modes => execution_modes)
7
6
  end
8
7
 
9
8
  def category label
10
9
  config.models.by_category label
11
10
  end
11
+
12
+ protected
13
+
14
+ def default_ability_class
15
+ CanTango.config.ability.default_class
16
+ end
17
+
18
+ def execution_modes
19
+ CanTango.config.ability.modes || [:no_cache]
20
+ end
21
+
22
+ def config
23
+ CanTango.config
24
+ end
12
25
  end
13
26
  end
14
27
 
@@ -3,8 +3,8 @@ module CanTango::Api
3
3
  module Account
4
4
  attr_writer :active_user, :active_account, :ability_class
5
5
 
6
- def self.included(base)
7
- CanTango.config.users.register base
6
+ def self.included(clazz)
7
+ CanTango.config.accounts.register_account clazz
8
8
  end
9
9
 
10
10
  def active_user
@@ -17,23 +17,16 @@ module CanTango::Api
17
17
  @active_account || self
18
18
  end
19
19
 
20
- def can? *args
21
- ability.can?(*args)
22
- end
23
-
24
- def cannot? *args
25
- ability.cannot?(*args)
26
- end
20
+ # from sugar-high or Active Support
21
+ delegate :can?, :cannot?, :to => :ability
27
22
 
28
23
  protected
29
24
 
30
- def ability
31
- ability_class.new(active_account)
32
- end
33
-
34
- def ability_class
35
- CanTango::Ability::Executor::Modes
36
- end
25
+ include CanTango::Api::Common
26
+
27
+ def ability opts = {}
28
+ create_ability active_account, opts = {}
29
+ end
37
30
  end
38
31
  end
39
32
  end