1
1
from __future__ import annotations
2
2
3
- import functools
4
3
import logging
5
- import os
6
4
import re
7
- import tempfile
8
5
import time
9
- import urllib .parse
10
6
11
7
from collections import defaultdict
12
8
from contextlib import contextmanager
13
- from pathlib import Path
14
9
from typing import TYPE_CHECKING
15
10
from typing import cast
16
11
22
17
from poetry .core .version .markers import EmptyMarker
23
18
from poetry .core .version .markers import MarkerUnion
24
19
25
- from poetry .inspection .info import PackageInfo
26
- from poetry .inspection .info import PackageInfoError
27
20
from poetry .mixology .incompatibility import Incompatibility
28
21
from poetry .mixology .incompatibility_cause import DependencyCause
29
22
from poetry .mixology .incompatibility_cause import PythonCause
30
23
from poetry .mixology .term import Term
31
24
from poetry .packages import DependencyPackage
25
+ from poetry .packages .direct_origin import DirectOrigin
32
26
from poetry .packages .package_collection import PackageCollection
33
27
from poetry .puzzle .exceptions import OverrideNeeded
34
28
from poetry .repositories .exceptions import PackageNotFound
35
- from poetry .utils .helpers import download_file
36
29
from poetry .utils .helpers import get_file_hash
37
- from poetry .vcs .git import Git
38
30
39
31
40
32
if TYPE_CHECKING :
41
33
from collections .abc import Callable
42
34
from collections .abc import Collection
43
35
from collections .abc import Iterable
44
36
from collections .abc import Iterator
37
+ from pathlib import Path
45
38
46
39
from cleo .io .io import IO
47
40
from packaging .utils import NormalizedName
@@ -100,39 +93,6 @@ def _formatter_elapsed(self) -> str:
100
93
return f"{ elapsed :.1f} s"
101
94
102
95
103
- @functools .lru_cache (maxsize = None )
104
- def _get_package_from_git (
105
- url : str ,
106
- branch : str | None = None ,
107
- tag : str | None = None ,
108
- rev : str | None = None ,
109
- subdirectory : str | None = None ,
110
- source_root : Path | None = None ,
111
- ) -> Package :
112
- source = Git .clone (
113
- url = url ,
114
- source_root = source_root ,
115
- branch = branch ,
116
- tag = tag ,
117
- revision = rev ,
118
- clean = False ,
119
- )
120
- revision = Git .get_revision (source )
121
-
122
- path = Path (source .path )
123
- if subdirectory :
124
- path = path .joinpath (subdirectory )
125
-
126
- package = Provider .get_package_from_directory (path )
127
- package ._source_type = "git"
128
- package ._source_url = url
129
- package ._source_reference = rev or tag or branch or "HEAD"
130
- package ._source_resolved_reference = revision
131
- package ._source_subdirectory = subdirectory
132
-
133
- return package
134
-
135
-
136
96
class Provider :
137
97
UNSAFE_PACKAGES : set [str ] = set ()
138
98
@@ -351,7 +311,7 @@ def _search_for_vcs(self, dependency: VCSDependency) -> Package:
351
311
Basically, we clone the repository in a temporary directory
352
312
and get the information we need by checking out the specified reference.
353
313
"""
354
- package = self .get_package_from_vcs (
314
+ package = DirectOrigin .get_package_from_vcs (
355
315
dependency .vcs ,
356
316
dependency .source ,
357
317
branch = dependency .branch ,
@@ -368,31 +328,9 @@ def _search_for_vcs(self, dependency: VCSDependency) -> Package:
368
328
369
329
return package
370
330
371
- @staticmethod
372
- def get_package_from_vcs (
373
- vcs : str ,
374
- url : str ,
375
- branch : str | None = None ,
376
- tag : str | None = None ,
377
- rev : str | None = None ,
378
- subdirectory : str | None = None ,
379
- source_root : Path | None = None ,
380
- ) -> Package :
381
- if vcs != "git" :
382
- raise ValueError (f"Unsupported VCS dependency { vcs } " )
383
-
384
- return _get_package_from_git (
385
- url = url ,
386
- branch = branch ,
387
- tag = tag ,
388
- rev = rev ,
389
- subdirectory = subdirectory ,
390
- source_root = source_root ,
391
- )
392
-
393
331
def _search_for_file (self , dependency : FileDependency ) -> Package :
394
332
dependency .validate (raise_error = True )
395
- package = self .get_package_from_file (dependency .full_path )
333
+ package = DirectOrigin .get_package_from_file (dependency .full_path )
396
334
397
335
self .validate_package_for_dependency (dependency = dependency , package = package )
398
336
@@ -408,22 +346,9 @@ def _search_for_file(self, dependency: FileDependency) -> Package:
408
346
409
347
return package
410
348
411
- @classmethod
412
- def get_package_from_file (cls , file_path : Path ) -> Package :
413
- try :
414
- package = PackageInfo .from_path (path = file_path ).to_package (
415
- root_dir = file_path
416
- )
417
- except PackageInfoError :
418
- raise RuntimeError (
419
- f"Unable to determine package info from path: { file_path } "
420
- )
421
-
422
- return package
423
-
424
349
def _search_for_directory (self , dependency : DirectoryDependency ) -> Package :
425
350
dependency .validate (raise_error = True )
426
- package = self .get_package_from_directory (dependency .full_path )
351
+ package = DirectOrigin .get_package_from_directory (dependency .full_path )
427
352
428
353
self .validate_package_for_dependency (dependency = dependency , package = package )
429
354
@@ -434,12 +359,8 @@ def _search_for_directory(self, dependency: DirectoryDependency) -> Package:
434
359
435
360
return package
436
361
437
- @classmethod
438
- def get_package_from_directory (cls , directory : Path ) -> Package :
439
- return PackageInfo .from_directory (path = directory ).to_package (root_dir = directory )
440
-
441
362
def _search_for_url (self , dependency : URLDependency ) -> Package :
442
- package = self .get_package_from_url (dependency .url )
363
+ package = DirectOrigin .get_package_from_url (dependency .url )
443
364
444
365
self .validate_package_for_dependency (dependency = dependency , package = package )
445
366
@@ -453,23 +374,6 @@ def _search_for_url(self, dependency: URLDependency) -> Package:
453
374
454
375
return package
455
376
456
- @classmethod
457
- def get_package_from_url (cls , url : str ) -> Package :
458
- file_name = os .path .basename (urllib .parse .urlparse (url ).path )
459
- with tempfile .TemporaryDirectory () as temp_dir :
460
- dest = Path (temp_dir ) / file_name
461
- download_file (url , dest )
462
- package = cls .get_package_from_file (dest )
463
-
464
- package .files = [
465
- {"file" : file_name , "hash" : "sha256:" + get_file_hash (dest )}
466
- ]
467
-
468
- package ._source_type = "url"
469
- package ._source_url = url
470
-
471
- return package
472
-
473
377
def _get_dependencies_with_overrides (
474
378
self , dependencies : list [Dependency ], package : DependencyPackage
475
379
) -> list [Dependency ]:
0 commit comments