Add --config-file support (#3047)

## Summary

Users can now pass a config file on the command line, e.g., with
`--config-file /path/to/file.py`.
This commit is contained in:
Charlie Marsh 2024-04-17 13:32:29 -04:00 committed by GitHub
parent 7fb2bf816f
commit c6e75f8b35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 33 additions and 3 deletions

View file

@ -21,7 +21,7 @@ impl Workspace {
/// found.
pub fn find(path: impl AsRef<Path>) -> Result<Option<Self>, WorkspaceError> {
for ancestor in path.as_ref().ancestors() {
match read_options(ancestor) {
match find_in_directory(ancestor) {
Ok(Some(options)) => {
return Ok(Some(Self {
options,
@ -43,10 +43,18 @@ impl Workspace {
}
Ok(None)
}
/// Load a [`Workspace`] from a `pyproject.toml` or `uv.toml` file.
pub fn from_file(path: impl AsRef<Path>) -> Result<Self, WorkspaceError> {
Ok(Self {
options: read_file(path.as_ref())?,
root: path.as_ref().parent().unwrap().to_path_buf(),
})
}
}
/// Read a `uv.toml` or `pyproject.toml` file in the given directory.
fn read_options(dir: &Path) -> Result<Option<Options>, WorkspaceError> {
fn find_in_directory(dir: &Path) -> Result<Option<Options>, WorkspaceError> {
// Read a `uv.toml` file in the current directory.
let path = dir.join("uv.toml");
match fs_err::read_to_string(&path) {
@ -94,6 +102,20 @@ fn read_options(dir: &Path) -> Result<Option<Options>, WorkspaceError> {
Ok(None)
}
/// Load [`Options`] from a `pyproject.toml` or `ruff.toml` file.
fn read_file(path: &Path) -> Result<Options, WorkspaceError> {
let content = fs_err::read_to_string(path)?;
if path.ends_with("pyproject.toml") {
let pyproject: PyProjectToml = toml::from_str(&content)
.map_err(|err| WorkspaceError::PyprojectToml(path.user_display().to_string(), err))?;
Ok(pyproject.tool.and_then(|tool| tool.uv).unwrap_or_default())
} else {
let options: Options = toml::from_str(&content)
.map_err(|err| WorkspaceError::UvToml(path.user_display().to_string(), err))?;
Ok(options)
}
}
#[derive(thiserror::Error, Debug)]
pub enum WorkspaceError {
#[error(transparent)]