Downloads and installs files#
Simple light API to download and install files. If the file appears to be a
compressed file by ending with zip
, tar.gz
, tgz
etc, then also un-compress
the file after it is downloaded. The process flow follows:
Check to see if the installed file exists. If not download it.
Otherwise, if the file has been downloaded uncompress it.
If the file could not be downloaded, uncompressed, or a file from the uncompressed file isn’t found an error is thrown.
A destination location can be specified in the configuration. It is also
possible to install it in the ~/.cache/<package name>
where package name is
the name the installed package. For example, that would be zensols.install
for the package installed for this repository.
Documentation#
Obtaining#
The easiest way to install the command line program is via the pip
installer:
pip3 install zensols.install
Binaries are also available on pypi.
Usage#
The below code is given in the example.
First create the installer configuration with each file to be installed as a
resource as a file install.conf
:
[zip_resource]
class_name = zensols.install.Resource
url = https://github.com/plandes/zenbuild/archive/refs/tags/general_build.zip
# we have to give the name of the diretory in the zip file so the program knows
# what to unzip; otherwise it is named from the section, or file if `None`
name = zenbuild-general_build
# uncomment below to keep the `zenbuild-general_build.zip` zip file
#clean_up = False
[downloader]
class_name = zensols.install.Downloader
#use_progress_bar = False
[installer]
class_name = zensols.install.Installer
downloader = instance: downloader
# uncomment the below line, then comment out `base_directory` to use the
# package name (using the zensols.cli.ApplicationFactory--see example); using
# `package_resource` will in install a ~/.<package name> install directory
base_directory = path: install_dir
#package_resource = ${package:name}
resources = instance: list: zip_resource
Now use the configuration to create the installer and call it:
import logging
from zensols.config import IniConfig, ImportConfigFactory
from zensols.install import Installer
logging.basicConfig(level=logging.INFO)
fac = ImportConfigFactory(IniConfig('install.conf'))
installer: Installer = fac.instance('installer')
installer.install()
This code creates a new directory with the un-zipped files in install_dir
:
INFO:zensols.install.installer:installing zenbuild-general_build to install_dir/zenbuild-general_build
INFO:zensols.install.download:creating directory: install_dir
INFO:zensols.install.download:downloading https://github.com/plandes/zenbuild/archive/refs/tags/general_build.zip to install_dir/zenbuild-general_build.zip
general_build.zip: 16.4kB [00:00, 40.1kB/s]
INFO:zensols.install.installer:uncompressing install_dir/zenbuild-general_build.zip to install_dir
patool: Extracting install_dir/zenbuild-general_build.zip ...
patool: ... install_dir/zenbuild-general_build.zip extracted to `install_dir'.
INFO:zensols.install.installer:cleaning up downloaded file: install_dir/zenbuild-general_build.zip
First the program checks to see if the target directory (name
property in the
zip_resource
section) exists. It then downloads it when it can’t find either
the target directory or the downloaded file.
If the program is run a second time, there will be no output since the installed directory now exists.
Changelog#
An extensive changelog is available here.
License#
Copyright (c) 2021 - 2023 Paul Landes