Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 27 additions & 8 deletions meetup_ballot/ballot.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import logging
import os
import time
import csv

from meetup_ballot.meetup import MeetupClient

Expand All @@ -14,7 +15,7 @@
MAX_RSVPS_VAR = "MAX_RSVPS"
RSVP_BEFORE_DAYS = "RSVP_BEFORE_DAYS"
NUM_OF_REQUESTS_TO_SLEEP_AFTER = 2

NAME_EXCEPTIONS_CSV = "NAME_EXCEPTIONS_CSV"

def setup_logging():
"""
Expand Down Expand Up @@ -88,14 +89,25 @@ def does_member_name_looks_like_spam(member_name):
return False


def filter_spam_members(member_ids, client):
def read_name_exceptions(name_exceptions_csv):
""" Read member names from csv files"""
member_ids = []
with open(name_exceptions_csv) as name_exceptions:
reader = csv.reader(name_exceptions, delimiter=',')
for row in reader:
member_ids.append(int(row[0]))
return member_ids


def filter_spam_members(member_ids, client, name_exceptions_csv):
"""
Returns a list of good member_ids by filtering the spam members
:param member_ids:
:param client:
:return:
"""
good_members = []
name_exceptions = read_name_exceptions(name_exceptions_csv)
for i, member_id in enumerate(member_ids):
if i % NUM_OF_REQUESTS_TO_SLEEP_AFTER == 0:
time.sleep(1)
Expand All @@ -112,13 +124,19 @@ def filter_spam_members(member_ids, client):
)
good_members.append(member_id)
else:
logging.info(
"Bad Member name: {} (ID: {})".format(member_name, member_id)
)
if member_id in name_exceptions:
logging.info(
"Good member name (is in name_exceptions): {} (ID: {})".format(member_name, member_id)
)
good_members.append(member_id)
else:
logging.info(
"Bad member name: {} (ID: {})".format(member_name, member_id)
)
return good_members


def run_ballot(meetup_key, meetup_urlname):
def run_ballot(meetup_key, meetup_urlname, name_exceptions_csv):
"""
Run's the PyData London Meetups's RSVP Ballot.
:param meetup_key: Meetup.com API Key
Expand All @@ -140,7 +158,7 @@ def run_ballot(meetup_key, meetup_urlname):
member_ids = client.get_member_ids_from_rsvps(event_rsvps)

logging.info("Filtering spam members")
good_member_ids = filter_spam_members(member_ids, client)
good_member_ids = filter_spam_members(member_ids, client, name_exceptions_csv)

logging.info("Getting event hosts and coorganizers")
coorg_hosts_member_ids = client.get_coorganizers_and_hosts_from_rsvps(
Expand Down Expand Up @@ -178,6 +196,7 @@ def main():
meetup_key = get_environment_variable(MEETUP_KEY_VAR)
meetup_urlname = get_environment_variable(MEETUP_URLNAME_VAR)
rsvp_before_days = int(get_environment_variable(RSVP_BEFORE_DAYS))
name_exceptions_csv = get_environment_variable(NAME_EXCEPTIONS_CSV)
if check_meetup_is_in_less_than_delta_time(
meetup_key, meetup_urlname, days=rsvp_before_days
):
Expand All @@ -186,7 +205,7 @@ def main():
)
logging.info("Running the PyData London Meetup's RSVP Ballot")
try:
run_ballot(meetup_key, meetup_urlname)
run_ballot(meetup_key, meetup_urlname, name_exceptions_csv)
except Exception as e:
logging.exception(e)
else:
Expand Down
1 change: 1 addition & 0 deletions name_exceptions.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
5, ExceptionMemberName
15 changes: 9 additions & 6 deletions tests/test_ballot.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ def test_member_name():
None,
'Word',
'A BC',
'Uncle Bob'
'Uncle Bob',
'ExceptionMemberName'
]

actual = [ballot.does_member_name_looks_like_spam(name)
Expand All @@ -18,7 +19,8 @@ def test_member_name():
True,
True,
True,
False
False,
True
]
eq_(expected, actual)

Expand All @@ -29,16 +31,17 @@ def test_filter_spam_members(_):
None,
'Word',
'A BC',
'Uncle Bob'
'Uncle Bob',
'ExceptionMemberName'
]
mocked_client = MagicMock(
get_member_name=MagicMock(
side_effect=names
)
)
actual = ballot.filter_spam_members([1, 2, 3, 4], mocked_client)
actual = ballot.filter_spam_members([1, 2, 3, 4, 5], mocked_client, 'name_exceptions.csv')

eq_([4], actual)
eq_([4, 5], actual)


@patch('meetup_ballot.ballot.filter_spam_members')
Expand All @@ -57,7 +60,7 @@ def test_run_ballet(mocked_client_cls, mocked_env, mocked_spam):
mocked_env.return_value = 101
mocked_spam.return_value = ['a', 'b', 'c']

actual_attending_number = ballot.run_ballot('key', 'url')
actual_attending_number = ballot.run_ballot('key', 'url', 'name_exceptions.csv')

eq_(2, actual_attending_number)

Expand Down