conftest.py 2.5 KB
Newer Older
F
frostming 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
from contextlib import contextmanager
from io import BytesIO
from pathlib import Path
from typing import List, Tuple, Optional
from urllib.parse import urlparse

import pip_shims
import pytest
from pip._vendor.requests import adapters
from pip._vendor.requests import models

from pdm.context import context
from pdm.models.candidates import Candidate
from pdm.models.repositories import BaseRepository
from pdm.models.requirements import Requirement
from pdm.models.specifiers import PySpecSet
from pdm.types import Source
from pdm.utils import get_finder

from tests import FIXTURES


class ArtifactoryAdaptor(adapters.BaseAdapter):
    def __init__(self, base_path):
        super().__init__()
        self.base_path = base_path
        self._opened_files = []

    def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
        file_path = self.base_path / urlparse(request.url).path.lstrip('/')  # type: Path
        response = models.Response()
        response.request = request
        if not file_path.exists():
            response.status_code = 404
            response.reason = "Not Found"
            response.raw = BytesIO(b"Not Found")
        else:
            response.status_code = 200
            response.reason = "OK"
            response.raw = file_path.open("rb")
        self._opened_files.append(response.raw)
        return response

    def close(self):
        for fp in self._opened_files:
            fp.close()
        self._opened_files.clear()


class TestRepository(BaseRepository):
    def get_dependencies(self, candidate: Candidate) -> Tuple[List[Requirement], PySpecSet, str]:
        pass

    def _find_named_matches(self, requirement: Requirement, requires_python: PySpecSet,
                            allow_prereleases: bool = False) -> List[Candidate]:
        pass

    @contextmanager
    def get_finder(self, sources: Optional[List[Source]] = None) -> pip_shims.PackageFinder:
        sources = sources or self.sources
        finder = get_finder(sources, context.cache_dir.as_posix())
        finder.session.mount("http://fixtures.test/", ArtifactoryAdaptor(FIXTURES))
        yield finder
        finder.session.close()


class FakeProject:
    pass


@pytest.fixture()
def repository():
    return TestRepository([])


@pytest.fixture()
def project(tmp_path):
    p = FakeProject()
    p.config = {"cache_dir": tmp_path.as_posix()}
    p.packages_root = None
    p.python_requires = PySpecSet(">=3.6")
    context.init(p)
    return p