183 """Add the missing package to project dependency manifests where missing.
185 Returns ``{"updated": [filenames...], "errors": [...]}``.
187 pkg = dep_info[
"package"]
188 group = dep_info.get(
"optional_group")
193 pyproject = _PROJECT_ROOT /
"pyproject.toml"
194 if pyproject.exists():
196 content = pyproject.read_text(encoding=
"utf-8")
197 if pkg
not in content:
199 marker = f
"{group} = ["
200 if marker
in content:
201 lines = content.split(
"\n")
204 for i, line
in enumerate(lines):
205 new_lines.append(line)
206 if not added
and marker
in line:
207 next_line = lines[i + 1]
if i + 1 < len(lines)
else ""
208 if pkg
not in "".join(lines[i:]):
209 new_lines.append(f
' "{pkg}",')
213 new_lines.append(f
'{group} = [')
214 new_lines.append(f
' "{pkg}",')
215 new_lines.append(
']')
216 content =
"\n".join(new_lines)
218 content += f
'\n{group} = [\n "{pkg}",\n]\n'
219 pyproject.write_text(content, encoding=
"utf-8")
220 updated.append(
"pyproject.toml")
221 except Exception
as e:
222 errors.append(f
"pyproject.toml: {e}")
225 req_all = _PROJECT_ROOT /
"requirements-all.txt"
228 lines = req_all.read_text(encoding=
"utf-8").split(
"\n")
233 stripped = line.strip()
234 if stripped.lstrip(
"#").strip() == pkg
and stripped.startswith(
"#"):
235 new_lines.append(pkg)
239 new_lines.append(line)
243 new_lines.append(pkg)
246 req_all.write_text(
"\n".join(new_lines) +
"\n", encoding=
"utf-8")
247 updated.append(
"requirements-all.txt")
248 except Exception
as e:
249 errors.append(f
"requirements-all.txt: {e}")
252 req_txt = _PROJECT_ROOT /
"requirements.txt"
255 lines = req_txt.read_text(encoding=
"utf-8").split(
"\n")
260 stripped = line.strip()
261 if stripped.lstrip(
"#").strip() == pkg
and stripped.startswith(
"#"):
262 new_lines.append(f
"{pkg} # {group or 'optional'}")
266 new_lines.append(line)
267 if stripped == pkg
or stripped.startswith(f
"{pkg} #")
or stripped.startswith(f
"{pkg} #"):
270 new_lines.append(f
"{pkg} # {group or 'optional'}")
273 req_txt.write_text(
"\n".join(new_lines) +
"\n", encoding=
"utf-8")
274 updated.append(
"requirements.txt")
275 except Exception
as e:
276 errors.append(f
"requirements.txt: {e}")
278 return {
"updated": updated,
"errors": errors}