groupify 0.4.2 → 0.5.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 +4 -4
- data/.travis.yml +4 -2
- data/Gemfile +4 -0
- data/README.md +16 -5
- data/gemfiles/activesupport4.gemfile +3 -2
- data/groupify.gemspec +1 -0
- data/lib/groupify/adapter/active_record.rb +20 -12
- data/lib/groupify/adapter/mongoid.rb +8 -5
- data/lib/groupify/version.rb +1 -1
- data/spec/groupify/active_record_spec.rb +30 -3
- data/spec/groupify/mongoid_spec.rb +29 -0
- data/spec/spec_helper.rb +3 -1
- metadata +23 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14495b01edcc63635a6d0b077f5fb0227d7d6022
|
4
|
+
data.tar.gz: 4adb33988bdc07fbe2d4a64d4d59c806b51274a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df8017bb4f1e2b123b1bcad6c209f744c03b06161d70fa1a7153f89d34f36bdc4ec79a4cfbda27b665263aecf03bad850fc0ada10fb67570b8b73bda03aedb2b
|
7
|
+
data.tar.gz: 010dd7484806af265d6e869dd98de25ff07e51c527dc80231ebde7928913ee73c77df5b7607c580a5fa6fb3afe7311f224f28145ab9eb2eef8def37d175099a7
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
# Groupify [](http://travis-ci.org/dwbutler/groupify) [](https://gemnasium.com/dwbutler/groupify)
|
1
|
+
# Groupify [](http://travis-ci.org/dwbutler/groupify) [](https://gemnasium.com/dwbutler/groupify) [](https://codeclimate.com/github/dwbutler/groupify)
|
2
|
+
|
2
3
|
Adds group and membership functionality to Rails models.
|
3
4
|
|
4
5
|
The following ORMs are supported:
|
5
|
-
Mongoid 3.1 & 4.0, ActiveRecord 3.2 & 4.
|
6
|
+
Mongoid 3.1 & 4.0, ActiveRecord 3.2 & 4.x
|
6
7
|
|
7
8
|
The following Rubies are supported:
|
8
|
-
Ruby 1.9.3, 2.0.
|
9
|
+
* MRI Ruby 1.9.3, 2.0.x, 2.1.x
|
10
|
+
* JRuby (1.9 mode)
|
9
11
|
|
10
12
|
## Installation
|
11
13
|
|
@@ -21,8 +23,6 @@ Or install it yourself as:
|
|
21
23
|
|
22
24
|
$ gem install groupify
|
23
25
|
|
24
|
-
## Getting Started
|
25
|
-
|
26
26
|
### Active Record
|
27
27
|
Add a migration similar to the following:
|
28
28
|
|
@@ -68,6 +68,14 @@ class Assignment < ActiveRecord::Base
|
|
68
68
|
end
|
69
69
|
```
|
70
70
|
|
71
|
+
You will also need to define a `GroupMembership` model to join groups to members:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
class GroupMembership < ActiveRecord::Base
|
75
|
+
acts_as_group_membership
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
71
79
|
### Mongoid
|
72
80
|
In your group model:
|
73
81
|
|
@@ -104,6 +112,9 @@ group.add user
|
|
104
112
|
|
105
113
|
user.in_group?(group)
|
106
114
|
# => true
|
115
|
+
|
116
|
+
# Add multiple members at once
|
117
|
+
group.add(user, widget, task)
|
107
118
|
```
|
108
119
|
|
109
120
|
Add to named groups:
|
@@ -5,7 +5,8 @@ gem 'activerecord', "~> 4"
|
|
5
5
|
# TODO: Enable once Mongoid 4 is released
|
6
6
|
#gem "mongoid", ">= 4.0"
|
7
7
|
|
8
|
-
gem "mongoid", :github => "mongoid/mongoid"
|
8
|
+
#gem "mongoid", :github => "mongoid/mongoid"
|
9
|
+
gem "mongoid", "4.0.0.beta1"
|
9
10
|
gem 'mongoid-rspec'
|
10
11
|
|
11
12
|
gem 'database_cleaner'
|
@@ -20,4 +21,4 @@ platform :jruby do
|
|
20
21
|
gem "jdbc-sqlite3"
|
21
22
|
# See https://github.com/jruby/activerecord-jdbc-adapter/issues/253
|
22
23
|
gem "activerecord-jdbcsqlite3-adapter", :github => 'jruby/activerecord-jdbc-adapter', :branch => 'v1.3.0.beta2'
|
23
|
-
end
|
24
|
+
end
|
data/groupify.gemspec
CHANGED
@@ -61,17 +61,17 @@ module Groupify
|
|
61
61
|
@member_klasses ||= Set.new
|
62
62
|
has_many :group_memberships, :dependent => :destroy
|
63
63
|
end
|
64
|
-
|
65
|
-
def members
|
66
|
-
self.class.default_member_class.joins(:group_memberships).where(:group_memberships => {:member_type => self.class.default_member_class.to_s}).uniq
|
67
|
-
end
|
68
64
|
|
69
65
|
def member_classes
|
70
66
|
self.class.member_classes
|
71
67
|
end
|
72
68
|
|
73
|
-
def add(
|
74
|
-
|
69
|
+
def add(*members)
|
70
|
+
clear_association_cache
|
71
|
+
|
72
|
+
members.flatten.each do |member|
|
73
|
+
member.groups << self
|
74
|
+
end
|
75
75
|
end
|
76
76
|
|
77
77
|
# Merge a source group into this group.
|
@@ -86,7 +86,7 @@ module Groupify
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def default_member_class
|
89
|
-
@default_member_class ||=
|
89
|
+
@default_member_class ||= (User rescue false)
|
90
90
|
end
|
91
91
|
|
92
92
|
def default_member_class=(klass)
|
@@ -102,11 +102,6 @@ module Groupify
|
|
102
102
|
def has_members(name)
|
103
103
|
klass = name.to_s.classify.constantize
|
104
104
|
register(klass)
|
105
|
-
|
106
|
-
# Define specific members accessor, i.e. group.users
|
107
|
-
define_method name.to_s.pluralize.underscore do
|
108
|
-
klass.joins(:group_memberships).where(:group_memberships => {:group_id => self.id}).uniq
|
109
|
-
end
|
110
105
|
end
|
111
106
|
|
112
107
|
# Merge two groups. The members of the source become members of the destination, and the source is destroyed.
|
@@ -129,8 +124,21 @@ module Groupify
|
|
129
124
|
|
130
125
|
def register(member_klass)
|
131
126
|
(@member_klasses ||= Set.new) << member_klass
|
127
|
+
|
128
|
+
associate_member_class(member_klass)
|
129
|
+
|
132
130
|
member_klass
|
133
131
|
end
|
132
|
+
|
133
|
+
def associate_member_class(member_klass)
|
134
|
+
association_name = member_klass.name.to_s.pluralize.underscore.to_sym
|
135
|
+
source_type = member_klass.base_class
|
136
|
+
has_many association_name, :through => :group_memberships, :source => :member, :source_type => source_type
|
137
|
+
|
138
|
+
if member_klass == default_member_class
|
139
|
+
has_many :members, :through => :group_memberships, :source => :member, :source_type => source_type
|
140
|
+
end
|
141
|
+
end
|
134
142
|
end
|
135
143
|
end
|
136
144
|
|
@@ -52,7 +52,7 @@ module Groupify
|
|
52
52
|
@default_member_class = nil
|
53
53
|
@member_klasses ||= Set.new
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
def members
|
57
57
|
self.class.default_member_class.any_in(:group_ids => [self.id])
|
58
58
|
end
|
@@ -61,8 +61,10 @@ module Groupify
|
|
61
61
|
self.class.member_classes
|
62
62
|
end
|
63
63
|
|
64
|
-
def add(
|
65
|
-
|
64
|
+
def add(*members)
|
65
|
+
members.flatten.each do |member|
|
66
|
+
member.groups << self
|
67
|
+
end
|
66
68
|
end
|
67
69
|
|
68
70
|
# Merge a source group into this group.
|
@@ -110,9 +112,10 @@ module Groupify
|
|
110
112
|
end
|
111
113
|
|
112
114
|
source_group.member_classes.each do |klass|
|
113
|
-
klass.any_in(:group_ids => [source_group.id]).
|
115
|
+
klass.any_in(:group_ids => [source_group.id]).update_all(:$set => {:"group_ids.$" => destination_group.id})
|
114
116
|
end
|
115
|
-
|
117
|
+
|
118
|
+
source_group.delete
|
116
119
|
end
|
117
120
|
|
118
121
|
protected
|
data/lib/groupify/version.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'active_record'
|
3
3
|
|
4
|
+
puts "ActiveRecord version #{ActiveSupport::VERSION::STRING}"
|
5
|
+
|
4
6
|
# Load database config
|
5
7
|
if JRUBY
|
6
8
|
require 'jdbc/sqlite3'
|
@@ -63,6 +65,9 @@ class User < ActiveRecord::Base
|
|
63
65
|
acts_as_named_group_member
|
64
66
|
end
|
65
67
|
|
68
|
+
class Manager < User
|
69
|
+
end
|
70
|
+
|
66
71
|
class Widget < ActiveRecord::Base
|
67
72
|
acts_as_group_member
|
68
73
|
end
|
@@ -71,9 +76,6 @@ class Group < ActiveRecord::Base
|
|
71
76
|
acts_as_group :members => [:users, :widgets], :default_members => :users
|
72
77
|
end
|
73
78
|
|
74
|
-
class Manager < User
|
75
|
-
end
|
76
|
-
|
77
79
|
class Organization < Group
|
78
80
|
has_members :managers
|
79
81
|
end
|
@@ -95,10 +97,20 @@ describe User do
|
|
95
97
|
it { should respond_to :shares_any_group?}
|
96
98
|
end
|
97
99
|
|
100
|
+
#ActiveRecord::Base.logger = Logger.new(STDOUT)
|
101
|
+
|
98
102
|
describe Groupify::ActiveRecord do
|
99
103
|
let(:user) { User.create! }
|
100
104
|
let(:group) { Group.create! }
|
101
105
|
let(:widget) { Widget.create! }
|
106
|
+
|
107
|
+
it "members and groups are empty when initialized" do
|
108
|
+
user.groups.should be_empty
|
109
|
+
User.new.groups.should be_empty
|
110
|
+
|
111
|
+
Group.new.members.should be_empty
|
112
|
+
group.members.should be_empty
|
113
|
+
end
|
102
114
|
|
103
115
|
it "adds a group to a member" do
|
104
116
|
user.groups << group
|
@@ -113,6 +125,16 @@ describe Groupify::ActiveRecord do
|
|
113
125
|
group.members.should include(user)
|
114
126
|
end
|
115
127
|
|
128
|
+
it "adds multiple members to a group" do
|
129
|
+
group.add(user, widget)
|
130
|
+
group.users.should include(user)
|
131
|
+
group.widgets.should include(widget)
|
132
|
+
|
133
|
+
users = [User.create!, User.create!]
|
134
|
+
group.add(users)
|
135
|
+
group.users.should include(*users)
|
136
|
+
end
|
137
|
+
|
116
138
|
it 'lists which member classes can belong to this group' do
|
117
139
|
group.class.member_classes.should include(User, Widget)
|
118
140
|
group.member_classes.should include(User, Widget)
|
@@ -234,8 +256,13 @@ describe Groupify::ActiveRecord do
|
|
234
256
|
|
235
257
|
it "members can check if groups are shared" do
|
236
258
|
user.groups << group
|
259
|
+
widget.groups << group
|
237
260
|
user2 = User.create!(:groups => [group])
|
238
261
|
|
262
|
+
user.shares_any_group?(widget).should be_true
|
263
|
+
Widget.shares_any_group(user).to_a.should include(widget)
|
264
|
+
User.shares_any_group(widget).to_a.should include(user, user2)
|
265
|
+
|
239
266
|
user.shares_any_group?(user2).should be_true
|
240
267
|
User.shares_any_group(user).to_a.should include(user2)
|
241
268
|
end
|
@@ -17,11 +17,14 @@ RSpec.configure do |config|
|
|
17
17
|
end
|
18
18
|
|
19
19
|
require 'mongoid'
|
20
|
+
puts "Mongoid version #{Mongoid::VERSION}"
|
21
|
+
|
20
22
|
require 'mongoid-rspec'
|
21
23
|
include Mongoid::Matchers
|
22
24
|
|
23
25
|
# Load mongoid config
|
24
26
|
Mongoid.load!('./spec/groupify/mongoid.yml', :test)
|
27
|
+
#Moped.logger = Logger.new(STDOUT)
|
25
28
|
|
26
29
|
require 'groupify'
|
27
30
|
require 'groupify/adapter/mongoid'
|
@@ -33,6 +36,9 @@ class MongoidUser
|
|
33
36
|
acts_as_named_group_member
|
34
37
|
end
|
35
38
|
|
39
|
+
class MongoidManager < MongoidUser
|
40
|
+
end
|
41
|
+
|
36
42
|
class MongoidTask
|
37
43
|
include Mongoid::Document
|
38
44
|
|
@@ -55,7 +61,9 @@ end
|
|
55
61
|
|
56
62
|
class MongoidProject < MongoidGroup
|
57
63
|
has_members :mongoid_issues
|
64
|
+
has_members :mongoid_managers
|
58
65
|
alias_method :issues, :mongoid_issues
|
66
|
+
alias_method :managers, :mongoid_managers
|
59
67
|
end
|
60
68
|
|
61
69
|
describe MongoidGroup do
|
@@ -79,6 +87,15 @@ describe Groupify::Mongoid do
|
|
79
87
|
let!(:group) { MongoidGroup.create! }
|
80
88
|
let(:task) { MongoidTask.create! }
|
81
89
|
let(:issue) { MongoidIssue.create! }
|
90
|
+
let(:manager) { MongoidManager.create! }
|
91
|
+
|
92
|
+
it "members and groups are empty when initialized" do
|
93
|
+
user.groups.should be_empty
|
94
|
+
MongoidUser.new.groups.should be_empty
|
95
|
+
|
96
|
+
MongoidGroup.new.members.should be_empty
|
97
|
+
group.members.should be_empty
|
98
|
+
end
|
82
99
|
|
83
100
|
it "adds a group to a member" do
|
84
101
|
user.groups << group
|
@@ -93,6 +110,16 @@ describe Groupify::Mongoid do
|
|
93
110
|
group.members.should include(user)
|
94
111
|
end
|
95
112
|
|
113
|
+
it "adds multiple members to a group" do
|
114
|
+
group.add(user, task)
|
115
|
+
group.users.should include(user)
|
116
|
+
group.tasks.should include(task)
|
117
|
+
|
118
|
+
users = [MongoidUser.create!, MongoidUser.create!]
|
119
|
+
group.add(users)
|
120
|
+
group.users.should include(*users)
|
121
|
+
end
|
122
|
+
|
96
123
|
it 'lists which member classes can belong to this group' do
|
97
124
|
group.class.member_classes.should include(MongoidUser, MongoidTask)
|
98
125
|
group.member_classes.should include(MongoidUser, MongoidTask)
|
@@ -137,12 +164,14 @@ describe Groupify::Mongoid do
|
|
137
164
|
destination = MongoidProject.create!
|
138
165
|
|
139
166
|
source.add(user)
|
167
|
+
source.add(manager)
|
140
168
|
destination.add(task)
|
141
169
|
|
142
170
|
destination.merge!(source)
|
143
171
|
source.destroyed?.should be_true
|
144
172
|
|
145
173
|
destination.users.to_a.should include(user)
|
174
|
+
destination.managers.to_a.should include(manager)
|
146
175
|
destination.tasks.to_a.should include(task)
|
147
176
|
end
|
148
177
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,111 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: groupify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dwbutler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mongoid
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '3.2'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sqlite3
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: mongoid-rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: database_cleaner
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
description: Adds group and membership functionality to Rails models
|
@@ -115,8 +115,8 @@ executables: []
|
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
-
- .gitignore
|
119
|
-
- .travis.yml
|
118
|
+
- ".gitignore"
|
119
|
+
- ".travis.yml"
|
120
120
|
- Gemfile
|
121
121
|
- LICENSE
|
122
122
|
- README.md
|
@@ -134,7 +134,8 @@ files:
|
|
134
134
|
- spec/groupify/mongoid_spec.rb
|
135
135
|
- spec/spec_helper.rb
|
136
136
|
homepage: https://github.com/dwbutler/groupify
|
137
|
-
licenses:
|
137
|
+
licenses:
|
138
|
+
- MIT
|
138
139
|
metadata: {}
|
139
140
|
post_install_message:
|
140
141
|
rdoc_options: []
|
@@ -142,17 +143,17 @@ require_paths:
|
|
142
143
|
- lib
|
143
144
|
required_ruby_version: !ruby/object:Gem::Requirement
|
144
145
|
requirements:
|
145
|
-
- -
|
146
|
+
- - ">="
|
146
147
|
- !ruby/object:Gem::Version
|
147
148
|
version: '0'
|
148
149
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
150
|
requirements:
|
150
|
-
- -
|
151
|
+
- - ">="
|
151
152
|
- !ruby/object:Gem::Version
|
152
153
|
version: '0'
|
153
154
|
requirements: []
|
154
155
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.
|
156
|
+
rubygems_version: 2.2.1
|
156
157
|
signing_key:
|
157
158
|
specification_version: 4
|
158
159
|
summary: Group functionality for Rails
|