pipfile.py 2.4 KB
Newer Older
F
Frost Ming 已提交
1 2
from __future__ import annotations

F
Frost Ming 已提交
3 4 5
import functools
import operator
import os
6
from argparse import Namespace
U
ulwlu 已提交
7
from os import PathLike
F
Frost Ming 已提交
8
from typing import Any
F
Frost Ming 已提交
9 10

from packaging.markers import default_environment
F
Frost Ming 已提交
11

U
ulwlu 已提交
12
from pdm._types import RequirementDict
13
from pdm.compat import tomllib
F
Frost Ming 已提交
14
from pdm.formats.base import make_array
F
Frost Ming 已提交
15
from pdm.models.markers import Marker
F
Frost Ming 已提交
16
from pdm.models.requirements import Requirement
17
from pdm.project import Project
F
Frost Ming 已提交
18 19 20 21

MARKER_KEYS = list(default_environment().keys())


U
ulwlu 已提交
22
def convert_pipfile_requirement(name: str, req: RequirementDict) -> str:
F
Frost Ming 已提交
23 24

    if isinstance(req, dict):
F
Frost Ming 已提交
25
        markers: list[Marker] = []
F
Frost Ming 已提交
26
        if "markers" in req:
F
Frost Ming 已提交
27
            markers.append(Marker(req["markers"]))  # type: ignore
F
Frost Ming 已提交
28 29 30 31 32 33 34 35 36
        for key in MARKER_KEYS:
            if key in req:
                marker = Marker(f"{key}{req[key]}")
                markers.append(marker)
                del req[key]

        if markers:
            marker = functools.reduce(operator.and_, markers)
            req["marker"] = str(marker).replace('"', "'")
F
Frost Ming 已提交
37
    return Requirement.from_req_dict(name, req).as_line()
F
Frost Ming 已提交
38 39


U
ulwlu 已提交
40
def check_fingerprint(project: Project, filename: PathLike) -> bool:
F
Frost Ming 已提交
41 42 43
    return os.path.basename(filename) == "Pipfile"


44
def convert(
F
Frost Ming 已提交
45 46
    project: Project, filename: PathLike, options: Namespace | None
) -> tuple[dict[str, Any], dict[str, Any]]:
T
Taneli Hukkinen 已提交
47
    with open(filename, "rb") as fp:
48
        data = tomllib.load(fp)
F
Frost Ming 已提交
49
    result = {}
F
Frost Ming 已提交
50
    settings = {}
F
Frost Ming 已提交
51
    if "pipenv" in data:
F
Frost Ming 已提交
52
        settings["allow_prereleases"] = data["pipenv"].get("allow_prereleases", False)
F
Frost Ming 已提交
53 54 55 56
    if "requires" in data:
        python_version = data["requires"].get("python_full_version") or data[
            "requires"
        ].get("python_version")
F
Frost Ming 已提交
57
        result["requires-python"] = f">={python_version}"
F
Frost Ming 已提交
58
    if "source" in data:
F
Frost Ming 已提交
59
        settings["source"] = data["source"]
F
Frost Ming 已提交
60
    result["dependencies"] = make_array(  # type: ignore
F
Frost Ming 已提交
61 62 63 64 65 66
        [
            convert_pipfile_requirement(k, req)
            for k, req in data.get("packages", {}).items()
        ],
        True,
    )
F
Frost Ming 已提交
67 68 69 70 71 72 73 74 75
    settings["dev-dependencies"] = {
        "dev": make_array(
            [
                convert_pipfile_requirement(k, req)
                for k, req in data.get("dev-packages", {}).items()
            ],
            True,
        )
    }
F
Frost Ming 已提交
76
    return result, settings
F
frostming 已提交
77 78


F
Frost Ming 已提交
79
def export(project: Project, candidates: list, options: Any) -> None:
F
frostming 已提交
80
    raise NotImplementedError()