groupify 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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