From 3de616f19805663bb26ca67d6b3496cd4abdcd47 Mon Sep 17 00:00:00 2001 From: Michael Buehlmann Date: Sun, 14 Apr 2024 17:22:33 -0400 Subject: [PATCH] initial commit --- .gitignore | 2 + README.md | 0 cosmicweb_music/__init__.py | 0 cosmicweb_music/cosmICweb.py | 392 +++++++++++++++++++++++++++++++++++ poetry.lock | 190 +++++++++++++++++ pyproject.toml | 19 ++ 6 files changed, 603 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 cosmicweb_music/__init__.py create mode 100755 cosmicweb_music/cosmICweb.py create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b0f2192 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +.venv \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/cosmicweb_music/__init__.py b/cosmicweb_music/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cosmicweb_music/cosmICweb.py b/cosmicweb_music/cosmICweb.py new file mode 100755 index 0000000..6da79f9 --- /dev/null +++ b/cosmicweb_music/cosmICweb.py @@ -0,0 +1,392 @@ +import os +import sys +import tempfile +import subprocess +import click +import requests +from collections import namedtuple +from datetime import datetime +import logging + +# Logger +logger = logging.getLogger() +handler = logging.StreamHandler() +formatter = logging.Formatter( + "%(asctime)s %(levelname)-8s %(message)s", "%Y-%m-%d %H:%M:%S" +) +handler.setFormatter(formatter) +logger.addHandler(handler) +logger.setLevel("INFO") + +# Some constants +DEFAULT_URL = "https://cosmicweb.astro.univie.ac.at" +EDITOR = os.environ.get("EDITOR", "vim") + +# Types +Ellipsoid = namedtuple( + "Ellipsoid", ["center", "shape", "traceback_radius", "radius_definition"] +) +DownloadConfig = namedtuple( + "DownloadConfig", + [ + "simulation_name", + "halo_names", + "halo_urls", + "traceback_radius", + "api_token", + "MUSIC", + "settings", + "accessed_at", + ], +) + + +def query_yes_no(question, default="yes"): + """Ask a yes/no question via raw_input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") + + +# Routines +def fetch_ellipsoids(url, api_token, attempts): + for i in range(attempts): + try: + r = requests.get(url, headers={"Authorization": "Token " + api_token}) + # This will raise an error if not successful + r.raise_for_status() + except requests.exceptions.HTTPError as e: + logging.warning("Failed fetching (attempt {}/{}) ...".format(i, attempts)) + else: + content = r.json() + return [ + Ellipsoid( + center=e["ellips_center"], + shape=e["ellips_matrix"], + radius_definition=e["radius_definition"], + traceback_radius=e["traceback_radius"], + ) + for e in content + ] + logging.error("Unable to download ellipsoids from {}".format(url)) + return None + + +def fetch_ellipsoid(url, api_token, traceback_radius, attempts=3): + ellipsoids = fetch_ellipsoids(url, api_token, attempts) + if ellipsoids is not None: + return next( + (e for e in ellipsoids if e.traceback_radius == traceback_radius), None + ) + return None + + +def fetch_downloadstore(cosmicweb_url, target): + try: + r = requests.get(cosmicweb_url + "/api/music/store/" + target) + # This will raise an error if not successful + r.raise_for_status() + except requests.exceptions.HTTPError as e: + logging.critical("Failed downloading from cosmICweb.") + sys.exit("Error") + content = r.json() + sim = content["simulation"] + halo_urls = [ + "{url}/simulation/{sid}/halo/{hid}".format( + url=sim["api_url"], sid=sim["api_id"], hid=h + ) + for h in content["halos"] + ] + return DownloadConfig( + simulation_name=sim["name"], + halo_names=["halo_{}".format(h) for h in content["halos"]], + halo_urls=halo_urls, + traceback_radius=content["traceback_radius"], + api_token=sim["api_token"], + MUSIC=sim["ics"], + settings=content["configuration"], + accessed_at=datetime.now(), + ) + + +def fetch_publication(cosmicweb_url, publication_name, traceback_radius): + try: + r = requests.get(cosmicweb_url + "/api/publications/" + publication_name) + # This will raise an error if not successful + r.raise_for_status() + except requests.exceptions.HTTPError as e: + logging.critical("Failed downloading from cosmICweb.") + sys.exit("Error") + content = r.json() + sim = content["simulation"] + halo_names = [h["name"] for h in content["halos"]] + halo_urls = [ + "{url}/simulation/{sid}/halo/{hid}".format( + url=sim["api_url"], sid=sim["api_id"], hid=h["id"] + ) + for h in content["halos"] + ] + return DownloadConfig( + simulation_name=sim["name"], + halo_names=halo_names, + halo_urls=halo_urls, + traceback_radius=traceback_radius, + api_token=sim["api_token"], + MUSIC=sim["ics"], + settings={}, + accessed_at=datetime.now(), + ) + + +def edit_template(template): + with tempfile.NamedTemporaryFile(suffix=".tmp", mode="r+") as tf: + tf.write(template) + tf.flush() + # Call the editor. backupcopy=yes prevents vim from creating copy and rename + subprocess.call([EDITOR, "+set backupcopy=yes", tf.name]) + tf.seek(0) + template = tf.read() + return template + + +def music_config_to_template(music_config, configuration): + # TODO: apply configuraton, add header + return ( + "[SETUP]\n" + music_config["setup"] + "\n\n\n\n" + "[COSMOLOGY]\n" + music_config["cosmology"] + "\n\n" + "[RANDOM]\n" + music_config["random"] + "\n\n" + "[POISSON]\n" + music_config["poisson"] + ) + + +def compose_template(template, ellipsoid): + # TODO: add ellipsoid header (rtb, halo_name, etc) + shape_0 = ", ".join("{:13.6e}".format(e) for e in ellipsoid.shape[0]) + shape_1 = ", ".join("{:13.6e}".format(e) for e in ellipsoid.shape[1]) + shape_2 = ", ".join("{:13.6e}".format(e) for e in ellipsoid.shape[2]) + center = ", ".join("{:13.6e}".format(x) for x in ellipsoid.center) + + ellipsoid_lines = ( + "region = ellipsoid\n" + "region_ellipsoid_matrix[0] = {s0}\n" + "region_ellipsoid_matrix[1] = {s1}\n" + "region_ellipsoid_matrix[2] = {s2}\n" + "region_ellipsoid_center = {c}\n".format( + s0=shape_0, s1=shape_1, s2=shape_2, c=center + ) + ) + return template.replace("", ellipsoid_lines) + + +def write_music_file(output_file, music_config): + dirname = os.path.dirname(output_file) + if not os.path.exists(dirname): + logging.debug("Creating directory {}".format(dirname)) + os.makedirs(dirname) + with open(output_file, "w") as f: + f.write(music_config) + + +def call_music(): + pass + + +def process_config(config, args): + ellipsoids = [] + for halo_name, url in zip(config.halo_names, config.halo_urls): + logging.info("Fetching ellipsoids from halo " + halo_name) + ellipsoids.append( + fetch_ellipsoid( + url + "/ellipsoids", + config.api_token, + config.traceback_radius, + args.attempts, + ) + ) + + # Edit template + logging.info("Creating MUSIC template") + music_template = music_config_to_template(config.MUSIC, config.settings) + + if query_yes_no( + "Do you want to edit the MUSIC template before creating the IC files?\n" + "(changing zstart, levelmin, levelmax, etc.)", + default="no", + ): + logging.debug("Editing MUSIC template") + music_template = edit_template(music_template) + logging.debug("Finished editing MUSIC template") + # Store template to file + for halo_name, ellipsoid in zip(config.halo_names, ellipsoids): + if ellipsoid is None: + logging.warning( + "Ellipsoid for halo {} not available, skipping".format(halo_name) + ) + continue + logging.info("Composing MUSIC configuration file for halo {}".format(halo_name)) + music_config = compose_template(music_template, ellipsoid) + if args.create_subdirs and len(ellipsoids) > 1: + output_file = os.path.join(args.output_path, str(halo_name), "ics.cfg") + else: + output_file = os.path.join( + args.output_path, "/ics_{}.cfg".format(halo_name) + ) + logging.info( + "Storing MUSIC configuration file for halo {} in {}".format( + halo_name, output_file + ) + ) + write_music_file(output_file, music_config) + + # TODO: Execute MUSIC? + + +def downloadstore_mode(args, target: str): + logging.info("Fetching download configuration from the cosmICweb server") + config = fetch_downloadstore(args.cosmicweb_url, target) + if args.output_path == "./": + args.output_path = "./cosmICweb-zooms-{}".format(config.simulation_name) + logging.debug("Output directory set to " + args.output_path) + logging.info("Download configuration successfully fetched") + process_config(config, args) + + +def publication_mode(args, publication_name: str, traceback_radius: int): + logging.info( + "Fetching publication " + args.publication_name + " from the cosmICweb server" + ) + config = fetch_publication(args.cosmicweb_url, publication_name, traceback_radius) + args.output_path = os.path.join(args.output_path, publication_name) + logging.debug("Output directory set to " + args.output_path) + logging.info("Publication successfully fetched") + process_config(config, args) + + +def dir_path(p): + if os.path.isdir(p): + return p + else: + raise NotADirectoryError(p) + + +@click.group() +@click.option( + "--url", default=DEFAULT_URL, help="overwrite URL of the cosmICweb server" +) +@click.option( + "--output-path", + type=dir_path, + default="./", + help="Download target for IC files. If downloading publication, will create a subfolder with the name of the publication", +) +@click.option("--common-directory", is_flag=True) +@click.option( + "--attempts", type=int, default=3, help="number of attempts to download ellipsoids" +) +@click.option("--verbose", is_flag=True) +@click.pass_context +def cli(ctx, url, output_path, common_directory, attempts, verbose): + if verbose: + logger.setLevel("DEBUG") + ctx.obj = { + "url": url, + "output_path": output_path, + "common_directory": common_directory, + "attempts": attempts, + } + + +@cli.command(help="Download ICs using a target UUID generated on cosmICweb") +@click.argument("target") +@click.pass_context +def get(ctx, target): + args = ctx.obj + downloadstore_mode(args, target) + + +@cli.command(help="Download published ICs using the publication name") +@click.argument("publication_name") +@click.option("--traceback_radius", type=click.Choice([1, 2, 4, 10]), default=2) +@click.pass_context +def publication(ctx, publication_name, traceback_radius): + args = ctx.obj + publication_mode(args, publication_name, traceback_radius) + + +if __name__ == "__main__": + cli() + +# if __name__ == "__main__": +# parser = argparse.ArgumentParser() +# parser.add_argument( +# "--url", +# dest="cosmicweb_url", +# default=DEFAULT_URL, +# help="overwrite URL of the cosmicweb server", +# ) +# parser.add_argument( +# "--output-path", +# type=dir_path, +# default="./", +# help="Download target for IC files. If downloading publication, will create a subfolder with the " +# "name of the publication", +# ) +# parser.add_argument( +# "--common-directory", dest="create_subdirs", action="store_false" +# ) +# parser.add_argument( +# "--attempts", +# type=int, +# default=3, +# help="number of attempts to download ellipsoids", +# ) +# parser.add_argument("--verbose", action="store_true") + +# subparsers = parser.add_subparsers(dest="mode") +# # Downloading from publications +# publication_parser = subparsers.add_parser( +# "publication", help="download publications" +# ) +# publication_parser.add_argument("publication_name", help="name of the publication") +# publication_parser.add_argument( +# "--traceback_radius", type=int, choices=[1, 2, 4, 10], default=2, help="" +# ) +# # Downloading from download object +# download_parser = subparsers.add_parser("get") +# download_parser.add_argument("target") + +# args = parser.parse_args() + +# if args.verbose: +# logger.setLevel("DEBUG") + +# if args.mode == "get": +# downloadstore_mode(args) +# elif args.mode == "publication": +# publication_mode(args) +# else: +# raise NotImplementedError("unknown subparser") diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..7fbad04 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,190 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "77fb072556c86c1be54da4a6fcada5234ce37943166ee26a3fa19907fedfc8c6" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..7839e7a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,19 @@ +[tool.poetry] +name = "cosmicweb-music" +version = "0.1.0" +description = "" +authors = ["Michael Buehlmann "] +readme = "README.md" + +[tool.poetry.scripts] +cosmicweb-music = "cosmicweb_music.cosmICweb:cli" + +[tool.poetry.dependencies] +python = "^3.9" +click = "^8.1.7" +requests = "^2.31.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api"