mailmanager 1.0.17 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog +6 -1
- data/Gemfile.lock +1 -1
- data/features/list_metadata.feature +6 -0
- data/lib/mailmanager/lib.rb +57 -79
- data/lib/mailmanager/list.rb +12 -0
- data/lib/mailmanager/listproxy.py +4 -4
- data/lib/mailmanager/version.rb +1 -1
- data/spec/lib/mailmanager/lib_spec.rb +36 -20
- data/spec/lib/mailmanager/list_spec.rb +20 -0
- metadata +2 -2
data/Changelog
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
Current version is 1.0.
|
1
|
+
Current version is 1.0.18
|
2
|
+
|
3
|
+
changes since 1.0.17
|
4
|
+
- added host_name getter/setter for lists
|
5
|
+
- cleaned & DRY'd up the lib class a bit
|
6
|
+
- cleaned up the lib spec helper method names
|
2
7
|
|
3
8
|
changes since 1.0.16
|
4
9
|
- removed rubygems-test since it doesn't work yet (says it can't find bundler)
|
data/Gemfile.lock
CHANGED
@@ -29,3 +29,9 @@ Feature: List metadata
|
|
29
29
|
And I set its subject_prefix to "[Foo List] "
|
30
30
|
When I ask for its subject_prefix
|
31
31
|
Then I should get "[Foo List] "
|
32
|
+
|
33
|
+
Scenario: Getting & setting the host name
|
34
|
+
Given I have a list named "foo"
|
35
|
+
And I set its host_name to "groups.foo.org"
|
36
|
+
When I ask for its host_name
|
37
|
+
Then I should get "groups.foo.org"
|
data/lib/mailmanager/lib.rb
CHANGED
@@ -59,153 +59,131 @@ module MailManager
|
|
59
59
|
parse_output(cmd, out)
|
60
60
|
end
|
61
61
|
|
62
|
+
def inject(list, message, queue=nil)
|
63
|
+
cmd = :inject
|
64
|
+
params = {:listname => list.name, :stdin => message}
|
65
|
+
params[:queue] = queue unless queue.nil?
|
66
|
+
command(cmd, params)
|
67
|
+
end
|
68
|
+
|
62
69
|
def list_address(list)
|
63
|
-
|
64
|
-
out = command(cmd, :name => list.name, :wlcmd => :getListAddress)
|
65
|
-
parse_json_output(out)
|
70
|
+
withlist_command(:getListAddress, list)
|
66
71
|
end
|
67
72
|
|
68
73
|
def regular_members(list)
|
69
|
-
|
70
|
-
out = command(cmd, :name => list.name, :wlcmd => :getRegularMemberKeys)
|
71
|
-
parse_json_output(out)
|
74
|
+
withlist_command(:getRegularMemberKeys, list)
|
72
75
|
end
|
73
76
|
|
74
77
|
def digest_members(list)
|
75
|
-
|
76
|
-
out = command(cmd, :name => list.name, :wlcmd => :getDigestMemberKeys)
|
77
|
-
parse_json_output(out)
|
78
|
+
withlist_command(:getDigestMemberKeys, list)
|
78
79
|
end
|
79
80
|
|
80
81
|
def add_member(list, member)
|
81
|
-
|
82
|
-
out = command(cmd, :name => list.name, :wlcmd => :AddMember, :arg => member)
|
83
|
-
parse_json_output(out)
|
82
|
+
withlist_command(:AddMember, list, member)
|
84
83
|
end
|
85
84
|
|
86
85
|
def approved_add_member(list, member)
|
87
|
-
|
88
|
-
out = command(cmd, :name => list.name, :wlcmd => :ApprovedAddMember,
|
89
|
-
:arg => member)
|
90
|
-
parse_json_output(out)
|
86
|
+
withlist_command(:ApprovedAddMember, list, member)
|
91
87
|
end
|
92
88
|
|
93
89
|
def delete_member(list, email)
|
94
|
-
|
95
|
-
out = command(cmd, :name => list.name, :wlcmd => :DeleteMember,
|
96
|
-
:arg => email)
|
97
|
-
parse_json_output(out)
|
90
|
+
withlist_command(:DeleteMember, list, email)
|
98
91
|
end
|
99
92
|
|
100
93
|
def approved_delete_member(list, email)
|
101
|
-
|
102
|
-
out = command(cmd, :name => list.name, :wlcmd => :ApprovedDeleteMember,
|
103
|
-
:arg => email)
|
104
|
-
parse_json_output(out)
|
94
|
+
withlist_command(:ApprovedDeleteMember, list, email)
|
105
95
|
end
|
106
96
|
|
107
97
|
def moderators(list)
|
108
|
-
|
109
|
-
out = command(cmd, :name => list.name, :wlcmd => :moderator)
|
110
|
-
parse_json_output(out)
|
98
|
+
withlist_command(:moderator, list)
|
111
99
|
end
|
112
100
|
|
113
101
|
def add_moderator(list, email)
|
114
102
|
if moderators(list)['return'].include?(email)
|
115
103
|
raise ModeratorAlreadyExistsError, "#{email} is already a moderator of #{list.name}"
|
116
104
|
end
|
117
|
-
|
118
|
-
out = command(cmd, :name => list.name, :wlcmd => 'moderator.append',
|
119
|
-
:arg => email)
|
120
|
-
parse_json_output(out)
|
105
|
+
withlist_command('moderator.append', list, email)
|
121
106
|
end
|
122
107
|
|
123
108
|
def delete_moderator(list, email)
|
124
109
|
unless moderators(list)['return'].include?(email)
|
125
110
|
raise ModeratorNotFoundError, "#{email} is not a moderator of #{list.name}"
|
126
111
|
end
|
127
|
-
|
128
|
-
out = command(cmd, :name => list.name, :wlcmd => 'moderator.remove',
|
129
|
-
:arg => email)
|
130
|
-
parse_json_output(out)
|
112
|
+
withlist_command('moderator.remove', list, email)
|
131
113
|
end
|
132
114
|
|
133
|
-
def inject(list, message, queue=nil)
|
134
|
-
cmd = :inject
|
135
|
-
params = {:listname => list.name, :stdin => message}
|
136
|
-
params[:queue] = queue unless queue.nil?
|
137
|
-
command(cmd, params)
|
138
|
-
end
|
139
|
-
|
140
|
-
# TODO: DRY this up!
|
141
|
-
|
142
115
|
def web_page_url(list)
|
143
|
-
|
144
|
-
out = command(cmd, :name => list.name, :wlcmd => 'web_page_url')
|
145
|
-
parse_json_output(out)
|
116
|
+
withlist_command('web_page_url', list)
|
146
117
|
end
|
147
118
|
|
148
119
|
def request_email(list)
|
149
|
-
|
150
|
-
out = command(cmd, :name => list.name, :wlcmd => :GetRequestEmail)
|
151
|
-
parse_json_output(out)
|
120
|
+
withlist_command(:GetRequestEmail, list)
|
152
121
|
end
|
153
122
|
|
154
123
|
def description(list)
|
155
|
-
|
156
|
-
out = command(cmd, :name => list.name, :wlcmd => :description)
|
157
|
-
parse_json_output(out)
|
124
|
+
withlist_command(:description, list)
|
158
125
|
end
|
159
126
|
|
160
|
-
def
|
161
|
-
|
162
|
-
out = command(cmd, :name => list.name, :wlcmd => :subject_prefix)
|
163
|
-
parse_json_output(out)
|
127
|
+
def set_description(list, desc)
|
128
|
+
withlist_command(:description, list, desc)
|
164
129
|
end
|
165
130
|
|
166
|
-
def
|
167
|
-
|
168
|
-
out = command(cmd, :name => list.name, :wlcmd => :description, :arg => desc)
|
169
|
-
parse_json_output(out)
|
131
|
+
def subject_prefix(list)
|
132
|
+
withlist_command(:subject_prefix, list)
|
170
133
|
end
|
171
134
|
|
172
135
|
def set_subject_prefix(list, sp)
|
173
|
-
|
174
|
-
|
136
|
+
withlist_command(:subject_prefix, list, sp)
|
137
|
+
end
|
138
|
+
|
139
|
+
def host_name(list)
|
140
|
+
withlist_command(:host_name, list)
|
141
|
+
end
|
142
|
+
|
143
|
+
def set_host_name(list, host_name)
|
144
|
+
withlist_command(:host_name, list, host_name)
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
def withlist_command(wlcmd, list, *args)
|
150
|
+
params = {:name => list.name, :wlcmd => wlcmd}
|
151
|
+
params[:arg] = args[0] unless args[0].nil?
|
152
|
+
out = command(:withlist, params)
|
175
153
|
parse_json_output(out)
|
176
154
|
end
|
177
155
|
|
178
|
-
def command(cmd,
|
156
|
+
def command(cmd, params = {})
|
179
157
|
mailman_cmd = "#{mailmanager.root}/bin/#{cmd.to_s} "
|
180
|
-
# delete
|
158
|
+
# delete params as we handle them explicitly
|
181
159
|
stdin = nil
|
182
|
-
stdin =
|
160
|
+
stdin = params.delete(:stdin) if params.respond_to?(:has_key?) && params.has_key?(:stdin)
|
183
161
|
case cmd
|
184
162
|
when :newlist
|
185
163
|
mailman_cmd += "-q "
|
186
|
-
raise ArgumentError, "Missing :name param" if
|
187
|
-
raise ArgumentError, "Missing :admin_email param" if
|
188
|
-
raise ArgumentError, "Missing :admin_password param" if
|
164
|
+
raise ArgumentError, "Missing :name param" if params[:name].nil?
|
165
|
+
raise ArgumentError, "Missing :admin_email param" if params[:admin_email].nil?
|
166
|
+
raise ArgumentError, "Missing :admin_password param" if params[:admin_password].nil?
|
189
167
|
mailman_cmd_suffix = [:name, :admin_email, :admin_password].map { |key|
|
190
|
-
escape(
|
168
|
+
escape(params.delete(key))
|
191
169
|
}.join(' ')
|
192
170
|
mailman_cmd += "#{mailman_cmd_suffix} "
|
193
171
|
when :rmlist
|
194
|
-
raise ArgumentError, "Missing :name param" if
|
195
|
-
mailman_cmd += "#{escape(
|
172
|
+
raise ArgumentError, "Missing :name param" if params[:name].nil?
|
173
|
+
mailman_cmd += "#{escape(params.delete(:name))} "
|
196
174
|
when :withlist
|
197
|
-
raise ArgumentError, "Missing :name param" if
|
175
|
+
raise ArgumentError, "Missing :name param" if params[:name].nil?
|
198
176
|
proxy_path = File.dirname(__FILE__)
|
199
177
|
mailman_cmd = "PYTHONPATH=#{proxy_path} #{MailManager.python} #{mailman_cmd}"
|
200
|
-
mailman_cmd += "-q -r listproxy.command #{escape(
|
201
|
-
"#{
|
202
|
-
if !
|
203
|
-
mailman_cmd += "#{escape(
|
178
|
+
mailman_cmd += "-q -r listproxy.command #{escape(params.delete(:name))} " +
|
179
|
+
"#{params.delete(:wlcmd)} "
|
180
|
+
if !params[:arg].nil? && params[:arg].length > 0
|
181
|
+
mailman_cmd += "#{escape(params.delete(:arg))} "
|
204
182
|
end
|
205
183
|
end
|
206
184
|
|
207
|
-
# assume any leftover
|
208
|
-
mailman_cmd +=
|
185
|
+
# assume any leftover params are POSIX-style args
|
186
|
+
mailman_cmd += params.keys.map { |k| "--#{k}=#{escape(params[k])}" }.join(' ')
|
209
187
|
mailman_cmd += ' ' if mailman_cmd[-1,1] != ' '
|
210
188
|
mailman_cmd += "2>&1"
|
211
189
|
if MailManager.debug
|
data/lib/mailmanager/list.rb
CHANGED
@@ -158,6 +158,18 @@ EOF
|
|
158
158
|
result['result'].to_sym
|
159
159
|
end
|
160
160
|
|
161
|
+
# Returns the list's host name
|
162
|
+
def host_name
|
163
|
+
result = lib.host_name(self)
|
164
|
+
result['return']
|
165
|
+
end
|
166
|
+
|
167
|
+
# Sets the list's host name
|
168
|
+
def host_name=(host_name)
|
169
|
+
result = lib.set_host_name(self, host_name)
|
170
|
+
result['result'].to_sym
|
171
|
+
end
|
172
|
+
|
161
173
|
private
|
162
174
|
|
163
175
|
def add_member_using(method, email, name)
|
@@ -47,10 +47,10 @@ def unwindattrs(obj, attrname, *args):
|
|
47
47
|
return unwindattrs(nextobj, nextattrname, *args)
|
48
48
|
|
49
49
|
needs_userdesc = dict(AddMember=True, ApprovedAddMember=True)
|
50
|
-
needs_save = dict(AddMember=True, ApprovedAddMember=True,
|
51
|
-
|
52
|
-
|
53
|
-
needs_save_with_arg = dict(description=True, subject_prefix=True)
|
50
|
+
needs_save = dict(AddMember=True, ApprovedAddMember=True, DeleteMember=True,
|
51
|
+
ApprovedDeleteMember=True, moderator_append=True,
|
52
|
+
moderator_remove=True)
|
53
|
+
needs_save_with_arg = dict(description=True, subject_prefix=True, host_name=True)
|
54
54
|
|
55
55
|
def command(mlist, cmd, *args):
|
56
56
|
result = {}
|
data/lib/mailmanager/version.rb
CHANGED
@@ -150,54 +150,54 @@ EOF
|
|
150
150
|
|
151
151
|
describe "#regular_members" do
|
152
152
|
it "should ask Mailman for the regular list members" do
|
153
|
-
|
153
|
+
test_mailman_cmd(:regular_members, :getRegularMemberKeys, regular_members)
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
157
|
describe "#digest_members" do
|
158
158
|
it "should ask Mailman for the digest list members" do
|
159
|
-
|
159
|
+
test_mailman_cmd(:digest_members, :getDigestMemberKeys, digest_members)
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
163
163
|
describe "#add_member" do
|
164
164
|
it "should ask Mailman to add the member to the list" do
|
165
165
|
new_member = 'newb@dnc.org'
|
166
|
-
|
166
|
+
test_method_setter(:add_member, new_member)
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
170
|
describe "#approved_add_member" do
|
171
171
|
it "should ask Mailman to add the member to the list" do
|
172
172
|
new_member = 'newb@dnc.org'
|
173
|
-
|
173
|
+
test_method_setter(:approved_add_member, new_member)
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
177
|
describe "#delete_member" do
|
178
178
|
it "should ask Mailman to delete the member from the list" do
|
179
179
|
former_member = 'oldie@ofa.org'
|
180
|
-
|
180
|
+
test_method_setter(:delete_member, former_member)
|
181
181
|
end
|
182
182
|
end
|
183
183
|
|
184
184
|
describe "#approved_delete_member" do
|
185
185
|
it "should ask Mailman to delete the member from the list" do
|
186
186
|
former_member = 'oldie@ofa.org'
|
187
|
-
|
187
|
+
test_method_setter(:approved_delete_member, former_member)
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
191
|
describe "#moderators" do
|
192
192
|
it "should ask Mailman for the list's moderators" do
|
193
|
-
|
193
|
+
test_mailman_cmd(:moderators, :moderator, ['phb@bigcorp.com', 'nhb@smallstartup.com'])
|
194
194
|
end
|
195
195
|
end
|
196
196
|
|
197
197
|
describe "#add_moderator" do
|
198
198
|
it "should ask Mailman to add the moderator to the list" do
|
199
199
|
subject.should_receive(:moderators).with(list).and_return({'result' => 'success', 'return' => []})
|
200
|
-
|
200
|
+
test_mailman_cmd(:add_moderator, 'moderator.append', nil, 'foo@bar.com')
|
201
201
|
end
|
202
202
|
|
203
203
|
it "should raise ModeratorAlreadyExistsError if they already a moderator" do
|
@@ -211,7 +211,7 @@ EOF
|
|
211
211
|
describe "#delete_moderator" do
|
212
212
|
it "should ask Mailman to delete the moderator from the list" do
|
213
213
|
subject.should_receive(:moderators).with(list).and_return({'result' => 'success', 'return' => ['foo@bar.com']})
|
214
|
-
|
214
|
+
test_mailman_cmd(:delete_moderator, 'moderator.remove', nil, 'foo@bar.com')
|
215
215
|
end
|
216
216
|
|
217
217
|
it "should raise ModeratorNotFoundError if they are not already a moderator" do
|
@@ -224,44 +224,60 @@ EOF
|
|
224
224
|
|
225
225
|
describe "#web_page_url" do
|
226
226
|
it "should ask Mailman for the list's web address" do
|
227
|
-
|
227
|
+
test_attr_getter(:web_page_url, "http://bar.com/mailman/listinfo/foo")
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
231
231
|
describe "#request_email" do
|
232
232
|
it "should ask Mailman for the request email address" do
|
233
|
-
|
233
|
+
test_method_getter(:request_email, "foo-request@bar.com")
|
234
234
|
end
|
235
235
|
end
|
236
236
|
|
237
237
|
describe "#description" do
|
238
238
|
it "should ask Mailman for the list's description" do
|
239
|
-
|
239
|
+
test_attr_getter(:description, "this is a mailing list")
|
240
240
|
end
|
241
241
|
end
|
242
242
|
|
243
243
|
describe "#subject_prefix" do
|
244
244
|
it "should ask Mailman for the list's subject prefix" do
|
245
|
-
|
245
|
+
test_attr_getter(:subject_prefix, "[Foo] ")
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
describe "#host_name" do
|
250
|
+
it "should ask Mailman for the list's host name" do
|
251
|
+
test_attr_getter(:host_name, "groups.foo.org")
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
describe "#set_host_name" do
|
256
|
+
it "should tell Mailman to set the list's host name" do
|
257
|
+
test_attr_setter(:host_name, 'groups.foo.org')
|
246
258
|
end
|
247
259
|
end
|
248
260
|
end
|
249
261
|
|
250
|
-
def
|
262
|
+
def test_method_getter(lib_method, return_value, *args)
|
251
263
|
cc_mailman_method = camel_case("get_#{lib_method.to_s}")
|
252
|
-
|
264
|
+
test_mailman_cmd(lib_method, cc_mailman_method, return_value, *args)
|
253
265
|
end
|
254
266
|
|
255
|
-
def
|
267
|
+
def test_method_setter(lib_method, *args)
|
256
268
|
cc_mailman_method = camel_case(lib_method.to_s)
|
257
|
-
|
269
|
+
test_mailman_cmd(lib_method, cc_mailman_method, nil, *args)
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_attr_getter(attr, return_value)
|
273
|
+
test_mailman_cmd(attr, attr, return_value)
|
258
274
|
end
|
259
275
|
|
260
|
-
def
|
261
|
-
|
276
|
+
def test_attr_setter(attr, *args)
|
277
|
+
test_mailman_cmd("set_#{attr}", attr, nil, *args)
|
262
278
|
end
|
263
279
|
|
264
|
-
def
|
280
|
+
def test_mailman_cmd(lib_method, mailman_method, return_value=nil, *args)
|
265
281
|
if return_value.is_a?(Hash)
|
266
282
|
result = return_value
|
267
283
|
else
|
@@ -113,4 +113,24 @@ describe MailManager::List do
|
|
113
113
|
subject.approved_delete_member('foo@bar.baz').should == :success
|
114
114
|
end
|
115
115
|
end
|
116
|
+
|
117
|
+
context "host_name accessors" do
|
118
|
+
let(:host_name) { 'groups.foo.org' }
|
119
|
+
|
120
|
+
describe "#host_name=" do
|
121
|
+
it "should tell lib to set the host_name" do
|
122
|
+
lib.should_receive(:set_host_name).with(subject, host_name).
|
123
|
+
and_return({'result' => 'success'})
|
124
|
+
subject.host_name = host_name
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "#host_name" do
|
129
|
+
it "should ask lib for the host_name" do
|
130
|
+
lib.should_receive(:host_name).with(subject).
|
131
|
+
and_return({'result' => 'success', 'return' => host_name})
|
132
|
+
subject.host_name.should == host_name
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
116
136
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mailmanager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.0.
|
5
|
+
version: 1.0.18
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Wes Morgan
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-02-
|
13
|
+
date: 2011-02-10 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|