@@ -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+ 
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+ 
322+ name = "member_without_version" 
323+ # No version key - this should trigger NonExistentKey exception 
324+ """ 
325+ 
326+     lock_content  =  """\  
327+ 
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+ 
336+ members = ["member_without_version"] 
337+ 
338+ [workspace.package] 
339+ version = "42.1" 
340+ """ 
341+ 
342+     expected_lock_content  =  """\  
343+ 
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+ 
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+ 
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+ 
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+ 
411+ members = ["member_without_workspace"] 
412+ 
413+ [workspace.package] 
414+ version = "42.1" 
415+ """ 
416+ 
417+     expected_lock_content  =  """\  
418+ 
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