Ejemplo n.º 1
0
 def get_dependencies(whl, version):
     with zipfile.ZipFile(str(whl), "r") as zip_file:
         name = "/".join([
             "{}.dist-info".format("-".join(whl.name.split("-")[0:2])),
             "METADATA"
         ])
         with zip_file.open(name) as file_handler:
             metadata = message_from_string(
                 file_handler.read().decode("utf-8"))
     deps = metadata.get_all("Requires-Dist")
     if deps is None:
         return
     for dep in deps:
         req = Requirement(dep)
         markers = getattr(req.marker, "_markers", tuple()) or ()
         if any(m for m in markers if isinstance(m, tuple) and len(m) == 3
                and m[0].value == "extra"):
             continue
         py_versions = WheelDownloader._marker_at(markers, "python_version")
         if py_versions:
             marker = Marker('python_version < "1"')
             marker._markers = [
                 markers[ver] for ver in sorted(
                     list(i for i in set(py_versions)
                          | {i - 1
                             for i in py_versions} if i >= 0))
             ]
             matches_python = marker.evaluate({"python_version": version})
             if not matches_python:
                 continue
             deleted = 0
             for ver in py_versions:
                 deleted += WheelDownloader._del_marker_at(
                     markers, ver - deleted)
         platforms = []
         platform_positions = WheelDownloader._marker_at(
             markers, "sys_platform")
         deleted = 0
         for pos in platform_positions:  # can only be ore meaningfully
             platform = "{}{}".format(markers[pos][1].value,
                                      markers[pos][2].value)
             deleted += WheelDownloader._del_marker_at(
                 markers, pos - deleted)
             platforms.append(platform)
         if not platforms:
             platforms.append(None)
         for platform in platforms:
             yield version, platform, req
def evaluated_deps(pkg):
    "Returns dependencies that apply to the current environment"

    deps = []
    for k, dep in pkg.get("dependencies", {}).items():
        if "markers" in dep:
            marker = Marker(dep["markers"])

            # Remove any "extra" clauses from the marker before we evaluate it. If a package is
            # in this list, the extra has already been matched.
            marker._markers = remove_extra_marker(marker._markers)

            try:
                if not marker.evaluate():
                    continue
            except UndefinedEnvironmentName as e:
                print(f"Failed to evaluate marker for {pkg['name']}: {e}")
                raise

        deps.append(k)
    return deps