From 6464631dbe5c4afeb76f2f3c9d63b89f917c9a3b Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Tue, 2 Nov 2021 18:14:09 -0700 Subject: fmt (black): *.py --- python/fatcat_cleanup.py | 58 +-- python/fatcat_export.py | 56 ++- python/fatcat_harvest.py | 94 +++-- python/fatcat_import.py | 950 ++++++++++++++++++++++++++++----------------- python/fatcat_ingest.py | 210 +++++----- python/fatcat_review.py | 45 ++- python/fatcat_transform.py | 172 +++++--- python/fatcat_util.py | 48 +-- python/fatcat_webface.py | 23 +- python/fatcat_worker.py | 139 ++++--- python/shell.py | 30 +- 11 files changed, 1110 insertions(+), 715 deletions(-) diff --git a/python/fatcat_cleanup.py b/python/fatcat_cleanup.py index 04ee2bd9..f8030b16 100755 --- a/python/fatcat_cleanup.py +++ b/python/fatcat_cleanup.py @@ -15,38 +15,45 @@ sentry_client = raven.Client() def run_files(args): - fmi = FileCleaner(args.api, + fmi = FileCleaner( + args.api, dry_run_mode=args.dry_run, edit_batch_size=args.batch_size, - editgroup_description=args.editgroup_description_override) + editgroup_description=args.editgroup_description_override, + ) JsonLinePusher(fmi, args.json_file).run() + def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--fatcat-api-url', - default="http://localhost:9411/v0", - help="connect to this host/port") - parser.add_argument('--batch-size', - help="size of batch to send", - default=50, type=int) - parser.add_argument('--editgroup-description-override', + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--fatcat-api-url", default="http://localhost:9411/v0", help="connect to this host/port" + ) + parser.add_argument("--batch-size", help="size of batch to send", default=50, type=int) + parser.add_argument( + "--editgroup-description-override", help="editgroup description override", - default=None, type=str) - parser.add_argument('--dry-run', - help="dry-run mode (don't actually update)", - default=False, type=bool) + default=None, + type=str, + ) + parser.add_argument( + "--dry-run", help="dry-run mode (don't actually update)", default=False, type=bool + ) subparsers = parser.add_subparsers() - sub_files = subparsers.add_parser('files', - help="attempt metadata cleanups over a list of file entities") + sub_files = subparsers.add_parser( + "files", help="attempt metadata cleanups over a list of file entities" + ) sub_files.set_defaults( func=run_files, auth_var="FATCAT_AUTH_WORKER_CLEANUP", ) - sub_files.add_argument('json_file', + sub_files.add_argument( + "json_file", help="files JSON file to import from", - default=sys.stdin, type=argparse.FileType('r')) + default=sys.stdin, + type=argparse.FileType("r"), + ) args = parser.parse_args() if not args.__dict__.get("func"): @@ -55,15 +62,18 @@ def main(): # allow editgroup description override via env variable (but CLI arg takes # precedence) - if not args.editgroup_description_override \ - and os.environ.get('FATCAT_EDITGROUP_DESCRIPTION'): - args.editgroup_description_override = os.environ.get('FATCAT_EDITGROUP_DESCRIPTION') + if not args.editgroup_description_override and os.environ.get( + "FATCAT_EDITGROUP_DESCRIPTION" + ): + args.editgroup_description_override = os.environ.get("FATCAT_EDITGROUP_DESCRIPTION") args.api = authenticated_api( args.fatcat_api_url, # token is an optional kwarg (can be empty string, None, etc) - token=os.environ.get(args.auth_var)) + token=os.environ.get(args.auth_var), + ) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_export.py b/python/fatcat_export.py index 9a7cfd01..ebdc5af8 100755 --- a/python/fatcat_export.py +++ b/python/fatcat_export.py @@ -19,7 +19,9 @@ def run_export_releases(args): ident = uuid2fcid(line.split()[0]) release = args.api.get_release(ident=ident, expand="all") args.json_output.write( - json.dumps(entity_to_dict(release), api_client=args.api.api_client) + "\n") + json.dumps(entity_to_dict(release), api_client=args.api.api_client) + "\n" + ) + def run_export_changelog(args): end = args.end @@ -30,36 +32,47 @@ def run_export_changelog(args): for i in range(args.start, end): entry = args.api.get_changelog_entry(index=i) args.json_output.write( - json.dumps(entity_to_dict(entry, api_client=args.api.api_client)) + "\n") + json.dumps(entity_to_dict(entry, api_client=args.api.api_client)) + "\n" + ) + def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--fatcat-api-url', - default="http://localhost:9411/v0", - help="connect to this host/port") + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--fatcat-api-url", default="http://localhost:9411/v0", help="connect to this host/port" + ) subparsers = parser.add_subparsers() - sub_releases = subparsers.add_parser('releases') + sub_releases = subparsers.add_parser("releases") sub_releases.set_defaults(func=run_export_releases) - sub_releases.add_argument('ident_file', + sub_releases.add_argument( + "ident_file", help="TSV list of fatcat release idents to dump", - default=sys.stdin, type=argparse.FileType('r')) - sub_releases.add_argument('json_output', + default=sys.stdin, + type=argparse.FileType("r"), + ) + sub_releases.add_argument( + "json_output", help="where to send output", - default=sys.stdout, type=argparse.FileType('w')) + default=sys.stdout, + type=argparse.FileType("w"), + ) - sub_changelog = subparsers.add_parser('changelog') + sub_changelog = subparsers.add_parser("changelog") sub_changelog.set_defaults(func=run_export_changelog) - sub_changelog.add_argument('--start', - help="index to start dumping at", - default=1, type=int) - sub_changelog.add_argument('--end', + sub_changelog.add_argument("--start", help="index to start dumping at", default=1, type=int) + sub_changelog.add_argument( + "--end", help="index to stop dumping at (else detect most recent)", - default=None, type=int) - sub_changelog.add_argument('json_output', + default=None, + type=int, + ) + sub_changelog.add_argument( + "json_output", help="where to send output", - default=sys.stdout, type=argparse.FileType('w')) + default=sys.stdout, + type=argparse.FileType("w"), + ) args = parser.parse_args() if not args.__dict__.get("func"): @@ -69,5 +82,6 @@ def main(): args.api = public_api(args.fatcat_api_url) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_harvest.py b/python/fatcat_harvest.py index 0324aa52..91356aad 100755 --- a/python/fatcat_harvest.py +++ b/python/fatcat_harvest.py @@ -26,9 +26,11 @@ def run_crossref(args): state_topic=f"fatcat-{args.env}.api-crossref-state", contact_email=args.contact_email, start_date=args.start_date, - end_date=args.end_date) + end_date=args.end_date, + ) worker.run(continuous=args.continuous) + def run_datacite(args): worker = HarvestDataciteWorker( kafka_hosts=args.kafka_hosts, @@ -36,93 +38,108 @@ def run_datacite(args): state_topic=f"fatcat-{args.env}.api-datacite-state", contact_email=args.contact_email, start_date=args.start_date, - end_date=args.end_date) + end_date=args.end_date, + ) worker.run(continuous=args.continuous) + def run_arxiv(args): worker = HarvestArxivWorker( kafka_hosts=args.kafka_hosts, produce_topic=f"fatcat-{args.env}.oaipmh-arxiv", state_topic=f"fatcat-{args.env}.oaipmh-arxiv-state", start_date=args.start_date, - end_date=args.end_date) + end_date=args.end_date, + ) worker.run(continuous=args.continuous) + def run_pubmed(args): worker = PubmedFTPWorker( kafka_hosts=args.kafka_hosts, produce_topic=f"fatcat-{args.env}.ftp-pubmed", state_topic=f"fatcat-{args.env}.ftp-pubmed-state", start_date=args.start_date, - end_date=args.end_date) + end_date=args.end_date, + ) worker.run(continuous=args.continuous) + def run_doaj_article(args): worker = HarvestDoajArticleWorker( kafka_hosts=args.kafka_hosts, produce_topic=f"fatcat-{args.env}.oaipmh-doaj-article", state_topic="fatcat-{args.env}.oaipmh-doaj-article-state", start_date=args.start_date, - end_date=args.end_date) + end_date=args.end_date, + ) worker.run(continuous=args.continuous) + def run_doaj_journal(args): worker = HarvestDoajJournalWorker( kafka_hosts=args.kafka_hosts, produce_topic=f"fatcat-{args.env}.oaipmh-doaj-journal", state_topic=f"fatcat-{args.env}.oaipmh-doaj-journal-state", start_date=args.start_date, - end_date=args.end_date) + end_date=args.end_date, + ) worker.run(continuous=args.continuous) def mkdate(raw): return datetime.datetime.strptime(raw, "%Y-%m-%d").date() + def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--kafka-hosts', + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--kafka-hosts", default="localhost:9092", - help="list of Kafka brokers (host/port) to use") - parser.add_argument('--env', - default="dev", - help="Kafka topic namespace to use (eg, prod, qa, dev)") - parser.add_argument('--start-date', - default=None, type=mkdate, - help="beginning of harvest period") - parser.add_argument('--end-date', - default=None, type=mkdate, - help="end of harvest period") - parser.add_argument('--contact-email', - default="undefined", # better? - help="contact email to use in API header") - parser.add_argument('--continuous', - action='store_true', - help="continue harvesting indefinitely in a loop?") + help="list of Kafka brokers (host/port) to use", + ) + parser.add_argument( + "--env", default="dev", help="Kafka topic namespace to use (eg, prod, qa, dev)" + ) + parser.add_argument( + "--start-date", default=None, type=mkdate, help="beginning of harvest period" + ) + parser.add_argument("--end-date", default=None, type=mkdate, help="end of harvest period") + parser.add_argument( + "--contact-email", + default="undefined", # better? + help="contact email to use in API header", + ) + parser.add_argument( + "--continuous", action="store_true", help="continue harvesting indefinitely in a loop?" + ) subparsers = parser.add_subparsers() - sub_crossref = subparsers.add_parser('crossref', - help="harvest DOI metadata from Crossref API (JSON)") + sub_crossref = subparsers.add_parser( + "crossref", help="harvest DOI metadata from Crossref API (JSON)" + ) sub_crossref.set_defaults(func=run_crossref) - sub_datacite = subparsers.add_parser('datacite', - help="harvest DOI metadata from Datacite API (JSON)") + sub_datacite = subparsers.add_parser( + "datacite", help="harvest DOI metadata from Datacite API (JSON)" + ) sub_datacite.set_defaults(func=run_datacite) - sub_arxiv = subparsers.add_parser('arxiv', - help="harvest metadata from arxiv.org OAI-PMH endpoint (XML)") + sub_arxiv = subparsers.add_parser( + "arxiv", help="harvest metadata from arxiv.org OAI-PMH endpoint (XML)" + ) sub_arxiv.set_defaults(func=run_arxiv) - sub_pubmed = subparsers.add_parser('pubmed', - help="harvest MEDLINE/PubMed metadata from daily FTP updates (XML)") + sub_pubmed = subparsers.add_parser( + "pubmed", help="harvest MEDLINE/PubMed metadata from daily FTP updates (XML)" + ) sub_pubmed.set_defaults(func=run_pubmed) # DOAJ stuff disabled because API range-requests are broken - #sub_doaj_article = subparsers.add_parser('doaj-article') - #sub_doaj_article.set_defaults(func=run_doaj_article) - #sub_doaj_journal = subparsers.add_parser('doaj-journal') - #sub_doaj_journal.set_defaults(func=run_doaj_journal) + # sub_doaj_article = subparsers.add_parser('doaj-article') + # sub_doaj_article.set_defaults(func=run_doaj_article) + # sub_doaj_journal = subparsers.add_parser('doaj-journal') + # sub_doaj_journal.set_defaults(func=run_doaj_journal) args = parser.parse_args() if not args.__dict__.get("func"): @@ -130,5 +147,6 @@ def main(): sys.exit(-1) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_import.py b/python/fatcat_import.py index 3225688c..42001974 100755 --- a/python/fatcat_import.py +++ b/python/fatcat_import.py @@ -51,11 +51,13 @@ sentry_client = raven.Client() def run_crossref(args): - fci = CrossrefImporter(args.api, + fci = CrossrefImporter( + args.api, args.issn_map_file, extid_map_file=args.extid_map_file, edit_batch_size=args.batch_size, - bezerk_mode=args.bezerk_mode) + bezerk_mode=args.bezerk_mode, + ) if args.kafka_mode: KafkaJsonPusher( fci, @@ -68,15 +70,14 @@ def run_crossref(args): else: JsonLinePusher(fci, args.json_file).run() + def run_jalc(args): - ji = JalcImporter(args.api, - args.issn_map_file, - extid_map_file=args.extid_map_file) + ji = JalcImporter(args.api, args.issn_map_file, extid_map_file=args.extid_map_file) Bs4XmlLinesPusher(ji, args.xml_file, "= args.limit: + if args.limit and counts["ingest_request"] >= args.limit: break - counts['elasticsearch_release'] += 1 + counts["elasticsearch_release"] += 1 release = args.api.get_release(esr.ident) ingest_request = release_ingest_request( release, @@ -96,18 +101,18 @@ def _run_search_dump(args, search): if not ingest_request: continue if args.force_recrawl: - ingest_request['force_recrawl'] = True - counts['ingest_request'] += 1 + ingest_request["force_recrawl"] = True + counts["ingest_request"] += 1 if args.dry_run: continue if kafka_producer is not None: kafka_producer.produce( ingest_file_request_topic, - json.dumps(ingest_request).encode('utf-8'), - #key=None, + json.dumps(ingest_request).encode("utf-8"), + # key=None, on_delivery=kafka_fail_fast, ) - counts['kafka'] += 1 + counts["kafka"] += 1 else: print(json.dumps(ingest_request)) if kafka_producer is not None: @@ -138,7 +143,9 @@ def run_ingest_container(args): elif args.name: search = search.query("match", container_name=args.name) else: - print("You must supply at least one query/filter parameter! Eg, ISSN-L", file=sys.stderr) + print( + "You must supply at least one query/filter parameter! Eg, ISSN-L", file=sys.stderr + ) sys.exit(-1) return _run_search_dump(args, search) @@ -150,8 +157,9 @@ def run_ingest_query(args): way as searches in the fatcat web interface. """ - search = _init_search(args) \ - .filter("term", in_ia=False) \ + search = ( + _init_search(args) + .filter("term", in_ia=False) .query( "query_string", query=args.query, @@ -160,6 +168,7 @@ def run_ingest_query(args): lenient=True, fields=["title^5", "contrib_names^2", "container_title"], ) + ) return _run_search_dump(args, search) @@ -169,86 +178,96 @@ def run_ingest_extid(args): Selects release entities where the external identifier (extid) exists """ - search = _init_search(args) \ - .filter("term", in_ia=False) \ - .filter("exists", field=args.extid) + search = _init_search(args).filter("term", in_ia=False).filter("exists", field=args.extid) return _run_search_dump(args, search) def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--fatcat-api-url', - default="http://localhost:9411/v0", - help="connect to this host/port") - parser.add_argument('--enqueue-kafka', - action='store_true', - help="send ingest requests directly to sandcrawler kafka topic for processing") - parser.add_argument('--kafka-hosts', + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--fatcat-api-url", default="http://localhost:9411/v0", help="connect to this host/port" + ) + parser.add_argument( + "--enqueue-kafka", + action="store_true", + help="send ingest requests directly to sandcrawler kafka topic for processing", + ) + parser.add_argument( + "--kafka-hosts", default="localhost:9092", - help="list of Kafka brokers (host/port) to use") - parser.add_argument('--kafka-request-topic', - help="exact Kafka ingest request topic to use") - parser.add_argument('--elasticsearch-endpoint', + help="list of Kafka brokers (host/port) to use", + ) + parser.add_argument("--kafka-request-topic", help="exact Kafka ingest request topic to use") + parser.add_argument( + "--elasticsearch-endpoint", default="https://search.fatcat.wiki", - help="elasticsearch API. internal endpoint preferred, but public is default") - parser.add_argument('--elasticsearch-index', - default="fatcat_release", - help="elasticsearch index to query") - parser.add_argument('--env', - default="dev", - help="Kafka topic namespace to use (eg, prod, qa, dev)") - parser.add_argument('--limit', - default=None, - type=int, - help="Max number of search hits to return") - parser.add_argument('--dry-run', - action='store_true', - help="runs through creating all ingest requests, but doesn't actually output or enqueue") - parser.add_argument('--before-year', + help="elasticsearch API. internal endpoint preferred, but public is default", + ) + parser.add_argument( + "--elasticsearch-index", default="fatcat_release", help="elasticsearch index to query" + ) + parser.add_argument( + "--env", default="dev", help="Kafka topic namespace to use (eg, prod, qa, dev)" + ) + parser.add_argument( + "--limit", default=None, type=int, help="Max number of search hits to return" + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="runs through creating all ingest requests, but doesn't actually output or enqueue", + ) + parser.add_argument( + "--before-year", type=str, - help="filters results to only with release_year before this (not inclusive)") - parser.add_argument('--after-year', + help="filters results to only with release_year before this (not inclusive)", + ) + parser.add_argument( + "--after-year", type=str, - help="filters results to only with release_year after this (inclusive)") - parser.add_argument('--release-types', + help="filters results to only with release_year after this (inclusive)", + ) + parser.add_argument( + "--release-types", type=str, - help="filters results to specified release-types, separated by commas. By default, 'stub' is filtered out.") - parser.add_argument('--allow-non-oa', - action='store_true', - help="By default, we limit to OA releases. This removes that filter") - parser.add_argument('--force-recrawl', - action='store_true', - help="Tell ingest worker to skip GWB history lookup and do SPNv2 crawl") - parser.add_argument('--ingest-type', - default="pdf", - help="What medium to ingest (pdf, xml, html)") + help="filters results to specified release-types, separated by commas. By default, 'stub' is filtered out.", + ) + parser.add_argument( + "--allow-non-oa", + action="store_true", + help="By default, we limit to OA releases. This removes that filter", + ) + parser.add_argument( + "--force-recrawl", + action="store_true", + help="Tell ingest worker to skip GWB history lookup and do SPNv2 crawl", + ) + parser.add_argument( + "--ingest-type", default="pdf", help="What medium to ingest (pdf, xml, html)" + ) subparsers = parser.add_subparsers() - sub_container = subparsers.add_parser('container', - help="Create ingest requests for releases from a specific container") + sub_container = subparsers.add_parser( + "container", help="Create ingest requests for releases from a specific container" + ) sub_container.set_defaults(func=run_ingest_container) - sub_container.add_argument('--container-id', - help="fatcat container entity ident") - sub_container.add_argument('--issnl', - help="ISSN-L of container entity") - sub_container.add_argument('--publisher', - help="publisher name") - sub_container.add_argument('--name', - help="container name") - - sub_query = subparsers.add_parser('query', - help="Create ingest requests for releases from a specific query") + sub_container.add_argument("--container-id", help="fatcat container entity ident") + sub_container.add_argument("--issnl", help="ISSN-L of container entity") + sub_container.add_argument("--publisher", help="publisher name") + sub_container.add_argument("--name", help="container name") + + sub_query = subparsers.add_parser( + "query", help="Create ingest requests for releases from a specific query" + ) sub_query.set_defaults(func=run_ingest_query) - sub_query.add_argument('query', - help="search query (same DSL as web interface search)") + sub_query.add_argument("query", help="search query (same DSL as web interface search)") - sub_extid = subparsers.add_parser('extid', - help="Create ingest requests for releases that have given extid defined") + sub_extid = subparsers.add_parser( + "extid", help="Create ingest requests for releases that have given extid defined" + ) sub_extid.set_defaults(func=run_ingest_extid) - sub_extid.add_argument('extid', - help="extid short name (as included in ES release schema)") + sub_extid.add_argument("extid", help="extid short name (as included in ES release schema)") args = parser.parse_args() if not args.__dict__.get("func"): @@ -258,5 +277,6 @@ def main(): args.api = public_api(args.fatcat_api_url) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_review.py b/python/fatcat_review.py index f719bb46..0cdfc29d 100755 --- a/python/fatcat_review.py +++ b/python/fatcat_review.py @@ -13,39 +13,43 @@ sentry_client = raven.Client() def run_dummy(args): - reviewer = DummyReviewBot(args.api, poll_interval=args.poll_interval, - verbose=args.verbose) + reviewer = DummyReviewBot(args.api, poll_interval=args.poll_interval, verbose=args.verbose) if args.editgroup: annotation = reviewer.run_single(args.editgroup, args.annotate) print(annotation) elif args.continuous: reviewer.run() + def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--verbose', - action='store_true', - help="enable verbose output") - parser.add_argument('--fatcat-api-url', + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument("--verbose", action="store_true", help="enable verbose output") + parser.add_argument( + "--fatcat-api-url", default="http://localhost:9411/v0", - help="fatcat API host/port to use") - parser.add_argument('--poll-interval', + help="fatcat API host/port to use", + ) + parser.add_argument( + "--poll-interval", help="how long to wait between polling (seconds)", - default=10.0, type=float) + default=10.0, + type=float, + ) subparsers = parser.add_subparsers() - sub_dummy = subparsers.add_parser('dummy', - help="example/demonstration review bot") + sub_dummy = subparsers.add_parser("dummy", help="example/demonstration review bot") sub_dummy.set_defaults(func=run_dummy) - sub_dummy.add_argument("--continuous", + sub_dummy.add_argument( + "--continuous", action="store_true", - help="run forever, polling for new reviewable editgroups") - sub_dummy.add_argument("--editgroup", - help="single editgroup ID to review") - sub_dummy.add_argument("--annotate", + help="run forever, polling for new reviewable editgroups", + ) + sub_dummy.add_argument("--editgroup", help="single editgroup ID to review") + sub_dummy.add_argument( + "--annotate", action="store_true", - help="for single editgroups, pushes result as annotation") + help="for single editgroups, pushes result as annotation", + ) args = parser.parse_args() if not args.__dict__.get("func"): @@ -58,5 +62,6 @@ def main(): args.api = authenticated_api(args.fatcat_api_url) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_transform.py b/python/fatcat_transform.py index ab855dbf..fe2e12a6 100755 --- a/python/fatcat_transform.py +++ b/python/fatcat_transform.py @@ -31,10 +31,10 @@ def run_elasticsearch_releases(args): if not line: continue entity = entity_from_json(line, ReleaseEntity, api_client=args.api.api_client) - if entity.state != 'active': + if entity.state != "active": continue - args.json_output.write( - json.dumps(release_to_elasticsearch(entity)) + '\n') + args.json_output.write(json.dumps(release_to_elasticsearch(entity)) + "\n") + def run_elasticsearch_containers(args): es_client = elasticsearch.Elasticsearch(args.fatcat_elasticsearch_url) @@ -44,7 +44,7 @@ def run_elasticsearch_containers(args): if not line: continue entity = entity_from_json(line, ContainerEntity, api_client=args.api.api_client) - if entity.state != 'active': + if entity.state != "active": continue if args.query_stats: @@ -60,7 +60,8 @@ def run_elasticsearch_containers(args): else: es_doc = container_to_elasticsearch(entity) - args.json_output.write(json.dumps(es_doc) + '\n') + args.json_output.write(json.dumps(es_doc) + "\n") + def run_elasticsearch_files(args): for line in args.json_input: @@ -68,10 +69,10 @@ def run_elasticsearch_files(args): if not line: continue entity = entity_from_json(line, FileEntity, api_client=args.api.api_client) - if entity.state != 'active': + if entity.state != "active": continue - args.json_output.write( - json.dumps(file_to_elasticsearch(entity)) + '\n') + args.json_output.write(json.dumps(file_to_elasticsearch(entity)) + "\n") + def run_elasticsearch_changelogs(args): for line in args.json_input: @@ -79,8 +80,8 @@ def run_elasticsearch_changelogs(args): if not line: continue entity = entity_from_json(line, ChangelogEntry, api_client=args.api.api_client) - args.json_output.write( - json.dumps(changelog_to_elasticsearch(entity)) + '\n') + args.json_output.write(json.dumps(changelog_to_elasticsearch(entity)) + "\n") + def run_citeproc_releases(args): for line in args.json_input: @@ -88,82 +89,126 @@ def run_citeproc_releases(args): if not line: continue entity = entity_from_json(line, ReleaseEntity, api_client=args.api.api_client) - if entity.state != 'active': + if entity.state != "active": continue csl_json = release_to_csl(entity) - csl_json['id'] = "release:" + (entity.ident or "unknown") + csl_json["id"] = "release:" + (entity.ident or "unknown") out = citeproc_csl(csl_json, args.style, args.html) args.json_output.write(out + "\n") + def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--fatcat-api-url', - default="http://localhost:9411/v0", - help="connect to this host/port") - parser.add_argument('--fatcat-elasticsearch-url', + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--fatcat-api-url", default="http://localhost:9411/v0", help="connect to this host/port" + ) + parser.add_argument( + "--fatcat-elasticsearch-url", default="http://localhost:9200", - help="connect to this host/port") + help="connect to this host/port", + ) subparsers = parser.add_subparsers() - sub_elasticsearch_releases = subparsers.add_parser('elasticsearch-releases', - help="convert fatcat release JSON schema to elasticsearch release schema") + sub_elasticsearch_releases = subparsers.add_parser( + "elasticsearch-releases", + help="convert fatcat release JSON schema to elasticsearch release schema", + ) sub_elasticsearch_releases.set_defaults(func=run_elasticsearch_releases) - sub_elasticsearch_releases.add_argument('json_input', + sub_elasticsearch_releases.add_argument( + "json_input", help="JSON-per-line of release entities", - default=sys.stdin, type=argparse.FileType('r')) - sub_elasticsearch_releases.add_argument('json_output', + default=sys.stdin, + type=argparse.FileType("r"), + ) + sub_elasticsearch_releases.add_argument( + "json_output", help="where to send output", - default=sys.stdout, type=argparse.FileType('w')) - - sub_elasticsearch_containers = subparsers.add_parser('elasticsearch-containers', - help="convert fatcat container JSON schema to elasticsearch container schema") + default=sys.stdout, + type=argparse.FileType("w"), + ) + + sub_elasticsearch_containers = subparsers.add_parser( + "elasticsearch-containers", + help="convert fatcat container JSON schema to elasticsearch container schema", + ) sub_elasticsearch_containers.set_defaults(func=run_elasticsearch_containers) - sub_elasticsearch_containers.add_argument('json_input', + sub_elasticsearch_containers.add_argument( + "json_input", help="JSON-per-line of container entities", - default=sys.stdin, type=argparse.FileType('r')) - sub_elasticsearch_containers.add_argument('json_output', + default=sys.stdin, + type=argparse.FileType("r"), + ) + sub_elasticsearch_containers.add_argument( + "json_output", help="where to send output", - default=sys.stdout, type=argparse.FileType('w')) - sub_elasticsearch_containers.add_argument('--query-stats', - action='store_true', - help="whether to query release search index for container stats") - - sub_elasticsearch_files = subparsers.add_parser('elasticsearch-files', - help="convert fatcat file JSON schema to elasticsearch file schema") + default=sys.stdout, + type=argparse.FileType("w"), + ) + sub_elasticsearch_containers.add_argument( + "--query-stats", + action="store_true", + help="whether to query release search index for container stats", + ) + + sub_elasticsearch_files = subparsers.add_parser( + "elasticsearch-files", + help="convert fatcat file JSON schema to elasticsearch file schema", + ) sub_elasticsearch_files.set_defaults(func=run_elasticsearch_files) - sub_elasticsearch_files.add_argument('json_input', + sub_elasticsearch_files.add_argument( + "json_input", help="JSON-per-line of file entities", - default=sys.stdin, type=argparse.FileType('r')) - sub_elasticsearch_files.add_argument('json_output', + default=sys.stdin, + type=argparse.FileType("r"), + ) + sub_elasticsearch_files.add_argument( + "json_output", help="where to send output", - default=sys.stdout, type=argparse.FileType('w')) - - sub_elasticsearch_changelogs = subparsers.add_parser('elasticsearch-changelogs', - help="convert fatcat changelog JSON schema to elasticsearch changelog schema") + default=sys.stdout, + type=argparse.FileType("w"), + ) + + sub_elasticsearch_changelogs = subparsers.add_parser( + "elasticsearch-changelogs", + help="convert fatcat changelog JSON schema to elasticsearch changelog schema", + ) sub_elasticsearch_changelogs.set_defaults(func=run_elasticsearch_changelogs) - sub_elasticsearch_changelogs.add_argument('json_input', + sub_elasticsearch_changelogs.add_argument( + "json_input", help="JSON-per-line of changelog entries", - default=sys.stdin, type=argparse.FileType('r')) - sub_elasticsearch_changelogs.add_argument('json_output', + default=sys.stdin, + type=argparse.FileType("r"), + ) + sub_elasticsearch_changelogs.add_argument( + "json_output", help="where to send output", - default=sys.stdout, type=argparse.FileType('w')) - - sub_citeproc_releases = subparsers.add_parser('citeproc-releases', - help="convert fatcat release schema to any standard citation format using citeproc/CSL") + default=sys.stdout, + type=argparse.FileType("w"), + ) + + sub_citeproc_releases = subparsers.add_parser( + "citeproc-releases", + help="convert fatcat release schema to any standard citation format using citeproc/CSL", + ) sub_citeproc_releases.set_defaults(func=run_citeproc_releases) - sub_citeproc_releases.add_argument('json_input', + sub_citeproc_releases.add_argument( + "json_input", help="JSON-per-line of release entities", - default=sys.stdin, type=argparse.FileType('r')) - sub_citeproc_releases.add_argument('json_output', + default=sys.stdin, + type=argparse.FileType("r"), + ) + sub_citeproc_releases.add_argument( + "json_output", help="where to send output", - default=sys.stdout, type=argparse.FileType('w')) - sub_citeproc_releases.add_argument('--style', - help="citation style to output", - default='csl-json') - sub_citeproc_releases.add_argument('--html', - action='store_true', - help="output HTML, not plain text") + default=sys.stdout, + type=argparse.FileType("w"), + ) + sub_citeproc_releases.add_argument( + "--style", help="citation style to output", default="csl-json" + ) + sub_citeproc_releases.add_argument( + "--html", action="store_true", help="output HTML, not plain text" + ) args = parser.parse_args() if not args.__dict__.get("func"): @@ -173,5 +218,6 @@ def main(): args.api = public_api(args.fatcat_api_url) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_util.py b/python/fatcat_util.py index a8e99ac3..57102e9e 100755 --- a/python/fatcat_util.py +++ b/python/fatcat_util.py @@ -16,47 +16,50 @@ from fatcat_tools import authenticated_api, fcid2uuid, uuid2fcid def run_uuid2fcid(args): print(uuid2fcid(args.uuid)) + def run_fcid2uuid(args): print(fcid2uuid(args.fcid)) + def run_editgroup_accept(args): args.api.accept_editgroup(args.editgroup_id) + def run_editgroup_submit(args): eg = args.api.get_editgroup(args.editgroup_id) args.api.update_editgroup(args.editgroup_id, eg, submit=True) + def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--fatcat-api-url', - default="http://localhost:9411/v0", - help="connect to this host/port") + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--fatcat-api-url", default="http://localhost:9411/v0", help="connect to this host/port" + ) subparsers = parser.add_subparsers() - sub_uuid2fcid = subparsers.add_parser('uuid2fcid', - help="convert a standard UUID (as string) to fatcat ident format") + sub_uuid2fcid = subparsers.add_parser( + "uuid2fcid", help="convert a standard UUID (as string) to fatcat ident format" + ) sub_uuid2fcid.set_defaults(func=run_uuid2fcid) - sub_uuid2fcid.add_argument('uuid', - help="UUID to transform") + sub_uuid2fcid.add_argument("uuid", help="UUID to transform") - sub_fcid2uuid = subparsers.add_parser('fcid2uuid', - help="convert a fatcat ident string to standard UUID format") + sub_fcid2uuid = subparsers.add_parser( + "fcid2uuid", help="convert a fatcat ident string to standard UUID format" + ) sub_fcid2uuid.set_defaults(func=run_fcid2uuid) - sub_fcid2uuid.add_argument('fcid', - help="FCID to transform (into UUID)") + sub_fcid2uuid.add_argument("fcid", help="FCID to transform (into UUID)") - sub_editgroup_accept = subparsers.add_parser('editgroup-accept', - help="accept an editgroup (by ident)") + sub_editgroup_accept = subparsers.add_parser( + "editgroup-accept", help="accept an editgroup (by ident)" + ) sub_editgroup_accept.set_defaults(func=run_editgroup_accept) - sub_editgroup_accept.add_argument('editgroup_id', - help="editgroup to accept") + sub_editgroup_accept.add_argument("editgroup_id", help="editgroup to accept") - sub_editgroup_submit = subparsers.add_parser('editgroup-submit', - help="submit an editgroup for review (by ident)") + sub_editgroup_submit = subparsers.add_parser( + "editgroup-submit", help="submit an editgroup for review (by ident)" + ) sub_editgroup_submit.set_defaults(func=run_editgroup_submit) - sub_editgroup_submit.add_argument('editgroup_id', - help="editgroup to submit") + sub_editgroup_submit.add_argument("editgroup_id", help="editgroup to submit") args = parser.parse_args() if not args.__dict__.get("func"): @@ -66,5 +69,6 @@ def main(): args.api = authenticated_api(args.fatcat_api_url) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_webface.py b/python/fatcat_webface.py index d12e8dad..acaa5936 100755 --- a/python/fatcat_webface.py +++ b/python/fatcat_webface.py @@ -6,21 +6,18 @@ from fatcat_web import app def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--debug', - action='store_true', - help="enable debugging interface (note: not for everything)") - parser.add_argument('--host', - default="127.0.0.1", - help="listen on this host/IP") - parser.add_argument('--port', - type=int, - default=9810, - help="listen on this port") + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--debug", + action="store_true", + help="enable debugging interface (note: not for everything)", + ) + parser.add_argument("--host", default="127.0.0.1", help="listen on this host/IP") + parser.add_argument("--port", type=int, default=9810, help="listen on this port") args = parser.parse_args() app.run(debug=args.debug, host=args.host, port=args.port) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/fatcat_worker.py b/python/fatcat_worker.py index 397cf731..b776e0ce 100755 --- a/python/fatcat_worker.py +++ b/python/fatcat_worker.py @@ -20,10 +20,12 @@ sentry_client = raven.Client() def run_changelog(args): topic = "fatcat-{}.changelog".format(args.env) - worker = ChangelogWorker(args.api, args.kafka_hosts, topic, - poll_interval=args.poll_interval) + worker = ChangelogWorker( + args.api, args.kafka_hosts, topic, poll_interval=args.poll_interval + ) worker.run() + def run_entity_updates(args): changelog_topic = "fatcat-{}.changelog".format(args.env) release_topic = "fatcat-{}.release-updates-v03".format(args.env) @@ -31,7 +33,9 @@ def run_entity_updates(args): container_topic = "fatcat-{}.container-updates".format(args.env) work_ident_topic = "fatcat-{}.work-ident-updates".format(args.env) ingest_file_request_topic = "sandcrawler-{}.ingest-file-requests-daily".format(args.env) - worker = EntityUpdatesWorker(args.api, args.kafka_hosts, + worker = EntityUpdatesWorker( + args.api, + args.kafka_hosts, changelog_topic, release_topic=release_topic, file_topic=file_topic, @@ -41,86 +45,126 @@ def run_entity_updates(args): ) worker.run() + def run_elasticsearch_release(args): consume_topic = "fatcat-{}.release-updates-v03".format(args.env) - worker = ElasticsearchReleaseWorker(args.kafka_hosts, consume_topic, + worker = ElasticsearchReleaseWorker( + args.kafka_hosts, + consume_topic, elasticsearch_backend=args.elasticsearch_backend, - elasticsearch_index=args.elasticsearch_index) + elasticsearch_index=args.elasticsearch_index, + ) worker.run() + def run_elasticsearch_container(args): consume_topic = "fatcat-{}.container-updates".format(args.env) - worker = ElasticsearchContainerWorker(args.kafka_hosts, consume_topic, + worker = ElasticsearchContainerWorker( + args.kafka_hosts, + consume_topic, query_stats=args.query_stats, elasticsearch_release_index="fatcat_release", elasticsearch_backend=args.elasticsearch_backend, - elasticsearch_index=args.elasticsearch_index) + elasticsearch_index=args.elasticsearch_index, + ) worker.run() + def run_elasticsearch_changelog(args): consume_topic = "fatcat-{}.changelog".format(args.env) - worker = ElasticsearchChangelogWorker(args.kafka_hosts, consume_topic, + worker = ElasticsearchChangelogWorker( + args.kafka_hosts, + consume_topic, elasticsearch_backend=args.elasticsearch_backend, - elasticsearch_index=args.elasticsearch_index) + elasticsearch_index=args.elasticsearch_index, + ) worker.run() + def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('--api-host-url', - default="http://localhost:9411/v0", - help="fatcat API host/port to use") - parser.add_argument('--kafka-hosts', + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument( + "--api-host-url", default="http://localhost:9411/v0", help="fatcat API host/port to use" + ) + parser.add_argument( + "--kafka-hosts", default="localhost:9092", - help="list of Kafka brokers (host/port) to use") - parser.add_argument('--env', - default="dev", - help="Kafka topic namespace to use (eg, prod, qa, dev)") + help="list of Kafka brokers (host/port) to use", + ) + parser.add_argument( + "--env", default="dev", help="Kafka topic namespace to use (eg, prod, qa, dev)" + ) subparsers = parser.add_subparsers() - sub_changelog = subparsers.add_parser('changelog', - help="poll fatcat API for changelog entries, push to kafka") + sub_changelog = subparsers.add_parser( + "changelog", help="poll fatcat API for changelog entries, push to kafka" + ) sub_changelog.set_defaults(func=run_changelog) - sub_changelog.add_argument('--poll-interval', + sub_changelog.add_argument( + "--poll-interval", help="how long to wait between polling (seconds)", - default=5.0, type=float) + default=5.0, + type=float, + ) - sub_entity_updates = subparsers.add_parser('entity-updates', - help="poll kafka for changelog entries; push entity changes to various kafka topics") + sub_entity_updates = subparsers.add_parser( + "entity-updates", + help="poll kafka for changelog entries; push entity changes to various kafka topics", + ) sub_entity_updates.set_defaults(func=run_entity_updates) - sub_elasticsearch_release = subparsers.add_parser('elasticsearch-release', - help="consume kafka feed of new/updated releases, transform and push to search") + sub_elasticsearch_release = subparsers.add_parser( + "elasticsearch-release", + help="consume kafka feed of new/updated releases, transform and push to search", + ) sub_elasticsearch_release.set_defaults(func=run_elasticsearch_release) - sub_elasticsearch_release.add_argument('--elasticsearch-backend', + sub_elasticsearch_release.add_argument( + "--elasticsearch-backend", help="elasticsearch backend to connect to", - default="http://localhost:9200") - sub_elasticsearch_release.add_argument('--elasticsearch-index', + default="http://localhost:9200", + ) + sub_elasticsearch_release.add_argument( + "--elasticsearch-index", help="elasticsearch index to push into", - default="fatcat_release_v03") + default="fatcat_release_v03", + ) - sub_elasticsearch_container = subparsers.add_parser('elasticsearch-container', - help="consume kafka feed of new/updated containers, transform and push to search") + sub_elasticsearch_container = subparsers.add_parser( + "elasticsearch-container", + help="consume kafka feed of new/updated containers, transform and push to search", + ) sub_elasticsearch_container.set_defaults(func=run_elasticsearch_container) - sub_elasticsearch_container.add_argument('--elasticsearch-backend', + sub_elasticsearch_container.add_argument( + "--elasticsearch-backend", help="elasticsearch backend to connect to", - default="http://localhost:9200") - sub_elasticsearch_container.add_argument('--elasticsearch-index', + default="http://localhost:9200", + ) + sub_elasticsearch_container.add_argument( + "--elasticsearch-index", help="elasticsearch index to push into", - default="fatcat_container") - sub_elasticsearch_container.add_argument('--query-stats', - action='store_true', - help="whether to query release search index for container stats") + default="fatcat_container", + ) + sub_elasticsearch_container.add_argument( + "--query-stats", + action="store_true", + help="whether to query release search index for container stats", + ) - sub_elasticsearch_changelog = subparsers.add_parser('elasticsearch-changelog', - help="consume changelog kafka feed, transform and push to search") + sub_elasticsearch_changelog = subparsers.add_parser( + "elasticsearch-changelog", + help="consume changelog kafka feed, transform and push to search", + ) sub_elasticsearch_changelog.set_defaults(func=run_elasticsearch_changelog) - sub_elasticsearch_changelog.add_argument('--elasticsearch-backend', + sub_elasticsearch_changelog.add_argument( + "--elasticsearch-backend", help="elasticsearch backend to connect to", - default="http://localhost:9200") - sub_elasticsearch_changelog.add_argument('--elasticsearch-index', + default="http://localhost:9200", + ) + sub_elasticsearch_changelog.add_argument( + "--elasticsearch-index", help="elasticsearch index to push into", - default="fatcat_changelog") + default="fatcat_changelog", + ) args = parser.parse_args() if not args.__dict__.get("func"): @@ -130,5 +174,6 @@ def main(): args.api = public_api(args.api_host_url) args.func(args) -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/python/shell.py b/python/shell.py index 9b561f5f..e8879a70 100644 --- a/python/shell.py +++ b/python/shell.py @@ -12,9 +12,9 @@ from fatcat_openapi_client.rest import ApiException from fatcat_tools import * -if __name__ == '__main__': +if __name__ == "__main__": - #api = + # api = print(" __ _ _ _ ") print(" / _| __ _| |_ ___ __ _| |_| |") print("| |_ / _` | __/ __/ _` | __| |") @@ -24,23 +24,27 @@ if __name__ == '__main__': admin_id = "aaaaaaaaaaaabkvkaaaaaaaaae" - #fatcat_openapi_client.configuration.api_key['Authorization'] = 'YOUR_API_KEY' - #fatcat_openapi_client.configuration.api_key_prefix['Authorization'] = 'Bearer' + # fatcat_openapi_client.configuration.api_key['Authorization'] = 'YOUR_API_KEY' + # fatcat_openapi_client.configuration.api_key_prefix['Authorization'] = 'Bearer' local_conf = fatcat_openapi_client.Configuration() - local_conf.api_key["Authorization"] = "AgEPZGV2LmZhdGNhdC53aWtpAhYyMDE5MDEwMS1kZXYtZHVtbXkta2V5AAImZWRpdG9yX2lkID0gYWFhYWFhYWFhYWFhYmt2a2FhYWFhYWFhYWkAAht0aW1lID4gMjAxOS0wMS0wOVQwMDo1Nzo1MloAAAYgnroNha1hSftChtxHGTnLEmM/pY8MeQS/jBSV0UNvXug=" + local_conf.api_key[ + "Authorization" + ] = "AgEPZGV2LmZhdGNhdC53aWtpAhYyMDE5MDEwMS1kZXYtZHVtbXkta2V5AAImZWRpdG9yX2lkID0gYWFhYWFhYWFhYWFhYmt2a2FhYWFhYWFhYWkAAht0aW1lID4gMjAxOS0wMS0wOVQwMDo1Nzo1MloAAAYgnroNha1hSftChtxHGTnLEmM/pY8MeQS/jBSV0UNvXug=" local_conf.api_key_prefix["Authorization"] = "Bearer" - local_conf.host = 'http://localhost:9411/v0' + local_conf.host = "http://localhost:9411/v0" local_conf.debug = True local_api = fatcat_openapi_client.DefaultApi(fatcat_openapi_client.ApiClient(local_conf)) - #prod_conf = fatcat_openapi_client.Configuration() - #prod_conf.api_key["Authorization"] = "AgEPZGV2LmZhdGNhdC53aWtpAg4yMDE4LTEyLTMxLWRldgACJmVkaXRvcl9pZCA9IGFhYWFhYWFhYWFhYWJrdmthYWFhYWFhYWFlAAIeY3JlYXRlZCA9IDIwMTgtMTItMzFUMjE6MTU6NDdaAAAGIMWFZeZ54pH4OzNl5+U5X3p1H1rMioSuIldihuiM5XAw" - #prod_conf.api_key_prefix["Authorization"] = "Bearer" - #prod_conf.host = 'https://api.fatcat.wiki/v0' - #prod_api = fatcat_openapi_client.DefaultApi(fatcat_openapi_client.ApiClient(prod_conf)) + # prod_conf = fatcat_openapi_client.Configuration() + # prod_conf.api_key["Authorization"] = "AgEPZGV2LmZhdGNhdC53aWtpAg4yMDE4LTEyLTMxLWRldgACJmVkaXRvcl9pZCA9IGFhYWFhYWFhYWFhYWJrdmthYWFhYWFhYWFlAAIeY3JlYXRlZCA9IDIwMTgtMTItMzFUMjE6MTU6NDdaAAAGIMWFZeZ54pH4OzNl5+U5X3p1H1rMioSuIldihuiM5XAw" + # prod_conf.api_key_prefix["Authorization"] = "Bearer" + # prod_conf.host = 'https://api.fatcat.wiki/v0' + # prod_api = fatcat_openapi_client.DefaultApi(fatcat_openapi_client.ApiClient(prod_conf)) qa_conf = fatcat_openapi_client.Configuration() - qa_conf.api_key["Authorization"] = "AgEPZGV2LmZhdGNhdC53aWtpAg4yMDE4LTEyLTMxLWRldgACJmVkaXRvcl9pZCA9IGFhYWFhYWFhYWFhYWJrdmthYWFhYWFhYWFlAAIeY3JlYXRlZCA9IDIwMTgtMTItMzFUMjE6MTU6NDdaAAAGIMWFZeZ54pH4OzNl5+U5X3p1H1rMioSuIldihuiM5XAw" + qa_conf.api_key[ + "Authorization" + ] = "AgEPZGV2LmZhdGNhdC53aWtpAg4yMDE4LTEyLTMxLWRldgACJmVkaXRvcl9pZCA9IGFhYWFhYWFhYWFhYWJrdmthYWFhYWFhYWFlAAIeY3JlYXRlZCA9IDIwMTgtMTItMzFUMjE6MTU6NDdaAAAGIMWFZeZ54pH4OzNl5+U5X3p1H1rMioSuIldihuiM5XAw" qa_conf.api_key_prefix["Authorization"] = "Bearer" - qa_conf.host = 'https://api.qa.fatcat.wiki/v0' + qa_conf.host = "https://api.qa.fatcat.wiki/v0" qa_api = fatcat_openapi_client.DefaultApi(fatcat_openapi_client.ApiClient(qa_conf)) -- cgit v1.2.3