diff --git a/Problem.py b/Problem.py index 85e9d3a..0c7e749 100644 --- a/Problem.py +++ b/Problem.py @@ -64,9 +64,9 @@ def %s: """ ## test icons ## -CHECK_MARK = u'\u2713' -CROSS_MARK = u'\u2717' -STOP_MARK = u'\u25A0' +CHECK_MARK = 'Y' # u'\u2713' +CROSS_MARK = 'N' # u'\u2717' +STOP_MARK = 'X' # u'\u25A0' class Problem(object, IterableUserDict): """The class for all TopCoder problems. diff --git a/ProblemFolder.py b/ProblemFolder.py index f92f71d..dd84a03 100644 --- a/ProblemFolder.py +++ b/ProblemFolder.py @@ -134,7 +134,7 @@ def test_problems(self, problems): for rel_path, number, name in problems: # load problem problem = Problem(rel_path + os.sep + (JSON_FILE_FORMAT % name)) - print " * Running tests for problem %d: %s * " % (problem[P_PROBLEM_NUMBER], problem[P_PROBLEM_NAME]) + print " * Running tests for problem %d: %s *" % (problem[P_PROBLEM_NUMBER], problem[P_PROBLEM_NAME]) # execute python file text python_filename = rel_path + os.sep + (PYTHON_FILE_FORMAT % problem[P_PROBLEM_DEFINITION]['class']) diff --git a/README b/README index 60669ae..bf70b88 100644 --- a/README +++ b/README @@ -43,4 +43,7 @@ $ scraper.py 10 --smart $ scraper.py 10 --smart --force 6) Fetch all problems between 10 and 50 on the TopCoder listing, overwriting everything: -$ scraper.py 10,50 --smart --force \ No newline at end of file +$ scraper.py 10,50 --smart --force + +7) Test problems 8, 9 and 10 +$ scraper.py 8-10 --test \ No newline at end of file diff --git a/marker.py b/marker.py deleted file mode 100644 index a8e30ac..0000000 --- a/marker.py +++ /dev/null @@ -1,45 +0,0 @@ -import json -import os - -problem_ident = raw_input("Problem number or name: ") -if problem_ident.isdigit(): - problem_dir_name = [x for x in os.listdir('.') if os.path.isdir(x) and x.split('_')[0] == problem_ident][0] -else: - problem_dir_name = [x for x in os.listdir('.') if os.path.isdir(x) and x.split('_')[1] == problem_ident][0] - -problem = json.load(open('%s/%s.json' % (problem_dir_name, problem_dir_name.split('_')[1]))) - -attempt = __import__( - "%s.%s" % (problem_dir_name, problem['definition']['class']), - fromlist=[problem['definition']['class']] -) -function = getattr(attempt, problem['definition']['signature']['name']) - -# run examples & tests -failed = False -crashed = True -for test_set in ['examples', 'tests']: - for i, example in enumerate(problem[test_set]): - try: - crashed = True - result = function(*example['input']) - crashed = False - if str(result) != str(example['output']): # needed for type differences - # break out - raise Exception() - else: - print "Passed %s %d: Returned %s with inputs %s." % (test_set[:-1], i, result, example['input']) - except Exception, e: - if crashed: - print "Failed %s %d: Program crashed with error '%s' on inputs %s." % (test_set[:-1], i, e, example['input']) - else: - print "Failed %s %d: Result was %s, expecting %s with inputs %s." % (test_set[:-1], i, result, example['output'], example['input']) - failed = True - break - if failed: - break - # blank line between examples and tests - print - -if not failed: - print "Passed all tests!" diff --git a/scraper.py b/scraper.py index 11a458c..fa266c7 100644 --- a/scraper.py +++ b/scraper.py @@ -55,41 +55,50 @@ def get_topcoder_problem_ids(opener, n, end = None): help="If specified, operates in smart mode, and looks for n new problems from TopCoder. Specify two numbers to find all problems between these two numbers. Does NOT download existing problems.") parser.add_argument('-f', '--force', action="store_true", help="If specified, overwrites existing problem Python files, or (in smart mode) downloads problems even if they already exist.") + parser.add_argument('-t', '--test', action="store_true", + help="If specified, runs tests for the specified problem numbers instead of running them.") args = parser.parse_args() + # parse out problem numbers problem_numbers = get_numbers_from_list(args.problems) - # create output directory + # scan output directory folder = ProblemFolder(args.output_dir) - # connect to TopCoder - print "Connecting to TopCoder...", - opener = connect_to_topcoder() - print "OK" - - # are we in smart mode? - if args.smart: - # look for problem numbers first - print "Looking for problems...", - if len(problem_numbers) == 2: - new_ids = get_topcoder_problem_ids(opener, problem_numbers[0], problem_numbers[1]) - else: - new_ids = get_topcoder_problem_ids(opener, problem_numbers[0]) - print "%d problems found." % len(new_ids) - - # don't re-download existing problems, unless in forced mode - if args.force: - problem_numbers = new_ids - else: - existing_ids = folder.get_problem_numbers() - problem_numbers = [x for x in new_ids if x not in existing_ids] + if args.test: + # test specified problems + for n in problem_numbers: + folder.test_problems(folder.find_problem(number = n)) - print "--- Scraping %d problems ---" % len(problem_numbers) - - # scrape problems - for n in problem_numbers: - print " * Scraping problem %d." % n - folder.scrape_and_add_problem(n, opener=opener, force=args.force) - - print "--- OK ---" + else: + # connect to TopCoder + print "Connecting to TopCoder...", + opener = connect_to_topcoder() + print "OK" + + # are we in smart mode? + if args.smart: + # look for problem numbers first + print "Looking for problems...", + if len(problem_numbers) == 2: + new_ids = get_topcoder_problem_ids(opener, problem_numbers[0], problem_numbers[1]) + else: + new_ids = get_topcoder_problem_ids(opener, problem_numbers[0]) + print "%d problems found." % len(new_ids) + + # don't re-download existing problems, unless in forced mode + if args.force: + problem_numbers = new_ids + else: + existing_ids = folder.get_problem_numbers() + problem_numbers = [x for x in new_ids if x not in existing_ids] + + print "--- Scraping %d problems ---" % len(problem_numbers) + + # scrape problems + for n in problem_numbers: + print " * Scraping problem %d." % n + folder.scrape_and_add_problem(n, opener=opener, force=args.force) + + print "--- OK ---"