Skip to content
This repository was archived by the owner on Jun 9, 2021. It is now read-only.

Commit 44b57db

Browse files
committed
2 parents 468445f + e5dde5e commit 44b57db

File tree

33 files changed

+1329
-280
lines changed

33 files changed

+1329
-280
lines changed

students/eowyn/session10/ff-mailroom/ffmailroom.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def filter_donations(self, min_donation, max_donation):
3333

3434
@property
3535
def sum_donations(self):
36-
return round(sum(self.donations), 2)
36+
return sum(self.donations)
3737

3838
@property
3939
def count_donations(self):
@@ -65,20 +65,22 @@ def add_donor(self, name, amt):
6565
return this_donor.generate_letter()
6666

6767
def get_donor(self, name):
68-
for i in self.all_donors:
69-
if i.name == name:
70-
return i
68+
for this_donor in self.all_donors:
69+
if this_donor.name == name:
70+
return this_donor
7171

7272
def list_names(self):
7373
return ("Donor Names:\n" +
7474
'\n'.join([i.name for i in self.all_donors]))
7575

7676
def generate_report_data(self):
77-
names = [i.name for i in self.all_donors]
78-
totals = [i.sum_donations for i in self.all_donors]
79-
counts = [i.count_donations for i in self.all_donors]
80-
averages = [i.average_donation for i in self.all_donors]
81-
report_data = list(zip(names, totals, counts, averages))
77+
report_data = []
78+
for this_donor in self.all_donors:
79+
new_data = (this_donor.name,
80+
this_donor.sum_donations,
81+
this_donor.count_donations,
82+
this_donor.average_donation)
83+
report_data.append(new_data)
8284
report_data = sorted(report_data,
8385
key=lambda y: int(y[1]),
8486
reverse=True)
@@ -110,10 +112,8 @@ def print_donor_records(self):
110112

111113
@property
112114
def total_donations(self):
113-
total = 0
114-
for i in self.all_donors:
115-
total += i.sum_donations
116-
return total
115+
return sum( (d.sum_donations for d in self.all_donors) )
116+
117117

118118
def challenge(self, factor, min_donation=0,
119119
max_donation=float('inf')):

students/eowyn/session10/ff-mailroom/test_ffmailroom.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ def test_generate_report_data():
109109
t.add_donor(name2, amt3)
110110
result = [('Marge Simpson', 1500.0, 2, 750.0),
111111
('Ada Lovelace', 345.0, 1, 345.0)]
112+
print(t.generate_report_data)
112113
assert t.generate_report_data() == result
113114

114115

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env python
2+
import sys
3+
import copy
4+
from textwrap import dedent
5+
from mailroom.transactions import Transactions
6+
from mailroom.ui import Mailroom
7+
8+
if __name__ == "__main__":
9+
Mailroom(Transactions()).mainloop()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__version__ = "0.1.0"
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/usr/bin/env python
2+
import sys
3+
import copy
4+
from textwrap import dedent
5+
6+
7+
class Donor():
8+
# Keep track of individual donors and their history of donations
9+
10+
def __init__(self, name):
11+
self.donations = []
12+
self.name = ''.join(name) # should we check input?
13+
14+
def add_donation(self, amt):
15+
self.donations.append(float(amt))
16+
17+
def generate_letter(self):
18+
'''
19+
Generate a formatted thank you note to a donor and return
20+
the string of the thank you note for printing or writing.
21+
'''
22+
fs = "Thank you, {0}, for your generosity and recent gift of ${1:.2f}."
23+
return fs.format(self.name, self.most_recent_donation)
24+
25+
def mult_donations(self, factor):
26+
self.donations = list(map(lambda x: x * factor, self.donations))
27+
28+
def filter_donations(self, min_donation, max_donation):
29+
if min_donation > max_donation:
30+
(min_donation, max_donation) = (max_donation, min_donation)
31+
self.donations = list(filter(lambda x: x > min_donation and
32+
x < max_donation, self.donations))
33+
34+
@property
35+
def sum_donations(self):
36+
return sum(self.donations)
37+
38+
@property
39+
def count_donations(self):
40+
return len(self.donations)
41+
42+
@property
43+
def most_recent_donation(self):
44+
return round(self.donations[-1], 2)
45+
46+
@property
47+
def average_donation(self):
48+
return round(self.sum_donations / self.count_donations, 2)
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
#!/usr/bin/env python
2+
3+
from mailroom.donor import Donor
4+
from mailroom.transactions import Transactions
5+
6+
def test_donor_init():
7+
name = "Ada Lovelace"
8+
amt = 345
9+
d = Donor(name)
10+
d.add_donation(amt)
11+
assert d.name == name
12+
assert d.donations == [345]
13+
14+
def test_name():
15+
name = "Ada Lovelace"
16+
amt = 345
17+
d = Donor(name)
18+
d.add_donation(amt)
19+
assert d.name == name
20+
21+
22+
def test_create_transactions():
23+
name = "Ada Lovelace"
24+
amt = 345
25+
d = Donor(name)
26+
d.add_donation(amt)
27+
t = Transactions()
28+
t.add_donor(name, amt)
29+
assert t.get_donor(name).name == name
30+
31+
32+
def test_add_donors_to_transactions():
33+
name = "Ada Lovelace"
34+
amt = 345
35+
d = Donor(name)
36+
d.add_donation(amt)
37+
name2 = "Marge Simpson"
38+
amt2 = 500
39+
d2 = Donor(name2)
40+
d2.add_donation(amt2)
41+
t = Transactions()
42+
t.add_donor(name, amt)
43+
t.add_donor(name2, amt2)
44+
assert t.get_donor(name).name == name
45+
assert t.get_donor(name2).name == name2
46+
assert t.get_donor(name).most_recent_donation == amt
47+
assert t.get_donor(name2).most_recent_donation == amt2
48+
49+
50+
51+
def test_add_donation():
52+
name = "Ada Lovelace"
53+
amt = 345
54+
d = Donor(name)
55+
d.add_donation(amt)
56+
amt2 = 400
57+
d.add_donation(amt2)
58+
assert d.count_donations == 2
59+
assert d.sum_donations == 745
60+
assert d.most_recent_donation == 400
61+
assert d.average_donation == 372.50
62+
63+
64+
def test_new_donor():
65+
name = "Ada Lovelace"
66+
amt = 345
67+
d = Donor(name)
68+
d.add_donation(amt)
69+
name2 = "Marge Simpson"
70+
amt2 = 500
71+
d2 = Donor(name2)
72+
d2.add_donation(amt2)
73+
t = Transactions()
74+
t.add_donor(name, amt)
75+
assert t.get_donor(name2) is None
76+
t.add_donor(name2, amt2)
77+
assert t.get_donor(name2).name == name2
78+
assert t.get_donor(name2).most_recent_donation == amt2
79+
80+
81+
def test_list_names():
82+
name = "Ada Lovelace"
83+
amt = 345
84+
d = Donor(name)
85+
d.add_donation(amt)
86+
name2 = "Marge Simpson"
87+
amt2 = 500
88+
d2 = Donor(name2)
89+
d2.add_donation(amt2)
90+
t = Transactions()
91+
t.add_donor(name, amt)
92+
t.add_donor(name2, amt2)
93+
result = 'Donor Names:\n' + name + '\n' + name2
94+
print(t.list_names())
95+
assert t.list_names() == result
96+
97+
98+
def test_generate_report_data():
99+
name, amt = ("Ada Lovelace", 345)
100+
d = Donor(name)
101+
d.add_donation(amt)
102+
name2, amt2, amt3 = ("Marge Simpson", 500, 1000)
103+
d2 = Donor(name2)
104+
d2.add_donation(amt2)
105+
t = Transactions()
106+
t.add_donor(name, amt)
107+
t.add_donor(name2, amt2)
108+
t.add_donor(name2, amt3)
109+
result = [('Marge Simpson', 1500.0, 2, 750.0),
110+
('Ada Lovelace', 345.0, 1, 345.0)]
111+
print(t.generate_report_data)
112+
assert t.generate_report_data() == result
113+
114+
115+
def test_setup_table():
116+
t = Transactions()
117+
returnval = t.setup_table()
118+
assert returnval.startswith("Donor Name")
119+
assert "Total Given" in returnval
120+
assert "Num Gifts" in returnval
121+
assert "Average Gift" in returnval
122+
123+
124+
def test_setup_body():
125+
name, amt = ("Ada Lovelace", 345)
126+
d = Donor(name)
127+
d.add_donation(amt)
128+
name2, amt2, amt3 = ("Marge Simpson", 500, 1000)
129+
d2 = Donor(name2)
130+
d2.add_donation(amt2)
131+
t = Transactions()
132+
t.add_donor(name, amt)
133+
t.add_donor(name2, amt2)
134+
t.add_donor(name2, amt3)
135+
returnval = t.setup_body()
136+
nlines = returnval.count('\n')
137+
assert name in returnval
138+
assert name2 in returnval
139+
assert nlines == 2
140+
141+
142+
def test_letter_string():
143+
name, amt = ("Ada Lovelace", 345)
144+
d = Donor(name)
145+
d.add_donation(amt)
146+
result = "Thank you, Ada Lovelace, for your generosity and recent gift of $345.00."
147+
assert d.generate_letter() == result
148+
149+
def test_mult_donations():
150+
name, amt, amt2, amt3 = ("Ada Lovelace", 350, 700, 100)
151+
d = Donor(name)
152+
d.add_donation(amt)
153+
d.add_donation(amt2)
154+
d.add_donation(amt3)
155+
d.mult_donations(2)
156+
assert d.donations == [700, 1400, 200]
157+
158+
def test_filter_donations():
159+
name, amt, amt2, amt3 = ("Ada Lovelace", 350, 700, 100)
160+
d = Donor(name)
161+
d.add_donation(amt)
162+
d.add_donation(amt2)
163+
d.add_donation(amt3)
164+
d.filter_donations(600, 800)
165+
assert d.donations == [700]
166+
167+
def test_filter_correct_donations():
168+
name, amt, amt2, amt3 = ("Ada Lovelace", 350, 700, 100)
169+
d = Donor(name)
170+
d.add_donation(amt)
171+
d.add_donation(amt2)
172+
d.add_donation(amt3)
173+
d.filter_donations(800, 600) # max and min clearly swapped
174+
assert d.donations == [700]
175+
176+
def test_total_donations():
177+
name, amt, amt2, amt3 = ("Ada Lovelace", 350, 700, 100)
178+
d = Donor(name)
179+
d.add_donation(amt)
180+
d.add_donation(amt2)
181+
d.add_donation(amt3)
182+
t = Transactions()
183+
t.add_donor(name, amt)
184+
t.add_donor(name, amt2)
185+
t.add_donor(name, amt3)
186+
assert t.total_donations == 1150
187+
188+
def test_challenge():
189+
name, amt = ("Ada Lovelace", 345)
190+
d = Donor(name)
191+
d.add_donation(amt)
192+
name2, amt2, amt3 = ("Marge Simpson", 500, 1000)
193+
d2 = Donor(name2)
194+
d2.add_donation(amt2)
195+
t = Transactions()
196+
t.add_donor(name, amt)
197+
t.add_donor(name2, amt2)
198+
t.add_donor(name2, amt3)
199+
result = t.challenge(2, 400, 600)
200+
assert result == 500
201+

0 commit comments

Comments
 (0)