#!/usr/bin/env python3
"""
picker.py
Pick the precomputed matrix to use for decomposing an astronomical
spectrum.
This file is part of pypahdb - see the module docs for more
information.
"""
import json
import os
from glob import glob
from urllib.request import urlretrieve
import importlib_resources
from tqdm import tqdm
RELEASES_URL = "https://www.astrochemistry.org/pahdb/pypahdb/releases.json"
[docs]
class Picker(object):
"""Pick the precomputed matrix to use for decomposing an astronomical
spectrum.
Attributes:
_pkl_files: List of already downloaded precomputed matrices.
_releases: List of available releases.
_resources_dir: Path to the resources directory.
"""
_pkl_files = []
_releases = []
_resources_dir = None
def __init__(self):
"""Pick the precomputed matrix."""
self._resources_dir = importlib_resources.files("pypahdb") / "resources"
self._pkl_files = glob("*.pkl", root_dir=self._resources_dir)
[docs]
def pick(self, version=None):
"""Pick the precomputed matrix.
Args:
version (str): The version of the precomputed matrix to use or "picker" to show menu.
Returns:
pathlib.Path: The path to the precomputed matrix.
"""
if self._pkl_files:
if version is None:
return self._resources_dir / next(reversed(sorted(self._pkl_files)))
pkl_file = f"precomputed_v{version}.pkl"
if pkl_file in self._pkl_files:
return self._resources_dir / pkl_file
json_file = self._resources_dir / "releases.json"
print("downloading latests releases.json")
self._download(RELEASES_URL, json_file)
with open(json_file, "r") as f:
self._releases = json.load(f)
if (
version is None
or version == "picker"
or version not in [r["version"] for r in self._releases]
):
version = self._menu()
pkl_file = f"precomputed_v{version}.pkl"
if pkl_file in self._pkl_files:
return self._resources_dir / pkl_file
release = next(
filter(lambda release: release["version"] == version, self._releases), None
)
print("downloading precomputed matrix")
location = release["location"]
if os.getenv("GITHUB_ACTIONS") == "true":
location += "&github_actions=true"
pkl_file = self._resources_dir / pkl_file
self._download(location, pkl_file)
return pkl_file
def _download(self, url, filename):
"""Download url to filename."""
def _report(t):
last_b = [0]
def inner(b=1, bsize=1, tsize=None):
if tsize is not None:
t.total = tsize
t.update((b - last_b[0]) * bsize)
last_b[0] = b
return inner
with tqdm(
unit="B",
unit_scale=True,
leave=False,
miniters=1,
) as t:
urlretrieve(url, filename=filename, reporthook=_report(t), data=None)
def _menu(self):
"""Present the menu picker"""
while True:
print("-" * 80)
print(
"# VERSION DESCRIPTION SIZE DOWNLOADED"
)
print("-" * 80)
for i, release in enumerate(self._releases, start=1):
downloaded = f"precomputed_v{release['version']}.pkl" in self._pkl_files
print(
f"{i:<2} {release['version']:<16} {release['description']:41.41s} "
f"{release['size']:>7} {downloaded}"
)
print("-" * 80)
print()
select = input("select # : ")
if select.isdigit():
select = int(select)
if select >= 1 and select <= len(self._releases):
return self._releases[select - 1]["version"]