@@ -301,3 +301,150 @@ def test_cargo_provider_with_lock(
301
301
provider .set_version ("42.1" )
302
302
assert file .read_text () == dedent (toml_expected )
303
303
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