mailmanager 1.0.13 → 1.0.14

Sign up to get free protection for your applications and to get access to all the features.
data/Changelog CHANGED
@@ -1,4 +1,8 @@
1
- Current version is 1.0.13
1
+ Current version is 1.0.14
2
+
3
+ changes since 1.0.13
4
+ - more detailed error report when creating a new list fails
5
+ - make it a MailmanExecuteError when creating a new list fails
2
6
 
3
7
  changes since 1.0.12
4
8
  - added list description= setter method to List class
data/README.rdoc CHANGED
@@ -23,6 +23,66 @@ check your Python version before using this.
23
23
  new_list.add_member('bar@baz.com')
24
24
  new_list.members (returns ['foo@baz.com'])
25
25
 
26
+ == Hacking
27
+
28
+ Here are the basic steps for adding new features to this gem, if you're a programmer
29
+ type who likes to write code so you can code while you code... sorry.
30
+
31
+ MailManager's API currently consists of a handful of methods at the top-level
32
+ MailManager::Base class. This is where you'll find create_list and get_list. These
33
+ both return instances of MailManager::List, which is really where the action is.
34
+
35
+ MailManager::List contains the public Ruby API for interacting with Mailman's lists.
36
+ It exposes the methods and attributes of Mailman's MailList.py class, but makes
37
+ them a bit more Ruby-ish where appropriate. Not every method / attribute is
38
+ exposed, but this is where you come in, dear contributor.
39
+
40
+ The code that actually talks to Mailman is in lib/mailmanager/lib.rb.
41
+ It runs scripts in Mailman's bin directory. Anything that interacts with an
42
+ existing list uses Mailman's "withlist" script and the listproxy.py file in this
43
+ gem. If you read the docs on withlist that come with Mailman, it should be pretty
44
+ obvious what's going on there. But you don't need to understand all that to expose
45
+ new methods & attributes of MailList.py to MailManager.
46
+
47
+ Exposing new list properties works something like this:
48
+ - Look at Mailman's code in Mailman/MailList.py and see if the thing you want to
49
+ expose is a method or an attribute. You'll need to know a little Python, but not
50
+ much. Basically, a method is a callable thing and an attribute is a simple
51
+ property of the object. "AddMember" is a method, for example, while "description"
52
+ is an attribute.
53
+ - If it's a method, just write a simple method in lib/mailmanager/list.rb that
54
+ calls a method in lib.rb (just like the others do). Then go write the method
55
+ that you call in lib/mailmanager/lib.rb, using list_address or add_member as an
56
+ example (depending on whether you're writing a getter or a setter, respectively).
57
+ - All methods that interact with MailList.py instances (i.e. mailing lists) use the
58
+ withlist command, so just copy that stuff from an existing method.
59
+ - If you're exposing an attribute, then use the moderator methods as a guide.
60
+ For example, they do their own dupe checking since the MailList.py class will
61
+ let you set the attribute to whatever you want. Dangerous!
62
+ - If you're writing a setter, you have one more chore to make it work. You need the
63
+ listproxy.py code to lock the list and then save it after making your requested
64
+ change. It will do this for you if you do the following:
65
+ - For a method: Add the name of the MailList.py method to the needs_save dict and
66
+ have it return True. It should be obvious when you look at the others in there.
67
+ - For an attribute: Add the name of the attribute to the needs_save_with_arg dict.
68
+ This one is a bit different because the attr name is the same for gets and sets,
69
+ but we need to lock and save when it's a set, and we can guess that it's a set
70
+ when there is an argument passed, and a get when there is no argument. S-M-R-T
71
+ - For a chain of attrs/methods: Huh? Look at lib.rb#add_moderator for an
72
+ example. "moderator" is an array attribute of MailList.py, and we want to
73
+ append a new string to it. So our "command" to listproxy.py is
74
+ "moderator.append" with the new moderator string as the argument. listproxy is
75
+ smart enough to untangle that and get the moderator attribute and then call the
76
+ append method on it with your argument. But, in order to tell it to lock and
77
+ save the list for us, we must replace that dot in the name with an
78
+ underscore in the needs_save key. That's why we have "moderator_append=True"
79
+ in the needs_save dict in listproxy.py. So if you have a chain of attributes
80
+ and methods to get at the thing you're exposing, just replace the dots with
81
+ underscores in the needs_save dict key and you'll be all set.
82
+
83
+ That should get you started hacking on the gem. If you get stuck or are trying to
84
+ do anything more complex, please feel free to e-mail me: cap10morgan@gmail.com.
85
+
26
86
  == Contributing
27
87
 
28
88
  - Fork on GitHub
@@ -33,7 +93,7 @@ check your Python version before using this.
33
93
 
34
94
  == Author
35
95
 
36
- - Wes Morgan (cap10morgan on GitHub)
96
+ - Wes Morgan (cap10morgan on GitHub) <cap10morgan@gmail.com>
37
97
 
38
98
  Copyright 2011 Democratic National Committee,
39
99
  All Rights Reserved.
@@ -209,7 +209,7 @@ module MailManager
209
209
  list_name = match[1]
210
210
  end
211
211
  end
212
- raise "Error getting name of newly created list" if list_name.nil?
212
+ raise MailmanExecuteError, "Error getting name of newly created list. Mailman sent:\n#{output}" if list_name.nil?
213
213
  return_obj = MailManager::List.new(list_name)
214
214
  when :list_lists
215
215
  lists = []
@@ -1,3 +1,3 @@
1
1
  module MailManager
2
- VERSION = '1.0.13'
2
+ VERSION = '1.0.14'
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 13
9
- version: 1.0.13
8
+ - 14
9
+ version: 1.0.14
10
10
  platform: ruby
11
11
  authors:
12
12
  - Wes Morgan
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-27 00:00:00 -05:00
17
+ date: 2011-01-31 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency