Source code for scopesim.server.OLD_database

"""
Functions to download instrument packages and example data
"""
import shutil
import os
import zipfile
import logging

from scopesim.server.database import get_server_elements
from urllib3.exceptions import HTTPError

from astropy.utils.data import download_file

from scopesim import rc

from warnings import warn

[docs] def get_local_packages(path): """ List the packages that are available in the directory ``path`` Parameters ---------- path : str Directory containing all local instrument package files Returns ------- pkgs : list Names of packages on the local disk """ warn("Function Depreciated --> please use scopesim.download_package-s-()", DeprecationWarning, stacklevel=2) dirnames = os.listdir(path) pkgs = [] for dname in dirnames: if os.path.exists(os.path.join(path, dname, dname+".yaml")): pkgs += [dname] return pkgs
[docs] def list_packages(location="all", url=None, local_dir=None, return_pkgs=False, silent=False): """ List all ``.zip`` packages found under ``url`` Parameters ---------- location : str ["server", "local", "all"] To look for packages on the server or on the local hard-drive, or both url : str The URL of the IRDB HTTP server. If left as None, defaults to the value in scopesim.rc.__config__["!SIM.file.server_base_url"] local_dir : str Path to the folder where the local packages are stored (or downloaded) If left as None, defaults to scopesim.rc.__config__["!SIM.file.local_packages_path"] return_pkgs : bool If True, returns a list of package names silent : bool If True, does not print the list of package names Returns ------- all_pkgs : list of str A list of paths to the ``.zip`` packages relative to ``url`` The full string should be passed to download_package """ def print_package_list(the_pkgs, loc=""): print(f"\nPackages saved {loc}\n" + "=" * (len(loc) + 15)) for pkg in the_pkgs: print(pkg) if url is None: url = rc.__config__["!SIM.file.server_base_url"] if local_dir is None: local_dir = rc.__config__["!SIM.file.local_packages_path"] return_pkgs_list = [] if location.lower() in ["local", "all"]: local_pkgs = get_local_packages(local_dir) if not silent: print_package_list(local_pkgs, f"locally: {local_dir}") return_pkgs_list += local_pkgs if location.lower() in ["server", "all"]: server_pkgs = [] folders = get_server_elements(url, "/") for folder in folders: pkgs = get_server_elements(url + folder, ".zip") server_pkgs += [folder + pkg for pkg in pkgs] if not silent: print_package_list(server_pkgs, f"on the server: {url}") return_pkgs_list += server_pkgs if return_pkgs: return return_pkgs_list return None
[docs] def download_package(pkg_path, save_dir=None, url=None, from_cache=None): """ Downloads a package to the local disk Parameters ---------- pkg_path : str, list A ``.zip`` package path as given by ``list_packages()`` save_dir : str The place on the local disk where the ``.zip`` package is to be saved. If left as None, defaults to the value in scopesim.rc.__config__["!SIM.file.local_packages_path"] url : str The URL of the IRDB HTTP server. If left as None, defaults to the value in scopesim.rc.__config__["!SIM.file.server_base_url"] from_cache : bool Use the cached versions of the packages. If None, defaults to the RC value: ``!SIM.file.use_cached_downloads`` Returns ------- save_path : str The absolute path to the saved ``.zip`` package """ if isinstance(pkg_path, (list, tuple)): save_path = [download_package(pkg, save_dir, url) for pkg in pkg_path] elif isinstance(pkg_path, str): if pkg_path[-4:] != ".zip": logging.warning("Appended '.zip' to %s", pkg_path) pkg_path += ".zip" if url is None: url = rc.__config__["!SIM.file.server_base_url"] if save_dir is None: save_dir = rc.__config__["!SIM.file.local_packages_path"] if not os.path.exists(save_dir): os.mkdir(save_dir) try: if from_cache is None: from_cache = rc.__config__["!SIM.file.use_cached_downloads"] cache_path = download_file(url + pkg_path, cache=from_cache) save_path = os.path.join(save_dir, os.path.basename(pkg_path)) file_path = shutil.copy2(cache_path, save_path) with zipfile.ZipFile(file_path, 'r') as zip_ref: zip_ref.extractall(save_dir) except HTTPError: raise ValueError(f"Unable to find file: {url + pkg_path}") save_path = os.path.abspath(save_path) return save_path