adhocracy 0.3.0 → 0.3.1

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGIyMWQyYTE2OGZmM2MzMDRhNmJkYzYyZDcwMGM3ZWQzMDBkZDNjMw==
4
+ NDgwMjJhOWRkMTNiNWVkODY3YjYwYWMzNjliZjNlZWQ5M2I2ODQwNQ==
5
5
  data.tar.gz: !binary |-
6
- YjdhYWMwMTNlYmE2YzYzNDYyNGQ3MTE3ZWRhY2RkMmYyYjczNzNlNA==
6
+ NzVhY2E5Mjk0NzI3Yjk5NTJjMTg4NjgyZjg2MTA1MzcyMTZiZDJmZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MmYwZjA2ZDYxNzcwOTFmZDE3NDQzYWM2MWNkMjM2MTg1ODUxYjhkMGQyOTBm
10
- OWUwODM3ZmE0MzNjNzllZjE5ZDQ3MWFkYTA1MmM2NzgwMTAzY2ExYzc5YmZi
11
- ZTEzOGE0YmQ4YzU2ZDIyYWM4ZWYwMDQ5MjgyZWJmZTNhM2Q2NGU=
9
+ YjgxNmFmZjkxYzZiY2ZkMzZjNmI3MzQ3NTE1NjY1N2ZhMWMzOTQxNDk4YjVl
10
+ ZjZiMGE4MTE3YWY3NWVjOGMwYzdiZDU5ODFhMzE4MjNkYzZiM2QwNjA3ODkz
11
+ ZjY5YjY3N2Y0YjZkYzQ1YmVkODIyOGQzZWRkMTkwZWVlNmZiNzg=
12
12
  data.tar.gz: !binary |-
13
- NTdkYjk0MGJmNzRiN2VjNmI1ZGUyMGI1NTVkZTE2NzE2OTliNDBjZTNiOWY4
14
- NmNmNGE4ZDFmOTQ2MzFiNGNhMzQzZjRiODk4NzFhZmJkZjEwOTdmNjA1NDg3
15
- NTU4YTg3MDZhYjUzODU2OTg1MTY5ZDAwOWMzOGUxNmI4OGUyZTg=
13
+ ZWVkZmUzYWNmYTcyOTgwZjlmNGQ5Zjg4ZDAyYmIzNDc1YjczODM0NGZhZjUx
14
+ ZTVmZGYwMTVmMzIxMzczODljZWM1NzliZjllNWU0MzRhNzEyYWJhZGI0Mzg2
15
+ Yzc4NjQyNWZmYmVmOTBmNmM2OGU5M2MyYmRjMWE1ZWE4NGJiNzA=
data/README.rdoc CHANGED
@@ -68,14 +68,26 @@ Scenario: You want a special class of membership that has the privilege to edit
68
68
  Adhocracy allows for administrative members called officers. You can create a new officer with:
69
69
 
70
70
  @club.add_officer(@student)
71
-
72
- Alternatively, if `@student` is already a member, you can promote her with:
73
-
74
- @club.promote_to_officer(@student)
71
+ # or
72
+ @student.promote(@club)
75
73
 
76
74
  Later, you can strip an officer of her title with:
77
75
 
78
76
  @club.demote_officer(@student)
77
+ # or
78
+ @student.demote(@club)
79
+
80
+ You can check if a member is an officer with:
81
+
82
+ @club.has_officer?(@member)
83
+ # or
84
+ @member.officer_of?(@club)
85
+
86
+ Or get a full list of officers:
87
+
88
+ @club.officers
89
+ # or of administered groups
90
+ @member.administrations
79
91
 
80
92
  === Inviting Members
81
93
 
@@ -44,15 +44,14 @@ module Adhocracy
44
44
 
45
45
  def add_officer(member)
46
46
  membership = Adhocracy::Membership.where(member: member, group: self).
47
- first_or_create(officer: true)
48
- promote_to_officer(member, membership) unless membership.officer?
49
- membership
50
- end
51
-
52
- def promote_to_officer(member, membership = nil)
53
- membership ||= Adhocracy::Membership.find_by(member: member, group: self)
54
- return false if !membership.present? || membership.officer?
55
- return membership.update_column(:officer, true)
47
+ first_or_initialize(officer: true)
48
+ if membership.new_record?
49
+ membership.save
50
+ else
51
+ return false if membership.officer?
52
+ membership.update_column(:officer, true)
53
+ end
54
+ return membership
56
55
  end
57
56
 
58
57
  def demote_officer(member)
@@ -75,6 +74,11 @@ module Adhocracy
75
74
  MembershipAssociation.new(member: member, group: self).verify_membership
76
75
  end
77
76
 
77
+ def has_officer?(member)
78
+ Adhocracy::Membership.where(member: member, group: self,
79
+ officer: true).exists?
80
+ end
81
+
78
82
  def invited?(member, params = {})
79
83
  params.merge!({ member: member, group: self })
80
84
  MembershipAssociation.new(params).verify_membership_invitation
@@ -10,6 +10,8 @@ module Adhocracy
10
10
  class_name: "Adhocracy::MembershipInvitation"
11
11
  has_many :membership_requests, as: :member,
12
12
  class_name: "Adhocracy::MembershipRequest"
13
+ has_many :officer_memberships, -> { where officer: true }, as: :member,
14
+ class_name: "Adhocracy::Membership"
13
15
 
14
16
  send :include, InstanceMethods
15
17
  end
@@ -20,6 +22,11 @@ module Adhocracy
20
22
  MembershipAssociation.new(member: self).list_groups_for_membership
21
23
  end
22
24
 
25
+ def administrations
26
+ Adhocracy::Membership.where(member: self, officer: true).
27
+ includes(:group).collect { |membership| membership.group }
28
+ end
29
+
23
30
  def group_invitations
24
31
  MembershipAssociation.new(member: self).
25
32
  list_groups_for_membership_invitation
@@ -34,6 +41,24 @@ module Adhocracy
34
41
  MembershipAssociation.new(member: self, group: group).create_membership
35
42
  end
36
43
 
44
+ def promote(group)
45
+ membership = Adhocracy::Membership.where(member: self, group: group).
46
+ first_or_initialize(officer: true)
47
+ if membership.new_record?
48
+ membership.save
49
+ else
50
+ return false if membership.officer?
51
+ membership.update_column(:officer, true)
52
+ end
53
+ return membership
54
+ end
55
+
56
+ def demote(member)
57
+ membership = Adhocracy::Membership.find_by(member: self, group: member)
58
+ return false if !membership.present? || !membership.officer?
59
+ return membership.update_column(:officer, false)
60
+ end
61
+
37
62
  def request_membership_in(group)
38
63
  MembershipAssociation.new(member: self, group: group).
39
64
  create_membership_request
@@ -47,6 +72,11 @@ module Adhocracy
47
72
  MembershipAssociation.new(member: self, group: group).verify_membership
48
73
  end
49
74
 
75
+ def officer_of?(group)
76
+ Adhocracy::Membership.where(member: self, group: group,
77
+ officer: true).exists?
78
+ end
79
+
50
80
  def invited_to?(group, params = {})
51
81
  params.merge!({ member: self, group: group })
52
82
  MembershipAssociation.new(params).verify_membership_invitation
@@ -1,3 +1,3 @@
1
1
  module Adhocracy
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -89,6 +89,15 @@ module Adhocracy
89
89
  expect(@adhoc.has_member?(@user)).to be false
90
90
  end
91
91
 
92
+ it "if an officer exists and returns true if it does" do
93
+ @adhoc.add_officer(@user)
94
+ expect(@adhoc.has_officer?(@user)).to be true
95
+ end
96
+
97
+ it "if an officer exists and returns false if it does not" do
98
+ expect(@adhoc.has_officer?(@user)).to be false
99
+ end
100
+
92
101
  it "if an invitation exists and returns true if it does" do
93
102
  @adhoc.invite_member(@user)
94
103
  expect(@adhoc.invited?(@user)).to be true
@@ -155,7 +164,7 @@ module Adhocracy
155
164
 
156
165
  it "not creating duplicate officers" do
157
166
  @adhoc.add_officer(@user)
158
- expect(@adhoc.add_officer(@user).valid?).to be false
167
+ expect(@adhoc.add_officer(@user)).to be false
159
168
  end
160
169
 
161
170
  it "inviting members" do
@@ -210,24 +219,14 @@ module Adhocracy
210
219
  end
211
220
 
212
221
  it "if the member is a non-officer" do
213
- @adhoc.add_member(@user)
214
- @adhoc.promote_to_officer(@user)
215
- expect(@adhoc.officers).to include @user
216
- end
217
-
218
- it "if the member is a non-officer member (and add_officer is used)" do
219
222
  @adhoc.add_member(@user)
220
223
  @adhoc.add_officer(@user)
221
224
  expect(@adhoc.officers).to include @user
222
225
  end
223
226
 
224
- it "but returns false if the user is not a member" do
225
- expect(@adhoc.promote_to_officer(@user)).to be false
226
- end
227
-
228
227
  it "but returns false if the member is already an officer" do
229
228
  @adhoc.add_officer(@user)
230
- expect(@adhoc.promote_to_officer(@user)).to be false
229
+ expect(@adhoc.add_officer(@user)).to be false
231
230
  end
232
231
  end
233
232
 
@@ -30,7 +30,7 @@ module Adhocracy
30
30
  @adhoc4 = FactoryGirl.create(:adhoc)
31
31
  @adhoc5 = FactoryGirl.create(:adhoc)
32
32
  @user.join_group(@adhoc1)
33
- @user.join_group(@adhoc3)
33
+ @user.promote(@adhoc3)
34
34
  @adhoc4.invite_member(@user)
35
35
  @user.request_membership_in(@adhoc5)
36
36
  end
@@ -43,6 +43,14 @@ module Adhocracy
43
43
  expect(@user.groups).to_not include @adhoc2, @adhoc4, @adhoc5
44
44
  end
45
45
 
46
+ it "including all administered groups" do
47
+ expect(@user.administrations).to include @adhoc3
48
+ end
49
+
50
+ it "excluding non-administered groups" do
51
+ expect(@user.administrations).to_not include @adhoc1, @adhoc2, @adhoc4, @adhoc5
52
+ end
53
+
46
54
  it "including all invited groups" do
47
55
  expect(@user.group_invitations).to include @adhoc4
48
56
  end
@@ -77,6 +85,15 @@ module Adhocracy
77
85
  expect(@user.member_of?(@adhoc)).to be false
78
86
  end
79
87
 
88
+ it "if an officer exists and returns true if it does" do
89
+ @user.promote(@adhoc)
90
+ expect(@user.officer_of?(@adhoc)).to be true
91
+ end
92
+
93
+ it "if an officer exists and returns false if it does not" do
94
+ expect(@user.officer_of?(@adhoc)).to be false
95
+ end
96
+
80
97
  it "if an invitation exists and returns true if it does" do
81
98
  @adhoc.invite_member(@user)
82
99
  expect(@user.invited_to?(@adhoc)).to be true
@@ -142,6 +159,16 @@ module Adhocracy
142
159
  expect(@user.join_group(@adhoc).valid?).to be false
143
160
  end
144
161
 
162
+ it "creating officers" do
163
+ @user.promote(@adhoc)
164
+ expect(@user.administrations).to include @adhoc
165
+ end
166
+
167
+ it "not creating duplicate officers" do
168
+ @user.promote(@adhoc)
169
+ expect(@user.promote(@adhoc)).to be false
170
+ end
171
+
145
172
  it "requesting memberships" do
146
173
  @user.request_membership_in(@adhoc)
147
174
  expect(@user.membership_requests).to include @adhoc
@@ -181,5 +208,40 @@ module Adhocracy
181
208
  end
182
209
  end
183
210
 
211
+ context "promotes members to officers" do
212
+ before :each do
213
+ @adhoc = FactoryGirl.create(:adhoc)
214
+ @user = FactoryGirl.create(:user)
215
+ end
216
+
217
+ it "if the member is a non-officer" do
218
+ @user.promote(@adhoc)
219
+ expect(@adhoc.officers).to include @user
220
+ end
221
+
222
+ it "but returns false if the member is already an officer" do
223
+ @user.promote(@adhoc)
224
+ expect(@user.promote(@adhoc)).to be false
225
+ end
226
+ end
227
+
228
+ context "demotes officers" do
229
+ before :each do
230
+ @adhoc = FactoryGirl.create(:adhoc)
231
+ @user = FactoryGirl.create(:user)
232
+ end
233
+
234
+ it "if the member is an officer" do
235
+ @user.promote(@adhoc)
236
+ @user.demote(@adhoc)
237
+ expect(@adhoc.officers).to_not include @user
238
+ end
239
+
240
+ it "but returns false if the member is not an officer" do
241
+ @adhoc.add_member(@user)
242
+ expect(@user.demote(@adhoc)).to be false
243
+ end
244
+ end
245
+
184
246
  end
185
247
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adhocracy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - timothycommoner
@@ -256,47 +256,47 @@ test_files:
256
256
  - spec/lib/adhocracy/acts_as_group_spec.rb
257
257
  - spec/lib/adhocracy/acts_as_member_spec.rb
258
258
  - spec/dummy/README.rdoc
259
- - spec/dummy/app/helpers/application_helper.rb
260
- - spec/dummy/app/views/layouts/application.html.erb
261
- - spec/dummy/app/assets/stylesheets/application.css
262
- - spec/dummy/app/assets/javascripts/application.js
263
- - spec/dummy/app/models/adhoc.rb
264
- - spec/dummy/app/models/user.rb
265
- - spec/dummy/app/controllers/application_controller.rb
266
- - spec/dummy/db/migrate/20140306214611_create_users.rb
267
- - spec/dummy/db/migrate/20140306214620_create_adhocs.rb
268
- - spec/dummy/db/schema.rb
269
- - spec/dummy/public/422.html
270
- - spec/dummy/public/404.html
271
- - spec/dummy/public/favicon.ico
272
- - spec/dummy/public/500.html
273
- - spec/dummy/Rakefile
274
259
  - spec/dummy/bin/rails
275
260
  - spec/dummy/bin/bundle
276
261
  - spec/dummy/bin/rake
262
+ - spec/dummy/config.ru
263
+ - spec/dummy/db/schema.rb
264
+ - spec/dummy/db/migrate/20140306214611_create_users.rb
265
+ - spec/dummy/db/migrate/20140306214620_create_adhocs.rb
266
+ - spec/dummy/config/routes.rb
267
+ - spec/dummy/config/application.rb
268
+ - spec/dummy/config/environments/test.rb
269
+ - spec/dummy/config/environments/development.rb
270
+ - spec/dummy/config/environments/production.rb
277
271
  - spec/dummy/config/initializers/mime_types.rb
278
- - spec/dummy/config/initializers/inflections.rb
272
+ - spec/dummy/config/initializers/session_store.rb
279
273
  - spec/dummy/config/initializers/backtrace_silencers.rb
280
274
  - spec/dummy/config/initializers/wrap_parameters.rb
281
- - spec/dummy/config/initializers/session_store.rb
282
275
  - spec/dummy/config/initializers/filter_parameter_logging.rb
283
276
  - spec/dummy/config/initializers/secret_token.rb
284
- - spec/dummy/config/application.rb
285
- - spec/dummy/config/environments/test.rb
286
- - spec/dummy/config/environments/development.rb
287
- - spec/dummy/config/environments/production.rb
277
+ - spec/dummy/config/initializers/inflections.rb
288
278
  - spec/dummy/config/boot.rb
289
- - spec/dummy/config/routes.rb
279
+ - spec/dummy/config/database.yml
290
280
  - spec/dummy/config/locales/en.yml
291
281
  - spec/dummy/config/environment.rb
292
- - spec/dummy/config/database.yml
293
- - spec/dummy/config.ru
294
- - spec/spec_helper.rb
282
+ - spec/dummy/Rakefile
283
+ - spec/dummy/public/500.html
284
+ - spec/dummy/public/404.html
285
+ - spec/dummy/public/422.html
286
+ - spec/dummy/public/favicon.ico
287
+ - spec/dummy/app/views/layouts/application.html.erb
288
+ - spec/dummy/app/helpers/application_helper.rb
289
+ - spec/dummy/app/assets/javascripts/application.js
290
+ - spec/dummy/app/assets/stylesheets/application.css
291
+ - spec/dummy/app/controllers/application_controller.rb
292
+ - spec/dummy/app/models/user.rb
293
+ - spec/dummy/app/models/adhoc.rb
294
+ - spec/factories/adhocracy_memberships.rb
295
295
  - spec/factories/adhocracy_membership_requests.rb
296
- - spec/factories/users.rb
297
296
  - spec/factories/adhocracy_membership_invitations.rb
298
- - spec/factories/adhocracy_memberships.rb
299
297
  - spec/factories/adhoc.rb
298
+ - spec/factories/users.rb
299
+ - spec/spec_helper.rb
300
+ - spec/models/adhocracy/membership_invitation_spec.rb
300
301
  - spec/models/adhocracy/membership_spec.rb
301
302
  - spec/models/adhocracy/membership_request_spec.rb
302
- - spec/models/adhocracy/membership_invitation_spec.rb