Adds support for --no-deps to pip compile (#1311)

Mostly throwing this up here as a discussion topic. Having something
like this is primarily useful for enabling use cases similar to `rye
add` where I want to use this currently. One can accomplish something
similar with `unearth` today or by abusing regular `pip install`:

```
$ ~/.rye/self/bin/pip install --no-deps --dry-run flask --report - -q | jq '.install[0].metadata | {name, version}'
{
  "name": "Flask",
  "version": "3.0.2"
}
```

Another option would be to have a `puffin resolve` command or similar
that works like `pip compile` without dependencies, takes the
requirements as arguments and returns a line for each resolution. That
would be a larger change.
This commit is contained in:
Armin Ronacher
2024-02-15 15:01:31 +01:00
committed by GitHub
parent 94437175c7
commit bf2ee6bc31
3 changed files with 42 additions and 2 deletions
+4 -2
View File
@@ -27,8 +27,8 @@ use puffin_installer::{Downloader, NoBinary};
use puffin_interpreter::{Interpreter, PythonVersion};
use puffin_normalize::{ExtraName, PackageName};
use puffin_resolver::{
DisplayResolutionGraph, InMemoryIndex, Manifest, OptionsBuilder, PreReleaseMode,
ResolutionMode, Resolver,
DependencyMode, DisplayResolutionGraph, InMemoryIndex, Manifest, OptionsBuilder,
PreReleaseMode, ResolutionMode, Resolver,
};
use puffin_traits::{InFlight, NoBuild, SetupPyStrategy};
use puffin_warnings::warn_user;
@@ -51,6 +51,7 @@ pub(crate) async fn pip_compile(
output_file: Option<&Path>,
resolution_mode: ResolutionMode,
prerelease_mode: PreReleaseMode,
dependency_mode: DependencyMode,
upgrade: Upgrade,
generate_hashes: bool,
include_annotations: bool,
@@ -212,6 +213,7 @@ pub(crate) async fn pip_compile(
let options = OptionsBuilder::new()
.resolution_mode(resolution_mode)
.prerelease_mode(prerelease_mode)
.dependency_mode(dependency_mode)
.exclude_newer(exclude_newer)
.build();
+11
View File
@@ -191,6 +191,11 @@ struct PipCompileArgs {
#[clap(long, conflicts_with = "extra")]
all_extras: bool,
/// Ignore package dependencies, instead only add those packages explicitly listed
/// on the command line to the resulting the requirements file.
#[clap(long)]
no_deps: bool,
#[clap(long, value_enum, default_value_t = ResolutionMode::default())]
resolution: ResolutionMode,
@@ -807,6 +812,11 @@ async fn run() -> Result<ExitStatus> {
};
let upgrade = Upgrade::from_args(args.upgrade, args.upgrade_package);
let no_build = NoBuild::from_args(args.only_binary, args.no_build);
let dependency_mode = if args.no_deps {
DependencyMode::Direct
} else {
DependencyMode::Transitive
};
commands::pip_compile(
&requirements,
&constraints,
@@ -815,6 +825,7 @@ async fn run() -> Result<ExitStatus> {
args.output_file.as_deref(),
args.resolution,
args.prerelease,
dependency_mode,
upgrade,
args.generate_hashes,
!args.no_annotate,
+27
View File
@@ -480,6 +480,33 @@ fn compile_python_312() -> Result<()> {
Ok(())
}
/// Resolve a specific version of Black at Python 3.12 without deps.
#[test]
fn compile_python_312_no_deps() -> Result<()> {
let context = TestContext::new("3.12");
let requirements_in = context.temp_dir.child("requirements.in");
requirements_in.write_str("black==23.10.1")?;
puffin_snapshot!(context.compile()
.arg("requirements.in")
.arg("--no-deps")
.arg("--python-version")
.arg("3.12"), @r###"
success: true
exit_code: 0
----- stdout -----
# This file was autogenerated by Puffin v[VERSION] via the following command:
# puffin pip compile --cache-dir [CACHE_DIR] --exclude-newer 2023-11-18T12:00:00Z requirements.in --no-deps --python-version 3.12
black==23.10.1
----- stderr -----
Resolved 1 package in [TIME]
"###
);
Ok(())
}
/// Resolve a specific version of Black at Python 3.7.
#[test]
fn compile_python_37() -> Result<()> {