cengal.bulk_pip_actions.install.versions.v_0.install

  1#!/usr/bin/env python
  2# coding=utf-8
  3
  4# Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>
  5# 
  6# Licensed under the Apache License, Version 2.0 (the "License");
  7# you may not use this file except in compliance with the License.
  8# You may obtain a copy of the License at
  9# 
 10#     http://www.apache.org/licenses/LICENSE-2.0
 11# 
 12# Unless required by applicable law or agreed to in writing, software
 13# distributed under the License is distributed on an "AS IS" BASIS,
 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 15# See the License for the specific language governing permissions and
 16# limitations under the License.
 17
 18# import pip
 19# from pip._internal import main as pip_main
 20
 21from cengal.os.execute import prepare_py_params
 22from cengal.cross_version.console_print.universal import cross_print
 23
 24import platform
 25import sys
 26import os.path
 27from contextlib import contextmanager
 28
 29"""
 30Module Docstring
 31Docstrings: http://www.python.org/dev/peps/pep-0257/
 32"""
 33
 34__author__ = "ButenkoMS <gtalk@butenkoms.space>"
 35__copyright__ = "Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>"
 36__credits__ = ["ButenkoMS <gtalk@butenkoms.space>", ]
 37__license__ = "Apache License, Version 2.0"
 38__version__ = "4.4.1"
 39__maintainer__ = "ButenkoMS <gtalk@butenkoms.space>"
 40__email__ = "gtalk@butenkoms.space"
 41# __status__ = "Prototype"
 42__status__ = "Development"
 43# __status__ = "Production"
 44
 45
 46PLATFORM_NAME = platform.python_implementation()  # can be 'PyPy', 'CPython', etc.
 47PYTHON_VERSION = platform.python_version_tuple()  # tuple() of str(); for example: ('3', '5', '1')
 48PYTHON_VERSION_INT = sys.version_info  # sys.version_info == (major=3, minor=2, micro=5, releaselevel='final', serial=0)
 49#   Usage: sys.version_info >= (3, 7)
 50
 51
 52# On Python < 3.4 you should install enum backport module before you will be able to use it. So:
 53FROM_PYPI = 0
 54FROM_ZIP = 1
 55FROM_FOLDER_WITH_ZIP_FILES = 2
 56FROM_EXTERNAL_GIT = 3
 57
 58
 59_FILTERING_TYPE__OFF = 0
 60_FILTERING_TYPE__INCLUDING = 1
 61_FILTERING_TYPE__EXCLUDING = 2
 62
 63
 64# Do not import this function from THIS module!
 65@contextmanager
 66def _change_current_dir(new_current_dir):
 67    cur_dir = os.getcwd()
 68    os.chdir(new_current_dir)
 69    try:
 70        yield
 71    except:
 72        raise
 73    finally:
 74        os.chdir(cur_dir)
 75
 76
 77# Do not import this function from THIS module!
 78def _filtered_file_list_traversal(root_dir, filtering_type, extentions_set=None, remove_empty_items=False):
 79    """
 80    :param root_dir: str(); r'C:\dir\path'
 81    :param filtering_type: FilteringType()
 82    :param extentions_set: set(); {'.upk', '.txt'}
 83    :return: list() of tuple(); list of (dirpath, dirnames, new_filenames)
 84    """
 85
 86    if (_FILTERING_TYPE__OFF != filtering_type) and (extentions_set is None):
 87        raise Exception('extentions_set can\'t be None with this filtering type')
 88
 89    result_list = list()
 90    for raw_result in os.walk(root_dir):
 91        dirpath = raw_result[0]
 92        dirnames = raw_result[1]
 93        filenames = raw_result[2]
 94
 95        new_filenames = list()
 96        for filename in filenames:
 97            if _FILTERING_TYPE__OFF == filtering_type:
 98                new_filenames.append(filename)
 99            elif _FILTERING_TYPE__INCLUDING == filtering_type:
100                extention = os.path.splitext(filename)[1]
101                if extention in extentions_set:
102                    new_filenames.append(filename)
103            elif _FILTERING_TYPE__EXCLUDING == filtering_type:
104                extention = os.path.splitext(filename)[1]
105                if extention not in extentions_set:
106                    new_filenames.append(filename)
107        if remove_empty_items:
108            if len(new_filenames) > 0:
109                result = (dirpath, dirnames, new_filenames)
110                result_list.append(result)
111        else:
112            result = (dirpath, dirnames, new_filenames)
113            result_list.append(result)
114
115    return result_list
116
117
118# def pip_install(name_or_path):
119#     command_line = None
120#     pip_name = None
121#     if 'nt' == os.name:
122#         path_to_interpreter = sys.executable
123#         interpreter_root_dir_name = os.path.dirname(path_to_interpreter)
124#         path_to_pip = os.path.join(interpreter_root_dir_name, 'Scripts', 'pip.exe')
125#         pip_name_template = '"{}"'
126#         pip_name = pip_name_template.format(path_to_pip)
127#     else:
128#         if '2' == PYTHON_VERSION[0]:
129#             pip_name = 'pip'
130#         elif '3' == PYTHON_VERSION[0]:
131#             pip_name = 'pip3'
132#     command_line_template = '{pip_name} install --upgrade {package_name_or_path}'
133#     command_line = command_line_template.format(pip_name=pip_name, package_name_or_path=name_or_path)
134#     os.system(command_line)
135
136
137def pip_install(name_or_path):
138    os.system(prepare_py_params(['-m', 'pip', 'install', '--upgrade', name_or_path]))
139
140
141def install(name_or_path, type_of_installation):
142    """
143    Will exit(1) on error (done by pip_main() itself)!
144    :param name_or_path: 'tornado', './python-lzf-master-python3.zip', './InstallSourcess/Python3/', etc.
145    :param type_of_installation: {FROM_PYPI, FROM_ZIP, FROM_FOLDER_WITH_ZIP_FILES}
146    :return:
147    """
148    if FROM_PYPI == type_of_installation:
149        # pip_main(['install', name_or_path])
150        pip_install(name_or_path)
151        cross_print('')
152    elif FROM_ZIP == type_of_installation:
153        # pip_main(['install', name_or_path])
154        pip_install(name_or_path)
155        cross_print('')
156    elif FROM_FOLDER_WITH_ZIP_FILES == type_of_installation:
157        interested_extensions = {'.zip'}
158        result_list = _filtered_file_list_traversal(name_or_path, _FILTERING_TYPE__INCLUDING, interested_extensions)
159        for result in result_list:
160            for filename in result[2]:
161                # I'm not sure now, but I think I remember that there was some troubles when you trying to install
162                # some zipped modules with full path under PyPy. So:
163                relative_file_name = os.path.join('.', filename)
164                with _change_current_dir(result[0]):
165                    # pip_main(['install', relative_file_name])
166                    pip_install(relative_file_name)
167                    cross_print('')
PLATFORM_NAME = 'CPython'
PYTHON_VERSION = ('3', '8', '10')
PYTHON_VERSION_INT = sys.version_info(major=3, minor=8, micro=10, releaselevel='final', serial=0)
FROM_PYPI = 0
FROM_ZIP = 1
FROM_FOLDER_WITH_ZIP_FILES = 2
FROM_EXTERNAL_GIT = 3
def pip_install(name_or_path):
138def pip_install(name_or_path):
139    os.system(prepare_py_params(['-m', 'pip', 'install', '--upgrade', name_or_path]))
def install(name_or_path, type_of_installation):
142def install(name_or_path, type_of_installation):
143    """
144    Will exit(1) on error (done by pip_main() itself)!
145    :param name_or_path: 'tornado', './python-lzf-master-python3.zip', './InstallSourcess/Python3/', etc.
146    :param type_of_installation: {FROM_PYPI, FROM_ZIP, FROM_FOLDER_WITH_ZIP_FILES}
147    :return:
148    """
149    if FROM_PYPI == type_of_installation:
150        # pip_main(['install', name_or_path])
151        pip_install(name_or_path)
152        cross_print('')
153    elif FROM_ZIP == type_of_installation:
154        # pip_main(['install', name_or_path])
155        pip_install(name_or_path)
156        cross_print('')
157    elif FROM_FOLDER_WITH_ZIP_FILES == type_of_installation:
158        interested_extensions = {'.zip'}
159        result_list = _filtered_file_list_traversal(name_or_path, _FILTERING_TYPE__INCLUDING, interested_extensions)
160        for result in result_list:
161            for filename in result[2]:
162                # I'm not sure now, but I think I remember that there was some troubles when you trying to install
163                # some zipped modules with full path under PyPy. So:
164                relative_file_name = os.path.join('.', filename)
165                with _change_current_dir(result[0]):
166                    # pip_main(['install', relative_file_name])
167                    pip_install(relative_file_name)
168                    cross_print('')

Will exit(1) on error (done by pip_main() itself)! :param name_or_path: 'tornado', './python-lzf-master-python3.zip', './InstallSourcess/Python3/', etc. :param type_of_installation: {FROM_PYPI, FROM_ZIP, FROM_FOLDER_WITH_ZIP_FILES} :return: