troles 0.5.1 → 0.5.2

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 (44) hide show
  1. data/Design.textile +68 -0
  2. data/Gemfile +9 -7
  3. data/Gemfile.lock +81 -76
  4. data/README.textile +63 -170
  5. data/VERSION +1 -1
  6. data/lib/trole.rb +2 -2
  7. data/lib/trole_groups/storage/base_many.rb +16 -5
  8. data/lib/troles/adapters/active_record/config.rb +19 -5
  9. data/lib/troles/api/config.rb +1 -1
  10. data/lib/troles/api/core.rb +4 -4
  11. data/lib/troles/common/api/core.rb +13 -14
  12. data/lib/troles/common/api/read.rb +6 -0
  13. data/lib/troles/common/api.rb +3 -2
  14. data/lib/troles/common/config/schema/helpers.rb +30 -11
  15. data/lib/troles/common/config/schema/role_helpers.rb +5 -5
  16. data/lib/troles/common/config/valid_roles.rb +4 -3
  17. data/lib/troles/common/dependencies.rb +1 -1
  18. data/lib/troles/common/storage.rb +16 -4
  19. data/lib/troles/common.rb +2 -2
  20. data/lib/troles/config.rb +4 -4
  21. data/lib/troles/storage/join_ref_many.rb +13 -0
  22. data/lib/troles/storage.rb +6 -5
  23. data/lib/troles.rb +3 -8
  24. data/spec/active_record/migrations/many/custom_join.rb +31 -0
  25. data/spec/active_record/migrations/many/join_ref_many.rb +31 -0
  26. data/spec/active_record/migrations/many/ref_many.rb +0 -8
  27. data/spec/active_record/models/custom_join.rb +13 -0
  28. data/spec/active_record/models/join_ref_many.rb +13 -0
  29. data/spec/active_record/models/ref_many.rb +0 -2
  30. data/spec/active_record/strategies/many/custom_join_spec.rb +46 -0
  31. data/spec/active_record/strategies/many/join_ref_many_spec.rb +46 -0
  32. data/spec/active_record/strategies/many/ref_many_spec.rb +2 -2
  33. data/spec/generic/models/base_user.rb +2 -1
  34. data/spec/trole/strategies/embed_one_spec.rb +1 -1
  35. data/spec/trole/strategies/ref_one_spec.rb +1 -1
  36. data/spec/trole/strategies/string_one_spec.rb +1 -1
  37. data/spec/troles/common/multi_roles_spec.rb +7 -13
  38. data/spec/troles/strategies/bit_many_spec.rb +1 -1
  39. data/spec/troles/strategies/embed_many_spec.rb +1 -1
  40. data/spec/troles/strategies/ref_many_spec.rb +1 -1
  41. data/spec/troles/strategies/string_many_spec.rb +1 -1
  42. data/spec/troles/strategy_helper.rb +1 -1
  43. data/troles.gemspec +38 -24
  44. metadata +72 -42
@@ -41,8 +41,9 @@ module Troles::Common
41
41
  end
42
42
 
43
43
  def get_model_type class_name
44
- return :user if class_name == subject_class
45
- return :role if class_name == object_model
44
+ return :subject if class_name == subject_class
45
+ return :object if class_name == object_model
46
+ return :join if class_name == role_join_model
46
47
  raise "Not a known model: #{class_name}"
47
48
  end
48
49
 
@@ -54,22 +55,40 @@ module Troles::Common
54
55
  from_type = get_model_type from
55
56
  to_type = get_model_type to
56
57
 
57
- model_key = options[:key] ? options[:key] : send("#{from_type}_key")
58
+ key_opts = key_options(type, to_type)
59
+
60
+ model_key = options[:key] ? options[:key] : send("#{to_type}_key", key_opts)
58
61
 
59
62
  class_name = send "#{to_type}_class_name"
60
63
 
61
- options = {:class_name => class_name}
62
- options.merge!(options[:opts]) if options[:opts]
63
- puts "#{from}.#{type} :#{model_key}, #{options.inspect}" if log_on?
64
- from.send(type, model_key, options)
64
+ rel_options = {:class_name => class_name}
65
+
66
+ rel_options.merge!(options[:opts]) if options[:opts]
67
+
68
+ puts "#{from}.#{type} :#{model_key}, #{rel_options.inspect}" if log_on?
69
+
70
+ from.send(type, model_key, rel_options)
65
71
  end
66
72
 
67
- def object_key
68
- make_key object_class_name
73
+ def object_key options = {}
74
+ make_key "#{object_class_name}", options
69
75
  end
70
76
 
71
- def make_key name
72
- name.to_s.gsub(/::/, '__').underscore.pluralize
77
+ def key_options type, obj
78
+ return {:prefix => 't'} if (type == :has_many && obj == :object)
79
+ {}
80
+ end
81
+
82
+ def make_key name, options = {}
83
+ name = name.to_s.gsub(/::/, '__').underscore.pluralize
84
+ parts = name.split('_')
85
+ name = parts.inject([]) do |res, part|
86
+ res << (part != parts.last ? part.singularize : part)
87
+ res
88
+ end.join('_')
89
+
90
+ key = name
91
+ options[:prefix] ? "t#{key}" : key
73
92
  end
74
93
  end
75
94
  end
@@ -6,16 +6,16 @@ module Troles::Common
6
6
  subject_class.to_s
7
7
  end
8
8
 
9
- def subject_key
10
- make_key subject_class_name
9
+ def subject_key options = {}
10
+ make_key subject_class_name, options
11
11
  end
12
12
 
13
13
  def join_class_name
14
- join_model.to_s
14
+ role_join_model.to_s
15
15
  end
16
16
 
17
- def join_key
18
- make_key join_class_name
17
+ def join_key options = {}
18
+ make_key join_class_name, options
19
19
  end
20
20
 
21
21
  def object_class_name
@@ -1,12 +1,13 @@
1
1
  module Troles::Common
2
2
  class Config
3
- module ValidRoles
3
+ module ValidRoles
4
4
  def add_valid_roles *roles
5
5
  valid_roles =valid_roles & roles
6
6
  end
7
7
 
8
8
  def valid_roles= *roles
9
9
  vrs = roles.flatten.map{|r| r.to_s.alpha_numeric}.map(&:to_sym).uniq
10
+
10
11
  raise ArgumentError, "The #{strategy} strategy can only accept 2 valid roles" if (vrs.size > 2) && strategy == :bit_one
11
12
  raise ArgumentError, "The role names you want to be valid are not valid role names. Must be alphanumeric, was: #{roles.flatten}" if vrs.empty?
12
13
  @valid_roles ||= vrs
@@ -14,8 +15,8 @@ module Troles::Common
14
15
 
15
16
  def valid_roles
16
17
  raise "No valid roles defined" if !@valid_roles || @valid_roles.empty?
17
- @valid_roles
18
+ @valid_roles
18
19
  end
19
20
  end
20
21
  end
21
- end
22
+ end
@@ -1,7 +1,7 @@
1
+ require 'sweetloader'
1
2
  require 'sugar-high/kind_of'
2
3
  require 'sugar-high/string'
3
4
  require 'sugar-high/array'
4
- require 'sugar-high/class_ext'
5
5
  require 'active_support/inflector'
6
6
  require 'troles/meta'
7
7
 
@@ -29,6 +29,12 @@ module Troles::Common
29
29
  # @param [Object] the value to set on the role field of the role subject
30
30
  def set_ds_field value
31
31
  return if ds_field_value == value
32
+
33
+ if Troles::Common::Config.log_on?
34
+ puts "Troles::Common::Storage.set_ds_field:"
35
+ puts "#{rolegroup_subject}.#{ds_field_name} = #{value}"
36
+ end
37
+
32
38
  role_subject.send(:"#{ds_field_name}=", value)
33
39
  persist_role_changes!
34
40
  end
@@ -47,10 +53,16 @@ module Troles::Common
47
53
 
48
54
  # Attempts to persist the role field changes
49
55
  # @return [true, false, error] true if saved, false if no save! method, Error on some error
50
- def persist_role_changes!
51
- return false if !role_subject.respond_to? :save!
52
- role_subject.save!
53
- role_subject.publish_change :roles
56
+ def persist_role_changes!
57
+ puts "Troles::Common::Storage::BaseMany.persist_role_changes!" if Troles::Common::Config.log_on?
58
+ if !role_subject.respond_to? :save
59
+ puts "could not save since no #save method on subject: #{role_subject}" if Troles::Common::Config.log_on?
60
+ return false
61
+ else
62
+ puts "#{role_subject}.save" if Troles::Common::Config.log_on?
63
+ role_subject.save
64
+ role_subject.publish_change :roles
65
+ end
54
66
  end
55
67
 
56
68
  protected
data/lib/troles/common.rb CHANGED
@@ -13,5 +13,5 @@ module Troles
13
13
  autoload :Marshaller, 'troles/common/marshaller'
14
14
  autoload :Storage, 'troles/common/storage'
15
15
  autoload :EventManager, 'troles/common/event_manager'
16
- end
17
- end
16
+ end
17
+ end
data/lib/troles/config.rb CHANGED
@@ -1,15 +1,15 @@
1
1
  module Troles
2
- class Config < Troles::Common::Config
2
+ class Config < Troles::Common::Config
3
3
  def initialize subject_class, options = {}
4
4
  super
5
5
  end
6
6
 
7
7
  def configure_models
8
8
  super
9
- end
10
-
9
+ end
10
+
11
11
  def generic?
12
12
  super
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -0,0 +1,13 @@
1
+ # @author Kristian Mandrup
2
+ #
3
+ # Many role storage for storing multiple Role references on the role subject
4
+ #
5
+ # @note all methods potentially operate directly on values in the data store
6
+ #
7
+ module Troles::Storage
8
+ class JoinRefMany < RefMany
9
+ def initialize role_subject
10
+ super
11
+ end
12
+ end
13
+ end
@@ -4,10 +4,11 @@
4
4
  #
5
5
  module Troles
6
6
  module Storage
7
- autoload :BaseMany, 'troles/storage/base_many'
8
- autoload :BitMany, 'troles/storage/bit_many'
9
- autoload :EmbedMany, 'troles/storage/embed_many'
10
- autoload :RefMany, 'troles/storage/ref_many'
11
- autoload :StringMany, 'troles/storage/string_many'
7
+ autoload :BaseMany, 'troles/storage/base_many'
8
+ autoload :BitMany, 'troles/storage/bit_many'
9
+ autoload :EmbedMany, 'troles/storage/embed_many'
10
+ autoload :RefMany, 'troles/storage/ref_many'
11
+ autoload :JoinRefMany, 'troles/storage/join_ref_many'
12
+ autoload :StringMany, 'troles/storage/string_many'
12
13
  end
13
14
  end
data/lib/troles.rb CHANGED
@@ -1,11 +1,6 @@
1
1
  require 'troles/common'
2
2
  require 'troles/macros'
3
3
 
4
- module Troles
5
- autoload :Config, 'troles/config'
6
- autoload :Common, 'troles/common'
7
- autoload :Api, 'troles/api'
8
- autoload :Operations, 'troles/operations'
9
- autoload :Strategy, 'troles/strategy'
10
- autoload :Storage, 'troles/storage'
11
- end
4
+ module Troles
5
+ autoload_modules :Config, :Common, :Api, :Operations, :Strategy, :Storage
6
+ end
@@ -0,0 +1,31 @@
1
+ class CreateCustomJoin < ActiveRecord::Migration
2
+ def self.up
3
+ # down
4
+
5
+ create_table :users do |t|
6
+ # implicit user_id binds to user_id of roles_users join table
7
+ t.string :name
8
+ t.timestamps
9
+ end
10
+
11
+ # join table
12
+ create_table :roles_users_join, :id => false do |t|
13
+ t.integer :user_id
14
+ t.integer :role_id
15
+ end
16
+
17
+
18
+ create_table :roles do |t|
19
+ # implicit role_id binds to role_id of roles_users join table
20
+ t.string :name
21
+ t.timestamps
22
+ end
23
+ end
24
+
25
+ def self.down
26
+ drop_table :users
27
+ drop_table :roles
28
+ drop_table :users_roles
29
+ end
30
+ end
31
+
@@ -0,0 +1,31 @@
1
+ class CreateJoinRefMany < ActiveRecord::Migration
2
+ def self.up
3
+ # down
4
+
5
+ create_table :users do |t|
6
+ # implicit user_id binds to user_id of roles_users join table
7
+ t.string :name
8
+ t.timestamps
9
+ end
10
+
11
+ # join table
12
+ create_table :users_roles, :id => false do |t|
13
+ t.integer :user_id
14
+ t.integer :role_id
15
+ end
16
+
17
+
18
+ create_table :roles do |t|
19
+ # implicit role_id binds to role_id of roles_users join table
20
+ t.string :name
21
+ t.timestamps
22
+ end
23
+ end
24
+
25
+ def self.down
26
+ drop_table :users
27
+ drop_table :roles
28
+ drop_table :users_roles
29
+ end
30
+ end
31
+
@@ -8,13 +8,6 @@ class CreateRefMany < ActiveRecord::Migration
8
8
  t.timestamps
9
9
  end
10
10
 
11
- # join table
12
- create_table :roles_users, :id => false do |t|
13
- t.integer :user_id
14
- t.integer :role_id
15
- end
16
-
17
-
18
11
  create_table :roles do |t|
19
12
  # implicit role_id binds to role_id of roles_users join table
20
13
  t.string :name
@@ -25,7 +18,6 @@ class CreateRefMany < ActiveRecord::Migration
25
18
  def self.down
26
19
  drop_table :users
27
20
  drop_table :roles
28
- drop_table :users_roles
29
21
  end
30
22
  end
31
23
 
@@ -0,0 +1,13 @@
1
+ require "active_record/migrations/many/custom_join"
2
+
3
+ class User < ActiveRecord::Base
4
+ # has_and_belongs_to_many :troles, :class_name => 'Role'
5
+ end
6
+
7
+ class Role < ActiveRecord::Base
8
+ # has_and_belongs_to_many :accounts, :class_name => 'User'
9
+ end
10
+
11
+ class RolesUsersJoin < ActiveRecord::Base
12
+ end
13
+
@@ -0,0 +1,13 @@
1
+ require "active_record/migrations/many/join_ref_many"
2
+
3
+ class User < ActiveRecord::Base
4
+ # has_and_belongs_to_many :troles, :class_name => 'Role'
5
+ end
6
+
7
+ class Role < ActiveRecord::Base
8
+ # has_and_belongs_to_many :accounts, :class_name => 'User'
9
+ end
10
+
11
+ class UsersRoles < ActiveRecord::Base
12
+ end
13
+
@@ -8,6 +8,4 @@ class Role < ActiveRecord::Base
8
8
  # has_and_belongs_to_many :accounts, :class_name => 'User'
9
9
  end
10
10
 
11
- class MyUsersRoles < ActiveRecord::Base
12
- end
13
11
 
@@ -0,0 +1,46 @@
1
+ require "active_record/strategy_helper"
2
+ require 'active_record/models/custom_join'
3
+
4
+ def migrate_up
5
+ CreateCustomJoin.up # run migration
6
+ Config.add_roles [:user, :admin, :editor, :blogger]
7
+ end
8
+
9
+ def migrate_down
10
+ CreateCustomJoin.down
11
+ end
12
+
13
+ User.troles_strategy :ref_many do |c|
14
+ c.valid_roles = [:user, :admin, :blogger, :editor]
15
+ # c.auto_config[:relations] = false
16
+ end.configure! :role_join_model => 'RolesUsersJoin'
17
+
18
+ module UserSetup
19
+ def find_role name
20
+ Role.where(:name => name.to_sym).first
21
+ end
22
+
23
+ def create_no_roles_user
24
+ Factory.create :user, :name => 'no roles', :troles => []
25
+ end
26
+
27
+ def create_user
28
+ Factory.create :user, :name => 'normal', :troles => [ find_role(:user) ]
29
+ end
30
+
31
+ def create_admin_user
32
+ Factory.create :user, :name => 'admin', :troles => [ find_role(:admin) ]
33
+ end
34
+
35
+ def create_complex_user
36
+ Factory.create :user, :name => 'user and admin', :troles => [ find_role(:user), find_role(:admin) ]
37
+ end
38
+ end
39
+
40
+
41
+ require 'troles/common/api_spec' # Common API examples
42
+
43
+ describe 'Troles strategy Custom Join' do
44
+ it_should_behave_like "Common API"
45
+ # it_should_behave_like "Troles API"
46
+ end
@@ -0,0 +1,46 @@
1
+ require "active_record/strategy_helper"
2
+ require 'active_record/models/join_ref_many'
3
+
4
+ def migrate_up
5
+ CreateJoinRefMany.up # run migration
6
+ Config.add_roles [:user, :admin, :editor, :blogger]
7
+ end
8
+
9
+ def migrate_down
10
+ CreateJoinRefMany.down
11
+ end
12
+
13
+ User.troles_strategy :join_ref_many do |c|
14
+ c.valid_roles = [:user, :admin, :blogger, :editor]
15
+ # c.auto_config[:relations] = false
16
+ end.configure!
17
+
18
+ module UserSetup
19
+ def find_role name
20
+ Role.where(:name => name.to_sym).first
21
+ end
22
+
23
+ def create_no_roles_user
24
+ Factory.create :user, :name => 'no roles', :troles => []
25
+ end
26
+
27
+ def create_user
28
+ Factory.create :user, :name => 'normal', :troles => [ find_role(:user) ]
29
+ end
30
+
31
+ def create_admin_user
32
+ Factory.create :user, :name => 'admin', :troles => [ find_role(:admin) ]
33
+ end
34
+
35
+ def create_complex_user
36
+ Factory.create :user, :name => 'user and admin', :troles => [ find_role(:user), find_role(:admin) ]
37
+ end
38
+ end
39
+
40
+
41
+ require 'troles/common/api_spec' # Common API examples
42
+
43
+ describe 'Troles strategy :ref_many_join' do
44
+ it_should_behave_like "Common API"
45
+ # it_should_behave_like "Troles API"
46
+ end
@@ -12,8 +12,8 @@ end
12
12
 
13
13
  User.troles_strategy :ref_many do |c|
14
14
  c.valid_roles = [:user, :admin, :blogger, :editor]
15
- c.auto_config[:relations] = false
16
- end.configure! :role_join_model => 'MyUsersRoles'
15
+ # c.auto_config[:relations] = false
16
+ end.configure!
17
17
 
18
18
  module UserSetup
19
19
  def find_role name
@@ -21,7 +21,8 @@ class BaseUser
21
21
  false
22
22
  end
23
23
 
24
- def save!
24
+ def save
25
25
  true
26
26
  end
27
+ alias_method :save!, :save
27
28
  end
@@ -1,4 +1,4 @@
1
- require 'strategy_helper'
1
+ require 'trole/strategy_helper'
2
2
 
3
3
  User.troles_strategy :embed_one do |c|
4
4
  c.valid_roles = [:user, :admin, :editor, :blogger]
@@ -1,4 +1,4 @@
1
- require 'strategy_helper'
1
+ require 'trole/strategy_helper'
2
2
 
3
3
  User.troles_strategy :ref_one do |c|
4
4
  c.valid_roles = [:user, :admin, :editor, :blogger]
@@ -1,4 +1,4 @@
1
- require 'strategy_helper'
1
+ require 'trole/strategy_helper'
2
2
 
3
3
  User.troles_strategy :string_one do |c|
4
4
  c.valid_roles = [:user, :admin, :editor, :blogger]
@@ -14,7 +14,7 @@ shared_examples_for "Common Write API for multiple roles" do
14
14
  user.has_role?(:admin).should be_true
15
15
  user.has_role?(:user).should be_false
16
16
  user.has_any_role?(:admin, :editor).should be_true
17
- user.has_any_role?(:admin, :user).should be_false
17
+ user.has_any_role?(:user).should be_false
18
18
  user.has_all_roles?(:admin, :editor, :blogger).should be_true
19
19
  end
20
20
 
@@ -23,7 +23,7 @@ shared_examples_for "Common Write API for multiple roles" do
23
23
  user.has_role?(:admin).should be_true
24
24
  user.has_role?(:user).should be_false
25
25
  user.has_any_role?(:admin, :editor).should be_true
26
- user.has_any_role?(:admin, :user).should be_false
26
+ user.has_any_role?(:user).should be_false
27
27
  user.has_all_roles?(:admin, :editor, :blogger).should be_true
28
28
  end
29
29
  end
@@ -48,19 +48,12 @@ shared_examples_for "Common Write API for multiple roles" do
48
48
  user.remove_roles :admin, :admin
49
49
  expect { user.role_list }.to change{user.role_list_value}
50
50
  user.has_role?(:admin).should be_false
51
- user.roles.list.should == [:editor, :blogger]
51
+ user.roles.list.should include(:editor, :blogger)
52
52
  end
53
53
  end
54
54
 
55
55
  describe '#static_role!' do
56
56
  pending 'TODO'
57
-
58
- it "should set set roles to :user only" do
59
- user.static_role!(:guest)
60
- user.has_role?(:guest).should be_true
61
- user.valid_roles.should include(:guest)
62
- lambda { user.set_roles(:admin) }.should raise_error
63
- end
64
57
  end
65
58
  end
66
59
 
@@ -69,7 +62,8 @@ shared_examples_for "Common Operations API for multiple roles" do
69
62
  it "should clear all roles and invalidate roles cache" do
70
63
  user.set_roles :admin
71
64
  user.roles << [:admin, :editor, :blogger]
72
- user.roles.list.should == [:admin, :editor, :blogger]
65
+ user.roles.list.should include(:admin, :editor, :blogger)
66
+
73
67
  user.roles.clear!
74
68
  expect { user.role_list }.to change{user.role_list_value }
75
69
  user.role_list.should be_empty
@@ -81,7 +75,7 @@ shared_examples_for "Common Operations API for multiple roles" do
81
75
  user.set_roles :admin
82
76
  user.roles + [:admin, :editor, :blogger]
83
77
 
84
- user.roles.list.should == [:admin, :editor, :blogger]
78
+ user.roles.list.should include(:admin, :editor, :blogger)
85
79
  user.has_role?(:admin).should be_true
86
80
  user.has_role?(:user).should be_false
87
81
 
@@ -139,4 +133,4 @@ shared_examples_for "Common Operations API for multiple roles" do
139
133
  lambda { user.set_roles(:admin) }.should raise_error
140
134
  end
141
135
  end
142
- end
136
+ end
@@ -1,4 +1,4 @@
1
- require 'strategy_helper'
1
+ require 'troles/strategy_helper'
2
2
 
3
3
  User.troles_strategy :bit_many do |c|
4
4
  c.valid_roles = [:user, :admin, :blogger, :editor]
@@ -1,4 +1,4 @@
1
- require 'strategy_helper'
1
+ require 'troles/strategy_helper'
2
2
 
3
3
  User.troles_strategy :embed_many do |c|
4
4
  c.valid_roles = [:user, :admin, :blogger, :editor]
@@ -1,4 +1,4 @@
1
- require 'strategy_helper'
1
+ require 'troles/strategy_helper'
2
2
 
3
3
  User.troles_strategy :ref_many do |c|
4
4
  c.valid_roles = [:user, :admin, :blogger, :editor]
@@ -1,4 +1,4 @@
1
- require 'strategy_helper'
1
+ require 'troles/strategy_helper'
2
2
 
3
3
  User.troles_strategy :string_many do |c|
4
4
  c.valid_roles = [:user, :admin, :blogger, :editor]
@@ -1,3 +1,3 @@
1
1
  require 'trole_spec_helper'
2
- require 'troles_spec'
2
+ require 'troles_spec'
3
3
  require 'generic/models'