groupify 0.1.1 → 0.2.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.
data/README.md CHANGED
@@ -20,28 +20,61 @@ Or install it yourself as:
20
20
  ## Getting Started
21
21
  In your group model:
22
22
 
23
- class Group
24
- include Mongoid::Document
25
-
26
- acts_as_group
27
- end
23
+ ```ruby
24
+ class Group
25
+ include Mongoid::Document
26
+
27
+ acts_as_group
28
+ end
29
+ ```
28
30
 
29
31
  In your user model:
30
32
 
31
- class User
32
- include Mongoid::Document
33
-
34
- acts_as_group_member
35
- end
33
+ ```ruby
34
+ class User
35
+ include Mongoid::Document
36
+
37
+ acts_as_group_member
38
+ end
39
+ ```
40
+
41
+ ## Usage
36
42
 
37
43
  Create groups and add members:
38
44
 
39
- group = Group.new
40
- user = User.new
41
-
42
- user.groups << group
43
- or
44
- group.add user
45
+ ```ruby
46
+ group = Group.new
47
+ user = User.new
48
+
49
+ user.groups << group
50
+ or
51
+ group.add user
52
+
53
+ user.in_group?(group) => true
54
+ ```
55
+
56
+ Add to named groups:
57
+
58
+ ```ruby
59
+ user.groups << :admin
60
+ user.in_group?(:admin) => true
61
+ ```
62
+
63
+ Check if two group members share any of the same groups:
64
+
65
+ ```ruby
66
+ user1.shares_any_group?(user2)
67
+ ```
68
+
69
+ Query for groups & members:
70
+
71
+ ```ruby
72
+ User.in_group(group) # Find all users in this group
73
+ Group.with_member(user) # Find all groups with this user
74
+
75
+ User.shares_any_group(user) # Find all users that share any groups with this user
76
+ User.shares_any_named_group(user) # Find all users that share any named groups with this user
77
+ ```
45
78
 
46
79
  Check the specs for more details.
47
80
 
data/groupify.gemspec CHANGED
@@ -25,4 +25,5 @@ Gem::Specification.new do |gem|
25
25
  gem.add_development_dependency "mongoid", "~> 3.0"
26
26
  gem.add_development_dependency 'mongoid-rspec', '~> 1.5.1'
27
27
  end
28
+ gem.add_development_dependency 'database_cleaner'
28
29
  end
@@ -1,3 +1,3 @@
1
1
  module Groupify
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/groupify.rb CHANGED
@@ -1,4 +1,3 @@
1
- require "groupify/version"
2
1
  require 'active_support'
3
2
  require 'mongoid'
4
3
 
@@ -79,14 +78,45 @@ module Groupify
79
78
 
80
79
  included do
81
80
  group_class_name='Group' unless defined?(@group_class_name)
82
- has_and_belongs_to_many :groups, :autosave => true, :inverse_of => nil, :class_name => @group_class_name
81
+ field :named_groups, :type => Array
82
+ has_and_belongs_to_many :groups, :autosave => true, :inverse_of => nil, :class_name => @group_class_name do
83
+ def <<(group)
84
+ case group
85
+ when self.metadata.klass
86
+ super
87
+ else
88
+ (self.base.named_groups ||= []) << group.to_s
89
+ self.base.save if self.metadata.autosave
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ def in_group?(group)
96
+ case group
97
+ when groups.metadata.klass
98
+ self.groups.include?(group)
99
+ else
100
+ self.named_groups ? self.named_groups.include?(group.to_s) : false
101
+ end
102
+ end
103
+
104
+ def in_any_group?(*groups)
105
+ groups.flatten.each do |group|
106
+ return true if in_group?(group)
107
+ end
108
+ return false
109
+ end
110
+
111
+ def in_all_groups?(*groups)
112
+ groups.flatten.each do |group|
113
+ return false unless in_group?(group)
114
+ end
115
+ return true
83
116
  end
84
117
 
85
- def in_group?(group); self.groups.include? group; end
86
- def in_any_group?(*groups); (self.groups & groups.flatten).present?; end
87
- def in_all_groups?(*groups); self.groups == groups.flatten; end
88
118
  def shares_any_group?(other)
89
- in_any_group?(other.groups)
119
+ in_any_group?(other.groups + (other.named_groups || []))
90
120
  end
91
121
 
92
122
  module ClassMethods
@@ -94,10 +124,45 @@ module Groupify
94
124
  def group_class_name=(klass); @group_class_name = klass; end
95
125
 
96
126
  def none; where(:id => nil); end
97
- def in_group(group); group.present? ? where(:group_ids.in => [group.id]) : none; end
98
- def in_any_group(*groups); groups.present? ? where(:group_ids.in => groups.flatten.map{|g|g.id}) : none; end
99
- def in_all_groups(*groups); groups.present? ? where(:group_ids => groups.flatten.map{|g|g.id}) : none; end
100
- def shares_any_group(other); in_any_group(other.groups); end
127
+
128
+ def in_group(group)
129
+ return none unless group.present?
130
+ case group
131
+ when self.reflect_on_association(:groups).klass
132
+ where(:group_ids.in => [group.id])
133
+ else
134
+ in_named_group(group)
135
+ end
136
+ end
137
+
138
+ def in_named_group(named_group)
139
+ named_group.present? ? where(:named_groups.in => [named_group.to_s]) : none
140
+ end
141
+
142
+ def in_any_group(*groups)
143
+ groups.present? ? where(:group_ids.in => groups.flatten.map{|g|g.id}) : none
144
+ end
145
+
146
+ def in_any_named_group(*named_groups)
147
+ named_groups.present? ? where(:named_groups.in => named_groups.flatten.map{|g|g.to_s}) : none
148
+ end
149
+
150
+ def in_all_groups(*groups)
151
+ groups.present? ? where(:group_ids => groups.flatten.map{|g|g.id}) : none
152
+ end
153
+
154
+ def in_all_named_groups(*named_groups)
155
+ named_groups.present? ? where(:named_groups => named_groups.flatten.map{|g|g.to_s}) : none
156
+ end
157
+
158
+ def shares_any_group(other)
159
+ in_any_group(other.groups)
160
+ end
161
+
162
+ def shares_any_named_group(other)
163
+ in_any_named_group(other.named_groups)
164
+ end
165
+
101
166
  end
102
167
  end
103
168
  end
@@ -22,6 +22,11 @@ class MongoidGroup
22
22
  alias_method :users, :mongoid_users
23
23
  end
24
24
 
25
+ class MongoidProject < MongoidGroup
26
+
27
+ alias_method :tasks, :mongoid_tasks
28
+ end
29
+
25
30
  describe MongoidGroup do
26
31
  it { should respond_to :members}
27
32
  it { should respond_to :add }
@@ -82,4 +87,36 @@ describe "MongoidUser" do
82
87
  MongoidUser.in_all_groups(group, group2).first.should eql(user)
83
88
  MongoidUser.in_all_groups([group, group2]).first.should eql(user)
84
89
  end
90
+
91
+ it "can have named groups" do
92
+ user.groups << :admin
93
+ user.groups << :user
94
+ user.named_groups.should include('admin')
95
+
96
+ user.in_group?(:admin).should be_true
97
+ user.in_any_group?(:admin, :user, :test).should be_true
98
+ user.in_all_groups?(:admin, :user).should be_true
99
+ user.in_all_groups?(:admin, 'user', :test).should be_false
100
+
101
+ MongoidUser.in_group(:admin).first.should eql(user)
102
+ MongoidUser.in_named_group(:admin).first.should eql(user)
103
+ MongoidUser.in_any_named_group(:admin, :test).first.should eql(user)
104
+ MongoidUser.in_all_named_groups(:admin, :user).first.should eql(user)
105
+ end
106
+
107
+ it "can check if groups are shared" do
108
+ user.groups << group
109
+ user2 = MongoidUser.create(:groups => [group])
110
+
111
+ user.shares_any_group?(user2).should be_true
112
+ MongoidUser.shares_any_group(user).to_a.should include(user2)
113
+ end
114
+
115
+ it "can check if named groups are shared" do
116
+ user.groups << :admin
117
+ user2 = MongoidUser.create(:named_groups => [:admin])
118
+
119
+ user.shares_any_group?(user2).should be_true
120
+ MongoidUser.shares_any_named_group(user).to_a.should include(user2)
121
+ end
85
122
  end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
- Bundler.require(:default)
4
+ Bundler.require(:default, :test, :development)
5
5
 
6
6
  require 'active_support'
7
7
  require 'active_support/all'
@@ -15,4 +15,20 @@ if Mongoid::VERSION < '3'
15
15
  else
16
16
  Mongoid.load!('./spec/mongoid3.yml', :test)
17
17
  end
18
- #Mongoid.logger.level = :info
18
+ #Mongoid.logger.level = :info
19
+
20
+ RSpec.configure do |config|
21
+ config.order = "random"
22
+
23
+ config.before(:suite) do
24
+ DatabaseCleaner[:mongoid].strategy = :truncation
25
+ end
26
+
27
+ config.before(:each) do
28
+ DatabaseCleaner[:mongoid].start
29
+ end
30
+
31
+ config.after(:each) do
32
+ DatabaseCleaner[:mongoid].clean
33
+ end
34
+ end
metadata CHANGED
@@ -1,64 +1,100 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groupify
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.1.1
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
6
11
  platform: ruby
7
12
  authors:
8
- - dwbutler
13
+ - dwbutler
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2012-08-30 00:00:00 Z
18
+ date: 2012-09-05 00:00:00 -07:00
19
+ default_executable:
14
20
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rails
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
21
- - - ~>
22
- - !ruby/object:Gem::Version
23
- version: "3.2"
24
- type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: rspec
28
- prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
30
- none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
35
- type: :development
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: mongoid
39
- prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: "2.0"
46
- type: :development
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: mongoid-rspec
50
- prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
54
- - - "="
55
- - !ruby/object:Gem::Version
56
- version: 1.4.5
57
- type: :development
58
- version_requirements: *id004
21
+ - !ruby/object:Gem::Dependency
22
+ name: rails
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 3
32
+ - 2
33
+ version: "3.2"
34
+ type: :development
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: mongoid
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 2
61
+ - 0
62
+ version: "2.0"
63
+ type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: mongoid-rspec
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - "="
72
+ - !ruby/object:Gem::Version
73
+ hash: 13
74
+ segments:
75
+ - 1
76
+ - 4
77
+ - 5
78
+ version: 1.4.5
79
+ type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: database_cleaner
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ type: :development
94
+ version_requirements: *id005
59
95
  description: Adds group and membership functionality to Rails models
60
96
  email:
61
- - dwbutler@ucla.edu
97
+ - dwbutler@ucla.edu
62
98
  executables: []
63
99
 
64
100
  extensions: []
@@ -66,19 +102,20 @@ extensions: []
66
102
  extra_rdoc_files: []
67
103
 
68
104
  files:
69
- - .gitignore
70
- - .travis.yml
71
- - Gemfile
72
- - LICENSE
73
- - README.md
74
- - Rakefile
75
- - groupify.gemspec
76
- - lib/groupify.rb
77
- - lib/groupify/version.rb
78
- - spec/groupify/mongoid_spec.rb
79
- - spec/mongoid2.yml
80
- - spec/mongoid3.yml
81
- - spec/spec_helper.rb
105
+ - .gitignore
106
+ - .travis.yml
107
+ - Gemfile
108
+ - LICENSE
109
+ - README.md
110
+ - Rakefile
111
+ - groupify.gemspec
112
+ - lib/groupify.rb
113
+ - lib/groupify/version.rb
114
+ - spec/groupify/mongoid_spec.rb
115
+ - spec/mongoid2.yml
116
+ - spec/mongoid3.yml
117
+ - spec/spec_helper.rb
118
+ has_rdoc: true
82
119
  homepage: https://github.com/dwbutler/groupify
83
120
  licenses: []
84
121
 
@@ -86,28 +123,34 @@ post_install_message:
86
123
  rdoc_options: []
87
124
 
88
125
  require_paths:
89
- - lib
126
+ - lib
90
127
  required_ruby_version: !ruby/object:Gem::Requirement
91
128
  none: false
92
129
  requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: "0"
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ hash: 3
133
+ segments:
134
+ - 0
135
+ version: "0"
96
136
  required_rubygems_version: !ruby/object:Gem::Requirement
97
137
  none: false
98
138
  requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: "0"
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ hash: 3
142
+ segments:
143
+ - 0
144
+ version: "0"
102
145
  requirements: []
103
146
 
104
147
  rubyforge_project:
105
- rubygems_version: 1.8.15
148
+ rubygems_version: 1.3.7
106
149
  signing_key:
107
150
  specification_version: 3
108
151
  summary: Group functionality for Rails
109
152
  test_files:
110
- - spec/groupify/mongoid_spec.rb
111
- - spec/mongoid2.yml
112
- - spec/mongoid3.yml
113
- - spec/spec_helper.rb
153
+ - spec/groupify/mongoid_spec.rb
154
+ - spec/mongoid2.yml
155
+ - spec/mongoid3.yml
156
+ - spec/spec_helper.rb