@@ -390,19 +390,6 @@ def test_getters_and_setters():
390390 assert v .prerelease == "rc.1"
391391 assert v .metadata == "build.2"
392392
393- def test_setters_invalid_values ():
394- v = Version (1 , 2 , 3 )
395- with pytest .raises (ValueError ):
396- v .major = "a"
397- with pytest .raises (ValueError ):
398- v .minor = "b"
399- with pytest .raises (ValueError ):
400- v .patch = "c"
401- with pytest .raises (ValueError ):
402- v .prerelease = "invalid@prerelease"
403- with pytest .raises (ValueError ):
404- v .metadata = "invalid@meta"
405-
406393
407394@pytest .mark .parametrize (
408395 "input_str,expected_major,expected_minor,expected_patch,expected_prerelease, expected_metadata" ,
@@ -554,3 +541,55 @@ def test_is_valid_string(version_str, expected):
554541 print (repr (Version .from_string (version_str )))
555542 # Assert
556543 assert result == expected
544+
545+
546+ @pytest .mark .parametrize (
547+ "major, minor, patch, prerelease, metadata, expected_str" ,
548+ [
549+ (1 , 0 , 0 , None , None , "1.0.0" ),
550+ (1 , 2 , 3 , None , None , "1.2.3" ),
551+ (1 , 0 , 0 , "alpha" , None , "1.0.0.alpha" ),
552+ (1 , 0 , 0 , "beta" , None , "1.0.0.beta" ),
553+ (1 , 0 , 0 , "rc.1" , None , "1.0.0.rc_1" ),
554+ (1 , 2 , 3 , "alpha.1" , None , "1.2.3.alpha_1" ),
555+ (1 , 2 , 3 , "beta.2.3" , None , "1.2.3.beta_2_3" ),
556+ (1 , 0 , 0 , None , "build" , "1.0.0.postbuild" ),
557+ (1 , 0 , 0 , None , "build.123" , "1.0.0.postbuild_123" ),
558+ (1 , 2 , 3 , "alpha" , "build" , "1.2.3.alpha.postbuild" ),
559+ (1 , 2 , 3 , "alpha.1" , "build.123" , "1.2.3.alpha_1.postbuild_123" ),
560+ (10 , 20 , 30 , "beta.1.2.3" , "build.456.789" , "10.20.30.beta_1_2_3.postbuild_456_789" ),
561+ ],
562+ ids = [
563+ "no_prerelease_no_metadata" ,
564+ "simple_version" ,
565+ "alpha_prerelease" ,
566+ "beta_prerelease" ,
567+ "rc_prerelease_with_dots" ,
568+ "prerelease_with_single_dot" ,
569+ "prerelease_with_multiple_dots" ,
570+ "metadata_only" ,
571+ "metadata_with_dots" ,
572+ "prerelease_and_metadata" ,
573+ "prerelease_and_metadata_with_dots" ,
574+ "complex_prerelease_and_metadata" ,
575+ ]
576+ )
577+ def test_to_python_version (major , minor , patch , prerelease , metadata , expected_str ):
578+ version = Version (major , minor , patch , prerelease , metadata )
579+ assert version .to_python_version () == expected_str
580+
581+ def test_to_python_version_replaces_special_chars ():
582+ # Test that dots and dashes are replaced with underscores
583+ version = Version (1 , 2 , 3 , "alpha.beta" , "metadata.123" )
584+ result = version .to_python_version ()
585+ assert result == "1.2.3.alpha_beta.postmetadata_123"
586+ assert '.' not in result .split ('.' )[- 1 ] # No dots in the last segment after splitting on main dots
587+
588+ def test_to_python_version_vs_str ():
589+ # Verify that to_python_version and __str__ produce different outputs for versions with prerelease/metadata
590+ version = Version (1 , 2 , 3 , "alpha.1" , "build.123" )
591+ python_version = version .to_python_version ()
592+ semver_version = str (version )
593+ assert python_version == "1.2.3.alpha_1.postbuild_123"
594+ assert semver_version == "1.2.3-alpha.1+build.123"
595+ assert python_version != semver_version
0 commit comments