groupify 0.7.2 → 0.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a51b9eb2f098c12c38c0931f70239b4c6dcc69a4
4
- data.tar.gz: 583b5b0cd264c7d9a47c61d15fd471510b83d6e0
3
+ metadata.gz: dcc33f0b1cc986893a05a5fdc5e916bd7e3b9837
4
+ data.tar.gz: bbe9793b57fe7c7256193694aed87e7d1de7adf7
5
5
  SHA512:
6
- metadata.gz: 9b170ecd8d041eace85389589d8f12cf817aa2ce09c484350661285e1b690f8e679380e484a4a44855a1de9d994c3e1ecee71e20b5577a53b0ba7dc10d09206d
7
- data.tar.gz: 97e75482a3628024737b26f452febd88f109472b94c8c2e55884f7b6614a789b34cb2ba1da37e3a6cc4f5d1d01438ac71a33cf5e8cbc9c3937c12544bbeebd2e
6
+ metadata.gz: bfa5473767c6bf658020a14ba3f480d0b04ace3997c34377b4dca702dbeab9c4ef3c11354da9264ea453986b20af09472ea513c7ca807e0bc8d3e7f0111935bd
7
+ data.tar.gz: e12229d766b2f5abead3b6d7d6848fb6f7c3b40a7889fe03734e589c35a5b4d017efb0628d902755d51f355264b5b049b160ded876a1fbbfbcd3d0b0f168d1c1
@@ -0,0 +1 @@
1
+ gem_groupify
@@ -1,7 +1,23 @@
1
1
  # Change Log
2
2
 
3
- ## [0.7.1](https://github.com/dwbutler/groupify/tree/0.7.1) (2015-11-19)
4
- [Full Changelog](https://github.com/dwbutler/groupify/compare/v0.7.0...0.7.1)
3
+ ## [v0.8.0](https://github.com/dwbutler/groupify/tree/v0.8.0) (2016-06-10)
4
+ [Full Changelog](https://github.com/dwbutler/groupify/compare/v0.7.2...v0.8.0)
5
+
6
+ **Fixed bugs:**
7
+
8
+ - Setting a group as a group member breaks has\_members associations on that group [\#45](https://github.com/dwbutler/groupify/issues/45)
9
+ - Error on add user a team on Rails 5 Beta [\#39](https://github.com/dwbutler/groupify/issues/39)
10
+ - Split group memberships [\#46](https://github.com/dwbutler/groupify/pull/46) ([juhazi](https://github.com/juhazi))
11
+
12
+ ## [v0.7.2](https://github.com/dwbutler/groupify/tree/v0.7.2) (2016-05-21)
13
+ [Full Changelog](https://github.com/dwbutler/groupify/compare/v0.7.1...v0.7.2)
14
+
15
+ **Merged pull requests:**
16
+
17
+ - Some fixes to prep for rails5 [\#44](https://github.com/dwbutler/groupify/pull/44) ([wadestuart](https://github.com/wadestuart))
18
+
19
+ ## [v0.7.1](https://github.com/dwbutler/groupify/tree/v0.7.1) (2015-11-19)
20
+ [Full Changelog](https://github.com/dwbutler/groupify/compare/v0.7.0...v0.7.1)
5
21
 
6
22
  **Fixed bugs:**
7
23
 
@@ -107,4 +123,4 @@
107
123
  ## [v0.4.0](https://github.com/dwbutler/groupify/tree/v0.4.0) (2013-07-01)
108
124
 
109
125
 
110
- \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
126
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/README.md CHANGED
@@ -129,11 +129,11 @@ Example:
129
129
 
130
130
  ```ruby
131
131
  class Organization < Group
132
- has_members [:offices, :equipment]
132
+ has_members :offices, :equipment
133
133
  end
134
134
  ```
135
135
 
136
- Mongoid works the same way by creating Mongoid relations.
136
+ Mongoid works the same way by creating Mongoid relations.
137
137
 
138
138
  ## Usage
139
139
 
@@ -359,6 +359,15 @@ end
359
359
 
360
360
  ## Upgrading
361
361
 
362
+ ### 0.8+ - Name Change for `group_memberships` Associations (ActiveRecord only)
363
+
364
+ Groupify 0.8+ changed the ActiveRecord adapter to support configuring the same
365
+ model as both a group and a group member. To accomplish this, the internal `group_memberships`
366
+ association was renamed to be different for groups and members. If you were
367
+ using it, please be aware that you will need to change your code. This
368
+ association is considered to be an internal implementation details and not part
369
+ of the public API, so please don't rely on it if you can avoid it.
370
+
362
371
  ### 0.7+ - Polymorphic Groups (ActiveRecord only)
363
372
  Groupify < 0.7 required a single `Group` model used for all group memberships.
364
373
  Groupify 0.7+ supports using multiple models as groups by implementing polymorphic associations.
@@ -381,3 +390,7 @@ table is large.
381
390
  3. Commit your changes (`git commit -am 'Added some feature'`)
382
391
  4. Push to the branch (`git push origin my-new-feature`)
383
392
  5. Create new Pull Request
393
+
394
+ ## Contributors
395
+
396
+ See a list of contributors [here](https://github.com/dwbutler/groupify/graphs/contributors).
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ end
12
12
  require 'github_changelog_generator/task'
13
13
  desc "Regenerate changelog"
14
14
  GitHubChangelogGenerator::RakeTask.new :changelog do |config|
15
- config.future_release = '0.7.1'
15
+ config.future_release = 'v0.8.0'
16
16
  end
17
17
 
18
18
  task :default => :spec
@@ -15,7 +15,7 @@ module Groupify
15
15
  included do
16
16
  @default_member_class = nil
17
17
  @member_klasses ||= Set.new
18
- has_many :group_memberships,
18
+ has_many :group_memberships_as_group,
19
19
  dependent: :destroy,
20
20
  as: :group,
21
21
  class_name: Groupify.group_membership_class_name
@@ -37,7 +37,7 @@ module Groupify
37
37
  members.each do |member|
38
38
  member.groups << self unless member.groups.include?(self)
39
39
  if membership_type
40
- member.group_memberships.where(group_id: id, group_type: self.class.model_name.to_s, membership_type: membership_type).first_or_create!
40
+ member.group_memberships_as_member.where(group_id: id, group_type: self.class.model_name.to_s, membership_type: membership_type).first_or_create!
41
41
  end
42
42
  member.__send__(:clear_association_cache)
43
43
  end
@@ -68,9 +68,11 @@ module Groupify
68
68
  end
69
69
 
70
70
  # Define which classes are members of this group
71
- def has_members(name)
72
- klass = name.to_s.classify.constantize
73
- register(klass)
71
+ def has_members(*names)
72
+ Array.wrap(names.flatten).each do |name|
73
+ klass = name.to_s.classify.constantize
74
+ register(klass)
75
+ end
74
76
  end
75
77
 
76
78
  # Merge two groups. The members of the source become members of the destination, and the source is destroyed.
@@ -78,13 +80,13 @@ module Groupify
78
80
  # Ensure that all the members of the source can be members of the destination
79
81
  invalid_member_classes = (source_group.member_classes - destination_group.member_classes)
80
82
  invalid_member_classes.each do |klass|
81
- if klass.joins(:group_memberships).where(:group_memberships => {:group_id => source_group.id}).count > 0
83
+ if klass.joins(:group_memberships_as_member).where(:group_memberships => {:group_id => source_group.id}).count > 0
82
84
  raise ArgumentError.new("#{source_group.class} has members that cannot belong to #{destination_group.class}")
83
85
  end
84
86
  end
85
87
 
86
88
  source_group.transaction do
87
- source_group.group_memberships.update_all(:group_id => destination_group.id)
89
+ source_group.group_memberships_as_group.update_all(:group_id => destination_group.id)
88
90
  source_group.destroy
89
91
  end
90
92
  end
@@ -109,7 +111,7 @@ module Groupify
109
111
  members = args
110
112
 
111
113
  if opts[:as]
112
- proxy_association.owner.group_memberships.
114
+ proxy_association.owner.group_memberships_as_group.
113
115
  where(member_id: members.map(&:id), member_type: proxy_association.reflection.options[:source_type]).
114
116
  as(opts[:as]).
115
117
  delete_all
@@ -123,7 +125,7 @@ module Groupify
123
125
  members = args
124
126
 
125
127
  if opts[:as]
126
- proxy_association.owner.group_memberships.
128
+ proxy_association.owner.group_memberships_as_group.
127
129
  where(member_id: members.map(&:id), member_type: proxy_association.reflection.options[:source_type]).
128
130
  as(opts[:as]).
129
131
  destroy_all
@@ -148,14 +150,14 @@ module Groupify
148
150
  if ActiveSupport::VERSION::MAJOR > 3
149
151
  has_many association_name,
150
152
  ->{ uniq },
151
- through: :group_memberships,
153
+ through: :group_memberships_as_group,
152
154
  source: :member,
153
155
  source_type: source_type,
154
156
  extend: MemberAssociationExtensions
155
157
  else
156
158
  has_many association_name,
157
159
  uniq: true,
158
- through: :group_memberships,
160
+ through: :group_memberships_as_group,
159
161
  source: :member,
160
162
  source_type: source_type,
161
163
  extend: MemberAssociationExtensions
@@ -13,8 +13,8 @@ module Groupify
13
13
  extend ActiveSupport::Concern
14
14
 
15
15
  included do
16
- unless respond_to?(:group_memberships)
17
- has_many :group_memberships,
16
+ unless respond_to?(:group_memberships_as_member)
17
+ has_many :group_memberships_as_member,
18
18
  as: :member,
19
19
  autosave: true,
20
20
  dependent: :destroy,
@@ -23,14 +23,14 @@ module Groupify
23
23
 
24
24
  if ActiveSupport::VERSION::MAJOR > 3
25
25
  has_many :groups, ->{ uniq },
26
- through: :group_memberships,
26
+ through: :group_memberships_as_member,
27
27
  as: :group,
28
28
  source_type: @group_class_name,
29
29
  extend: GroupAssociationExtensions
30
30
  else
31
31
  has_many :groups,
32
32
  uniq: true,
33
- through: :group_memberships,
33
+ through: :group_memberships_as_member,
34
34
  as: :group,
35
35
  source_type: @group_class_name,
36
36
  extend: GroupAssociationExtensions
@@ -48,7 +48,7 @@ module Groupify
48
48
  groups = args.flatten
49
49
 
50
50
  if opts[:as]
51
- proxy_association.owner.group_memberships.where(group_id: groups.map(&:id)).as(opts[:as]).delete_all
51
+ proxy_association.owner.group_memberships_as_member.where(group_id: groups.map(&:id)).as(opts[:as]).delete_all
52
52
  else
53
53
  super(*groups)
54
54
  end
@@ -59,7 +59,7 @@ module Groupify
59
59
  groups = args.flatten
60
60
 
61
61
  if opts[:as]
62
- proxy_association.owner.group_memberships.where(group_id: groups.map(&:id)).as(opts[:as]).destroy_all
62
+ proxy_association.owner.group_memberships_as_member.where(group_id: groups.map(&:id)).as(opts[:as]).destroy_all
63
63
  else
64
64
  super(*groups)
65
65
  end
@@ -73,7 +73,7 @@ module Groupify
73
73
  criteria.merge!(membership_type: opts[:as])
74
74
  end
75
75
 
76
- group_memberships.exists?(criteria)
76
+ group_memberships_as_member.exists?(criteria)
77
77
  end
78
78
 
79
79
  def in_any_group?(*args)
@@ -106,30 +106,30 @@ module Groupify
106
106
 
107
107
  module ClassMethods
108
108
  def as(membership_type)
109
- joins(:group_memberships).where(group_memberships: { membership_type: membership_type })
109
+ joins(:group_memberships_as_member).where(group_memberships: { membership_type: membership_type })
110
110
  end
111
111
 
112
112
  def in_group(group)
113
113
  return none unless group.present?
114
114
 
115
- joins(:group_memberships).where(group_memberships: { group_id: group.id }).uniq
115
+ joins(:group_memberships_as_member).where(group_memberships: { group_id: group.id }).uniq
116
116
  end
117
117
 
118
118
  def in_any_group(*groups)
119
119
  groups = groups.flatten
120
120
  return none unless groups.present?
121
121
 
122
- joins(:group_memberships).where(group_memberships: { group_id: groups.map(&:id) }).uniq
122
+ joins(:group_memberships_as_member).where(group_memberships: { group_id: groups.map(&:id) }).uniq
123
123
  end
124
124
 
125
125
  def in_all_groups(*groups)
126
126
  groups = groups.flatten
127
127
  return none unless groups.present?
128
128
 
129
- joins(:group_memberships).
129
+ joins(:group_memberships_as_member).
130
130
  group("#{quoted_table_name}.#{connection.quote_column_name('id')}").
131
131
  where(group_memberships: {group_id: groups.map(&:id)}).
132
- having("COUNT(#{reflect_on_association(:group_memberships).klass.quoted_table_name}.#{connection.quote_column_name('group_id')}) = ?", groups.count).
132
+ having("COUNT(#{reflect_on_association(:group_memberships_as_member).klass.quoted_table_name}.#{connection.quote_column_name('group_id')}) = ?", groups.count).
133
133
  uniq
134
134
  end
135
135
 
@@ -137,9 +137,9 @@ module Groupify
137
137
  groups = groups.flatten
138
138
  return none unless groups.present?
139
139
 
140
- joins(:group_memberships).
140
+ joins(:group_memberships_as_member).
141
141
  group("#{quoted_table_name}.#{connection.quote_column_name('id')}").
142
- having("COUNT(DISTINCT #{reflect_on_association(:group_memberships).klass.quoted_table_name}.#{connection.quote_column_name('group_id')}) = ?", groups.count).
142
+ having("COUNT(DISTINCT #{reflect_on_association(:group_memberships_as_member).klass.quoted_table_name}.#{connection.quote_column_name('group_id')}) = ?", groups.count).
143
143
  uniq
144
144
  end
145
145
 
@@ -26,9 +26,7 @@ module Groupify
26
26
  end
27
27
 
28
28
  if (member_klasses = opts.delete :members)
29
- member_klasses.each do |member_klass|
30
- has_members(member_klass)
31
- end
29
+ has_members(member_klasses)
32
30
  end
33
31
  end
34
32
 
@@ -4,7 +4,7 @@ module Groupify
4
4
  class NamedGroupCollection < Set
5
5
  def initialize(member)
6
6
  @member = member
7
- @named_group_memberships = member.group_memberships.named
7
+ @named_group_memberships = member.group_memberships_as_member.named
8
8
  @group_names = @named_group_memberships.pluck(:group_name).map(&:to_sym)
9
9
  super(@group_names)
10
10
  end
@@ -14,18 +14,18 @@ module Groupify
14
14
  membership_type = opts[:as]
15
15
 
16
16
  if @member.new_record?
17
- @member.group_memberships.build(group_name: named_group, membership_type: nil)
17
+ @member.group_memberships_as_member.build(group_name: named_group, membership_type: nil)
18
18
  else
19
19
  @member.transaction do
20
- @member.group_memberships.where(group_name: named_group, membership_type: nil).first_or_create!
20
+ @member.group_memberships_as_member.where(group_name: named_group, membership_type: nil).first_or_create!
21
21
  end
22
22
  end
23
23
 
24
24
  if membership_type
25
25
  if @member.new_record?
26
- @member.group_memberships.build(group_name: named_group, membership_type: membership_type)
26
+ @member.group_memberships_as_member.build(group_name: named_group, membership_type: membership_type)
27
27
  else
28
- @member.group_memberships.where(group_name: named_group, membership_type: membership_type).first_or_create!
28
+ @member.group_memberships_as_member.where(group_name: named_group, membership_type: membership_type).first_or_create!
29
29
  end
30
30
  end
31
31
 
@@ -13,8 +13,8 @@ module Groupify
13
13
  extend ActiveSupport::Concern
14
14
 
15
15
  included do
16
- unless respond_to?(:group_memberships)
17
- has_many :group_memberships,
16
+ unless respond_to?(:group_memberships_as_member)
17
+ has_many :group_memberships_as_member,
18
18
  as: :member,
19
19
  autosave: true,
20
20
  dependent: :destroy,
@@ -63,30 +63,30 @@ module Groupify
63
63
 
64
64
  module ClassMethods
65
65
  def as(membership_type)
66
- joins(:group_memberships).where(group_memberships: {membership_type: membership_type})
66
+ joins(:group_memberships_as_member).where(group_memberships: {membership_type: membership_type})
67
67
  end
68
68
 
69
69
  def in_named_group(named_group)
70
70
  return none unless named_group.present?
71
71
 
72
- joins(:group_memberships).where(group_memberships: {group_name: named_group}).uniq
72
+ joins(:group_memberships_as_member).where(group_memberships: {group_name: named_group}).uniq
73
73
  end
74
74
 
75
75
  def in_any_named_group(*named_groups)
76
76
  named_groups.flatten!
77
77
  return none unless named_groups.present?
78
78
 
79
- joins(:group_memberships).where(group_memberships: {group_name: named_groups.flatten}).uniq
79
+ joins(:group_memberships_as_member).where(group_memberships: {group_name: named_groups.flatten}).uniq
80
80
  end
81
81
 
82
82
  def in_all_named_groups(*named_groups)
83
83
  named_groups.flatten!
84
84
  return none unless named_groups.present?
85
85
 
86
- joins(:group_memberships).
86
+ joins(:group_memberships_as_member).
87
87
  group("#{quoted_table_name}.#{connection.quote_column_name('id')}").
88
88
  where(:group_memberships => {:group_name => named_groups}).
89
- having("COUNT(DISTINCT #{reflect_on_association(:group_memberships).klass.quoted_table_name}.#{connection.quote_column_name('group_name')}) = ?", named_groups.count).
89
+ having("COUNT(DISTINCT #{reflect_on_association(:group_memberships_as_member).klass.quoted_table_name}.#{connection.quote_column_name('group_name')}) = ?", named_groups.count).
90
90
  uniq
91
91
  end
92
92
 
@@ -94,9 +94,9 @@ module Groupify
94
94
  named_groups.flatten!
95
95
  return none unless named_groups.present?
96
96
 
97
- joins(:group_memberships).
97
+ joins(:group_memberships_as_member).
98
98
  group("#{quoted_table_name}.#{connection.quote_column_name('id')}").
99
- having("COUNT(DISTINCT #{reflect_on_association(:group_memberships).klass.quoted_table_name}.#{connection.quote_column_name('group_name')}) = ?", named_groups.count).
99
+ having("COUNT(DISTINCT #{reflect_on_association(:group_memberships_as_member).klass.quoted_table_name}.#{connection.quote_column_name('group_name')}) = ?", named_groups.count).
100
100
  uniq
101
101
  end
102
102
 
@@ -65,9 +65,11 @@ module Groupify
65
65
  end
66
66
 
67
67
  # Define which classes are members of this group
68
- def has_members(name)
69
- klass = name.to_s.classify.constantize
70
- register(klass)
68
+ def has_members(*names)
69
+ Array.wrap(names.flatten).each do |name|
70
+ klass = name.to_s.classify.constantize
71
+ register(klass)
72
+ end
71
73
  end
72
74
 
73
75
  # Merge two groups. The members of the source become members of the destination, and the source is destroyed.
@@ -20,9 +20,7 @@ module Groupify
20
20
  end
21
21
 
22
22
  if (member_klasses = opts.delete :members)
23
- member_klasses.each do |member_klass|
24
- has_members(member_klass)
25
- end
23
+ has_members(member_klasses)
26
24
  end
27
25
  end
28
26
 
@@ -1,3 +1,3 @@
1
1
  module Groupify
2
- VERSION = "0.7.2"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -36,7 +36,7 @@ end
36
36
 
37
37
  require 'groupify/adapter/active_record'
38
38
 
39
- class User < ActiveRecord::Base
39
+ class User < ActiveRecord::Base
40
40
  groupify :group_member
41
41
  groupify :named_group_member
42
42
  end
@@ -58,15 +58,17 @@ class Project < ActiveRecord::Base
58
58
  groupify :named_group_member
59
59
  end
60
60
 
61
- class Group < ActiveRecord::Base
61
+ class Group < ActiveRecord::Base
62
62
  groupify :group, members: [:users, :widgets, "namespaced/members"], default_members: :users
63
63
  end
64
64
 
65
65
  class Organization < Group
66
- has_members :managers
66
+ groupify :group_member
67
+
68
+ has_members :managers, :organizations
67
69
  end
68
70
 
69
- class GroupMembership < ActiveRecord::Base
71
+ class GroupMembership < ActiveRecord::Base
70
72
  groupify :group_membership
71
73
  end
72
74
 
@@ -176,7 +178,7 @@ describe Groupify::ActiveRecord do
176
178
  it "only adds a member to a group once" do
177
179
  group.add user
178
180
  group.add user
179
- expect(user.group_memberships.count).to eq(1)
181
+ expect(user.group_memberships_as_member.count).to eq(1)
180
182
  end
181
183
 
182
184
  it "adds a namespaced member to a group" do
@@ -199,24 +201,31 @@ describe Groupify::ActiveRecord do
199
201
  expect { classroom.add(user) }.to raise_error(ActiveRecord::AssociationTypeMismatch)
200
202
  expect { user.groups << classroom }.to raise_error(ActiveRecord::AssociationTypeMismatch)
201
203
  end
204
+
205
+ it "allows a group to also act as a member" do
206
+ parent_org = Organization.create!
207
+ child_org = Organization.create!
208
+ parent_org.add(child_org)
209
+ expect(parent_org.organizations).to include(child_org)
210
+ end
202
211
  end
203
212
 
204
213
  it "lists which member classes can belong to this group" do
205
214
  expect(group.class.member_classes).to include(User, Widget)
206
215
  expect(group.member_classes).to include(User, Widget)
207
-
216
+
208
217
  expect(Organization.member_classes).to include(User, Widget, Manager)
209
218
  end
210
-
219
+
211
220
  it "finds members by group" do
212
221
  group.add user
213
-
222
+
214
223
  expect(User.in_group(group).first).to eql(user)
215
224
  end
216
225
 
217
226
  it "finds the group a member belongs to" do
218
227
  group.add user
219
-
228
+
220
229
  expect(Group.with_member(user).first).to eq(group)
221
230
  end
222
231
 
@@ -275,14 +284,14 @@ describe Groupify::ActiveRecord do
275
284
  group2 = Group.create!
276
285
  user.groups << group2
277
286
  group3 = Group.create!
278
-
287
+
279
288
  expect(user.groups).to include(group)
280
289
  expect(user.groups).to include(group2)
281
-
290
+
282
291
  expect(User.in_group(group).first).to eql(user)
283
292
  expect(User.in_group(group2).first).to eql(user)
284
293
  expect(user.in_group?(group)).to be true
285
-
294
+
286
295
  expect(User.in_any_group(group).first).to eql(user)
287
296
  expect(User.in_any_group(group3)).to be_empty
288
297
  expect(user.in_any_group?(group2, group3)).to be true
@@ -299,7 +308,7 @@ describe Groupify::ActiveRecord do
299
308
  widget.groups << group
300
309
  user2 = User.create!
301
310
  user2.groups << group
302
-
311
+
303
312
  expect(user.shares_any_group?(widget)).to be true
304
313
  expect(Widget.shares_any_group(user).to_a).to include(widget)
305
314
  expect(User.shares_any_group(widget).to_a).to include(user, user2)
@@ -322,7 +331,7 @@ describe Groupify::ActiveRecord do
322
331
 
323
332
  destination.merge!(source)
324
333
  expect(source.destroyed?).to be true
325
-
334
+
326
335
  expect(destination.users).to include(user, manager)
327
336
  expect(destination.managers).to include(manager)
328
337
  end
@@ -368,8 +377,8 @@ describe Groupify::ActiveRecord do
368
377
 
369
378
  context "when using membership types with groups" do
370
379
  it 'adds groups to a member with a specific membership type' do
371
- user.group_memberships.create!(group: group, as: :admin)
372
-
380
+ user.group_memberships_as_member.create!(group: group, as: :admin)
381
+
373
382
  expect(user.groups).to include(group)
374
383
  expect(group.members).to include(user)
375
384
  expect(group.users).to include(user)
@@ -416,13 +425,13 @@ describe Groupify::ActiveRecord do
416
425
  it "finds the group a member belongs to with a membership type" do
417
426
  group.add user, as: Manager
418
427
  user.groups.create!
419
-
428
+
420
429
  expect(Group.with_member(user).as(Manager)).to eq([group])
421
430
  end
422
431
 
423
432
  it "checks if members belong to any groups with a certain membership type" do
424
433
  group2 = Group.create!
425
- user.group_memberships.create!([{group: group, as: 'employee'}, {group: group2}])
434
+ user.group_memberships_as_member.create!([{group: group, as: 'employee'}, {group: group2}])
426
435
 
427
436
  expect(User.in_any_group(group, group2).as('employee').first).to eql(user)
428
437
  end
@@ -437,8 +446,8 @@ describe Groupify::ActiveRecord do
437
446
  it "checks if members belong to all groups with a certain membership type" do
438
447
  group2 = Group.create!
439
448
  group3 = Group.create!
440
- user.group_memberships.create!([{group: group, as: 'employee'}, {group: group2, as: 'employee'}, {group: group3, as: 'contractor'}])
441
-
449
+ user.group_memberships_as_member.create!([{group: group, as: 'employee'}, {group: group2, as: 'employee'}, {group: group3, as: 'contractor'}])
450
+
442
451
  expect(User.in_all_groups(group, group2).as('employee').first).to eql(user)
443
452
  expect(User.in_all_groups([group, group2]).as('employee').first).to eql(user)
444
453
  expect(User.in_all_groups(group, group3).as('employee')).to be_empty
@@ -452,7 +461,7 @@ describe Groupify::ActiveRecord do
452
461
  group2 = Group.create!
453
462
  group3 = Group.create!
454
463
  group4 = Group.create!
455
- user.group_memberships.create!([{group: group, as: 'employee'}, {group: group2, as: 'employee'}, {group: group3, as: 'contractor'}, {group: group4, as: 'employee'}])
464
+ user.group_memberships_as_member.create!([{group: group, as: 'employee'}, {group: group2, as: 'employee'}, {group: group3, as: 'contractor'}, {group: group4, as: 'employee'}])
456
465
 
457
466
  expect(User.in_only_groups(group, group2, group4).as('employee').first).to eql(user)
458
467
  expect(User.in_only_groups([group, group2]).as('employee')).to be_empty
@@ -467,7 +476,7 @@ describe Groupify::ActiveRecord do
467
476
  it "members can check if groups are shared with the same membership type" do
468
477
  user2 = User.create!
469
478
  group.add(user, user2, widget, as: "Sub Group #1")
470
-
479
+
471
480
  expect(user.shares_any_group?(widget, as: "Sub Group #1")).to be true
472
481
  expect(Widget.shares_any_group(user).as("Sub Group #1").to_a).to include(widget)
473
482
  expect(User.shares_any_group(widget).as("Sub Group #1").to_a).to include(user, user2)
@@ -515,7 +524,7 @@ describe Groupify::ActiveRecord do
515
524
  end
516
525
  end
517
526
  end
518
-
527
+
519
528
  context 'when using named groups' do
520
529
  before(:each) do
521
530
  user.named_groups.concat :admin, :user, :poster
@@ -543,7 +552,7 @@ describe Groupify::ActiveRecord do
543
552
  user.named_groups.destroy_all
544
553
  expect(user.named_groups).to be_empty
545
554
  end
546
-
555
+
547
556
  it "checks if a member belongs to one named group" do
548
557
  expect(user.in_named_group?(:admin)).to be true
549
558
  expect(User.in_named_group(:admin).first).to eql(user)
@@ -576,7 +585,7 @@ describe Groupify::ActiveRecord do
576
585
 
577
586
  it "checks if named groups are shared" do
578
587
  user2 = User.create!(:named_groups => [:admin])
579
-
588
+
580
589
  expect(user.shares_any_named_group?(user2)).to be true
581
590
  expect(User.shares_any_named_group(user).to_a).to include(user2)
582
591
  end
@@ -596,15 +605,15 @@ describe Groupify::ActiveRecord do
596
605
  it "enforces uniqueness of named groups" do
597
606
  user.named_groups << :team1
598
607
  expect(user.named_groups.count{|g| g == :team1}).to eq(1)
599
- expect(user.group_memberships.where(group_name: :team1, membership_type: nil).count).to eq(1)
600
- expect(user.group_memberships.where(group_name: :team1, membership_type: 'employee').count).to eq(1)
608
+ expect(user.group_memberships_as_member.where(group_name: :team1, membership_type: nil).count).to eq(1)
609
+ expect(user.group_memberships_as_member.where(group_name: :team1, membership_type: 'employee').count).to eq(1)
601
610
  expect(user.named_groups.as('employee').count{|g| g == :team1}).to eq(1)
602
611
  end
603
612
 
604
613
  it "enforces uniqueness of group name and membership type for group memberships" do
605
614
  user.named_groups.push :team1, as: 'employee'
606
- expect(user.group_memberships.where(group_name: :team1, membership_type: nil).count).to eq(1)
607
- expect(user.group_memberships.where(group_name: :team1, membership_type: 'employee').count).to eq(1)
615
+ expect(user.group_memberships_as_member.where(group_name: :team1, membership_type: nil).count).to eq(1)
616
+ expect(user.group_memberships_as_member.where(group_name: :team1, membership_type: 'employee').count).to eq(1)
608
617
  expect(user.named_groups.count{|g| g == :team1}).to eq(1)
609
618
  expect(user.named_groups.as('employee').count{|g| g == :team1}).to eq(1)
610
619
  end
@@ -65,7 +65,9 @@ end
65
65
  class MongoidGroup
66
66
  include Mongoid::Document
67
67
 
68
- groupify :group, members: [:mongoid_users, :mongoid_tasks, :mongoid_widgets], default_members: :mongoid_users
68
+ groupify :group, members: [:mongoid_users, :mongoid_tasks, :mongoid_widgets, :mongoid_groups], default_members: :mongoid_users
69
+ groupify :group_member, group_class_name: "MongoidGroup"
70
+
69
71
  alias_method :users, :mongoid_users
70
72
  alias_method :tasks, :mongoid_tasks
71
73
  alias_method :widgets, :mongoid_widgets
@@ -97,28 +99,37 @@ describe Groupify::Mongoid do
97
99
  expect(group.members).to be_empty
98
100
  end
99
101
 
100
- it "adds a group to a member" do
101
- user.groups << group
102
- expect(user.groups).to include(group)
103
- expect(group.members).to include(user)
104
- expect(group.users).to include(user)
105
- end
106
-
107
- it "adds a member to a group" do
108
- expect(user.groups).to be_empty
109
- group.add user
110
- expect(user.groups).to include(group)
111
- expect(group.members).to include(user)
112
- end
102
+ context "when adding" do
103
+ it "adds a group to a member" do
104
+ user.groups << group
105
+ expect(user.groups).to include(group)
106
+ expect(group.members).to include(user)
107
+ expect(group.users).to include(user)
108
+ end
109
+
110
+ it "adds a member to a group" do
111
+ expect(user.groups).to be_empty
112
+ group.add user
113
+ expect(user.groups).to include(group)
114
+ expect(group.members).to include(user)
115
+ end
113
116
 
114
- it "adds multiple members to a group" do
115
- group.add(user, task)
116
- expect(group.users).to include(user)
117
- expect(group.tasks).to include(task)
117
+ it "adds multiple members to a group" do
118
+ group.add(user, task)
119
+ expect(group.users).to include(user)
120
+ expect(group.tasks).to include(task)
118
121
 
119
- users = [MongoidUser.create!, MongoidUser.create!]
120
- group.add(users)
121
- expect(group.users).to include(*users)
122
+ users = [MongoidUser.create!, MongoidUser.create!]
123
+ group.add(users)
124
+ expect(group.users).to include(*users)
125
+ end
126
+
127
+ it "allows a group to also act as a member" do
128
+ parent_group = MongoidGroup.create!
129
+ child_group = MongoidGroup.create!
130
+ parent_group.add(child_group)
131
+ expect(parent_group.mongoid_groups).to include(child_group)
132
+ end
122
133
  end
123
134
 
124
135
  it 'lists which member classes can belong to this group' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groupify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dwbutler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-21 00:00:00.000000000 Z
11
+ date: 2016-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -124,6 +124,7 @@ files:
124
124
  - ".coveralls.yml"
125
125
  - ".gitignore"
126
126
  - ".rspec"
127
+ - ".ruby-gemset"
127
128
  - ".travis.yml"
128
129
  - Appraisals
129
130
  - CHANGELOG.md