Skip to content

Commit 1753468

Browse files
authored
allow in renv.lock lists (#803)
1 parent ab280ac commit 1753468

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

‎rsconnect/environment_r.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,9 @@ def _remote_repo_url(remote_type: str, pkg_ref: str) -> str:
291291
return f"{host}{pkg_ref}" if host else ""
292292

293293

294-
def _join_list(value: Optional[Sequence[str]]) -> Optional[str]:
295-
return ", ".join(value) if value else None
294+
def _join_list(value: Optional[Sequence[Optional[str]]]) -> Optional[str]:
295+
items = [v for v in value if v is not None] if value else []
296+
return ", ".join(items) if items else None
296297

297298

298299
def _is_url(value: str) -> bool:

‎tests/test_environment_r.py‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,38 @@ def test_null_r_section_raises(tmp_path):
197197
REnvironment.create(str(tmp_path))
198198

199199

200+
def test_null_entries_in_linking_fields_are_tolerated(tmp_path):
201+
# rpy2 and similar packages can produce renv.lock entries like
202+
# "LinkingTo": [null], which caused _join_list to raise TypeError
203+
# because str.join rejects None elements.
204+
write_lockfile(
205+
tmp_path,
206+
{
207+
"R": {"Version": "4.3.1", "Repositories": [{"Name": "CRAN", "URL": "https://cloud.r-project.org"}]},
208+
"Packages": {
209+
"rpy2": {
210+
"Package": "rpy2",
211+
"Version": "1.0.0",
212+
"Source": "Repository",
213+
"Repository": "CRAN",
214+
"Imports": ["R6", None],
215+
"Suggests": [None],
216+
"LinkingTo": [None],
217+
},
218+
},
219+
},
220+
)
221+
222+
env = REnvironment.create(str(tmp_path))
223+
assert env is not None
224+
description = env.packages["rpy2"]["description"]
225+
# Null entries are dropped; non-null strings are kept.
226+
assert description.get("Imports") == "R6"
227+
# Fields that are all-null collapse to absent rather than empty.
228+
assert "Suggests" not in description
229+
assert "LinkingTo" not in description
230+
231+
200232
MINIMAL_LOCKFILE = {
201233
"R": {"Version": "4.3.1", "Repositories": [{"Name": "CRAN", "URL": "https://cloud.r-project.org"}]},
202234
"Packages": {},

0 commit comments

Comments
 (0)