def login(args): # get service service = onlinejudge.dispatch.service_from_url(args.url) if service is None: sys.exit(1) # configure kwargs = {} if service.get_name() == 'yukicoder': if not args.method: args.method = 'github' if args.method not in [ 'github', 'twitter' ]: log.failure('login for yukicoder: invalid option: --method %s', args.method) sys.exit(1) kwargs['method'] = args.method else: if args.method: log.failure('login for %s: invalid option: --method %s', service.get_name(), args.method) sys.exit(1) # login def get_credentials(): if args.username is None: args.username = input('Username: ') if args.password is None: args.password = getpass.getpass() return args.username, args.password with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: service.login(get_credentials, session=sess, **kwargs)
def generate_scanner(args: 'argparse.Namespace') -> None: if not args.silent: log.warning('This feature is ' + log.red('experimental') + '.') if args.silent: for handler in log.logger.handlers: log.removeHandler(handler) problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: it = problem.get_input_format(session=sess) # type: Any if not it: log.error('input format not found') sys.exit(1) try: log.debug('original data: %s', repr(it)) it = list(tokenize(it)) log.debug('tokenized: %s', str(it)) it = list(parse(it)) log.debug('parsed: %s', str(it)) it = postprocess(it) log.debug('postprocessed: %s', str(it)) it = export(it, use_scanf=args.scanf, repeat_macro=args.repeat_macro) log.debug('result: %s', repr(it)) except: log.error('something wrong') raise log.success('success:') print(log.bold(it.rstrip())) # to stdout
def generate_scanner(args): if not args.silent: log.warning("This feature is " + log.red("experimental") + ".") if args.silent: for handler in log.logger.handlers: log.removeHandler(handler) problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: it = problem.get_input_format(session=sess) if not it: log.error("input format not found") sys.exit(1) try: log.debug("original data: %s", repr(it)) it = list(tokenize(it)) log.debug("tokenized: %s", str(it)) it = list(parse(it)) log.debug("parsed: %s", str(it)) it = postprocess(it) log.debug("postprocessed: %s", str(it)) it = export(it, use_scanf=args.scanf, repeat_macro=args.repeat_macro) log.debug("result: %s", repr(it)) except: log.error("something wrong") raise log.success("success:") print(log.bold(it.rstrip())) # to stdout
def download(args: 'argparse.Namespace') -> None: # prepare values problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) kwargs = {} if args.system: supported_service_names = ['aoj', 'yukicoder'] if problem.get_service().get_name() not in supported_service_names: log.error('--system for %s is not supported', problem.get_service().get_name()) sys.exit(1) kwargs['is_system'] = True if args.format is None: if kwargs.get('is_system'): if problem.get_service().get_name() == 'yukicoder': args.format = '%b.%e' else: args.format = '%i.%e' else: args.format = 'sample-%i.%e' # get samples from the server with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: samples = problem.download(session=sess, **kwargs) # type: ignore # write samples to files for i, sample in enumerate(samples): log.emit('') log.info('sample %d', i) for kind in ['input', 'output']: ext = kind[:-3] data = getattr(sample, kind).data name = getattr(sample, kind).name table = {} table['i'] = str(i + 1) table['e'] = ext table['n'] = name table['b'] = os.path.basename(name) table['d'] = os.path.dirname(name) path = os.path.join(args.directory, utils.parcentformat(args.format, table)) log.status('%sput: %s', ext, name) log.emit(colorama.Style.BRIGHT + data.rstrip() + colorama.Style.RESET_ALL) if args.dry_run: continue if os.path.exists(path): log.warning('file already exists: %s', path) if not args.overwrite: log.warning('skipped') continue os.makedirs(os.path.dirname(path), exist_ok=True) with open(path, 'w') as fh: fh.write(data) log.success('saved to: %s', path)
def download(args): # prepare values problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) kwargs = {} if args.system: supported_service_names = ["aoj", "yukicoder"] if problem.get_service().get_name() not in supported_service_names: log.error("--system for %s is not supported", problem.get_service().get_name()) sys.exit(1) kwargs["is_system"] = True if args.format is None: if kwargs.get("is_system"): if problem.get_service().get_name() == "yukicoder": args.format = "%b.%e" else: args.format = "%i.%e" else: args.format = "sample-%i.%e" # get samples from the server with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: samples = problem.download(session=sess, **kwargs) # write samples to files for i, sample in enumerate(samples): log.emit("") log.info("sample %d", i) for kind in ["input", "output"]: ext = kind[:-3] data = sample[kind]["data"] name = sample[kind]["name"] table = {} table["i"] = str(i + 1) table["e"] = ext table["n"] = name table["b"] = os.path.basename(name) table["d"] = os.path.dirname(name) path = os.path.join(args.directory, utils.parcentformat(args.format, table)) log.status("%sput: %s", ext, name) log.emit(colorama.Style.BRIGHT + data.rstrip() + colorama.Style.RESET_ALL) if args.dry_run: continue if os.path.exists(path): log.warning("file already exists: %s", path) if not args.overwrite: log.warning("skipped") continue os.makedirs(os.path.dirname(path), exist_ok=True) with open(path, "w", encoding="utf-8") as fh: fh.write(data) log.success("saved to: %s", path)
def login(args: 'argparse.Namespace') -> None: # get service service = onlinejudge.dispatch.service_from_url(args.url) if service is None: sys.exit(1) # configure kwargs = {} if service.get_name() == 'yukicoder': if not args.method: args.method = 'github' if args.method not in ['github', 'twitter']: log.failure('login for yukicoder: invalid option: --method %s', args.method) sys.exit(1) kwargs['method'] = args.method else: if args.method: log.failure('login for %s: invalid option: --method %s', service.get_name(), args.method) sys.exit(1) with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: if args.check: if service.is_logged_in(session=sess): log.info('You have already signed in.') else: log.info('You are not signed in.') sys.exit(1) else: # login def get_credentials() -> Tuple[str, str]: if args.username is None: args.username = input('Username: '******'If you don\'t want to give your password to this program, you can give only your session tokens.' ) log.info( 'see: https://github.com/kmyk/online-judge-tools/blob/master/LOGIN_WITH_COOKIES.md' ) service.login(get_credentials, session=sess, **kwargs) # type: ignore
def submit(args): # parse url problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) # read code with open(args.file) as fh: code = fh.buffer.read() try: s = code.decode() # for logging except UnicodeDecodeError as e: log.failure('%s: %s', e.__class__.__name__, str(e)) s = repr(code)[1:] log.info('code:') log.emit(log.bold(s)) # prepare kwargs kwargs = {} if problem.get_service().get_name() == 'topcoder': if args.full_submission: kwargs['kind'] = 'full' else: kwargs['kind'] = 'example' # make session if problem.get_service().get_name() == 'topcoder': sess = utils.run_webdriver(args.webdriver, target_url=problem.get_service().get_url(), headless=not args.verbose, cookie_path=args.cookie) else: sess = utils.with_cookiejar(utils.new_default_session(), path=args.cookie) with sess as sess: # language langs = problem.get_language_dict(session=sess) if args.language not in langs: log.error('language is unknown') log.info('supported languages are:') for lang in sorted(langs.keys()): log.emit('%s (%s)', lang, langs[lang]['description']) sys.exit(1) # confirm if args.wait: log.status('sleep(%.2f)', args.wait) time.sleep(args.wait) if not args.yes: sys.stdout.write('Are you sure? [y/N] ') sys.stdout.flush() c = sys.stdin.read(1) if c != 'y': log.info('terminated.') return # submit submission = problem.submit(code, language=args.language, session=sess, **kwargs) # show result if submission is None: log.failure('submission failed') else: if args.open: if not isinstance(args.open, str): args.open = None for browser in default_url_opener: args.open = shutil.which(browser) if args.open: break if not args.open: log.failure( 'couldn\'t open the url. please specify a browser') else: log.info('open the submission page with: %s', args.open) subprocess.check_call( [args.open, submission.get_url()], stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr)
def download(args: 'argparse.Namespace') -> None: # prepare values problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) is_default_format = args.format is None and args.directory is None # must be here since args.directory and args.format are overwritten if args.directory is None: args.directory = pathlib.Path('test') if args.format is None: if args.system: if problem.get_service().get_name() == 'yukicoder': args.format = '%b.%e' else: args.format = '%i.%e' else: args.format = 'sample-%i.%e' # get samples from the server with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: if args.system: samples = problem.download_system_cases( session=sess) # type: ignore else: samples = problem.download_sample_cases( session=sess) # type: ignore # append the history for submit command if not args.dry_run and is_default_format: history = onlinejudge.implementation.download_history.DownloadHistory() history.add(problem) # write samples to files for i, sample in enumerate(samples): log.faster_emit('') log.faster_info('sample %d', i) for kind in ['input', 'output']: ext = kind[:-3] data = getattr(sample, kind).data name = getattr(sample, kind).name table = {} table['i'] = str(i + 1) table['e'] = ext table['n'] = name table['b'] = os.path.basename(name) table['d'] = os.path.dirname(name) path = args.directory / utils.percentformat( args.format, table) # type: pathlib.Path log.faster_status('%sput: %s', ext, name) log.faster_emit(colorama.Style.BRIGHT + data.rstrip() + colorama.Style.RESET_ALL) if args.dry_run: continue if path.exists(): log.faster_warning('file already exists: %s', path) if not args.overwrite: log.faster_warning('skipped') continue path.parent.mkdir(parents=True, exist_ok=True) with path.open('w') as fh: fh.write(data) log.faster_success('saved to: %s', path) # print json if args.json: print(json.dumps(list(map(convert_sample_to_dict, samples))))
def submit(args: 'argparse.Namespace') -> None: # parse url problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) # read code with open(args.file) as fh: code = fh.buffer.read() format_config = { 'dos2unix': args.format_dos2unix or args.golf, 'rstrip': args.format_dos2unix or args.golf, } code = format_code(code, **format_config) # report code try: s = code.decode() except UnicodeDecodeError as e: log.failure('%s: %s', e.__class__.__name__, str(e)) s = repr(code)[1:] log.info('code (%d byte):', len(code)) log.emit(log.bold(s)) with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: # guess or select language ids langs = problem.get_language_dict(session=sess) matched_lang_ids: Optional[List[str]] = None if args.guess: kwargs = { 'language_dict': langs, 'cxx_latest': args.guess_cxx_latest, 'cxx_compiler': args.guess_cxx_compiler, 'python_version': args.guess_python_version, 'python_interpreter': args.guess_python_interpreter, } matched_lang_ids = guess_lang_ids_of_file(args.file, code, **kwargs) if args.language is not None: matched_lang_ids = select_ids_of_matched_languages( args.language.split(), matched_lang_ids, language_dict=langs) else: if args.language is None: matched_lang_ids = None elif args.language in langs: matched_lang_ids = [args.language] else: matched_lang_ids = select_ids_of_matched_languages( args.language.split(), list(langs.keys()), language_dict=langs) # report selected language ids if matched_lang_ids is not None and len(matched_lang_ids) == 1: args.language = matched_lang_ids[0] log.info('choosed language: %s (%s)', args.language, langs[args.language]['description']) else: if matched_lang_ids is None: log.error('language is unknown') log.info('supported languages are:') elif len(matched_lang_ids) == 0: log.error('no languages are matched') log.info('supported languages are:') else: log.error('Matched languages were not narrowed down to one.') log.info('You have to choose:') for lang_id in sorted(matched_lang_ids or langs.keys()): log.emit('%s (%s)', lang_id, langs[lang_id]['description']) sys.exit(1) # confirm if args.wait: log.status('sleep(%.2f)', args.wait) time.sleep(args.wait) if not args.yes: sys.stdout.write('Are you sure? [y/N] ') sys.stdout.flush() c = sys.stdin.read(1) if c != 'y': log.info('terminated.') return # submit kwargs = {} if problem.get_service().get_name() == 'topcoder': if args.full_submission: kwargs['kind'] = 'full' else: kwargs['kind'] = 'example' submission = problem.submit(code, language=args.language, session=sess, **kwargs) # type: ignore # show result if submission is None: log.failure('submission failed') else: if args.open: if args.open_browser: browser = args.open_browser else: for browser in default_url_opener: if shutil.which(browser): break else: browser = None log.failure( 'couldn\'t find browsers to open the url. please specify a browser' ) if browser: log.info('open the submission page with: %s', browser) subprocess.check_call( [browser, submission.get_url()], stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr)
def submit(args): # parse url problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) # read code with open(args.file) as fh: code = fh.buffer.read() format_config = { "dos2unix": args.format_dos2unix or args.golf, "rstrip": args.format_dos2unix or args.golf, } code = format_code(code, **format_config) # report code try: s = code.decode() except UnicodeDecodeError as e: log.failure("%s: %s", e.__class__.__name__, str(e)) s = repr(code)[1:] log.info("code (%d byte):", len(code)) log.emit(log.bold(s)) with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: # guess or select language ids langs = problem.get_language_dict(session=sess) if args.guess: kwargs = { "language_dict": langs, "cxx_latest": args.guess_cxx_latest, "cxx_compiler": args.guess_cxx_compiler, "python_version": args.guess_python_version, "python_interpreter": args.guess_python_interpreter, } matched_lang_ids = guess_lang_ids_of_file(args.file, code, **kwargs) if args.language is not None: matched_lang_ids = select_ids_of_matched_languages( args.language.split(), matched_lang_ids, language_dict=langs) else: if args.language is None: matched_lang_ids = None elif args.language in langs: matched_lang_ids = [args.language] else: matched_lang_ids = select_ids_of_matched_languages( args.language.split(), langs.keys(), language_dict=langs) # report selected language ids if matched_lang_ids is not None and len(matched_lang_ids) == 1: args.language = matched_lang_ids[0] log.info( "choosed language: %s (%s)", args.language, langs[args.language]["description"], ) else: if matched_lang_ids is None: log.error("language is unknown") log.info("supported languages are:") elif len(matched_lang_ids) == 0: log.error("no languages are matched") log.info("supported languages are:") else: log.error("Matched languages were not narrowed down to one.") log.info("You have to choose:") for lang_id in sorted(matched_lang_ids or langs.keys()): log.emit("%s (%s)", lang_id, langs[lang_id]["description"]) sys.exit(1) # confirm if args.wait: log.status("sleep(%.2f)", args.wait) time.sleep(args.wait) if not args.yes: sys.stdout.write("Are you sure? [y/N] ") sys.stdout.flush() c = sys.stdin.read(1) if c != "y": log.info("terminated.") return # submit kwargs = {} if problem.get_service().get_name() == "topcoder": if args.full_submission: kwargs["kind"] = "full" else: kwargs["kind"] = "example" submission = problem.submit(code, language=args.language, session=sess, **kwargs) # show result if submission is None: log.failure("submission failed") else: if args.open: if args.open_browser: browser = args.open_browser else: for browser in default_url_opener: if shutil.which(browser): break else: browser = None log.failure( "couldn't find browsers to open the url. please specify a browser" ) if browser: log.info("open the submission page with: %s", browser) subprocess.check_call( [browser, submission.get_url()], stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, )
def submit(args: 'argparse.Namespace') -> None: # guess url history = onlinejudge.implementation.download_history.DownloadHistory() if args.file.parent.resolve() == pathlib.Path.cwd(): guessed_urls = history.get() else: log.warning( 'cannot guess URL since the given file is not in the current directory' ) guessed_urls = [] if args.url is None: if len(guessed_urls) == 1: args.url = guessed_urls[0] log.info('guessed problem: %s', args.url) else: log.error('failed to guess the URL to submit') log.info('please manually specify URL as: $ oj submit URL FILE') sys.exit(1) # parse url problem = onlinejudge.dispatch.problem_from_url(args.url) if problem is None: sys.exit(1) # read code with args.file.open('rb') as fh: code = fh.read() # type: bytes format_config = { 'dos2unix': args.format_dos2unix or args.golf, 'rstrip': args.format_dos2unix or args.golf, } code = format_code(code, **format_config) # report code try: s = code.decode() except UnicodeDecodeError as e: log.failure('%s: %s', e.__class__.__name__, str(e)) s = repr(code)[1:] log.info('code (%d byte):', len(code)) lines = s.splitlines(keepends=True) if len(lines) < 30: log.emit(log.bold(s)) else: log.emit(log.bold(''.join(lines[:10]))) log.emit('... (%s lines) ...', len(lines[10:-10])) log.emit(log.bold(''.join(lines[-10:]))) with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess: # guess or select language ids langs = problem.get_language_dict(session=sess) matched_lang_ids = None # type: Optional[List[str]] if args.language in langs: matched_lang_ids = [args.language] else: if args.guess: kwargs = { 'language_dict': langs, 'cxx_latest': args.guess_cxx_latest, 'cxx_compiler': args.guess_cxx_compiler, 'python_version': args.guess_python_version, 'python_interpreter': args.guess_python_interpreter, } matched_lang_ids = guess_lang_ids_of_file( args.file, code, **kwargs) if not matched_lang_ids: log.info('failed to guess languages from the file name') matched_lang_ids = list(langs.keys()) if args.language is not None: log.info( 'you can use `--no-guess` option if you want to do an unusual submission' ) matched_lang_ids = select_ids_of_matched_languages( args.language.split(), matched_lang_ids, language_dict=langs) else: if args.language is None: matched_lang_ids = None else: matched_lang_ids = select_ids_of_matched_languages( args.language.split(), list(langs.keys()), language_dict=langs) # report selected language ids if matched_lang_ids is not None and len(matched_lang_ids) == 1: args.language = matched_lang_ids[0] log.info('chosen language: %s (%s)', args.language, langs[args.language]['description']) else: if matched_lang_ids is None: log.error('language is unknown') log.info('supported languages are:') elif len(matched_lang_ids) == 0: log.error('no languages are matched') log.info('supported languages are:') else: log.error('Matched languages were not narrowed down to one.') log.info('You have to choose:') for lang_id in sorted(matched_lang_ids or langs.keys()): log.emit('%s (%s)', lang_id, langs[lang_id]['description']) sys.exit(1) # confirm guessed_unmatch = ([problem.get_url()] != guessed_urls) if guessed_unmatch: samples_text = ('samples of "{}'.format('", "'.join(guessed_urls)) if guessed_urls else 'no samples') log.warning( 'the problem "%s" is specified to submit, but %s were downloaded in this directory. this may be mis-operation', problem.get_url(), samples_text) if args.wait: log.status('sleep(%.2f)', args.wait) time.sleep(args.wait) if not args.yes: if guessed_unmatch: problem_id = problem.get_url().rstrip('/').split( '/')[-1].split('?')[-1] # this is too ad-hoc key = problem_id[:3] + (problem_id[-1] if len(problem_id) >= 4 else '') sys.stdout.write('Are you sure? Please type "{}" '.format(key)) sys.stdout.flush() c = sys.stdin.readline().rstrip() if c != key: log.info('terminated.') return else: sys.stdout.write('Are you sure? [y/N] ') sys.stdout.flush() c = sys.stdin.read(1) if c.lower() != 'y': log.info('terminated.') return # submit kwargs = {} if problem.get_service().get_name() == 'topcoder': if args.full_submission: kwargs['kind'] = 'full' else: kwargs['kind'] = 'example' try: submission = problem.submit_code(code, language=args.language, session=sess, **kwargs) # type: ignore except onlinejudge.type.SubmissionError: log.failure('submission failed') sys.exit(1) # show result if args.open: if args.open_browser: browser = args.open_browser else: for browser in default_url_opener: if shutil.which(browser): break else: browser = None log.failure( 'couldn\'t find browsers to open the url. please specify a browser' ) if browser: log.status('open the submission page with: %s', browser) subprocess.check_call([browser, submission.get_url()], stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr)