Skip to content

feat: uv format from project root#15440

Merged
zanieb merged 9 commits intoastral-sh:mainfrom
jorgehermo9:feature/uv-format-project-root
Aug 22, 2025
Merged

feat: uv format from project root#15440
zanieb merged 9 commits intoastral-sh:mainfrom
jorgehermo9:feature/uv-format-project-root

Conversation

@jorgehermo9
Copy link
Contributor

Closes #15430

This PR is a branch from #15438, opening it as a draft until that is merged to main and I'll merge main with this branch to have a cleaner diff


let workspace_cache = WorkspaceCache::default();
let project =
VirtualProject::discover(project_dir, &DiscoveryOptions::default(), &workspace_cache)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let mut command = Command::new(&ruff_path);
command.current_dir(project_dir);
// Run ruff in the project root
command.current_dir(project.root());
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder how this implementation behaves for a workspace with multiple package. running just uv format would always run the format from the workspace root. What is the intended way of working with specific packages of a workspace?
using uv run format --project package_a and uv run format --project package_b?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if you wanted to run it in a workspace member it'd be uv format --package <name>

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, perfect then!

Thanks @zanieb, I'm kind of new with uv and I'm sorry for those basic questions

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No problem!

let subdir = context.temp_dir.child("subdir");
fs_err::create_dir_all(&subdir)?;

uv_snapshot!(context.filters(), context.format().current_dir("subdir"), @r"
Copy link
Contributor Author

@jorgehermo9 jorgehermo9 Aug 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we add another test similar to this, but using also the --project option? Maybe we could set up something like I depicted in https://github.com/astral-sh/uv/pull/15440/files#r2294435556 and have something like

.
├── main.py
├── package_a
│   ├── main.py
│   ├── pyproject.toml
│   └── README.md
├── package_b
│   ├── main.py
│   ├── pyproject.toml
│   └── README.md
├── pyproject.toml
└── README.md

and check that when running uv run format --project package_a only package_a gets formatted and package_b does not? Maybe this overlaps a bit with the current format_relative_project test so i'm not sure

Maybe I'm overthinking this 😄 but I'm open to include a test for this if this makes sense

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And also, another test such as

.
├── main.py
├── package_a
│   ├── main.py
│   ├── package_a_subdir
│   ├── pyproject.toml
│   └── README.md
├── package_b
│   ├── main.py
│   ├── pyproject.toml
│   └── README.md
├── pyproject.toml
└── README.md

and runing uv format with current dir as package_a/package_a_subdir only formats package_a files? But this may be testing VirtuslProject::discover's behaviour, so i'm also not sure

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems helpful to add a test case for a workspace if you're interested! Even if we don't handle workspace members "correctly" yet, having coverage for the behavior is helpful.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay! Going to add that later/tomorrow (CET timezone). Feel free to merge if you don't want to wait till that, I'll open a new PR for tests if you decide to merge this before

@jorgehermo9 jorgehermo9 marked this pull request as ready for review August 22, 2025 19:07
@jorgehermo9
Copy link
Contributor Author

Marked PR as ready!

I see the CI is failing for windows https://github.com/astral-sh/uv/actions/runs/17163604154/job/48698604290?pr=15440#step:10:2995 but seems unrelated

}

#[test]
fn format_from_project_root() -> Result<()> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should also add a --no-project test case. I'd expect that to not use the project root.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't support that yet actually, so that's a follow-up

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I may implement that as well! if no one takes it first 😃

Copy link
Member

@zanieb zanieb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks ready to go besides my nits.

jorgehermo9 and others added 2 commits August 22, 2025 21:35
Co-authored-by: Zanie Blue <contact@zanie.dev>
Co-authored-by: Zanie Blue <contact@zanie.dev>
@jorgehermo9
Copy link
Contributor Author

Thanks for your review @zanieb!
Feel free to merge if you want, if so I'll open another with the remaining tests,otherwise I'll do those changes tomorrow 😀

@zanieb zanieb merged commit e6def43 into astral-sh:main Aug 22, 2025
96 checks passed
@zanieb zanieb added the preview Experimental behavior label Aug 22, 2025
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Sep 2, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [astral-sh/uv](https://github.com/astral-sh/uv) | patch | `0.8.13` -> `0.8.14` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>astral-sh/uv (astral-sh/uv)</summary>

### [`v0.8.14`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0814)

[Compare Source](astral-sh/uv@0.8.13...0.8.14)

##### Python

- Add managed CPython distributions for aarch64 musl

##### Enhancements

- Add `--python-platform` to `uv pip check` ([#&#8203;15486](astral-sh/uv#15486))
- Add an environment variable for `UV_ISOLATED` ([#&#8203;15428](astral-sh/uv#15428))
- Add logging to the uv build backend ([#&#8203;15533](astral-sh/uv#15533))
- Allow more trailing null bytes in zip files ([#&#8203;15452](astral-sh/uv#15452))
- Allow pinning managed Python versions to specific build versions ([#&#8203;15314](astral-sh/uv#15314))
- Cache PyTorch wheels by default ([#&#8203;15481](astral-sh/uv#15481))
- Reject already-installed wheels that don't match the target platform ([#&#8203;15484](astral-sh/uv#15484))
- Add `--no-install-local` option to `uv sync`, `uv add` and `uv export`  ([#&#8203;15328](astral-sh/uv#15328))
- Include cycle error message in `uv pip` CLI ([#&#8203;15453](astral-sh/uv#15453))

##### Preview features

- Fix format of `{version}` on `uv format` failure ([#&#8203;15527](astral-sh/uv#15527))
- Lock during installs in `uv format` to prevent races ([#&#8203;15551](astral-sh/uv#15551))
- Respect `--project` in `uv format` ([#&#8203;15438](astral-sh/uv#15438))
- Run `uv format` in the project root ([#&#8203;15440](astral-sh/uv#15440))

##### Configuration

- Add file-to-CLI overrides for build isolation configuration ([#&#8203;15437](astral-sh/uv#15437))
- Add file-to-CLI overrides for reinstall configuration ([#&#8203;15426](astral-sh/uv#15426))

##### Performance

- Cache `WHEEL` and `METADATA` reads in installed distributions ([#&#8203;15489](astral-sh/uv#15489))

##### Bug fixes

- Avoid erroring when creating `venv` in current working directory ([#&#8203;15537](astral-sh/uv#15537))
- Avoid introducing unnecessary system dependency on CUDA ([#&#8203;15449](astral-sh/uv#15449))
- Clear discovered site packages when creating virtual environment ([#&#8203;15522](astral-sh/uv#15522))
- Read index credentials from the environment during `uv publish` checks ([#&#8203;15545](astral-sh/uv#15545))
- Refuse to remove non-virtual environments in `uv venv` ([#&#8203;15538](astral-sh/uv#15538))
- Stop setting `CLICOLOR_FORCE=1` when calling build backends ([#&#8203;15472](astral-sh/uv#15472))
- Support file or directory removal for Windows symlinks ([#&#8203;15543](astral-sh/uv#15543))

##### Documentation

- Fix GitHub guide highlight lines ([#&#8203;15443](astral-sh/uv#15443))
- Move Resolver to new Internals section in the Reference ([#&#8203;15465](astral-sh/uv#15465))
- Split the "Authentication" page into sections ([#&#8203;15575](astral-sh/uv#15575))
- Update uninstall docs to mention `uvw.exe` needs to be removed ([#&#8203;15536](astral-sh/uv#15536))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS44OC4wIiwidXBkYXRlZEluVmVyIjoiNDEuODguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview Experimental behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

uv format should run in the project root when invoked from a subdirectory

2 participants