blob: 9694a68ffdb7da4f701a86c90df64f040da06089 [file] [log] [blame]
# -*- coding: utf-8 -*-
"""
Decides if vendor bundles are used or not.
Setup python path accordingly.
"""
from __future__ import absolute_import, print_function
import os.path
import sys
# -----------------------------------------------------------------------------
# DEFINES:
# -----------------------------------------------------------------------------
HERE = os.path.dirname(__file__)
TASKS_VENDOR_DIR = os.path.join(HERE, "_vendor")
INVOKE_BUNDLE = os.path.join(TASKS_VENDOR_DIR, "invoke.zip")
INVOKE_BUNDLE_VERSION = "1.2.0"
DEBUG_SYSPATH = False
# -----------------------------------------------------------------------------
# EXCEPTIONS:
# -----------------------------------------------------------------------------
class VersionRequirementError(SystemExit):
pass
# -----------------------------------------------------------------------------
# FUNCTIONS:
# -----------------------------------------------------------------------------
def setup_path(invoke_minversion=None):
"""Setup python search and add ``TASKS_VENDOR_DIR`` (if available)."""
# print("INVOKE.tasks: setup_path")
if not os.path.isdir(TASKS_VENDOR_DIR):
print("SKIP: TASKS_VENDOR_DIR=%s is missing" % TASKS_VENDOR_DIR)
return
elif os.path.abspath(TASKS_VENDOR_DIR) in sys.path:
# -- SETUP ALREADY DONE:
# return
pass
use_vendor_bundles = os.environ.get("INVOKE_TASKS_USE_VENDOR_BUNDLES", "no")
if need_vendor_bundles(invoke_minversion):
use_vendor_bundles = "yes"
if use_vendor_bundles == "yes":
syspath_insert(0, os.path.abspath(TASKS_VENDOR_DIR))
if setup_path_for_bundle(INVOKE_BUNDLE, pos=1):
import invoke
bundle_path = os.path.relpath(INVOKE_BUNDLE, os.getcwd())
print("USING: %s (version: %s)" % (bundle_path, invoke.__version__))
else:
# -- BEST-EFFORT: May rescue something
syspath_append(os.path.abspath(TASKS_VENDOR_DIR))
setup_path_for_bundle(INVOKE_BUNDLE, pos=len(sys.path))
if DEBUG_SYSPATH:
for index, p in enumerate(sys.path):
print(" %d. %s" % (index, p))
def require_invoke_minversion(min_version, verbose=False):
"""Ensures that :mod:`invoke` has at the least the :param:`min_version`.
Otherwise,
:param min_version: Minimal acceptable invoke version (as string).
:param verbose: Indicates if invoke.version should be shown.
:raises: VersionRequirementError=SystemExit if requirement fails.
"""
# -- REQUIRES: sys.path is setup and contains invoke
try:
import invoke
invoke_version = invoke.__version__
except ImportError:
invoke_version = "__NOT_INSTALLED"
if invoke_version < min_version:
message = "REQUIRE: invoke.version >= %s (but was: %s)" % \
(min_version, invoke_version)
message += "\nUSE: pip install invoke>=%s" % min_version
raise VersionRequirementError(message)
# pylint: disable=invalid-name
INVOKE_VERSION = os.environ.get("INVOKE_VERSION", None)
if verbose and not INVOKE_VERSION:
os.environ["INVOKE_VERSION"] = invoke_version
print("USING: invoke.version=%s" % invoke_version)
def need_vendor_bundles(invoke_minversion=None):
invoke_minversion = invoke_minversion or "0.0.0"
need_vendor_answers = []
need_vendor_answers.append(need_vendor_bundle_invoke(invoke_minversion))
# -- REQUIRE: path.py
try:
import path
need_bundle = False
except ImportError:
need_bundle = True
need_vendor_answers.append(need_bundle)
# -- DIAG: print("INVOKE: need_bundle=%s" % need_bundle1)
# return need_bundle1 or need_bundle2
return any(need_vendor_answers)
def need_vendor_bundle_invoke(invoke_minversion="0.0.0"):
# -- REQUIRE: invoke
try:
import invoke
need_bundle = invoke.__version__ < invoke_minversion
if need_bundle:
del sys.modules["invoke"]
del invoke
except ImportError:
need_bundle = True
except Exception: # pylint: disable=broad-except
need_bundle = True
return need_bundle
# -----------------------------------------------------------------------------
# UTILITY FUNCTIONS:
# -----------------------------------------------------------------------------
def setup_path_for_bundle(bundle_path, pos=0):
if os.path.exists(bundle_path):
syspath_insert(pos, os.path.abspath(bundle_path))
return True
return False
def syspath_insert(pos, path):
if path in sys.path:
sys.path.remove(path)
sys.path.insert(pos, path)
def syspath_append(path):
if path in sys.path:
sys.path.remove(path)
sys.path.append(path)