roles_for_mongoid 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/.rspec +1 -0
  2. data/README.markdown +14 -109
  3. data/Rakefile +5 -1
  4. data/VERSION +1 -1
  5. data/lib/generators/mongoid/roles/roles_generator.rb +48 -25
  6. data/lib/roles_mongoid.rb +9 -0
  7. data/lib/roles_mongoid/base.rb +35 -0
  8. data/lib/roles_mongoid/namespaces.rb +12 -0
  9. data/lib/roles_mongoid/role.rb +28 -0
  10. data/lib/roles_mongoid/strategy.rb +15 -0
  11. data/lib/roles_mongoid/strategy/multi/many_roles.rb +65 -0
  12. data/lib/roles_mongoid/strategy/multi/role_strings.rb +63 -0
  13. data/lib/roles_mongoid/strategy/multi/roles_mask.rb +81 -0
  14. data/lib/roles_mongoid/strategy/single/admin_flag.rb +53 -0
  15. data/lib/roles_mongoid/strategy/single/one_role.rb +56 -0
  16. data/lib/roles_mongoid/strategy/single/role_string.rb +51 -0
  17. data/roles_for_mongoid.gemspec +43 -24
  18. data/sandbox/roles_assign.rb +54 -0
  19. data/sandbox/single_role.rb +68 -0
  20. data/spec/roles_mongoid/admin_flag_spec.rb +74 -0
  21. data/spec/roles_mongoid/many_roles_spec.rb +74 -0
  22. data/spec/roles_mongoid/one_role_spec.rb +74 -0
  23. data/spec/roles_mongoid/role_string_spec.rb +73 -0
  24. data/spec/roles_mongoid/role_strings_spec.rb +73 -0
  25. data/spec/roles_mongoid/roles_mask_spec.rb +73 -0
  26. data/spec/spec_helper.rb +17 -7
  27. metadata +94 -25
  28. data/lib/roles_for_mongoid.rb +0 -1
  29. data/lib/roles_for_mongoid/role.rb +0 -4
  30. data/lib/roles_for_mongoid/strategies/admin_flag.rb +0 -17
  31. data/lib/roles_for_mongoid/strategies/inline_role.rb +0 -6
  32. data/lib/roles_for_mongoid/strategies/inline_roles.rb +0 -13
  33. data/lib/roles_for_mongoid/strategies/role_relations.rb +0 -34
  34. data/lib/roles_for_mongoid/strategies/roles_mask.rb +0 -52
  35. data/lib/roles_for_mongoid/user.rb +0 -12
  36. data/spec/roles_for_mongoid/user_admin_field_spec.rb +0 -24
  37. data/spec/roles_for_mongoid/user_inline_role_spec.rb +0 -23
  38. data/spec/roles_for_mongoid/user_inline_roles_spec.rb +0 -27
  39. data/spec/roles_for_mongoid/user_role_relations_spec.rb +0 -37
  40. data/spec/roles_for_mongoid/user_roles_mask_spec.rb +0 -29
  41. data/spec/spec.opts +0 -1
@@ -0,0 +1,81 @@
1
+ module RoleStrategy::Mongoid
2
+ module RolesMask
3
+ def self.default_role_attribute
4
+ :roles_mask
5
+ end
6
+
7
+ def self.included base
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+ def role_attribute
13
+ strategy_class.roles_attribute_name.to_sym
14
+ end
15
+
16
+ def in_role(role)
17
+ mask = calc_index(role.to_s)
18
+ all.select do |user|
19
+ (user.send(role_attribute) & mask) > 0
20
+ end
21
+ end
22
+
23
+ def in_roles(*roles)
24
+ all.select do |user|
25
+ roles.flatten.any? do |role|
26
+ mask = calc_index(role.to_s)
27
+ (user.send(role_attribute) & mask) > 0
28
+ end
29
+ end
30
+ end
31
+
32
+ def calc_index(r)
33
+ 2**strategy_class.valid_roles.index(r.to_sym)
34
+ end
35
+ end
36
+
37
+ module Implementation
38
+ class Roles < ::Set # :nodoc:
39
+ attr_reader :model_instance
40
+
41
+ def initialize(sender, *roles)
42
+ super(*roles)
43
+ @model_instance = sender
44
+ end
45
+
46
+ def <<(role)
47
+ model_instance.roles = super.to_a
48
+ self
49
+ end
50
+ end
51
+
52
+ def role_attribute
53
+ strategy_class.roles_attribute_name
54
+ end
55
+
56
+ # assign roles
57
+ def roles=(*roles)
58
+ self.send("#{role_attribute}=", (roles.flatten.map { |r| r.to_sym } & strategy_class.valid_roles).map { |r| calc_index(r) }.inject { |sum, bitvalue| sum + bitvalue })
59
+ end
60
+ alias_method :role=, :roles=
61
+
62
+ # query assigned roles
63
+ def roles
64
+ strategy_class::Roles.new(self, strategy_class.valid_roles.reject { |r| ((self.send(role_attribute) || 0) & calc_index(r)).zero? })
65
+ end
66
+
67
+ def roles_list
68
+ roles.to_a
69
+ end
70
+
71
+ protected
72
+
73
+ def calc_index(r)
74
+ 2**strategy_class.valid_roles.index(r)
75
+ end
76
+ end
77
+
78
+ extend Roles::Generic::User::Configuration
79
+ configure
80
+ end
81
+ end
@@ -0,0 +1,53 @@
1
+ module RoleStrategy::Mongoid
2
+ module AdminFlag
3
+ def self.default_role_attribute
4
+ :admin_flag
5
+ end
6
+
7
+ def self.included base
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+ def role_attribute
13
+ strategy_class.roles_attribute_name.to_sym
14
+ end
15
+
16
+ def in_role(role_name)
17
+ case role_name.downcase.to_sym
18
+ when :admin
19
+ where(role_attribute => true)
20
+ else
21
+ where(role_attribute => false)
22
+ end
23
+ end
24
+ end
25
+
26
+ module Implementation
27
+ def role_attribute
28
+ strategy_class.roles_attribute_name
29
+ end
30
+
31
+ # assign roles
32
+ def roles=(*new_roles)
33
+ first_role = new_roles.flatten.first
34
+ if valid_role?(first_role)
35
+ self.send("#{role_attribute}=", new_roles.flatten.first.admin?)
36
+ else
37
+ raise ArgumentError, "The role #{first_role} is not a valid role"
38
+ end
39
+ end
40
+
41
+ # query assigned roles
42
+ def roles
43
+ role = self.send(role_attribute) ? strategy_class.admin_role_key : strategy_class.default_role_key
44
+ [role]
45
+ end
46
+ alias_method :roles_list, :roles
47
+
48
+ end # Implementation
49
+
50
+ extend Roles::Generic::User::Configuration
51
+ configure :num => :single
52
+ end
53
+ end
@@ -0,0 +1,56 @@
1
+ module RoleStrategy::Mongoid
2
+ module OneRole
3
+ def self.default_role_attribute
4
+ :one_role
5
+ end
6
+
7
+ def self.included base
8
+ base.extend Roles::Generic::Role::ClassMethods
9
+ base.extend ClassMethods
10
+ end
11
+
12
+ module ClassMethods
13
+ def role_attribute
14
+ strategy_class.roles_attribute_name.to_sym
15
+ end
16
+
17
+ def in_role(role_name)
18
+ in_roles(role_name)
19
+ end
20
+
21
+ def in_roles(*role_names)
22
+ begin
23
+ role_ids = Role.where(:name.in => role_names.to_strings).to_a.map(&:user_id)
24
+ where(:_id.in => role_ids)
25
+ rescue
26
+ return []
27
+ end
28
+ end
29
+ end
30
+
31
+ module Implementation
32
+ # assign roles
33
+ def roles=(*roles)
34
+ raise "Role class #{role_class} does not have a #find_role(role) method" if !role_class.respond_to? :find_role
35
+ first_role = roles.flatten.first
36
+ role_relation = role_class.find_role(first_role)
37
+ self.send("#{role_attribute}=", role_relation)
38
+ one_role.save
39
+ end
40
+ alias_method :role=, :roles=
41
+
42
+ # query assigned roles
43
+ def roles
44
+ role = self.send(role_attribute).name.to_sym
45
+ [role]
46
+ end
47
+
48
+ def roles_list
49
+ self.roles.to_a
50
+ end
51
+ end
52
+
53
+ extend Roles::Generic::User::Configuration
54
+ configure :num => :single, :type => :role_class
55
+ end
56
+ end
@@ -0,0 +1,51 @@
1
+ module RoleStrategy::Mongoid
2
+ module RoleString
3
+ def self.default_role_attribute
4
+ :role_string
5
+ end
6
+
7
+ def self.included base
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+ def role_attribute
13
+ strategy_class.roles_attribute_name.to_sym
14
+ end
15
+
16
+ def in_role(role_name)
17
+ where(role_attribute => role_name)
18
+ end
19
+ end
20
+
21
+
22
+ module Implementation
23
+ def role_attribute
24
+ strategy_class.roles_attribute_name
25
+ end
26
+
27
+ # assign roles
28
+ def roles=(*roles)
29
+ self.role = roles.select_labels.first.to_s
30
+ end
31
+
32
+ def role= role_name
33
+ if role_name.kind_of_label? && valid_role?(role_name)
34
+ self.send("#{role_attribute}=", role_name.to_s)
35
+ end
36
+ end
37
+
38
+ # query assigned roles
39
+ def roles
40
+ role = self.send(role_attribute)
41
+ [role.to_sym]
42
+ end
43
+ alias_method :roles_list, :roles
44
+ end
45
+
46
+ extend Roles::Generic::User::Configuration
47
+ configure :num => :single
48
+ end
49
+ end
50
+
51
+
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{roles_for_mongoid}
8
- s.version = "0.1.1"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kristian Mandrup"]
12
- s.date = %q{2010-08-02}
12
+ s.date = %q{2010-09-06}
13
13
  s.description = %q{Facilitates adding Roles to your Mongoid user models}
14
14
  s.email = %q{kmandrup@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -19,27 +19,33 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".gitignore",
22
+ ".rspec",
22
23
  "LICENSE",
23
24
  "README.markdown",
24
25
  "Rakefile",
25
26
  "VERSION",
26
27
  "lib/generators/mongoid/roles/roles_generator.rb",
27
- "lib/roles_for_mongoid.rb",
28
- "lib/roles_for_mongoid/role.rb",
29
- "lib/roles_for_mongoid/strategies/admin_flag.rb",
30
- "lib/roles_for_mongoid/strategies/inline_role.rb",
31
- "lib/roles_for_mongoid/strategies/inline_roles.rb",
32
- "lib/roles_for_mongoid/strategies/role_relations.rb",
33
- "lib/roles_for_mongoid/strategies/roles_mask.rb",
34
- "lib/roles_for_mongoid/user.rb",
28
+ "lib/roles_mongoid.rb",
29
+ "lib/roles_mongoid/base.rb",
30
+ "lib/roles_mongoid/namespaces.rb",
31
+ "lib/roles_mongoid/role.rb",
32
+ "lib/roles_mongoid/strategy.rb",
33
+ "lib/roles_mongoid/strategy/multi/many_roles.rb",
34
+ "lib/roles_mongoid/strategy/multi/role_strings.rb",
35
+ "lib/roles_mongoid/strategy/multi/roles_mask.rb",
36
+ "lib/roles_mongoid/strategy/single/admin_flag.rb",
37
+ "lib/roles_mongoid/strategy/single/one_role.rb",
38
+ "lib/roles_mongoid/strategy/single/role_string.rb",
35
39
  "roles_for_mongoid.gemspec",
40
+ "sandbox/roles_assign.rb",
41
+ "sandbox/single_role.rb",
36
42
  "sandbox/test.rb",
37
- "spec/roles_for_mongoid/user_admin_field_spec.rb",
38
- "spec/roles_for_mongoid/user_inline_role_spec.rb",
39
- "spec/roles_for_mongoid/user_inline_roles_spec.rb",
40
- "spec/roles_for_mongoid/user_role_relations_spec.rb",
41
- "spec/roles_for_mongoid/user_roles_mask_spec.rb",
42
- "spec/spec.opts",
43
+ "spec/roles_mongoid/admin_flag_spec.rb",
44
+ "spec/roles_mongoid/many_roles_spec.rb",
45
+ "spec/roles_mongoid/one_role_spec.rb",
46
+ "spec/roles_mongoid/role_string_spec.rb",
47
+ "spec/roles_mongoid/role_strings_spec.rb",
48
+ "spec/roles_mongoid/roles_mask_spec.rb",
43
49
  "spec/spec_helper.rb"
44
50
  ]
45
51
  s.homepage = %q{http://github.com/kristianmandrup/roles_for_mm}
@@ -48,11 +54,12 @@ Gem::Specification.new do |s|
48
54
  s.rubygems_version = %q{1.3.7}
49
55
  s.summary = %q{Facilitates adding Roles to your Mongoid user models}
50
56
  s.test_files = [
51
- "spec/roles_for_mongoid/user_admin_field_spec.rb",
52
- "spec/roles_for_mongoid/user_inline_role_spec.rb",
53
- "spec/roles_for_mongoid/user_inline_roles_spec.rb",
54
- "spec/roles_for_mongoid/user_role_relations_spec.rb",
55
- "spec/roles_for_mongoid/user_roles_mask_spec.rb",
57
+ "spec/roles_mongoid/admin_flag_spec.rb",
58
+ "spec/roles_mongoid/many_roles_spec.rb",
59
+ "spec/roles_mongoid/one_role_spec.rb",
60
+ "spec/roles_mongoid/role_string_spec.rb",
61
+ "spec/roles_mongoid/role_strings_spec.rb",
62
+ "spec/roles_mongoid/roles_mask_spec.rb",
56
63
  "spec/spec_helper.rb"
57
64
  ]
58
65
 
@@ -61,12 +68,24 @@ Gem::Specification.new do |s|
61
68
  s.specification_version = 3
62
69
 
63
70
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
64
- s.add_development_dependency(%q<rspec>, [">= 2.0.0.beta.17"])
71
+ s.add_development_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
72
+ s.add_runtime_dependency(%q<mongoid>, ["~> 2.0.0.beta.17"])
73
+ s.add_runtime_dependency(%q<require_all>, ["~> 1.1.0"])
74
+ s.add_runtime_dependency(%q<sugar-high>, ["~> 0.2.3"])
75
+ s.add_runtime_dependency(%q<roles_generic>, ["~> 0.2.2"])
65
76
  else
66
- s.add_dependency(%q<rspec>, [">= 2.0.0.beta.17"])
77
+ s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
78
+ s.add_dependency(%q<mongoid>, ["~> 2.0.0.beta.17"])
79
+ s.add_dependency(%q<require_all>, ["~> 1.1.0"])
80
+ s.add_dependency(%q<sugar-high>, ["~> 0.2.3"])
81
+ s.add_dependency(%q<roles_generic>, ["~> 0.2.2"])
67
82
  end
68
83
  else
69
- s.add_dependency(%q<rspec>, [">= 2.0.0.beta.17"])
84
+ s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
85
+ s.add_dependency(%q<mongoid>, ["~> 2.0.0.beta.17"])
86
+ s.add_dependency(%q<require_all>, ["~> 1.1.0"])
87
+ s.add_dependency(%q<sugar-high>, ["~> 0.2.3"])
88
+ s.add_dependency(%q<roles_generic>, ["~> 0.2.2"])
70
89
  end
71
90
  end
72
91
 
@@ -0,0 +1,54 @@
1
+ require 'mongoid'
2
+
3
+ Mongoid.configure do |config|
4
+ config.master = Mongo::Connection.new.db('testing')
5
+ end
6
+
7
+ Mongoid.database.collections.each do |coll|
8
+ coll.remove
9
+ end
10
+
11
+
12
+ class Role
13
+ include Mongoid::Document
14
+ field :name, :type => String
15
+
16
+ class << self
17
+ def find_roles(*role_names)
18
+ where(:name.in => role_names.flatten).to_a #.map(&:_id)
19
+ end
20
+ alias_method :find_role, :find_roles
21
+ end
22
+ end
23
+
24
+ module Blip
25
+ def self.included(base)
26
+ base.extend ClassMethods
27
+ end
28
+
29
+ module ClassMethods
30
+ def do_it
31
+ instance_eval "references_many :many_roles, :stored_as => :array, :class_name => 'Role'"
32
+ end
33
+ end
34
+ end
35
+
36
+ class User
37
+ include Mongoid::Document
38
+ include Blip
39
+ field :name, :type => String
40
+
41
+ do_it
42
+
43
+ end
44
+
45
+ Role.create :name => 'guest'
46
+ Role.create :name => 'admin'
47
+
48
+ user = User.create :name => 'Kristian'
49
+
50
+ user.many_roles << Role.find_role(:guest)
51
+ user.many_roles << Role.find_role(:admin)
52
+
53
+ puts user.many_roles.inspect
54
+
@@ -0,0 +1,68 @@
1
+ require 'mongoid'
2
+
3
+ Mongoid.configure do |config|
4
+ config.master = Mongo::Connection.new.db('testing')
5
+ end
6
+
7
+ Mongoid.database.collections.each do |coll|
8
+ coll.remove
9
+ end
10
+
11
+
12
+ class Role
13
+ include Mongoid::Document
14
+ field :name, :type => String
15
+ referenced_in :user
16
+
17
+ class << self
18
+ def find_roles(*role_names)
19
+ where(:name.in => role_names.flatten).to_a #.map(&:_id)
20
+ end
21
+ alias_method :find_role, :find_roles
22
+ end
23
+ end
24
+
25
+ module Blip
26
+ def self.included(base)
27
+ base.extend ClassMethods
28
+ end
29
+
30
+ module ClassMethods
31
+ def do_it
32
+ instance_eval "references_one :role" # :class_name => 'Role'
33
+ end
34
+ end
35
+ end
36
+
37
+ class User
38
+ include Mongoid::Document
39
+ include Blip
40
+ field :name, :type => String
41
+ references_one :role
42
+ # do_it
43
+
44
+ end
45
+
46
+ user = User.create
47
+ role = Role.create
48
+
49
+ puts "role: #{role.inspect}"
50
+ user.role = role
51
+
52
+ user.save
53
+
54
+ # Role.create :name => 'guest'
55
+ # Role.create :name => 'admin'
56
+ #
57
+ # user = User.create :name => 'Kristian'
58
+ #
59
+ # puts user.inspect
60
+ #
61
+ # user.role.create :name => :guest
62
+ # user.save
63
+
64
+ # user.role = Role.find_role(:guest).first
65
+ # user.save
66
+
67
+ puts user.role.inspect
68
+