예제 #1
0
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")
예제 #2
0
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