@@ -154,8 +154,11 @@ impl PyProjectToml {
154154 & self . project . version
155155 }
156156
157- pub ( crate ) fn parse ( contents : & str ) -> Result < Self , Error > {
158- Ok ( toml:: from_str ( contents) ?)
157+ pub ( crate ) fn parse ( path : & Path ) -> Result < Self , Error > {
158+ let contents = fs_err:: read_to_string ( path) ?;
159+ let pyproject_toml =
160+ toml:: from_str ( & contents) . map_err ( |err| Error :: Toml ( path. to_path_buf ( ) , err) ) ?;
161+ Ok ( pyproject_toml)
159162 }
160163
161164 pub ( crate ) fn readme ( & self ) -> Option < & Readme > {
@@ -949,7 +952,7 @@ mod tests {
949952 requires = ["uv_build>=0.4.15,<0.5.0"]
950953 build-backend = "uv_build"
951954 "# ;
952- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
955+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
953956 let temp_dir = TempDir :: new ( ) . unwrap ( ) ;
954957
955958 let metadata = pyproject_toml. to_metadata ( temp_dir. path ( ) ) . unwrap ( ) ;
@@ -1034,7 +1037,7 @@ mod tests {
10341037 "#
10351038 } ;
10361039
1037- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
1040+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
10381041 let metadata = pyproject_toml. to_metadata ( temp_dir. path ( ) ) . unwrap ( ) ;
10391042
10401043 assert_snapshot ! ( metadata. core_metadata_format( ) , @r###"
@@ -1128,7 +1131,7 @@ mod tests {
11281131 "#
11291132 } ;
11301133
1131- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
1134+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
11321135 let metadata = pyproject_toml. to_metadata ( temp_dir. path ( ) ) . unwrap ( ) ;
11331136
11341137 assert_snapshot ! ( metadata. core_metadata_format( ) , @r"
@@ -1220,7 +1223,7 @@ mod tests {
12201223 "#
12211224 } ;
12221225
1223- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
1226+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
12241227 let metadata = pyproject_toml. to_metadata ( temp_dir. path ( ) ) . unwrap ( ) ;
12251228
12261229 assert_snapshot ! ( metadata. core_metadata_format( ) , @r###"
@@ -1281,7 +1284,7 @@ mod tests {
12811284 #[ test]
12821285 fn build_system_valid ( ) {
12831286 let contents = extend_project ( "" ) ;
1284- let pyproject_toml = PyProjectToml :: parse ( & contents) . unwrap ( ) ;
1287+ let pyproject_toml: PyProjectToml = toml :: from_str ( & contents) . unwrap ( ) ;
12851288 assert_snapshot ! (
12861289 pyproject_toml. check_build_system( "0.4.15+test" ) . join( "\n " ) ,
12871290 @""
@@ -1299,7 +1302,7 @@ mod tests {
12991302 requires = ["uv_build"]
13001303 build-backend = "uv_build"
13011304 "# } ;
1302- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
1305+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
13031306 assert_snapshot ! (
13041307 pyproject_toml. check_build_system( "0.4.15+test" ) . join( "\n " ) ,
13051308 @r###"`build_system.requires = ["uv_build"]` is missing an upper bound on the `uv_build` version such as `<0.5`. Without bounding the `uv_build` version, the source distribution will break when a future, breaking version of `uv_build` is released."###
@@ -1317,7 +1320,7 @@ mod tests {
13171320 requires = ["uv_build>=0.4.15,<0.5.0", "wheel"]
13181321 build-backend = "uv_build"
13191322 "# } ;
1320- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
1323+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
13211324 assert_snapshot ! (
13221325 pyproject_toml. check_build_system( "0.4.15+test" ) . join( "\n " ) ,
13231326 @"Expected a single uv requirement in `build-system.requires`, found ``"
@@ -1335,7 +1338,7 @@ mod tests {
13351338 requires = ["setuptools"]
13361339 build-backend = "uv_build"
13371340 "# } ;
1338- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
1341+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
13391342 assert_snapshot ! (
13401343 pyproject_toml. check_build_system( "0.4.15+test" ) . join( "\n " ) ,
13411344 @"Expected a single uv requirement in `build-system.requires`, found ``"
@@ -1353,7 +1356,7 @@ mod tests {
13531356 requires = ["uv_build>=0.4.15,<0.5.0"]
13541357 build-backend = "setuptools"
13551358 "# } ;
1356- let pyproject_toml = PyProjectToml :: parse ( contents) . unwrap ( ) ;
1359+ let pyproject_toml: PyProjectToml = toml :: from_str ( contents) . unwrap ( ) ;
13571360 assert_snapshot ! (
13581361 pyproject_toml. check_build_system( "0.4.15+test" ) . join( "\n " ) ,
13591362 @r###"The value for `build_system.build-backend` should be `"uv_build"`, not `"setuptools"`"###
@@ -1364,7 +1367,7 @@ mod tests {
13641367 fn minimal ( ) {
13651368 let contents = extend_project ( "" ) ;
13661369
1367- let metadata = PyProjectToml :: parse ( & contents)
1370+ let metadata = toml :: from_str :: < PyProjectToml > ( & contents)
13681371 . unwrap ( )
13691372 . to_metadata ( Path :: new ( "/do/not/read" ) )
13701373 . unwrap ( ) ;
@@ -1383,15 +1386,14 @@ mod tests {
13831386 "#
13841387 } ) ;
13851388
1386- let err = PyProjectToml :: parse ( & contents) . unwrap_err ( ) ;
1387- assert_snapshot ! ( format_err( err) , @r###"
1388- Invalid pyproject.toml
1389- Caused by: TOML parse error at line 4, column 10
1389+ let err = toml:: from_str :: < PyProjectToml > ( & contents) . unwrap_err ( ) ;
1390+ assert_snapshot ! ( format_err( err) , @r#"
1391+ TOML parse error at line 4, column 10
13901392 |
13911393 4 | readme = { path = "Readme.md" }
13921394 | ^^^^^^^^^^^^^^^^^^^^^^
13931395 data did not match any variant of untagged enum Readme
1394- "### ) ;
1396+ "# ) ;
13951397 }
13961398
13971399 #[ test]
@@ -1401,7 +1403,7 @@ mod tests {
14011403 "#
14021404 } ) ;
14031405
1404- let err = PyProjectToml :: parse ( & contents)
1406+ let err = toml :: from_str :: < PyProjectToml > ( & contents)
14051407 . unwrap ( )
14061408 . to_metadata ( Path :: new ( "/do/not/read" ) )
14071409 . unwrap_err ( ) ;
@@ -1423,14 +1425,14 @@ mod tests {
14231425 "#
14241426 } ) ;
14251427
1426- let err = PyProjectToml :: parse ( & contents)
1428+ let err = toml :: from_str :: < PyProjectToml > ( & contents)
14271429 . unwrap ( )
14281430 . to_metadata ( Path :: new ( "/do/not/read" ) )
14291431 . unwrap_err ( ) ;
1430- assert_snapshot ! ( format_err( err) , @r### "
1431- Invalid pyproject.toml
1432+ assert_snapshot ! ( format_err( err) , @r"
1433+ Invalid project metadata
14321434 Caused by: `project.description` must be a single line
1433- "### ) ;
1435+ " ) ;
14341436 }
14351437
14361438 #[ test]
@@ -1441,14 +1443,14 @@ mod tests {
14411443 "#
14421444 } ) ;
14431445
1444- let err = PyProjectToml :: parse ( & contents)
1446+ let err = toml :: from_str :: < PyProjectToml > ( & contents)
14451447 . unwrap ( )
14461448 . to_metadata ( Path :: new ( "/do/not/read" ) )
14471449 . unwrap_err ( ) ;
1448- assert_snapshot ! ( format_err( err) , @r### "
1449- Invalid pyproject.toml
1450+ assert_snapshot ! ( format_err( err) , @r"
1451+ Invalid project metadata
14501452 Caused by: When `project.license-files` is defined, `project.license` must be an SPDX expression string
1451- "### ) ;
1453+ " ) ;
14521454 }
14531455
14541456 #[ test]
@@ -1457,7 +1459,7 @@ mod tests {
14571459 license = "MIT OR Apache-2.0"
14581460 "#
14591461 } ) ;
1460- let metadata = PyProjectToml :: parse ( & contents)
1462+ let metadata = toml :: from_str :: < PyProjectToml > ( & contents)
14611463 . unwrap ( )
14621464 . to_metadata ( Path :: new ( "/do/not/read" ) )
14631465 . unwrap ( ) ;
@@ -1475,13 +1477,13 @@ mod tests {
14751477 license = "MIT XOR Apache-2"
14761478 "#
14771479 } ) ;
1478- let err = PyProjectToml :: parse ( & contents)
1480+ let err = toml :: from_str :: < PyProjectToml > ( & contents)
14791481 . unwrap ( )
14801482 . to_metadata ( Path :: new ( "/do/not/read" ) )
14811483 . unwrap_err ( ) ;
14821484 // TODO(konsti): We mess up the indentation in the error.
14831485 assert_snapshot ! ( format_err( err) , @r"
1484- Invalid pyproject.toml
1486+ Invalid project metadata
14851487 Caused by: `project.license` is not a valid SPDX expression: MIT XOR Apache-2
14861488 Caused by: MIT XOR Apache-2
14871489 ^^^ unknown term
@@ -1495,18 +1497,18 @@ mod tests {
14951497 "#
14961498 } ) ;
14971499
1498- let err = PyProjectToml :: parse ( & contents)
1500+ let err = toml :: from_str :: < PyProjectToml > ( & contents)
14991501 . unwrap ( )
15001502 . to_metadata ( Path :: new ( "/do/not/read" ) )
15011503 . unwrap_err ( ) ;
1502- assert_snapshot ! ( format_err( err) , @r### "
1503- Invalid pyproject.toml
1504+ assert_snapshot ! ( format_err( err) , @r"
1505+ Invalid project metadata
15041506 Caused by: Dynamic metadata is not supported
1505- "### ) ;
1507+ " ) ;
15061508 }
15071509
15081510 fn script_error ( contents : & str ) -> String {
1509- let err = PyProjectToml :: parse ( contents)
1511+ let err = toml :: from_str :: < PyProjectToml > ( contents)
15101512 . unwrap ( )
15111513 . to_entry_points ( )
15121514 . unwrap_err ( ) ;
0 commit comments