Skip to content

Commit 424da68

Browse files
authored
Support for url zip subdirectories (#398)
1 parent 0ea6fd2 commit 424da68

File tree

8 files changed

+51
-1
lines changed

8 files changed

+51
-1
lines changed

src/poetry/core/factory.py

+1
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ def create_dependency(
323323
dependency = URLDependency(
324324
name,
325325
constraint["url"],
326+
directory=constraint.get("subdirectory", None),
326327
groups=groups,
327328
optional=optional,
328329
extras=constraint.get("extras", []),

src/poetry/core/json/schemas/poetry-schema.json

+4
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,10 @@
504504
"type": "string",
505505
"description": "The url to the file."
506506
},
507+
"subdirectory": {
508+
"type": "string",
509+
"description": "The relative path to the directory where the package is located."
510+
},
507511
"python": {
508512
"type": "string",
509513
"description": "The python versions for which the dependency should be installed."

src/poetry/core/packages/dependency.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,12 @@ def create_from_pep_508(
526526
name, "git", link.url_without_fragment, extras=req.extras
527527
)
528528
elif link.scheme in ["http", "https"]:
529-
dep = URLDependency(name, link.url, extras=req.extras)
529+
dep = URLDependency(
530+
name,
531+
link.url_without_fragment,
532+
directory=link.subdirectory_fragment,
533+
extras=req.extras,
534+
)
530535
elif is_file_uri:
531536
# handle RFC 8089 references
532537
path = url_to_path(req.url)

src/poetry/core/packages/package.py

+1
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ def to_dependency(self) -> Dependency:
506506
dep = URLDependency(
507507
self._name,
508508
cast(str, self._source_url),
509+
directory=self.source_subdirectory,
509510
groups=list(self._dependency_groups.keys()),
510511
optional=self.optional,
511512
extras=self.features,

src/poetry/core/packages/url_dependency.py

+11
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ def __init__(
1111
self,
1212
name: str,
1313
url: str,
14+
*,
15+
directory: str | None = None,
1416
groups: Iterable[str] | None = None,
1517
optional: bool = False,
1618
extras: Iterable[str] | None = None,
1719
) -> None:
1820
self._url = url
21+
self._directory = directory
1922

2023
parsed = urlparse(url)
2124
if not parsed.scheme or not parsed.netloc:
@@ -29,13 +32,18 @@ def __init__(
2932
allows_prereleases=True,
3033
source_type="url",
3134
source_url=self._url,
35+
source_subdirectory=directory,
3236
extras=extras,
3337
)
3438

3539
@property
3640
def url(self) -> str:
3741
return self._url
3842

43+
@property
44+
def directory(self) -> str | None:
45+
return self._directory
46+
3947
@property
4048
def base_pep_508_name(self) -> str:
4149
requirement = self.pretty_name
@@ -46,6 +54,9 @@ def base_pep_508_name(self) -> str:
4654

4755
requirement += f" @ {self._url}"
4856

57+
if self.directory:
58+
requirement += f"#subdirectory={self.directory}"
59+
4960
return requirement
5061

5162
def is_url(self) -> bool:

tests/packages/test_main.py

+15
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,21 @@ def test_dependency_from_pep_508_with_url() -> None:
237237
assert dep.url == "https://example.com/django-utils-1.0.0.tar.gz"
238238

239239

240+
def test_dependency_from_pep_508_with_url_and_subdirectory() -> None:
241+
name = (
242+
"django-utils @"
243+
" https://example.com/django-utils-1.0.0.tar.gz#subdirectory=django"
244+
)
245+
246+
dep = Dependency.create_from_pep_508(name)
247+
248+
assert dep.name == "django-utils"
249+
assert dep.is_url()
250+
dep = cast(URLDependency, dep)
251+
assert dep.url == "https://example.com/django-utils-1.0.0.tar.gz"
252+
assert dep.directory == "django"
253+
254+
240255
def test_dependency_from_pep_508_with_wheel_url() -> None:
241256
name = (
242257
"example_wheel @ https://example.com/example_wheel-14.0.2-py2.py3-none-any.whl"

tests/packages/test_package.py

+2
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ def test_to_dependency_for_url() -> None:
333333
"1.2.3",
334334
source_type="url",
335335
source_url="https://example.com/path.tar.gz",
336+
source_subdirectory="qux",
336337
features=["baz", "bar"],
337338
)
338339
dep = package.to_dependency()
@@ -345,6 +346,7 @@ def test_to_dependency_for_url() -> None:
345346
assert dep.url == "https://example.com/path.tar.gz"
346347
assert dep.source_type == "url"
347348
assert dep.source_url == "https://example.com/path.tar.gz"
349+
assert dep.source_subdirectory == "qux"
348350

349351

350352
def test_to_dependency_for_vcs() -> None:

tests/packages/test_url_dependency.py

+11
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ def test_to_pep_508_with_extras() -> None:
3333
assert expected == dependency.to_pep_508()
3434

3535

36+
def test_to_pep_508_with_subdirectory() -> None:
37+
dependency = URLDependency(
38+
"demo",
39+
"https://github.com/foo/bar/archive/0.1.0.zip",
40+
directory="baz",
41+
)
42+
43+
expected = "demo @ https://github.com/foo/bar/archive/0.1.0.zip#subdirectory=baz"
44+
assert expected == dependency.to_pep_508()
45+
46+
3647
def test_to_pep_508_with_marker() -> None:
3748
dependency = URLDependency(
3849
"pytorch",

0 commit comments

Comments
 (0)