Source code for preinstall.depsinstall
# -*- coding : UTF-8 -*-
"""
:filename: sppas.src.preinstall.depsinstall.py
:author: Florian Hocquet, Brigitte Bigi
:contact: develop@sppas.org
:summary: Manage the installer of SPPAS dependencies.
.. _This file is part of SPPAS: http://www.sppas.org/
..
-------------------------------------------------------------------------
___ __ __ __ ___
/ | \ | \ | \ / the automatic
\__ |__/ |__/ |___| \__ annotation and
\ | | | | \ analysis
___/ | | | | ___/ of speech
Copyright (C) 2011-2021 Brigitte Bigi
Laboratoire Parole et Langage, Aix-en-Provence, France
Use of this software is governed by the GNU Public License, version 3.
SPPAS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SPPAS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SPPAS. If not, see <http://www.gnu.org/licenses/>.
This banner notice must not be removed.
-------------------------------------------------------------------------
"""
import sys
import os
import logging
from .installer import DebianInstaller
from .installer import DnfInstaller
from .installer import RpmInstaller
from .installer import WindowsInstaller
from .installer import MacOsInstaller
# ---------------------------------------------------------------------------
[docs]class sppasInstallerDeps(object):
"""Main class to manage the installation of external features.
sppasInstallerDeps is a wrapper of Installer Object.
It only allows :
- to launch the installation process,
- to get information, which are important for the users,
about the pre-installation.
- to configure parameters to get a personalized installation.
For example:
>>> installer = sppasInstallerDeps()
See if a feature is available or not:
>>> installer.available("feature_id")
>>> True
Customize what is enabled or not:
>>> installer.enable("feature_id")
>>> False
>>> installer.enable("feature_id", True)
>>> True
Launch the installation process:
>>> errors = installer.install("feature_id")
>>> assert len(errors) == 0
>>> assert installer.available("feature_id") is True
"""
LIST_OS = {
"linux": {
"ubuntu": DebianInstaller,
"mint": DebianInstaller,
"debian": DebianInstaller,
"fedora": DnfInstaller,
"suse": RpmInstaller,
"microsoft": DebianInstaller
},
"win32": WindowsInstaller,
"darwin": MacOsInstaller
}
[docs] def __init__(self, progress=None):
"""Create a new sppasInstallerDeps instance.
Instantiate the appropriate installer depending on the OS.
:param progress: (ProcessProgressTerminal) The installation progress.
"""
self.__os = None
self.__set_os()
self.__installer = self.os()()
logging.info("System installer: {}".format(self.__installer.__class__.__name__))
if progress is not None:
self.__installer.set_progress(progress)
# Update pip before any installation.
self.__installer.update_pip()
# ------------------------------------------------------------------------
[docs] def set_progress(self, progress=None):
self.__installer.set_progress(progress)
# ------------------------------------------------------------------------
[docs] def features_ids(self, feat_type=None):
"""Return the list of feature identifiers.
:param feat_type: (str) Only return features of the given type.
:returns: (list)
"""
return self.__installer.get_fids(feat_type)
# ------------------------------------------------------------------------
[docs] def feature_type(self, feat_id):
"""Return the feature type: deps, lang, annot.
:param feat_id: (str) Identifier of a feature
:return: (str) or None
"""
return self.__installer.feature_type(feat_id)
# ------------------------------------------------------------------------
[docs] def brief(self, feat_id):
"""Return the brief description of the feature.
:param feat_id: (str) Identifier of a feature
"""
return self.__installer.brief(feat_id)
# ------------------------------------------------------------------------
[docs] def description(self, feat_id):
"""Return the description of the feature.
:param feat_id: (str) Identifier of a feature
"""
return self.__installer.description(feat_id)
# ------------------------------------------------------------------------
[docs] def available(self, feat_id):
"""Return True if the feature is available.
:param feat_id: (str) Identifier of a feature
"""
return self.__installer.available(feat_id)
# ------------------------------------------------------------------------
[docs] def os(self):
"""Return the OS of the computer."""
return self.__os
# ------------------------------------------------------------------------
def __set_os(self):
"""Set the OS of the computer."""
system = sys.platform
logging.info("Operating system: {}".format(system))
if system.startswith("linux") is True:
distrib = str(os.uname()).split(", ")[3].split("-")[1].split(" ")[0].lower()
logging.info("Distrib: {}".format(distrib))
if distrib in sppasInstallerDeps.LIST_OS["linux"]:
self.__os = sppasInstallerDeps.LIST_OS["linux"][distrib]
else:
raise OSError("The distrib {:s} for system {:s} is not supported yet.".format(distrib, system))
else:
if system not in list(sppasInstallerDeps.LIST_OS.keys()):
raise OSError("The OS {} is not supported yet.".format(system))
else:
self.__os = sppasInstallerDeps.LIST_OS[system]
# ------------------------------------------------------------------------
[docs] def enable(self, fid, value=None):
"""Return True if the feature is enabled and/or set it.
:param fid: (str) Identifier of a feature
:param value: (bool or None) Enable of disable the feature.
"""
if value is None:
return self.__installer.enable(fid)
return self.__installer.enable(fid, value)
# ------------------------------------------------------------------------
[docs] def install(self, feat_type=None):
"""Launch the installation process.
:return errors: (str) errors happening during installation.
"""
errors = self.__installer.install(feat_type)
return errors