def main(prog, args, output_file=sys.stdout): parser = argparse.ArgumentParser( prog=prog, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument( "url", help="URL (e.g. https://atcoder.jp/contests/abc012/tasks/abc012_3)") parser.add_argument("--without-login", action="store_true", help="Download data without login") parser.add_argument( "--lang", help="Programming language of your template code, {}.\n".format( " or ".join([lang.name for lang in ALL_LANGUAGES])) + "[Default] {}".format(CPP.name)) parser.add_argument("--template", help="File path to your template code\n{}".format( "\n".join([ "[Default ({dname})] {path}".format( dname=lang.display_name, path=lang.default_template_path) for lang in ALL_LANGUAGES ]))) parser.add_argument("--save-no-session-cache", action="store_true", help="Save no session cache to avoid security risk", default=None) parser.add_argument( "--config", help="File path to your config file\n{0}{1}".format( "[Default (Primary)] {}\n".format(USER_CONFIG_PATH), "[Default (Secondary)] {}\n".format(get_default_config_path()))) args = parser.parse_args(args) args.workspace = DEFAULT_WORKSPACE_DIR_PATH # dummy for get_config() args.parallel = False # dummy for get_config() config = get_config(args) client = AtCoderClient() if not config.etc_config.download_without_login: try: client.login( save_session_cache=not config.etc_config.save_no_session_cache) logging.info("Login successful.") except LoginError: logging.error( "Failed to login (maybe due to wrong username/password combination?)" ) sys.exit(-1) else: logging.info("Downloading data without login.") generate_code(client, args.url, config, output_file=output_file)
def get_config(args: argparse.Namespace) -> Config: def _load(path: str) -> Config: logger.info("Going to load {} as config".format(path)) with open(path, 'r') as f: return Config.load(f, args) if args.config: return _load(args.config) if os.path.exists(USER_CONFIG_PATH): return _load(USER_CONFIG_PATH) return _load(get_default_config_path())
def get_config(args: argparse.Namespace) -> Config: def _load(path: str) -> Config: logging.info("Going to load {} as config".format(path)) with open(path, 'r') as f: return Config.load(f, args) if args.config: return _load(args.config) if os.path.exists(USER_CONFIG_PATH): return _load(USER_CONFIG_PATH) return _load(get_default_config_path())
def get_config(args: argparse.Namespace, language: Language = None) -> Config: def _load(path: str) -> Config: logger.info("Going to load {} as config".format(path)) with open(path, 'r') as f: program_args = ProgramArgs.load(args) if language is not None: assert program_args.lang is None program_args.lang = language.name return Config.load(f, program_args) if args.config: return _load(args.config) if os.path.exists(USER_CONFIG_PATH): return _load(USER_CONFIG_PATH) return _load(get_default_config_path())
def test_load_default_config(self): with open(get_default_config_path(), 'r') as f: Config.load(f)
def main(prog, args): parser = argparse.ArgumentParser( prog=prog, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("contest_id", help="Contest ID (e.g. arc001)") parser.add_argument("--without-login", action="store_true", help="Download data without login") parser.add_argument( "--workspace", help="Path to workspace's root directory. This script will create files" " in {{WORKSPACE}}/{{contest_name}}/{{alphabet}}/ e.g. ./your-workspace/arc001/A/\n" "[Default] {}".format(DEFAULT_WORKSPACE_DIR_PATH)) parser.add_argument( "--lang", help="Programming language of your template code, {}.\n".format( " or ".join([lang.name for lang in ALL_LANGUAGES])) + "[Default] {}".format(CPP.name)) parser.add_argument("--template", help="File path to your template code\n{}".format( "\n".join([ "[Default ({dname})] {path}".format( dname=lang.display_name, path=lang.default_template_path) for lang in ALL_LANGUAGES ]))) # Deleted functionality parser.add_argument('--replacement', help=argparse.SUPPRESS) parser.add_argument( "--parallel", action="store_true", help= "Prepare problem directories asynchronously using multi processors.", default=None) parser.add_argument("--save-no-session-cache", action="store_true", help="Save no session cache to avoid security risk", default=None) parser.add_argument( "--config", help="File path to your config file\n{0}{1}".format( "[Default (Primary)] {}\n".format(USER_CONFIG_PATH), "[Default (Secondary)] {}\n".format(get_default_config_path()))) args = parser.parse_args(args) if args.replacement is not None: logger.error( with_color( "Sorry! --replacement argument no longer exists" " and you can only use --template." " See the official document for details.", Fore.LIGHTRED_EX)) raise DeletedFunctionalityError config = get_config(args) try: import AccountInformation # noqa raise BannedFileDetectedError( "We abolished the logic with AccountInformation.py. Please delete the file." ) except ImportError: pass client = AtCoderClient() if not config.etc_config.download_without_login: try: client.login( save_session_cache=not config.etc_config.save_no_session_cache) logger.info("Login successful.") except LoginError: logger.error( "Failed to login (maybe due to wrong username/password combination?)" ) sys.exit(-1) else: logger.info("Downloading data without login.") prepare_contest(client, args.contest_id, config)
def main(prog, args) -> bool: parser = argparse.ArgumentParser( prog=prog, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("--exec", '-e', help="File path to the execution target. [Default] Automatically detected exec file", default=None) parser.add_argument("--num", '-n', help="The case number to test (1-origin). All cases are tested if not specified.", type=int, default=None) parser.add_argument("--dir", '-d', help="Target directory to test. [Default] Current directory", default=".") parser.add_argument("--timeout", '-t', help="Timeout for each test cases (sec) [Default] 1", type=int, default=1) parser.add_argument("--knock-out", '-k', help="Stop execution immediately after any example's failure [Default] False", action="store_true", default=False) parser.add_argument('--skip-almost-ac-feedback', '-s', help='Hide inputs and expected/actual outputs if result is correct and there are error outputs' ' [Default] False,', action='store_true', default=False) parser.add_argument('--judge-type', '-j', help='error type' ' must be one of [{}]'.format( ', '.join(USER_FACING_JUDGE_TYPE_LIST)), type=str, default=None) parser.add_argument('--error-value', '-v', help='error value for decimal number judge:' ' [Default] ' + str(DEFAULT_EPS), type=float, default=None) parser.add_argument('--compile-before-testing', '-c', help='compile source before testing [true, false]: ' ' [Default]: false', type=bool, default=None) parser.add_argument('--compile-only-when-diff-detected', help='compile only when diff detected [true, false]' ' [Default]: true', type=bool, default=None) parser.add_argument("--config", help="File path to your config file\n{0}{1}".format("[Default (Primary)] {}\n".format( USER_CONFIG_PATH), "[Default (Secondary)] {}\n".format( get_default_config_path())) ) args = parser.parse_args(args) config = get_config(args) if config.etc_config.compile_before_testing is not None and args.compile_before_testing is None: args.compile_before_testing = config.etc_config.compile_before_testing if args.compile_before_testing: if config.etc_config.compile_only_when_diff_detected is not None and args.compile_only_when_diff_detected is None: args.compile_only_when_diff_detected = config.etc_config.compile_only_when_diff_detected metadata_file = os.path.join(args.dir, "metadata.json") metadata = get_metadata(metadata_file) judge_method = metadata.judge_method lang = metadata.lang in_sample_file_list = sorted( glob.glob(os.path.join(args.dir, metadata.sample_in_pattern))) out_sample_file_list = sorted( glob.glob(os.path.join(args.dir, metadata.sample_out_pattern))) user_input_decimal_error_type = None if args.judge_type is not None: if args.judge_type == "normal": judge_method = NormalJudge() elif args.judge_type in ["absolute", "relative", "absolute_or_relative"]: user_input_decimal_error_type = ErrorType(args.judge_type) elif args.judge_type == "multisolution": judge_method = MultiSolutionJudge(lang.name) elif args.judge_type == "interactive": judge_method = InteractiveJudge(lang.name) else: logger.error("Unknown judge type: {}. judge type must be one of [{}]".format( args.judge_type, ", ".join(USER_FACING_JUDGE_TYPE_LIST))) sys.exit(-1) user_input_error_value = args.error_value if isinstance(judge_method, DecimalJudge): judge_method = DecimalJudge(error_type=user_input_decimal_error_type or judge_method.error_type, diff=user_input_error_value or judge_method.diff) elif user_input_decimal_error_type is not None: judge_method = DecimalJudge(error_type=user_input_decimal_error_type, diff=user_input_error_value or DEFAULT_EPS) elif user_input_error_value is not None: assert judge_method.judge_type == JudgeType.Normal logger.warn("error_value {} is ignored because this is normal judge".format( user_input_error_value)) if isinstance(judge_method, DecimalJudge): logger.info("Decimal number judge is enabled. type={}, diff={}".format( judge_method.error_type.value, judge_method.diff)) if metadata.code_filename is None or not args.compile_before_testing: print("compile is skipped and infer exec file") exclude_exec_files = [] if hasattr(judge_method, "judge_exec_filename"): judge_method.judge_exec_filename = os.path.join( args.dir, judge_method.judge_exec_filename) exclude_exec_files.append(judge_method.judge_exec_filename) exec_file = args.exec or infer_exec_file( glob.glob(os.path.join(args.dir, '*')), exclude_exec_files) else: if args.compile_only_when_diff_detected: force_compile = True else: force_compile = False exec_file = lang.get_test_command('main', args.dir) print("command: ", exec_file) print("directory: ", args.dir) # Compile if not compile_main_and_judge_programs(metadata, args.dir, force_compile=force_compile): exit() if args.num is None: return run_all_tests(exec_file, in_sample_file_list, out_sample_file_list, args.timeout, args.knock_out, args.skip_almost_ac_feedback, judge_method, args.dir) else: return run_single_test(exec_file, in_sample_file_list, out_sample_file_list, args.timeout, args.num, judge_method, args.dir)
def main(prog, args, output_file=sys.stdout): parser = argparse.ArgumentParser( prog=prog, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("url", help="URL (e.g. https://atcoder.jp/contests/abc012/tasks/abc012_3)") parser.add_argument("--without-login", action="store_true", help="Download data without login") parser.add_argument("--lang", help="Programming language of your template code, {}.\n" .format(" or ".join([lang.name for lang in ALL_LANGUAGES])) + "[Default] {}".format(CPP.name)) parser.add_argument("--template", help="File path to your template code\n{}".format( "\n".join( ["[Default ({dname})] {path}".format( dname=lang.display_name, path=lang.default_template_path ) for lang in ALL_LANGUAGES] )) ) parser.add_argument("--save-no-session-cache", action="store_true", help="Save no session cache to avoid security risk", default=None) parser.add_argument("--config", help="File path to your config file\n{0}{1}".format("[Default (Primary)] {}\n".format( USER_CONFIG_PATH), "[Default (Secondary)] {}\n".format( get_default_config_path())) ) args = parser.parse_args(args) args.workspace = DEFAULT_WORKSPACE_DIR_PATH # dummy for get_config() args.parallel = False # dummy for get_config() config = get_config(args) client = AtCoderClient() if not config.etc_config.download_without_login: try: client.login( save_session_cache=not config.etc_config.save_no_session_cache) logging.info("Login successful.") except LoginError: logging.error( "Failed to login (maybe due to wrong username/password combination?)") sys.exit(-1) else: logging.info("Downloading data without login.") generate_code(client, args.url, config, output_file=output_file)
def main(prog, args): parser = argparse.ArgumentParser( prog=prog, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("contest_id", help="Contest ID (e.g. arc001)") parser.add_argument("--without-login", action="store_true", help="Download data without login") parser.add_argument("--workspace", help="Path to workspace's root directory. This script will create files" " in {{WORKSPACE}}/{{contest_name}}/{{alphabet}}/ e.g. ./your-workspace/arc001/A/\n" "[Default] {}".format(DEFAULT_WORKSPACE_DIR_PATH)) parser.add_argument("--lang", help="Programming language of your template code, {}.\n" .format(" or ".join([lang.name for lang in ALL_LANGUAGES])) + "[Default] {}".format(CPP.name)) parser.add_argument("--template", help="File path to your template code\n{}".format( "\n".join( ["[Default ({dname})] {path}".format( dname=lang.display_name, path=lang.default_template_path ) for lang in ALL_LANGUAGES] )) ) # Deleted functionality parser.add_argument('--replacement', help=argparse.SUPPRESS) parser.add_argument("--parallel", action="store_true", help="Prepare problem directories asynchronously using multi processors.", default=None) parser.add_argument("--save-no-session-cache", action="store_true", help="Save no session cache to avoid security risk", default=None) parser.add_argument("--config", help="File path to your config file\n{0}{1}".format("[Default (Primary)] {}\n".format( USER_CONFIG_PATH), "[Default (Secondary)] {}\n".format( get_default_config_path())) ) args = parser.parse_args(args) if args.replacement is not None: logging.error(with_color("Sorry! --replacement argument no longer exists" " and you can only use --template." " See the official document for details.", Fore.LIGHTRED_EX)) raise DeletedFunctionalityError config = get_config(args) try: import AccountInformation # noqa raise BannedFileDetectedError( "We abolished the logic with AccountInformation.py. Please delete the file.") except ImportError: pass client = AtCoderClient() if not config.etc_config.download_without_login: try: client.login( save_session_cache=not config.etc_config.save_no_session_cache) logging.info("Login successful.") except LoginError: logging.error( "Failed to login (maybe due to wrong username/password combination?)") sys.exit(-1) else: logging.info("Downloading data without login.") prepare_contest(client, args.contest_id, config)
def main(prog, args) -> bool: parser = argparse.ArgumentParser( prog=prog, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument( "--exec", '-e', help= "File path to the execution target. [Default] Automatically detected exec file", default=None) parser.add_argument( "--num", '-n', help= "The case number to test (1-origin). All cases are tested if not specified.", type=int, default=None) parser.add_argument( "--dir", '-d', help="Target directory to test. [Default] Current directory", default=".") parser.add_argument("--timeout", '-t', help="Timeout for each test cases (sec) [Default] 1", type=int, default=1) parser.add_argument( "--knock-out", '-k', help= "Stop execution immediately after any example's failure [Default] False", action="store_true", default=False) parser.add_argument( '--skip-almost-ac-feedback', '-s', help= 'Hide inputs and expected/actual outputs if result is correct and there are error outputs' ' [Default] False,', action='store_true', default=False) parser.add_argument('--judge-type', '-j', help='error type' ' must be one of [{}]'.format( ', '.join(USER_FACING_JUDGE_TYPE_LIST)), type=str, default=None) parser.add_argument('--error-value', '-v', help='error value for decimal number judge:' ' [Default] ' + str(DEFAULT_EPS), type=float, default=None) parser.add_argument('--compile-before-testing', '-c', help='compile source before testing [true, false]: ' ' [Default]: false', type=bool, default=None) parser.add_argument('--compile-only-when-diff-detected', help='compile only when diff detected [true, false]' ' [Default]: true', type=bool, default=None) parser.add_argument( "--config", help="File path to your config file\n{0}{1}".format( "[Default (Primary)] {}\n".format(USER_CONFIG_PATH), "[Default (Secondary)] {}\n".format(get_default_config_path()))) args = parser.parse_args(args) metadata_file = os.path.join(args.dir, "metadata.json") metadata = get_metadata(metadata_file) lang = metadata.lang # TODO: Stop loading language-specific config because tester doesn't have and shouldn't have --lang params. # TODO: All information required to run tester should be from metadata.json except for etc config # TODO: https://github.com/kyuridenamida/atcoder-tools/issues/177 config = get_config(args, lang) in_sample_file_list = sorted( glob.glob(os.path.join(args.dir, metadata.sample_in_pattern))) out_sample_file_list = sorted( glob.glob(os.path.join(args.dir, metadata.sample_out_pattern))) judge_method = _decide_judge_method(args, metadata, lang) if isinstance(judge_method, DecimalJudge): logger.info("Decimal number judge is enabled. type={}, diff={}".format( judge_method.error_type.value, judge_method.diff)) if args.exec is not None: exec_file = args.exec elif config.etc_config.compile_before_testing: # Use atcoder-tools's functionality to compile source code try: compile_main_and_judge_programs( metadata, args.dir, force_compile=not config.etc_config. compile_only_when_diff_detected) except BadStatusCodeException as e: raise e exec_file = lang.get_test_command('main', args.dir) else: # TODO Have a smarter strategy to detect judge program excluded_exec_files = [ os.path.join(args.dir, "judge"), os.path.join(args.dir, "judge.exe") ] exec_file = infer_exec_file(glob.glob(os.path.join(args.dir, '*')), excluded_exec_files) logger.info("Inferred exec file: {}".format(exec_file)) if args.num is None: return run_all_tests(exec_file, in_sample_file_list, out_sample_file_list, args.timeout, args.knock_out, args.skip_almost_ac_feedback, judge_method, args.dir, lang) # TODO: pass judge_lang instead else: return run_single_test(exec_file, in_sample_file_list, out_sample_file_list, args.timeout, args.num, judge_method, args.dir, lang)