Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexeySanko authored and AlexeySanko committed Feb 7, 2017
1 parent 262e71c commit 121cff0
Show file tree
Hide file tree
Showing 9 changed files with 300 additions and 241 deletions.
13 changes: 7 additions & 6 deletions src/main/python/pybuilder/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@
from os.path import sep as PATH_SEPARATOR

from pybuilder.errors import MissingPropertyException
from pybuilder.pip_common import Version, InvalidVersion, SpecifierSet, InvalidSpecifier
from pybuilder.utils import as_list
# Plugin install_dependencies_plugin can reload pip_common and pip_utils. Do not use from ... import ...
from pybuilder import pip_common

INITIALIZER_ATTRIBUTE = "_python_builder_initializer"

Expand Down Expand Up @@ -233,12 +234,12 @@ def __init__(self, name, version=None, url=None):

if version:
try:
version = ">=" + str(Version(version))
version = ">=" + str(pip_common.Version(version))
self.version_not_a_spec = True
except InvalidVersion:
except pip_common.InvalidVersion:
try:
version = str(SpecifierSet(version))
except InvalidSpecifier:
version = str(pip_common.SpecifierSet(version))
except pip_common.InvalidSpecifier:
raise ValueError("'%s' must be either PEP 0440 version or a version specifier set" % version)

self.version = version
Expand Down Expand Up @@ -354,7 +355,7 @@ def requires_python(self):

@requires_python.setter
def requires_python(self, value):
spec_set = SpecifierSet(value)
spec_set = pip_common.SpecifierSet(value)
self._requires_python = str(spec_set)

@property
Expand Down
57 changes: 27 additions & 30 deletions src/main/python/pybuilder/pip_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,9 @@
import sys

from pybuilder.core import Dependency, RequirementsFile
from pybuilder.pip_common import (Version,
SpecifierSet,
search_packages_info,
pip_working_set_init,
_pip_disallows_insecure_packages_by_default,
_pip_supports_constraints,
pip_version)
from pybuilder.utils import execute_command, as_list
# Plugin install_dependencies_plugin can reload pip_common and pip_utils. Do not use from ... import ...
from pybuilder import pip_common

PIP_EXEC_STANZA = [sys.executable, "-m", "pip.__main__"]
__RE_PIP_PACKAGE_VERSION = re.compile(r"^Version:\s+(.+)$", re.MULTILINE)
Expand All @@ -46,21 +41,23 @@ def build_dependency_version_string(mixed):
return version


def pip_install(install_targets, index_url=None, extra_index_url=None, upgrade=False,
insecure_installs=None, force_reinstall=False, target_dir=None, verbose=False, logger=None,
outfile_name=None, error_file_name=None, env=None, cwd=None, trusted_host=None, eager_upgrade=False):
def pip_install(install_targets, index_url=None, extra_index_url=None, upgrade=False, insecure_installs=None,
force_reinstall=False, target_dir=None, verbose=False, trusted_host=None, constraint_file=None,
eager_upgrade=False,
logger=None, outfile_name=None, error_file_name=None, env=None, cwd=None):
pip_command_line = list()
pip_command_line.extend(PIP_EXEC_STANZA)
pip_command_line.append("install")
pip_command_line.extend(build_pip_install_options(index_url,
extra_index_url,
upgrade,
insecure_installs,
force_reinstall,
target_dir,
verbose,
trusted_host,
eager_upgrade
pip_command_line.extend(build_pip_install_options(index_url=index_url,
extra_index_url=extra_index_url,
upgrade=upgrade,
insecure_installs=insecure_installs,
force_reinstall=force_reinstall,
target_dir=target_dir,
verbose=verbose,
trusted_host=trusted_host,
constraint_file=constraint_file,
eager_upgrade=eager_upgrade
))
for install_target in as_list(install_targets):
pip_command_line.extend(as_pip_install_target(install_target))
Expand Down Expand Up @@ -96,7 +93,7 @@ def build_pip_install_options(index_url=None, extra_index_url=None, upgrade=Fals

if upgrade:
options.append("--upgrade")
if pip_version >= "9.0":
if pip_common.pip_version >= "9.0":
options.append("--upgrade-strategy")
if eager_upgrade:
options.append("eager")
Expand All @@ -113,11 +110,11 @@ def build_pip_install_options(index_url=None, extra_index_url=None, upgrade=Fals
options.append("-t")
options.append(target_dir)

if constraint_file and _pip_supports_constraints():
if constraint_file and pip_common._pip_supports_constraints():
options.append("-c")
options.append(constraint_file)

if _pip_disallows_insecure_packages_by_default() and insecure_installs:
if pip_common._pip_disallows_insecure_packages_by_default() and insecure_installs:
for insecure_install in insecure_installs:
arguments_for_insecure_installation = ["--allow-unverified", insecure_install,
"--allow-external", insecure_install]
Expand Down Expand Up @@ -163,8 +160,8 @@ def normalize_dependency_package(mixed):

package_query = [normalized_package for normalized_package in
(normalize_dependency_package(p) for p in as_list(mixed)) if normalized_package]
pip_working_set_init()
search_packages_results = search_packages_info(package_query)
pip_common.pip_working_set_init()
search_packages_results = pip_common.search_packages_info(package_query)
return dict(((result['name'].lower(), result['version']) for result in search_packages_results))


Expand All @@ -173,10 +170,10 @@ def version_satisfies_spec(spec, version):
return True
if not version:
return False
if not isinstance(spec, SpecifierSet):
spec = SpecifierSet(spec)
if not isinstance(version, Version):
version = Version(version)
if not isinstance(spec, pip_common.SpecifierSet):
spec = pip_common.SpecifierSet(spec)
if not isinstance(version, pip_common.Version):
version = pip_common.Version(version)
return spec.contains(version)


Expand All @@ -186,8 +183,8 @@ def should_update_package(version):
False otherwise
"""
if version:
if not isinstance(version, SpecifierSet):
version_specifier = SpecifierSet(version)
if not isinstance(version, pip_common.SpecifierSet):
version_specifier = pip_common.SpecifierSet(version)
else:
version_specifier = version
# We always check if even one specifier in the set is not exact
Expand Down
32 changes: 17 additions & 15 deletions src/main/python/pybuilder/pluginloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,17 @@
IncompatiblePluginException,
UnspecifiedPluginNameException,
)
from pybuilder.pip_utils import (Version, pip_install, version_satisfies_spec, should_update_package)
from pybuilder.utils import read_file
# Plugin install_dependencies_plugin can reload pip_common and pip_utils. Do not use from ... import ...
from pybuilder import pip_utils, pip_common

PYPI_PLUGIN_PROTOCOL = "pypi:"
VCS_PLUGIN_PROTOCOL = "vcs:"

if pyb_version == "${dist_version}": # This is the case of PyB bootstrap
PYB_VERSION = Version('0.0.1.dev0')
PYB_VERSION = pip_common.Version('0.0.1.dev0')
else:
PYB_VERSION = Version(pyb_version)
PYB_VERSION = pip_common.Version(pyb_version)


class PluginLoader(object):
Expand Down Expand Up @@ -79,7 +80,7 @@ def load_plugin(self, project, name, version=None, plugin_module_name=None):
# Maybe we already installed this plugin from PyPI before
if thirdparty_plugin.startswith(PYPI_PLUGIN_PROTOCOL):
thirdparty_plugin = thirdparty_plugin.replace(PYPI_PLUGIN_PROTOCOL, "")
update_plugin = should_update_package(version)
update_plugin = pip_utils.should_update_package(version)
elif thirdparty_plugin.startswith(VCS_PLUGIN_PROTOCOL):
if not plugin_module_name:
raise UnspecifiedPluginNameException(name)
Expand Down Expand Up @@ -166,16 +167,17 @@ def _install_external_plugin(project, name, version, logger, plugin_module_name,

with tempfile.NamedTemporaryFile(delete=True) as log_file:
log_file_name = log_file.name
result = pip_install(pip_package,
index_url=project.get_property("install_dependencies_index_url"),
extra_index_url=project.get_property("install_dependencies_extra_index_url"),
trusted_host=project.get_property("install_dependencies_trusted_host"),
upgrade=upgrade,
force_reinstall=force_reinstall,
logger=logger,
outfile_name=log_file_name,
error_file_name=log_file_name,
cwd=".")
result = pip_utils.pip_install(
install_targets=pip_package,
index_url=project.get_property("install_dependencies_index_url"),
extra_index_url=project.get_property("install_dependencies_extra_index_url"),
trusted_host=project.get_property("install_dependencies_trusted_host"),
upgrade=upgrade,
force_reinstall=force_reinstall,
logger=logger,
outfile_name=log_file_name,
error_file_name=log_file_name,
cwd=".")
if result != 0:
logger.error("The following pip error was encountered:\n" + "".join(read_file(log_file_name)))
message = "Failed to install plugin from {0}".format(pip_package)
Expand All @@ -200,5 +202,5 @@ def _load_plugin(plugin_module_name, plugin_name):

def _check_plugin_version(plugin_module, plugin_name):
if hasattr(plugin_module, "pyb_version") and plugin_module.pyb_version:
if not version_satisfies_spec(plugin_module.pyb_version, PYB_VERSION):
if not pip_utils.version_satisfies_spec(plugin_module.pyb_version, PYB_VERSION):
raise IncompatiblePluginException(plugin_name, plugin_module.pyb_version, PYB_VERSION)
26 changes: 15 additions & 11 deletions src/main/python/pybuilder/plugins/core_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
from os.path import join

from pybuilder.core import init, task, description, depends, optional
from pybuilder.pip_utils import get_package_version, version_satisfies_spec, pip_install, as_pip_install_target
from pybuilder.utils import safe_log_file_name
# Plugin install_dependencies_plugin can reload pip_common and pip_utils. Do not use from ... import ...
from pybuilder import pip_utils


@init
Expand Down Expand Up @@ -59,21 +60,24 @@ def prepare(project, logger):
logger.debug("Creating reports directory %s", reports_directory)
os.mkdir(reports_directory)

plugin_dependency_versions = get_package_version(project.plugin_dependencies, logger)
plugin_dependency_versions = pip_utils.get_package_version(project.plugin_dependencies, logger)
for plugin_dependency in project.plugin_dependencies:
logger.debug("Processing plugin dependency %s" % plugin_dependency)
if plugin_dependency.name.lower() not in plugin_dependency_versions or not \
version_satisfies_spec(plugin_dependency.version,
plugin_dependency_versions[plugin_dependency.name.lower()]):
if plugin_dependency.name.lower() not in plugin_dependency_versions \
or not pip_utils.version_satisfies_spec(plugin_dependency.version,
plugin_dependency_versions[plugin_dependency.name.lower()]):
logger.info("Installing plugin dependency %s" % plugin_dependency)
log_file = project.expand_path("$dir_reports",
safe_log_file_name("dependency_%s_install.log" % plugin_dependency))
pip_install(as_pip_install_target(plugin_dependency),
index_url=project.get_property("install_dependencies_index_url"),
extra_index_url=project.get_property("install_dependencies_extra_index_url"),
verbose=project.get_property("verbose"), logger=logger,
force_reinstall=plugin_dependency.url is not None, outfile_name=log_file,
error_file_name=log_file)
pip_utils.pip_install(
install_targets=pip_utils.as_pip_install_target(plugin_dependency),
index_url=project.get_property("install_dependencies_index_url"),
extra_index_url=project.get_property("install_dependencies_extra_index_url"),
verbose=project.get_property("verbose"),
logger=logger,
force_reinstall=plugin_dependency.url is not None,
outfile_name=log_file,
error_file_name=log_file)


@task
Expand Down
25 changes: 16 additions & 9 deletions src/main/python/pybuilder/plugins/python/distutils_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import string
import subprocess
import sys
from datetime import datetime
from textwrap import dedent

try:
from StringIO import StringIO
Expand All @@ -41,10 +43,9 @@
get_dist_version_string,
safe_log_file_name,
assert_can_execute)
from pybuilder.pip_utils import build_dependency_version_string
from textwrap import dedent
from pybuilder.pip_utils import pip_install
from datetime import datetime
# Plugin install_dependencies_plugin can reload pip_common and pip_utils. Do not use from ... import ...
from pybuilder import pip_utils


use_plugin("python.core")

Expand Down Expand Up @@ -243,10 +244,16 @@ def install_distribution(project, logger):
_prepare_reports_dir(project)
outfile_name = project.expand_path("$dir_reports", "distutils",
"pip_install_%s" % datetime.utcnow().strftime("%Y%m%d%H%M%S"))
pip_install(project.expand_path("$dir_dist"), index_url=project.get_property("install_dependencies_index_url"),
extra_index_url=project.get_property("install_dependencies_extra_index_url"),
force_reinstall=True, logger=logger, verbose=project.get_property("verbose"), cwd=".",
outfile_name=outfile_name, error_file_name=outfile_name)
pip_utils.pip_install(
install_targets=project.expand_path("$dir_dist"),
index_url=project.get_property("install_dependencies_index_url"),
extra_index_url=project.get_property("install_dependencies_extra_index_url"),
force_reinstall=True,
logger=logger,
verbose=project.get_property("verbose"),
cwd=".",
outfile_name=outfile_name,
error_file_name=outfile_name)


@task("upload", description="Upload a project to PyPi.")
Expand Down Expand Up @@ -339,7 +346,7 @@ def flatten_and_quote(requirements_file):


def format_single_dependency(dependency):
return '%s%s' % (dependency.name, build_dependency_version_string(dependency))
return '%s%s' % (dependency.name, pip_utils.build_dependency_version_string(dependency))


def build_install_dependencies_string(project):
Expand Down
Loading

0 comments on commit 121cff0

Please sign in to comment.