From 3591b074c7da5707387b4fa9bcea1896e0fe627f Mon Sep 17 00:00:00 2001 From: Constantina Polycarpou Date: Sun, 16 Jun 2019 22:22:12 +0100 Subject: [PATCH 1/4] Adds read_name_exceptions function and updates filter_spam_members to read names from a csv file --- meetup_ballot/ballot.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/meetup_ballot/ballot.py b/meetup_ballot/ballot.py index 388a494..7fa015d 100644 --- a/meetup_ballot/ballot.py +++ b/meetup_ballot/ballot.py @@ -6,6 +6,7 @@ import logging import os import time +import csv from meetup_ballot.meetup import MeetupClient @@ -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(): """ @@ -88,7 +89,17 @@ 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, newline='') as name_exceptions: + reader = csv.reader(name_exceptions, delimiter=' ') + for row in reader: + member_ids.append(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: @@ -112,13 +123,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 read_name_exceptions(name_exceptions_csv): + 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 @@ -140,7 +157,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( @@ -178,6 +195,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 ): @@ -186,7 +204,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: From 4008672c93be0d96989d0305a81cf5173ad9acf6 Mon Sep 17 00:00:00 2001 From: Constantina Polycarpou Date: Sun, 14 Jul 2019 14:40:59 +0100 Subject: [PATCH 2/4] Fixes tests to work with changes and adds example file name_exceptions.csv --- meetup_ballot/ballot.py | 2 +- name_exceptions.csv | 1 + tests/test_ballot.py | 13 ++++++++----- 3 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 name_exceptions.csv diff --git a/meetup_ballot/ballot.py b/meetup_ballot/ballot.py index 7fa015d..a02999c 100644 --- a/meetup_ballot/ballot.py +++ b/meetup_ballot/ballot.py @@ -93,7 +93,7 @@ def read_name_exceptions(name_exceptions_csv): """ Read member names from csv files""" member_ids = [] with open(name_exceptions_csv, newline='') as name_exceptions: - reader = csv.reader(name_exceptions, delimiter=' ') + reader = csv.reader(name_exceptions, delimiter=',') for row in reader: member_ids.append(row[0]) return member_ids diff --git a/name_exceptions.csv b/name_exceptions.csv new file mode 100644 index 0000000..7ccc784 --- /dev/null +++ b/name_exceptions.csv @@ -0,0 +1 @@ +5, ExceptionMemberName diff --git a/tests/test_ballot.py b/tests/test_ballot.py index c4fa2f6..8e8c651 100644 --- a/tests/test_ballot.py +++ b/tests/test_ballot.py @@ -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) @@ -18,6 +19,7 @@ def test_member_name(): True, True, True, + False, False ] eq_(expected, actual) @@ -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') @@ -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) From d639eb178165da2efc04eb87563553e9996f2ef3 Mon Sep 17 00:00:00 2001 From: Constantina Polycarpou Date: Sat, 20 Jul 2019 18:10:31 +0100 Subject: [PATCH 3/4] Updates for code review comments --- meetup_ballot/ballot.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meetup_ballot/ballot.py b/meetup_ballot/ballot.py index a02999c..385a1ac 100644 --- a/meetup_ballot/ballot.py +++ b/meetup_ballot/ballot.py @@ -92,7 +92,7 @@ def does_member_name_looks_like_spam(member_name): def read_name_exceptions(name_exceptions_csv): """ Read member names from csv files""" member_ids = [] - with open(name_exceptions_csv, newline='') as name_exceptions: + with open(name_exceptions_csv) as name_exceptions: reader = csv.reader(name_exceptions, delimiter=',') for row in reader: member_ids.append(row[0]) @@ -107,6 +107,7 @@ def filter_spam_members(member_ids, client, name_exceptions_csv): :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) @@ -123,7 +124,7 @@ def filter_spam_members(member_ids, client, name_exceptions_csv): ) good_members.append(member_id) else: - if member_id in read_name_exceptions(name_exceptions_csv): + if member_id in name_exceptions: logging.info( "Good member name (is in name_exceptions): {} (ID: {})".format(member_name, member_id) ) From d270c95e27335926c9f72d173307bc503c54f96f Mon Sep 17 00:00:00 2001 From: Constantina Polycarpou Date: Sat, 20 Jul 2019 18:11:11 +0100 Subject: [PATCH 4/4] Fixes broken tests on Travis --- meetup_ballot/ballot.py | 2 +- tests/test_ballot.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/meetup_ballot/ballot.py b/meetup_ballot/ballot.py index 385a1ac..ef8155a 100644 --- a/meetup_ballot/ballot.py +++ b/meetup_ballot/ballot.py @@ -95,7 +95,7 @@ def read_name_exceptions(name_exceptions_csv): with open(name_exceptions_csv) as name_exceptions: reader = csv.reader(name_exceptions, delimiter=',') for row in reader: - member_ids.append(row[0]) + member_ids.append(int(row[0])) return member_ids diff --git a/tests/test_ballot.py b/tests/test_ballot.py index 8e8c651..b986f3b 100644 --- a/tests/test_ballot.py +++ b/tests/test_ballot.py @@ -20,7 +20,7 @@ def test_member_name(): True, True, False, - False + True ] eq_(expected, actual)