@@ -301,3 +301,150 @@ def test_cargo_provider_with_lock(
301301 provider .set_version ("42.1" )
302302 assert file .read_text () == dedent (toml_expected )
303303 assert lock_file .read_text () == dedent (lock_expected )
304+
305+
306+ def test_cargo_provider_workspace_member_without_version_key (
307+ config : BaseConfig ,
308+ chdir : Path ,
309+ ):
310+ """Test workspace member that has no version key at all (should not crash)."""
311+ workspace_toml = """\
312+ [workspace]
313+ members = ["member_without_version"]
314+
315+ [workspace.package]
316+ version = "0.1.0"
317+ """
318+
319+ # Create a member that has no version key at all
320+ member_content = """\
321+ [package]
322+ name = "member_without_version"
323+ # No version key - this should trigger NonExistentKey exception
324+ """
325+
326+ lock_content = """\
327+ [[package]]
328+ name = "member_without_version"
329+ version = "0.1.0"
330+ source = "registry+https://github.com/rust-lang/crates.io-index"
331+ checksum = "123abc"
332+ """
333+
334+ expected_workspace_toml = """\
335+ [workspace]
336+ members = ["member_without_version"]
337+
338+ [workspace.package]
339+ version = "42.1"
340+ """
341+
342+ expected_lock_content = """\
343+ [[package]]
344+ name = "member_without_version"
345+ version = "0.1.0"
346+ source = "registry+https://github.com/rust-lang/crates.io-index"
347+ checksum = "123abc"
348+ """
349+
350+ # Create the workspace file
351+ filename = CargoProvider .filename
352+ file = chdir / filename
353+ file .write_text (dedent (workspace_toml ))
354+
355+ # Create the member directory and file
356+ os .mkdir (chdir / "member_without_version" )
357+ member_file = chdir / "member_without_version" / "Cargo.toml"
358+ member_file .write_text (dedent (member_content ))
359+
360+ # Create the lock file
361+ lock_filename = CargoProvider .lock_filename
362+ lock_file = chdir / lock_filename
363+ lock_file .write_text (dedent (lock_content ))
364+
365+ config .settings ["version_provider" ] = "cargo"
366+
367+ provider = get_provider (config )
368+ assert isinstance (provider , CargoProvider )
369+ assert provider .get_version () == "0.1.0"
370+
371+ # This should not crash even though the member has no version key
372+ provider .set_version ("42.1" )
373+ assert file .read_text () == dedent (expected_workspace_toml )
374+ # The lock file should remain unchanged since the member doesn't inherit workspace version
375+ assert lock_file .read_text () == dedent (expected_lock_content )
376+
377+
378+ def test_cargo_provider_workspace_member_without_workspace_key (
379+ config : BaseConfig ,
380+ chdir : Path ,
381+ ):
382+ """Test workspace member that has version key but no workspace subkey."""
383+ workspace_toml = """\
384+ [workspace]
385+ members = ["member_without_workspace"]
386+
387+ [workspace.package]
388+ version = "0.1.0"
389+ """
390+
391+ # Create a member that has version as a table but no workspace subkey
392+ # This should trigger NonExistentKey when trying to access version["workspace"]
393+ member_content = """\
394+ [package]
395+ name = "member_without_workspace"
396+
397+ [package.version]
398+ # Has version table but no workspace key - should trigger NonExistentKey
399+ """
400+
401+ lock_content = """\
402+ [[package]]
403+ name = "member_without_workspace"
404+ version = "0.1.0"
405+ source = "registry+https://github.com/rust-lang/crates.io-index"
406+ checksum = "123abc"
407+ """
408+
409+ expected_workspace_toml = """\
410+ [workspace]
411+ members = ["member_without_workspace"]
412+
413+ [workspace.package]
414+ version = "42.1"
415+ """
416+
417+ expected_lock_content = """\
418+ [[package]]
419+ name = "member_without_workspace"
420+ version = "0.1.0"
421+ source = "registry+https://github.com/rust-lang/crates.io-index"
422+ checksum = "123abc"
423+ """
424+
425+ # Create the workspace file
426+ filename = CargoProvider .filename
427+ file = chdir / filename
428+ file .write_text (dedent (workspace_toml ))
429+
430+ # Create the member directory and file
431+ os .mkdir (chdir / "member_without_workspace" )
432+ member_file = chdir / "member_without_workspace" / "Cargo.toml"
433+ member_file .write_text (dedent (member_content ))
434+
435+ # Create the lock file
436+ lock_filename = CargoProvider .lock_filename
437+ lock_file = chdir / lock_filename
438+ lock_file .write_text (dedent (lock_content ))
439+
440+ config .settings ["version_provider" ] = "cargo"
441+
442+ provider = get_provider (config )
443+ assert isinstance (provider , CargoProvider )
444+ assert provider .get_version () == "0.1.0"
445+
446+ # This should not crash even though the member has no version.workspace key
447+ provider .set_version ("42.1" )
448+ assert file .read_text () == dedent (expected_workspace_toml )
449+ # The lock file should remain unchanged since the member doesn't inherit workspace version
450+ assert lock_file .read_text () == dedent (expected_lock_content )
0 commit comments