Skip to content

Commit 6897a13

Browse files
authored
feat(uv workspaces): add support for optional dependencies (#320)
* test: add optional-dependencies in uv workspaces example/test lock file * feat(uv workspaces): add support for identifying optional dependencies * bump Poetry plugin to 1.36.0 * bump CLI to 1.25.0
1 parent d9ea5cc commit 6897a13

File tree

5 files changed

+74
-7
lines changed

5 files changed

+74
-7
lines changed

components/polylith/libs/lock_files.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,19 @@ def get_workspace_enabled_lock_file_data(
104104
return data if members else {}
105105

106106

107+
def pick_package_sub_deps(package: dict) -> list:
108+
package_sub_deps = package.get("dependencies", [])
109+
110+
package_optional_deps_section = package.get("optional-dependencies", {})
111+
package_optional_deps: List[dict] = sum(package_optional_deps_section.values(), [])
112+
113+
return package_sub_deps + package_optional_deps
114+
115+
107116
def pick_packages(data: dict, name: str) -> list:
108117
package = next(p for p in data["package"] if p["name"] == name)
109118

110-
package_sub_deps = package.get("dependencies", [])
119+
package_sub_deps = pick_package_sub_deps(package)
111120
nested_package_deps = [pick_packages(data, p["name"]) for p in package_sub_deps]
112121

113122
flattened = sum(nested_package_deps, [])

projects/poetry_polylith_plugin/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "poetry-polylith-plugin"
3-
version = "1.35.0"
3+
version = "1.36.0"
44
description = "A Poetry plugin that adds tooling support for the Polylith Architecture"
55
authors = ["David Vujic"]
66
homepage = "https://davidvujic.github.io/python-polylith-docs/"

projects/polylith_cli/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "polylith-cli"
3-
version = "1.24.0"
3+
version = "1.25.0"
44
description = "Python tooling support for the Polylith Architecture"
55
authors = ['David Vujic']
66
homepage = "https://davidvujic.github.io/python-polylith-docs/"

test/components/polylith/libs/test_parse_lock_file.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,36 @@ def test_parse_contents_of_uv_workspaces_aware_lock_file(setup):
128128
assert non_existing == {}
129129

130130
assert gcp_libs_from_normalized_name == expected_gcp_libs
131+
132+
133+
def test_parse_contents_of_uv_workspaces_aware_lock_file_with_optional_dependencies(
134+
setup,
135+
):
136+
expected_regular = {
137+
"fastapi": "0.106.0",
138+
"anyio": "3.7.1",
139+
"exceptiongroup": "1.2.2",
140+
"idna": "3.7",
141+
"sniffio": "1.3.1",
142+
"pydantic": "2.8.2",
143+
"annotated-types": "0.7.0",
144+
"pydantic-core": "2.20.1",
145+
"typing-extensions": "4.12.2",
146+
"starlette": "0.27.0",
147+
"uvicorn": "0.25.0",
148+
"click": "8.1.7",
149+
"colorama": "0.4.6",
150+
"h11": "0.14.0",
151+
}
152+
153+
expected_optionals = {
154+
"requests": "2.32.3",
155+
"certifi": "2024.12.14",
156+
"charset-normalizer": "3.4.1",
157+
"urllib3": "2.3.0",
158+
}
159+
expected = {**expected_regular, **expected_optionals}
160+
161+
my_fastapi_libs = _extract_workspace_member_libs("my-fastapi-project")
162+
163+
assert my_fastapi_libs == expected

test/test_data/uv_workspaces

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,19 @@ dependencies = [
3232
name = "blinker"
3333
version = "1.8.2"
3434

35+
[[package]]
36+
name = "certifi"
37+
version = "2024.12.14"
38+
39+
[[package]]
40+
name = "charset-normalizer"
41+
version = "3.4.1"
42+
3543
[[package]]
3644
name = "click"
3745
version = "8.1.7"
3846
dependencies = [
39-
{ name = "colorama", marker = "platform_system == 'Windows'" },
47+
{ name = "colorama", marker = "sys_platform == 'win32'" },
4048
]
4149

4250
[[package]]
@@ -49,7 +57,6 @@ dependencies = [
4957
[[package]]
5058
name = "colorama"
5159
version = "0.4.6"
52-
source = { registry = "https://pypi.org/simple" }
5360

5461
[[package]]
5562
name = "confluent-kafka"
@@ -65,7 +72,6 @@ dependencies = [
6572
[[package]]
6673
name = "deprecation"
6774
version = "2.1.0"
68-
source = { registry = "https://pypi.org/simple" }
6975
dependencies = [
7076
{ name = "packaging" },
7177
]
@@ -103,7 +109,7 @@ dependencies = [
103109
{ name = "click" },
104110
{ name = "cloudevents" },
105111
{ name = "flask" },
106-
{ name = "gunicorn", marker = "platform_system != 'Windows'" },
112+
{ name = "gunicorn", marker = "sys_platform != 'win32'" },
107113
{ name = "watchdog" },
108114
]
109115

@@ -186,6 +192,11 @@ dependencies = [
186192
{ name = "uvicorn" },
187193
]
188194

195+
[package.optional-dependencies]
196+
opt = [
197+
{ name = "requests" },
198+
]
199+
189200
[[package]]
190201
name = "my-gcp-function-project"
191202
version = "0.1.0"
@@ -266,6 +277,16 @@ dependencies = [
266277
{ name = "uvicorn" },
267278
]
268279

280+
[[package]]
281+
name = "requests"
282+
version = "2.32.3"
283+
dependencies = [
284+
{ name = "certifi" },
285+
{ name = "charset-normalizer" },
286+
{ name = "idna" },
287+
{ name = "urllib3" },
288+
]
289+
269290
[[package]]
270291
name = "rich"
271292
version = "13.8.0"
@@ -324,6 +345,10 @@ dependencies = [
324345
name = "typing-extensions"
325346
version = "4.12.2"
326347

348+
[[package]]
349+
name = "urllib3"
350+
version = "2.3.0"
351+
327352
[[package]]
328353
name = "uvicorn"
329354
version = "0.25.0"

0 commit comments

Comments
 (0)