class TestQueue(unittest.TestCase): def setUp(self): self.q = Queue(1) def test_print(self): self.assertEquals(self.q.__str__(), "[0]") def test_len(self): self.assertEquals(len(self.q), 0) self.q.enqueue("test") self.assertEquals(len(self.q), 1) def test_dequeue_empty_queue(self): self.assertIsNone(self.q.dequeue()) def test_enqueue_full_queue(self): self.q.enqueue("test") self.assertFalse(self.q.enqueue("test")) def test_latest(self): self.assertEquals(self.q.latest(), 0) self.q.enqueue("test") self.assertEquals(self.q.latest(), "test") def test_empty(self): self.assertTrue(self.q.empty()) def test_enqueue(self): self.assertTrue(self.q.enqueue(0)) def test_full(self): self.q.enqueue(0) self.assertTrue(self.q.full()) def test_dequeue(self): self.q.enqueue("test") self.assertEquals(self.q.dequeue(), "test")
def main(): logging.basicConfig(filename='errors.log', level=logging.ERROR) log = logging.getLogger('ex') parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true') parser.add_argument('-l', '--load', help='load from last canceled run', action='store_true') args = parser.parse_args() if args.load: previous_state = load_from_save() post_queue = previous_state['post_queue'] update_queue = previous_state['update_queue'] else: post_queue = construct_match_queue(args.verbose) update_queue = Queue(len(post_queue)) r = praw.Reddit(user_agent='Match Thread Submiter for /r/soccer, by /u/Match-Thread-Bot') r.login() # Login details in praw.ini file while True: try: if not post_queue.empty(): time_until_kick_off = post_queue.latest().time_until_kick_off() else: time_until_kick_off = 0 print '{0} minutes until next kick off.'.format(int(time_until_kick_off)) print 'Length of post queue:\t{0}'.format(len(post_queue)) print 'Length of update queue:\t{0}'.format(len(update_queue)) if not post_queue.empty(): time_until_kick_off = post_queue.latest().time_until_kick_off() else: time_until_kick_off = 0 if not post_queue.empty() and time_until_kick_off < (PRE_KICK_OFF): post = post_queue.dequeue() title = u'Match Thread: {0} v {1}'.format(post.home_team, post.away_team) if not thread_exists(post, r): content = construct_thread(post) try: if post.gunners: # Submit gunners thread to /r/gunners submission = r.submit(ALT_SUBREDDIT, title, content) else: submission = r.submit(SUBREDDIT, title, content) submission.add_comment(comment) except (APIException, URLError, IOError): log.exception('Could not submit thread.') else: print 'posting thread %s' % submission.title update_queue.enqueue((submission.id, post)) print u'adding thread to update queue {0}'.format(submission.title) else: print u'Thread {0} already exists'.format(title) elif not update_queue.empty(): post = update_queue.dequeue() try: submission = r.get_submission(submission_id=post[0]) submission.edit(construct_thread(post[1], submission_id=post[0])) except (APIException, URLError, IOError): update_queue.enqueue(post) log.exception('Could not update thread') else: print u'updating thread {0}'.format(submission.title) time_left = MATCH_LENGTH - post[1].time_after_kick_off() if time_left > 0: update_queue.enqueue(post) print u'adding thread {0} to update queue {1} minutes left'.format(submission.title, int(time_left)) if post_queue.empty() and update_queue.empty(): print '\nFinished!' break print '\n' sleep(30) except KeyboardInterrupt: save_to_file(post_queue=post_queue, update_queue=update_queue) raise