From e8e87083dde3cb30d3eae0f88a63eaf8bb04cf92 Mon Sep 17 00:00:00 2001 From: nichmor Date: Tue, 3 Dec 2024 15:21:30 +0200 Subject: [PATCH 01/16] fix: remove dbg commands (#2632) --- crates/pixi_build_frontend/src/tool/cache.rs | 4 ---- crates/pixi_utils/src/conda_environment_file.rs | 2 -- 2 files changed, 6 deletions(-) diff --git a/crates/pixi_build_frontend/src/tool/cache.rs b/crates/pixi_build_frontend/src/tool/cache.rs index c16dd9960..0c923fcaa 100644 --- a/crates/pixi_build_frontend/src/tool/cache.rs +++ b/crates/pixi_build_frontend/src/tool/cache.rs @@ -304,13 +304,9 @@ mod tests { *count += 1; if count == &1 { - dbg!("a"); miette::bail!("error on first request"); - // tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; - // panic!("tim is right!"); } - dbg!("b"); let isolated_tool = IsolatedTool::new(spec.command.clone(), PathBuf::new(), HashMap::default()); Ok(isolated_tool) diff --git a/crates/pixi_utils/src/conda_environment_file.rs b/crates/pixi_utils/src/conda_environment_file.rs index 78a05dacb..4e70d03df 100644 --- a/crates/pixi_utils/src/conda_environment_file.rs +++ b/crates/pixi_utils/src/conda_environment_file.rs @@ -131,8 +131,6 @@ impl CondaEnvFile { channels = config.default_channels(); } - dbg!(&channels); - Ok((conda_deps, pip_deps, channels)) } } From 66553975e4658d9c7b3b407396324360cc6a98ba Mon Sep 17 00:00:00 2001 From: Ruben Arts Date: Tue, 3 Dec 2024 15:04:45 +0100 Subject: [PATCH 02/16] fix: regression `detached-environments` not used (#2627) fixes #2623 --------- Co-authored-by: Bas Zalmstra --- src/environment.rs | 8 ++-- tests/integration_python/test_run_cli.py | 49 ++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/environment.rs b/src/environment.rs index fe5823156..f508570fd 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -53,7 +53,7 @@ use xxhash_rust::xxh3::Xxh3; /// not present. pub async fn verify_prefix_location_unchanged(environment_dir: &Path) -> miette::Result<()> { let prefix_file = environment_dir - .join("conda-meta") + .join(consts::CONDA_META_DIR) .join(consts::PREFIX_FILE_NAME); tracing::info!( @@ -131,7 +131,7 @@ fn write_file, C: AsRef<[u8]>>(path: P, contents: C) -> io::Resul /// Give it the environment path to place it. fn create_prefix_location_file(environment_dir: &Path) -> miette::Result<()> { let prefix_file_path = environment_dir - .join("conda-meta") + .join(consts::CONDA_META_DIR) .join(consts::PREFIX_FILE_NAME); let parent_dir = prefix_file_path.parent().ok_or_else(|| { @@ -163,7 +163,7 @@ fn create_prefix_location_file(environment_dir: &Path) -> miette::Result<()> { /// Create the conda-meta/history. /// This file is needed for `conda run -p .pixi/envs/` to work. fn create_history_file(environment_dir: &Path) -> miette::Result<()> { - let history_file = environment_dir.join("conda-meta").join("history"); + let history_file = environment_dir.join(consts::CONDA_META_DIR).join("history"); tracing::info!("Verify history file exists: {}", history_file.display()); @@ -309,7 +309,7 @@ pub(crate) fn read_environment_file( /// 4. It verifies that the prefix contains a `.gitignore` file. pub async fn sanity_check_project(project: &Project) -> miette::Result<()> { // Sanity check of prefix location - verify_prefix_location_unchanged(project.default_environment().dir().as_path()).await?; + verify_prefix_location_unchanged(project.environments_dir().as_path()).await?; // TODO: remove on a 1.0 release // Check for old `env` folder as we moved to `envs` in 0.13.0 diff --git a/tests/integration_python/test_run_cli.py b/tests/integration_python/test_run_cli.py index 28a9cc7af..7cce0ef58 100644 --- a/tests/integration_python/test_run_cli.py +++ b/tests/integration_python/test_run_cli.py @@ -1,6 +1,8 @@ import json from pathlib import Path + from .common import EMPTY_BOILERPLATE_PROJECT, verify_cli_command, ExitCode, default_env_path + import tempfile import os @@ -274,3 +276,50 @@ def test_run_with_activation(pixi: Path, tmp_pixi_workspace: Path) -> None: [pixi, "run", "--manifest-path", manifest, "--force-activate", "task", "-vvv"], stdout_contains="test123", ) + + +def test_detached_environments_run(pixi: Path, tmp_path: Path, dummy_channel_1: str) -> None: + tmp_project = tmp_path.joinpath("pixi-project") + tmp_project.mkdir() + detached_envs_tmp = tmp_path.joinpath("pixi-detached-envs") + manifest = tmp_project.joinpath("pixi.toml") + + # Create a dummy project + verify_cli_command([pixi, "init", tmp_project, "--channel", dummy_channel_1]) + verify_cli_command([pixi, "add", "dummy-a", "--no-install", "--manifest-path", manifest]) + + # Set detached environments + verify_cli_command( + [ + pixi, + "config", + "set", + "--manifest-path", + manifest, + "--local", + "detached-environments", + str(detached_envs_tmp), + ], + ) + + # Run the installation + verify_cli_command([pixi, "install", "--manifest-path", manifest]) + + # Validate the detached environment + assert detached_envs_tmp.exists() + + detached_envs_folder = None + for folder in detached_envs_tmp.iterdir(): + if folder.is_dir(): + detached_envs_folder = folder + break + assert detached_envs_folder is not None, "Couldn't find detached environment folder" + + # Validate the conda-meta folder exists + assert Path(detached_envs_folder).joinpath("envs", "default", "conda-meta").exists() + + # Verify that the detached environment is used + verify_cli_command( + [pixi, "run", "--manifest-path", manifest, "echo $CONDA_PREFIX"], + stdout_contains=f"{detached_envs_tmp}", + ) From 869a42994f5b9b03b62b955f4e558ee3d157a0f1 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 3 Dec 2024 15:28:16 +0100 Subject: [PATCH 03/16] refactor: remove ipc override from options and give it manually to test (#2629) Co-authored-by: Bas Zalmstra --- crates/pixi_build_frontend/src/lib.rs | 19 +--- .../builders/conda_build/protocol.rs | 6 +- .../src/protocols/builders/pixi.rs | 27 +++++- .../src/protocols/builders/rattler_build.rs | 2 +- .../pixi_build_frontend/src/protocols/mod.rs | 91 ++++++++----------- crates/pixi_build_frontend/src/tool/cache.rs | 4 +- .../pixi_build_frontend/src/tool/installer.rs | 1 - crates/pixi_build_frontend/src/tool/mod.rs | 48 ++-------- crates/pixi_build_frontend/src/tool/spec.rs | 4 +- .../pixi_build_frontend/tests/diagnostics.rs | 52 ++++++----- 10 files changed, 103 insertions(+), 151 deletions(-) diff --git a/crates/pixi_build_frontend/src/lib.rs b/crates/pixi_build_frontend/src/lib.rs index ce4846976..2f009e2b3 100644 --- a/crates/pixi_build_frontend/src/lib.rs +++ b/crates/pixi_build_frontend/src/lib.rs @@ -5,11 +5,11 @@ mod protocols; use std::fmt::{Debug, Formatter}; -pub(crate) use protocols::builders::{conda_protocol, pixi_protocol, rattler_build_protocol}; +pub use protocols::builders::{conda_protocol, pixi_protocol, rattler_build_protocol}; mod protocol_builder; mod reporters; -mod tool; +pub mod tool; use std::path::PathBuf; @@ -32,9 +32,6 @@ pub enum BackendOverride { /// Overwrite the backend with a executable path. System(String), - - /// Override with a specific IPC channel. - Io(InProcessBackend), } impl BackendOverride { @@ -49,18 +46,6 @@ impl BackendOverride { } } -impl From for BackendOverride { - fn from(value: InProcessBackend) -> Self { - Self::Io(value) - } -} - -impl From for Option { - fn from(value: InProcessBackend) -> Self { - Some(value.into()) - } -} - /// A backend communication protocol that can run in the same process. pub struct InProcessBackend { pub rpc_in: Box, diff --git a/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs b/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs index 136823cf2..7e5e7fc43 100644 --- a/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs +++ b/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs @@ -44,10 +44,6 @@ impl Protocol { &self, request: &CondaMetadataParams, ) -> miette::Result { - let Some(tool) = self.tool.as_executable() else { - miette::bail!("Cannot use a non-executable tool to render conda metadata"); - }; - // Construct a new tool that can be used to invoke conda-render instead of the // original tool. let conda_render_executable = String::from("conda-render"); @@ -57,7 +53,7 @@ impl Protocol { conda_render_executable }; - let conda_render_tool = tool.with_executable(conda_render_executable); + let conda_render_tool = self.tool.with_executable(conda_render_executable); // TODO: Properly pass channels // TODO: Setup --exclusive-config-files diff --git a/crates/pixi_build_frontend/src/protocols/builders/pixi.rs b/crates/pixi_build_frontend/src/protocols/builders/pixi.rs index 2a73c2e32..40df45df2 100644 --- a/crates/pixi_build_frontend/src/protocols/builders/pixi.rs +++ b/crates/pixi_build_frontend/src/protocols/builders/pixi.rs @@ -7,17 +7,16 @@ use std::{ use miette::Diagnostic; use pixi_consts::consts; use pixi_manifest::{Manifest, PackageManifest, PrioritizedChannel, WorkspaceManifest}; -// pub use protocol::Protocol; use rattler_conda_types::{ChannelConfig, MatchSpec}; use thiserror::Error; use which::Error; use crate::{ + jsonrpc::{Receiver, Sender}, protocols::{InitializeError, JsonRPCBuildProtocol}, tool::{IsolatedToolSpec, ToolCacheError, ToolSpec}, - BackendOverride, ToolContext, + BackendOverride, InProcessBackend, ToolContext, }; - // use super::{InitializeError, JsonRPCBuildProtocol}; /// A protocol that uses a pixi manifest to invoke a build backend . @@ -74,7 +73,7 @@ impl Display for FinishError { impl ProtocolBuilder { /// Constructs a new instance from a manifest. - pub(crate) fn new( + pub fn new( source_dir: PathBuf, manifest_path: PathBuf, workspace_manifest: WorkspaceManifest, @@ -205,6 +204,26 @@ impl ProtocolBuilder { ) .await?) } + + /// Finish the construction of the protocol with the given + /// [`InProcessBackend`] representing the build backend. + pub async fn finish_with_ipc( + self, + ipc: InProcessBackend, + build_id: usize, + ) -> Result { + Ok(JsonRPCBuildProtocol::setup_with_transport( + "".to_string(), + self.source_dir, + self.manifest_path, + build_id, + self.cache_dir, + Sender::from(ipc.rpc_out), + Receiver::from(ipc.rpc_in), + None, + ) + .await?) + } } /// Try to find a pixi manifest in the given source directory. diff --git a/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs b/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs index becff6077..efe83f38b 100644 --- a/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs +++ b/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs @@ -39,7 +39,7 @@ pub enum ProtocolBuildError { FailedToBuildPixi(#[from] PixiProtocolBuildError), } -/// A builder for constructing a [`protocol::Protocol`] instance. +/// A builder for constructing a [`crate::protocol::Protocol`] instance. #[derive(Debug)] pub struct ProtocolBuilder { /// The directory that contains the source files. diff --git a/crates/pixi_build_frontend/src/protocols/mod.rs b/crates/pixi_build_frontend/src/protocols/mod.rs index 8f71ec44d..0e83814e4 100644 --- a/crates/pixi_build_frontend/src/protocols/mod.rs +++ b/crates/pixi_build_frontend/src/protocols/mod.rs @@ -32,7 +32,7 @@ use tokio::{ }; use crate::{ - jsonrpc::{stdio_transport, Receiver, RpcParams, Sender}, + jsonrpc::{stdio_transport, RpcParams}, tool::Tool, CondaBuildReporter, CondaMetadataReporter, }; @@ -149,63 +149,46 @@ impl JsonRPCBuildProtocol { cache_dir: Option, tool: Tool, ) -> Result { - match tool.try_into_executable() { - Ok(tool) => { - // Spawn the tool and capture stdin/stdout. - let mut process = tokio::process::Command::from(tool.command()) - .stdout(std::process::Stdio::piped()) - .stdin(std::process::Stdio::piped()) - .stderr(std::process::Stdio::piped()) - .spawn()?; - - let backend_identifier = tool.executable().clone(); - - // Acquire the stdin/stdout handles. - let stdin = process - .stdin - .take() - .expect("since we piped stdin we expect a valid value here"); - let stdout = process - .stdout - .expect("since we piped stdout we expect a valid value here"); - let stderr = process - .stderr - .map(|stderr| BufReader::new(stderr).lines()) - .expect("since we piped stderr we expect a valid value here"); - - // Construct a JSON-RPC client to communicate with the backend process. - let (tx, rx) = stdio_transport(stdin, stdout); - Self::setup_with_transport( - backend_identifier, - source_dir, - manifest_path, - build_id, - cache_dir, - tx, - rx, - Some(stderr), - ) - .await - } - Err(ipc) => { - Self::setup_with_transport( - "".to_string(), - source_dir, - manifest_path, - build_id, - cache_dir, - Sender::from(ipc.rpc_out), - Receiver::from(ipc.rpc_in), - None, - ) - .await - } - } + // Spawn the tool and capture stdin/stdout. + let mut process = tokio::process::Command::from(tool.command()) + .stdout(std::process::Stdio::piped()) + .stdin(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn()?; + + let backend_identifier = tool.executable().clone(); + + // Acquire the stdin/stdout handles. + let stdin = process + .stdin + .take() + .expect("since we piped stdin we expect a valid value here"); + let stdout = process + .stdout + .expect("since we piped stdout we expect a valid value here"); + let stderr = process + .stderr + .map(|stderr| BufReader::new(stderr).lines()) + .expect("since we piped stderr we expect a valid value here"); + + // Construct a JSON-RPC client to communicate with the backend process. + let (tx, rx) = stdio_transport(stdin, stdout); + Self::setup_with_transport( + backend_identifier, + source_dir, + manifest_path, + build_id, + cache_dir, + tx, + rx, + Some(stderr), + ) + .await } /// Setup a new protocol instance with a given transport. #[allow(clippy::too_many_arguments)] - async fn setup_with_transport( + pub(crate) async fn setup_with_transport( backend_identifier: String, source_dir: PathBuf, // In case of rattler-build it's recipe.yaml diff --git a/crates/pixi_build_frontend/src/tool/cache.rs b/crates/pixi_build_frontend/src/tool/cache.rs index 0c923fcaa..dc150f04f 100644 --- a/crates/pixi_build_frontend/src/tool/cache.rs +++ b/crates/pixi_build_frontend/src/tool/cache.rs @@ -208,9 +208,7 @@ mod tests { .await .unwrap(); - let exec = tool.as_executable().unwrap(); - - exec.command().arg("--version").spawn().unwrap(); + tool.command().arg("--version").spawn().unwrap(); } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] diff --git a/crates/pixi_build_frontend/src/tool/installer.rs b/crates/pixi_build_frontend/src/tool/installer.rs index c69463c65..08b36c2d5 100644 --- a/crates/pixi_build_frontend/src/tool/installer.rs +++ b/crates/pixi_build_frontend/src/tool/installer.rs @@ -157,7 +157,6 @@ impl ToolContext { channel_config: &ChannelConfig, ) -> Result { let spec = match spec { - ToolSpec::Io(ipc) => return Ok(Tool::Io(ipc)), ToolSpec::Isolated(isolated) => { if isolated.specs.is_empty() { return Err(ToolCacheError::Install(miette!( diff --git a/crates/pixi_build_frontend/src/tool/mod.rs b/crates/pixi_build_frontend/src/tool/mod.rs index ca21f38e4..be8e235d3 100644 --- a/crates/pixi_build_frontend/src/tool/mod.rs +++ b/crates/pixi_build_frontend/src/tool/mod.rs @@ -7,8 +7,6 @@ use std::{collections::HashMap, path::PathBuf}; pub use cache::ToolCacheError; pub use spec::{IsolatedToolSpec, SystemToolSpec, ToolSpec}; -use crate::InProcessBackend; - pub use installer::ToolContext; /// A tool that can be invoked. @@ -16,23 +14,6 @@ pub use installer::ToolContext; pub enum Tool { Isolated(IsolatedTool), System(SystemTool), - Io(InProcessBackend), -} - -impl Tool { - pub fn as_isolated(&self) -> Option<&IsolatedTool> { - match self { - Tool::Isolated(tool) => Some(tool), - Tool::System(_) => None, - Tool::Io(_) => None, - } - } -} - -#[derive(Debug)] -pub enum ExecutableTool { - Isolated(IsolatedTool), - System(SystemTool), } /// A tool that is pre-installed on the system. @@ -89,54 +70,43 @@ impl IsolatedTool { } impl Tool { - pub fn as_executable(&self) -> Option { - match self { - Tool::Isolated(tool) => Some(ExecutableTool::Isolated(tool.clone())), - Tool::System(tool) => Some(ExecutableTool::System(tool.clone())), - Tool::Io(_) => None, - } - } - - pub fn try_into_executable(self) -> Result { + pub fn as_isolated(&self) -> Option<&IsolatedTool> { match self { - Tool::Isolated(tool) => Ok(ExecutableTool::Isolated(tool)), - Tool::System(tool) => Ok(ExecutableTool::System(tool)), - Tool::Io(ipc) => Err(ipc), + Tool::Isolated(tool) => Some(tool), + Tool::System(_) => None, } } -} -impl ExecutableTool { /// Returns the full path to the executable to invoke. pub fn executable(&self) -> &String { match self { - ExecutableTool::Isolated(tool) => &tool.command, - ExecutableTool::System(tool) => &tool.command, + Tool::Isolated(tool) => &tool.command, + Tool::System(tool) => &tool.command, } } /// Construct a new tool that calls another executable. pub fn with_executable(&self, executable: impl Into) -> Self { match self { - ExecutableTool::Isolated(tool) => ExecutableTool::Isolated(IsolatedTool::new( + Tool::Isolated(tool) => Tool::Isolated(IsolatedTool::new( executable, tool.prefix.clone(), tool.activation_scripts.clone(), )), - ExecutableTool::System(_) => ExecutableTool::System(SystemTool::new(executable)), + Tool::System(_) => Tool::System(SystemTool::new(executable)), } } /// Construct a new command that enables invocation of the tool. pub fn command(&self) -> std::process::Command { match self { - ExecutableTool::Isolated(tool) => { + Tool::Isolated(tool) => { let mut cmd = std::process::Command::new(&tool.command); cmd.envs(tool.activation_scripts.clone()); cmd } - ExecutableTool::System(tool) => std::process::Command::new(&tool.command), + Tool::System(tool) => std::process::Command::new(&tool.command), } } } diff --git a/crates/pixi_build_frontend/src/tool/spec.rs b/crates/pixi_build_frontend/src/tool/spec.rs index 1ab8f8156..f4dc22e24 100644 --- a/crates/pixi_build_frontend/src/tool/spec.rs +++ b/crates/pixi_build_frontend/src/tool/spec.rs @@ -1,6 +1,6 @@ use rattler_conda_types::{MatchSpec, NamedChannelOrUrl}; -use crate::{BackendOverride, InProcessBackend}; +use crate::BackendOverride; /// Describes the specification of the tool. This can be used to cache tool /// information. @@ -8,7 +8,6 @@ use crate::{BackendOverride, InProcessBackend}; pub enum ToolSpec { Isolated(IsolatedToolSpec), System(SystemToolSpec), - Io(InProcessBackend), } /// A build tool that can be installed through a conda package. @@ -72,7 +71,6 @@ impl BackendOverride { IsolatedToolSpec::from_specs(vec![spec], channels.into_iter().flatten()), ), BackendOverride::System(command) => ToolSpec::System(SystemToolSpec { command }), - BackendOverride::Io(process) => ToolSpec::Io(process), } } } diff --git a/crates/pixi_build_frontend/tests/diagnostics.rs b/crates/pixi_build_frontend/tests/diagnostics.rs index 1fe1b35c3..68f18f943 100644 --- a/crates/pixi_build_frontend/tests/diagnostics.rs +++ b/crates/pixi_build_frontend/tests/diagnostics.rs @@ -2,6 +2,7 @@ use std::path::Path; use miette::{Diagnostic, GraphicalReportHandler, GraphicalTheme}; use pixi_build_frontend::{BuildFrontend, InProcessBackend, SetupRequest}; +use pixi_manifest::toml::{ExternalWorkspaceProperties, TomlManifest}; fn error_to_snapshot(diag: &impl Diagnostic) -> String { let mut report_str = String::new(); @@ -114,24 +115,22 @@ async fn test_invalid_backend() { let manifest = source_dir .path() .join(pixi_consts::consts::PROJECT_MANIFEST); - tokio::fs::write( - &manifest, - r#" - [workspace] - platforms = [] - channels = [] - preview = ['pixi-build'] - [package] - version = "0.1.0" - name = "project" + let toml = r#" + [workspace] + platforms = [] + channels = [] + preview = ['pixi-build'] - [build-system] - build-backend = { name = "ipc", version = "*" } - "#, - ) - .await - .unwrap(); + [package] + version = "0.1.0" + name = "project" + + [build-system] + build-backend = { name = "ipc", version = "*" } + "#; + + tokio::fs::write(&manifest, toml).await.unwrap(); let (in_tx, in_rx) = tokio::io::duplex(1024); let (out_tx, _out_rx) = tokio::io::duplex(1024); @@ -144,14 +143,19 @@ async fn test_invalid_backend() { // connection. drop(in_tx); - let err = BuildFrontend::default() - .setup_protocol(SetupRequest { - source_dir: source_dir.path().to_path_buf(), - build_tool_override: ipc.into(), - build_id: 0, - }) - .await - .unwrap_err(); + let (workspace, package) = TomlManifest::from_toml_str(toml) + .unwrap() + .into_manifests(ExternalWorkspaceProperties::default()) + .unwrap(); + let protocol = pixi_build_frontend::pixi_protocol::ProtocolBuilder::new( + source_dir.path().to_path_buf(), + manifest.to_path_buf(), + workspace, + package.unwrap(), + ) + .unwrap(); + + let err = protocol.finish_with_ipc(ipc, 0).await.unwrap_err(); let snapshot = error_to_snapshot(&err); let snapshot = replace_source_dir(&snapshot, source_dir.path()); From 3589d78b0d719dfb6d646c7423794e0006e220d0 Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Tue, 3 Dec 2024 16:28:03 +0100 Subject: [PATCH 04/16] feat: use `fs-err` in more places (#2636) I've noticed that there are still many places where we don't use `fs-err` --- Cargo.lock | 6 ++++ clippy.toml | 21 ++++++++++++++ crates/pixi_build_frontend/Cargo.toml | 1 + .../builders/conda_build/protocol.rs | 2 +- crates/pixi_config/Cargo.toml | 1 + crates/pixi_config/src/lib.rs | 7 ++--- crates/pixi_glob/Cargo.toml | 1 + crates/pixi_glob/src/glob_set.rs | 8 ++--- crates/pixi_manifest/Cargo.toml | 1 + .../pixi_manifest/src/manifests/manifest.rs | 8 ++--- crates/pixi_manifest/src/pyproject.rs | 4 +-- crates/pixi_trampoline/Cargo.lock | 3 ++ crates/pixi_trampoline/Cargo.toml | 3 +- crates/pixi_trampoline/src/main.rs | 2 +- crates/pixi_utils/Cargo.toml | 1 + .../pixi_utils/src/conda_environment_file.rs | 8 ++--- crates/pixi_utils/src/prefix_guard.rs | 2 +- crates/pypi_mapping/Cargo.toml | 1 + .../pypi_mapping/src/custom_pypi_mapping.rs | 2 +- src/cli/build.rs | 2 +- src/cli/info.rs | 12 ++++---- src/cli/init.rs | 8 ++--- src/cli/list.rs | 2 +- src/cli/project/export/conda_explicit_spec.rs | 7 ++--- src/environment.rs | 16 +++++----- src/global/common.rs | 4 +-- src/global/install.rs | 9 +++--- src/global/project/manifest.rs | 3 +- src/install_pypi/install_wheel.rs | 6 ++-- .../resolve/uv_resolution_context.rs | 2 +- src/prefix.rs | 2 +- src/project/environment.rs | 9 +++--- src/project/mod.rs | 6 ++-- src/task/executable_task.rs | 3 +- src/task/file_hashes.rs | 2 +- src/utils.rs | 6 ++-- tests/integration_rust/common/mod.rs | 10 +++---- tests/integration_rust/init_tests.rs | 2 +- tests/integration_rust/install_tests.rs | 29 ++++++++++--------- tests/integration_rust/project_tests.rs | 12 ++++---- tests/integration_rust/solve_group_tests.rs | 2 +- tests/integration_rust/task_tests.rs | 3 +- 42 files changed, 136 insertions(+), 103 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f0d31549..dbc91130f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3582,6 +3582,7 @@ name = "pixi_build_frontend" version = "0.1.0" dependencies = [ "dashmap", + "fs-err 2.11.0", "futures", "insta", "itertools 0.13.0", @@ -3634,6 +3635,7 @@ dependencies = [ "clap", "console", "dirs", + "fs-err 2.11.0", "insta", "itertools 0.13.0", "miette 7.2.0", @@ -3673,6 +3675,7 @@ name = "pixi_glob" version = "0.1.0" dependencies = [ "dashmap", + "fs-err 2.11.0", "insta", "itertools 0.13.0", "memchr", @@ -3692,6 +3695,7 @@ dependencies = [ "console", "dunce", "fancy_display", + "fs-err 2.11.0", "glob", "indexmap 2.6.0", "insta", @@ -3780,6 +3784,7 @@ name = "pixi_utils" version = "0.1.0" dependencies = [ "fd-lock", + "fs-err 2.11.0", "indicatif", "insta", "itertools 0.13.0", @@ -4024,6 +4029,7 @@ name = "pypi_mapping" version = "0.1.0" dependencies = [ "async-once-cell", + "fs-err 2.11.0", "futures", "http-cache-reqwest", "itertools 0.13.0", diff --git a/clippy.toml b/clippy.toml index 8e85afba9..b91418829 100644 --- a/clippy.toml +++ b/clippy.toml @@ -5,3 +5,24 @@ ignore-interior-mutability = [ "pixi::project::environment::Environment", "pixi::project::solve_group::SolveGroup", ] + +disallowed-methods = [ + "std::fs::canonicalize", + "std::fs::copy", + "std::fs::create_dir", + "std::fs::create_dir_all", + "std::fs::hard_link", + "std::fs::metadata", + "std::fs::read", + "std::fs::read_dir", + "std::fs::read_link", + "std::fs::read_to_string", + "std::fs::remove_dir", + "std::fs::remove_dir_all", + "std::fs::remove_file", + "std::fs::rename", + "std::fs::set_permissions", + "std::fs::soft_link", + "std::fs::symlink_metadata", + "std::fs::write", +] diff --git a/crates/pixi_build_frontend/Cargo.toml b/crates/pixi_build_frontend/Cargo.toml index 976b86429..c154b48ea 100644 --- a/crates/pixi_build_frontend/Cargo.toml +++ b/crates/pixi_build_frontend/Cargo.toml @@ -11,6 +11,7 @@ version = "0.1.0" [dependencies] dashmap = { workspace = true } +fs-err = { workspace = true } futures = { workspace = true } itertools = { workspace = true } jsonrpsee = { workspace = true, features = ["client"] } diff --git a/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs b/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs index 7e5e7fc43..12693a96b 100644 --- a/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs +++ b/crates/pixi_build_frontend/src/protocols/builders/conda_build/protocol.rs @@ -253,7 +253,7 @@ mod test { #[case::pinject("conda-render/pinject.txt")] #[case::microarch("conda-render/microarch-level.txt")] fn test_extract_rendered_recipe(#[case] path: &str) { - let rendered_recipe = std::fs::read_to_string( + let rendered_recipe = fs_err::read_to_string( Path::new(env!("CARGO_MANIFEST_DIR")) .join("test-data") .join(path), diff --git a/crates/pixi_config/Cargo.toml b/crates/pixi_config/Cargo.toml index 47772f06a..c0b8881df 100644 --- a/crates/pixi_config/Cargo.toml +++ b/crates/pixi_config/Cargo.toml @@ -13,6 +13,7 @@ version = "0.1.0" clap = { workspace = true, features = ["std", "derive", "env"] } console = { workspace = true } dirs = { workspace = true } +fs-err = { workspace = true } itertools = { workspace = true } miette = { workspace = true } pixi_consts = { workspace = true } diff --git a/crates/pixi_config/src/lib.rs b/crates/pixi_config/src/lib.rs index b32971711..f077049f4 100644 --- a/crates/pixi_config/src/lib.rs +++ b/crates/pixi_config/src/lib.rs @@ -11,7 +11,6 @@ use reqwest_middleware::ClientWithMiddleware; use serde::{de::IntoDeserializer, Deserialize, Serialize}; use std::{ collections::{BTreeSet as Set, HashMap}, - fs, path::{Path, PathBuf}, process::{Command, Stdio}, str::FromStr, @@ -747,7 +746,7 @@ impl Config { /// I/O errors or parsing errors pub fn from_path(path: &Path) -> miette::Result { tracing::debug!("Loading config from {}", path.display()); - let s = fs::read_to_string(path) + let s = fs_err::read_to_string(path) .into_diagnostic() .wrap_err(format!("failed to read config from '{}'", path.display()))?; @@ -1201,13 +1200,13 @@ impl Config { tracing::debug!("Saving config to: {}", to.display()); let parent = to.parent().expect("config path should have a parent"); - fs::create_dir_all(parent) + fs_err::create_dir_all(parent) .into_diagnostic() .wrap_err(format!( "failed to create directories in '{}'", parent.display() ))?; - fs::write(to, contents) + fs_err::write(to, contents) .into_diagnostic() .wrap_err(format!("failed to write config to '{}'", to.display())) } diff --git a/crates/pixi_glob/Cargo.toml b/crates/pixi_glob/Cargo.toml index 5349323b8..ecc8766e2 100644 --- a/crates/pixi_glob/Cargo.toml +++ b/crates/pixi_glob/Cargo.toml @@ -11,6 +11,7 @@ version = "0.1.0" [dependencies] dashmap = { workspace = true } +fs-err = { workspace = true } itertools = { workspace = true } memchr = { workspace = true } rattler_digest = { workspace = true } diff --git a/crates/pixi_glob/src/glob_set.rs b/crates/pixi_glob/src/glob_set.rs index bba77bf6a..2d70e97ae 100644 --- a/crates/pixi_glob/src/glob_set.rs +++ b/crates/pixi_glob/src/glob_set.rs @@ -96,10 +96,8 @@ impl<'t> GlobSet<'t> { #[cfg(test)] mod tests { use super::GlobSet; - use std::{ - fs::{create_dir, File}, - path::PathBuf, - }; + use fs_err::File; + use std::path::PathBuf; use tempfile::tempdir; #[test] @@ -111,7 +109,7 @@ mod tests { File::create(root_path.join("include1.txt")).unwrap(); File::create(root_path.join("include2.log")).unwrap(); File::create(root_path.join("exclude.txt")).unwrap(); - create_dir(root_path.join("subdir")).unwrap(); + fs_err::create_dir(root_path.join("subdir")).unwrap(); File::create(root_path.join("subdir/include_subdir.txt")).unwrap(); // Test globs: include all .txt but exclude exclude.txt diff --git a/crates/pixi_manifest/Cargo.toml b/crates/pixi_manifest/Cargo.toml index a29ed8e3e..cc7841d86 100644 --- a/crates/pixi_manifest/Cargo.toml +++ b/crates/pixi_manifest/Cargo.toml @@ -11,6 +11,7 @@ version = "0.1.0" [dependencies] dunce = { workspace = true } fancy_display = { workspace = true } +fs-err = { workspace = true } indexmap = { workspace = true } itertools = { workspace = true } pep440_rs = { workspace = true } diff --git a/crates/pixi_manifest/src/manifests/manifest.rs b/crates/pixi_manifest/src/manifests/manifest.rs index 56e2d986f..1d4fa89dc 100644 --- a/crates/pixi_manifest/src/manifests/manifest.rs +++ b/crates/pixi_manifest/src/manifests/manifest.rs @@ -84,7 +84,7 @@ impl Manifest { /// Create a new manifest from a path pub fn from_path(path: impl AsRef) -> miette::Result { let manifest_path = dunce::canonicalize(path.as_ref()).into_diagnostic()?; - let contents = std::fs::read_to_string(path.as_ref()).into_diagnostic()?; + let contents = fs_err::read_to_string(path.as_ref()).into_diagnostic()?; Self::from_str(manifest_path.as_ref(), contents) } @@ -162,7 +162,7 @@ impl Manifest { /// Save the manifest to the file and update the contents pub fn save(&mut self) -> miette::Result<()> { let contents = self.document.to_string(); - std::fs::write(&self.path, &contents).into_diagnostic()?; + fs_err::write(&self.path, &contents).into_diagnostic()?; self.contents = Some(contents); Ok(()) } @@ -801,7 +801,7 @@ mod tests { // Test the toml from a path let dir = tempdir().unwrap(); let path = dir.path().join("pixi.toml"); - std::fs::write(&path, PROJECT_BOILERPLATE).unwrap(); + fs_err::write(&path, PROJECT_BOILERPLATE).unwrap(); // From &PathBuf let _manifest = Manifest::from_path(&path).unwrap(); // From &Path @@ -2321,7 +2321,7 @@ bar = "*" for entry in glob(location).unwrap() { match entry { Ok(path) => { - let contents = std::fs::read_to_string(path).unwrap(); + let contents = fs_err::read_to_string(path).unwrap(); let _manifest = Manifest::from_str(Path::new("pixi.toml"), contents).unwrap(); } Err(e) => println!("{:?}", e), diff --git a/crates/pixi_manifest/src/pyproject.rs b/crates/pixi_manifest/src/pyproject.rs index ccb491cb2..3388a5370 100644 --- a/crates/pixi_manifest/src/pyproject.rs +++ b/crates/pixi_manifest/src/pyproject.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, fs, path::PathBuf, str::FromStr}; +use std::{collections::HashMap, path::PathBuf, str::FromStr}; use indexmap::IndexMap; use miette::{Diagnostic, IntoDiagnostic, Report, WrapErr}; @@ -58,7 +58,7 @@ impl PyProjectManifest { /// Parses a `pyproject.toml` file into a PyProjectManifest pub fn from_path(path: &PathBuf) -> Result { - let source = fs::read_to_string(path) + let source = fs_err::read_to_string(path) .into_diagnostic() .wrap_err_with(|| format!("Failed to read file: {:?}", path))?; Self::from_toml_str(&source).into_diagnostic() diff --git a/crates/pixi_trampoline/Cargo.lock b/crates/pixi_trampoline/Cargo.lock index f391a0d6d..0315f8119 100644 --- a/crates/pixi_trampoline/Cargo.lock +++ b/crates/pixi_trampoline/Cargo.lock @@ -2303,6 +2303,7 @@ dependencies = [ "clap", "console", "dirs", + "fs-err 2.11.0", "itertools 0.13.0", "miette", "pixi_consts", @@ -2333,6 +2334,7 @@ name = "pixi_trampoline" version = "0.1.0" dependencies = [ "ctrlc", + "fs-err 3.0.0", "miette", "pixi_utils", "serde", @@ -2344,6 +2346,7 @@ name = "pixi_utils" version = "0.1.0" dependencies = [ "fd-lock", + "fs-err 2.11.0", "indicatif", "itertools 0.13.0", "miette", diff --git a/crates/pixi_trampoline/Cargo.toml b/crates/pixi_trampoline/Cargo.toml index f45311e3f..860bc3dcd 100644 --- a/crates/pixi_trampoline/Cargo.toml +++ b/crates/pixi_trampoline/Cargo.toml @@ -25,7 +25,8 @@ strip = true [dependencies] ctrlc = "3.4" -miette = "7.2.0" +fs-err = "3.0.0" +miette = "7.4.0" pixi_utils = { path = "../pixi_utils" } serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" diff --git a/crates/pixi_trampoline/src/main.rs b/crates/pixi_trampoline/src/main.rs index 1bab2f9ac..8b2d13323 100644 --- a/crates/pixi_trampoline/src/main.rs +++ b/crates/pixi_trampoline/src/main.rs @@ -1,9 +1,9 @@ +use fs_err::File; use miette::{Context, IntoDiagnostic}; use pixi_utils::executable_from_path; use serde::Deserialize; use std::collections::HashMap; use std::env; -use std::fs::File; use std::ops::Not; #[cfg(target_family = "unix")] use std::os::unix::process::CommandExt; diff --git a/crates/pixi_utils/Cargo.toml b/crates/pixi_utils/Cargo.toml index 774dfed8f..308f6a02d 100644 --- a/crates/pixi_utils/Cargo.toml +++ b/crates/pixi_utils/Cargo.toml @@ -25,6 +25,7 @@ rustls-tls = [ [dependencies] fd-lock = { workspace = true } +fs-err = { workspace = true } indicatif = { workspace = true } itertools = { workspace = true } miette = { workspace = true } diff --git a/crates/pixi_utils/src/conda_environment_file.rs b/crates/pixi_utils/src/conda_environment_file.rs index 4e70d03df..807491a28 100644 --- a/crates/pixi_utils/src/conda_environment_file.rs +++ b/crates/pixi_utils/src/conda_environment_file.rs @@ -85,7 +85,7 @@ impl CondaEnvFile { } pub fn from_path(path: &Path) -> miette::Result { - let file = std::fs::File::open(path).into_diagnostic()?; + let file = fs_err::File::open(path).into_diagnostic()?; let reader = std::io::BufReader::new(file); let lines = reader @@ -187,7 +187,7 @@ fn parse_channels(channels: Vec) -> Vec { #[cfg(test)] mod tests { - use std::{fs, io::Write, path::Path, str::FromStr}; + use std::{io::Write, path::Path, str::FromStr}; use rattler_conda_types::{MatchSpec, ParseStrictness::Strict}; @@ -271,7 +271,7 @@ mod tests { .join("tests") .join("environment_yamls"); - let entries = match fs::read_dir(test_files_path) { + let entries = match fs_err::read_dir(test_files_path) { Ok(entries) => entries, Err(e) => panic!("Failed to read directory: {}", e), }; @@ -317,7 +317,7 @@ mod tests { let f = tempfile::NamedTempFile::new().unwrap(); let path = f.path(); - let mut file = std::fs::File::create(path).unwrap(); + let mut file = fs_err::File::create(path).unwrap(); file.write_all(example_conda_env_file.as_bytes()).unwrap(); let conda_env_file_data = CondaEnvFile::from_path(path).unwrap(); diff --git a/crates/pixi_utils/src/prefix_guard.rs b/crates/pixi_utils/src/prefix_guard.rs index 400c769b9..9ca68ead6 100644 --- a/crates/pixi_utils/src/prefix_guard.rs +++ b/crates/pixi_utils/src/prefix_guard.rs @@ -81,7 +81,7 @@ impl PrefixGuard { let guard_path = prefix.join(GUARD_PATH); // Ensure that the directory exists - std::fs::create_dir_all(guard_path.parent().unwrap())?; + fs_err::create_dir_all(guard_path.parent().unwrap())?; // Open the file Ok(Self { diff --git a/crates/pypi_mapping/Cargo.toml b/crates/pypi_mapping/Cargo.toml index 2800b5dc8..b2bc69e14 100644 --- a/crates/pypi_mapping/Cargo.toml +++ b/crates/pypi_mapping/Cargo.toml @@ -11,6 +11,7 @@ version = "0.1.0" [dependencies] async-once-cell = { workspace = true } +fs-err = { workspace = true } futures = { workspace = true } http-cache-reqwest = { workspace = true } itertools = { workspace = true } diff --git a/crates/pypi_mapping/src/custom_pypi_mapping.rs b/crates/pypi_mapping/src/custom_pypi_mapping.rs index 522ce87ea..bed1531c3 100644 --- a/crates/pypi_mapping/src/custom_pypi_mapping.rs +++ b/crates/pypi_mapping/src/custom_pypi_mapping.rs @@ -46,7 +46,7 @@ pub async fn fetch_mapping_from_url( } pub fn fetch_mapping_from_path(path: &Path) -> miette::Result { - let file = std::fs::File::open(path) + let file = fs_err::File::open(path) .into_diagnostic() .context(format!("failed to open file {}", path.display()))?; let reader = std::io::BufReader::new(file); diff --git a/src/cli/build.rs b/src/cli/build.rs index 461f89696..ea3cbd567 100644 --- a/src/cli/build.rs +++ b/src/cli/build.rs @@ -174,7 +174,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { // Move the built packages to the output directory. let output_dir = args.output_dir; for package in result.packages { - std::fs::create_dir_all(&output_dir) + fs_err::create_dir_all(&output_dir) .into_diagnostic() .with_context(|| { format!( diff --git a/src/cli/info.rs b/src/cli/info.rs index a39c7b350..82b905f00 100644 --- a/src/cli/info.rs +++ b/src/cli/info.rs @@ -1,4 +1,4 @@ -use std::{fmt::Display, fs, path::PathBuf}; +use std::{fmt::Display, path::PathBuf}; use chrono::{DateTime, Local}; use clap::Parser; @@ -316,24 +316,26 @@ impl Display for Info { /// Returns the size of a directory fn dir_size(path: impl Into) -> miette::Result { - fn dir_size(mut dir: fs::ReadDir) -> miette::Result { + fn dir_size(mut dir: fs_err::ReadDir) -> miette::Result { dir.try_fold(0, |acc, file| { let file = file.into_diagnostic()?; let size = match file.metadata().into_diagnostic()? { - data if data.is_dir() => dir_size(fs::read_dir(file.path()).into_diagnostic()?)?, + data if data.is_dir() => { + dir_size(fs_err::read_dir(file.path()).into_diagnostic()?)? + } data => data.len(), }; Ok(acc + size) }) } - let size = dir_size(fs::read_dir(path.into()).into_diagnostic()?)?; + let size = dir_size(fs_err::read_dir(path.into()).into_diagnostic()?)?; Ok(format!("{} MiB", size / 1024 / 1024)) } /// Returns last update time of file, formatted: DD-MM-YYYY H:M:S fn last_updated(path: impl Into) -> miette::Result { - let time = fs::metadata(path.into()) + let time = fs_err::metadata(path.into()) .into_diagnostic()? .modified() .into_diagnostic()?; diff --git a/src/cli/init.rs b/src/cli/init.rs index d7a948968..900bafb93 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -199,7 +199,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { } // Fail silently if the directory already exists or cannot be created. - fs::create_dir_all(&dir).ok(); + fs_err::create_dir_all(&dir).ok(); let default_name = get_name_from_dir(&dir).unwrap_or_else(|_| String::from("new_project")); let version = "0.1.0"; @@ -484,7 +484,7 @@ fn render_project( /// Save the rendered template to a file, and print a message to the user. fn save_manifest_file(path: &Path, content: String) -> miette::Result<()> { - fs::write(path, content).into_diagnostic()?; + fs_err::write(path, content).into_diagnostic()?; eprintln!( "{}Created {}", console::style(console::Emoji("✔ ", "")).green(), @@ -510,7 +510,7 @@ fn get_name_from_dir(path: &Path) -> miette::Result { // When the specific template is not in the file or the file does not exist. // Make the file and append the template to the file. fn create_or_append_file(path: &Path, template: &str) -> std::io::Result<()> { - let file = fs::read_to_string(path).unwrap_or_default(); + let file = fs_err::read_to_string(path).unwrap_or_default(); if !file.contains(template) { fs::OpenOptions::new() @@ -585,7 +585,7 @@ mod tests { let template = "Test Template"; fn read_file_content(path: &Path) -> String { - let mut file = std::fs::File::open(path).unwrap(); + let mut file = fs_err::File::open(path).unwrap(); let mut content = String::new(); file.read_to_string(&mut content).unwrap(); content diff --git a/src/cli/list.rs b/src/cli/list.rs index fc9817975..bd660fe80 100644 --- a/src/cli/list.rs +++ b/src/cli/list.rs @@ -96,7 +96,7 @@ where let mut result = 0; if path.as_ref().is_dir() { - for entry in std::fs::read_dir(&path)? { + for entry in fs_err::read_dir(path.as_ref())? { let _path = entry?.path(); if _path.is_file() { result += _path.metadata()?.len(); diff --git a/src/cli/project/export/conda_explicit_spec.rs b/src/cli/project/export/conda_explicit_spec.rs index fdbea28fc..87954ff41 100644 --- a/src/cli/project/export/conda_explicit_spec.rs +++ b/src/cli/project/export/conda_explicit_spec.rs @@ -1,6 +1,5 @@ use std::{ collections::HashSet, - fs, path::{Path, PathBuf}, }; @@ -87,7 +86,7 @@ fn render_explicit_spec( environment.push_str("# Generated by `pixi project export`\n"); environment.push_str(exp_env_spec.to_spec_string().as_str()); - fs::write(target, environment) + fs_err::write(target, environment) .into_diagnostic() .with_context(|| format!("failed to write environment file: {}", target.display()))?; @@ -212,7 +211,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { } } - fs::create_dir_all(&args.output_dir).ok(); + fs_err::create_dir_all(&args.output_dir).ok(); for (env_name, env, plat) in env_platform { render_env_platform( @@ -259,7 +258,7 @@ mod tests { .join(format!("{}_{}_conda_spec.txt", env_name, platform)); insta::assert_snapshot!( format!("test_render_conda_explicit_spec_{}_{}", env_name, platform), - fs::read_to_string(file_path).unwrap() + fs_err::read_to_string(file_path).unwrap() ); } } diff --git a/src/environment.rs b/src/environment.rs index f508570fd..9eee95d4e 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -61,7 +61,7 @@ pub async fn verify_prefix_location_unchanged(environment_dir: &Path) -> miette: prefix_file.display() ); - match std::fs::read_to_string(prefix_file.clone()) { + match fs_err::read_to_string(prefix_file.clone()) { // Not found is fine as it can be new or backwards compatible. Err(e) if e.kind() == ErrorKind::NotFound => Ok(()), // Scream the error if we don't know it. @@ -146,7 +146,7 @@ fn create_prefix_location_file(environment_dir: &Path) -> miette::Result<()> { // Read existing contents to determine if an update is necessary if prefix_file_path.exists() { - let existing_contents = fs::read_to_string(&prefix_file_path).into_diagnostic()?; + let existing_contents = fs_err::read_to_string(&prefix_file_path).into_diagnostic()?; if existing_contents == contents { tracing::info!("No update needed for the prefix file."); return Ok(()); @@ -240,11 +240,11 @@ pub(crate) fn write_environment_file( .parent() .expect("There should already be a conda-meta folder"); - match std::fs::create_dir_all(parent).into_diagnostic() { + match fs_err::create_dir_all(parent).into_diagnostic() { Ok(_) => { // Using json as it's easier to machine read it. let contents = serde_json::to_string_pretty(&env_file).into_diagnostic()?; - match std::fs::write(&path, contents).into_diagnostic() { + match fs_err::write(&path, contents).into_diagnostic() { Ok(_) => { tracing::debug!("Wrote environment file to: {:?}", path); } @@ -270,7 +270,7 @@ pub(crate) fn read_environment_file( ) -> miette::Result> { let path = environment_file_path(environment_dir); - let contents = match std::fs::read_to_string(&path) { + let contents = match fs_err::read_to_string(&path) { Ok(contents) => contents, Err(e) if e.kind() == ErrorKind::NotFound => { tracing::debug!("Environment file not yet found at: {:?}", path); @@ -282,7 +282,7 @@ pub(crate) fn read_environment_file( path, e ); - let _ = std::fs::remove_file(&path); + let _ = fs_err::remove_file(&path); return Err(e).into_diagnostic(); } }; @@ -294,7 +294,7 @@ pub(crate) fn read_environment_file( path, e ); - let _ = std::fs::remove_file(&path); + let _ = fs_err::remove_file(&path); return Ok(None); } }; @@ -526,7 +526,7 @@ pub async fn update_prefix_pypi( async fn uninstall_outdated_site_packages(site_packages: &Path) -> miette::Result<()> { // Check if the old interpreter is outdated let mut installed = vec![]; - for entry in std::fs::read_dir(site_packages).into_diagnostic()? { + for entry in fs_err::read_dir(site_packages).into_diagnostic()? { let entry = entry.into_diagnostic()?; if entry.file_type().into_diagnostic()?.is_dir() { let path = entry.path(); diff --git a/src/global/common.rs b/src/global/common.rs index d04d08fc2..4cf6d4e3f 100644 --- a/src/global/common.rs +++ b/src/global/common.rs @@ -39,7 +39,7 @@ impl BinDir { #[cfg(test)] pub fn new(root: PathBuf) -> miette::Result { let path = root.join("bin"); - std::fs::create_dir_all(&path).into_diagnostic()?; + fs_err::create_dir_all(&path).into_diagnostic()?; Ok(Self(path)) } @@ -107,7 +107,7 @@ impl EnvRoot { #[cfg(test)] pub fn new(root: PathBuf) -> miette::Result { let path = root.join("envs"); - std::fs::create_dir_all(&path).into_diagnostic()?; + fs_err::create_dir_all(&path).into_diagnostic()?; Ok(Self(path)) } diff --git a/src/global/install.rs b/src/global/install.rs index d8897dc1d..d9b00ee85 100644 --- a/src/global/install.rs +++ b/src/global/install.rs @@ -472,7 +472,6 @@ mod tests { #[tokio::test] async fn test_extract_executable_from_script_windows() { use crate::global::trampoline::GlobalExecutable; - use std::fs; use std::path::Path; let script_without_quote = r#" @SET "PATH=C:\Users\USER\.pixi/envs\hyperfine\bin:%PATH%" @@ -482,7 +481,7 @@ mod tests { let script_path = Path::new("hyperfine.bat"); let tempdir = tempfile::tempdir().unwrap(); let script_path = tempdir.path().join(script_path); - fs::write(&script_path, script_without_quote).unwrap(); + fs_err::write(&script_path, script_without_quote).unwrap(); let script_global_bin = GlobalExecutable::Script(script_path); let executable_path = script_global_bin.executable().await.unwrap(); assert_eq!( @@ -497,7 +496,7 @@ mod tests { "#; let script_path = Path::new("pydoc.bat"); let script_path = tempdir.path().join(script_path); - fs::write(&script_path, script_with_quote).unwrap(); + fs_err::write(&script_path, script_with_quote).unwrap(); let executable_path = script_global_bin.executable().await.unwrap(); assert_eq!( executable_path, @@ -508,7 +507,7 @@ mod tests { #[cfg(unix)] #[tokio::test] async fn test_extract_executable_from_script_unix() { - use std::{fs, path::Path}; + use std::path::Path; use crate::global::trampoline::GlobalExecutable; @@ -520,7 +519,7 @@ export CONDA_PREFIX="/home/user/.pixi/envs/nushell" let script_path = Path::new("nu"); let tempdir = tempfile::tempdir().unwrap(); let script_path = tempdir.path().join(script_path); - fs::write(&script_path, script).unwrap(); + fs_err::write(&script_path, script).unwrap(); let script_global_bin = GlobalExecutable::Script(script_path); let executable_path = script_global_bin.executable().await.unwrap(); assert_eq!( diff --git a/src/global/project/manifest.rs b/src/global/project/manifest.rs index 5974b0c64..fb2b55adf 100644 --- a/src/global/project/manifest.rs +++ b/src/global/project/manifest.rs @@ -3,7 +3,6 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; use fancy_display::FancyDisplay; -use fs_err as fs; use fs_err::tokio as tokio_fs; use indexmap::IndexSet; use miette::IntoDiagnostic; @@ -41,7 +40,7 @@ impl Manifest { /// Creates a new manifest from a path pub fn from_path(path: impl AsRef) -> miette::Result { let manifest_path = dunce::canonicalize(path.as_ref()).into_diagnostic()?; - let contents = fs::read_to_string(path.as_ref()).into_diagnostic()?; + let contents = fs_err::read_to_string(path.as_ref()).into_diagnostic()?; Self::from_str(manifest_path.as_ref(), contents) } diff --git a/src/install_pypi/install_wheel.rs b/src/install_pypi/install_wheel.rs index 66fb7b414..f19400398 100644 --- a/src/install_pypi/install_wheel.rs +++ b/src/install_pypi/install_wheel.rs @@ -37,7 +37,7 @@ pub(crate) fn get_wheel_info( /// See: fn find_dist_info(path: impl AsRef) -> miette::Result { // Iterate over `path` to find the `.dist-info` directory. It should be at the top-level. - let Some(dist_info) = fs::read_dir(path.as_ref()) + let Some(dist_info) = fs_err::read_dir(path.as_ref()) .into_diagnostic()? .find_map(|entry| { let entry = entry.ok()?; @@ -92,14 +92,14 @@ pub(crate) fn get_wheel_kind( // > 1.a Parse distribution-1.0.dist-info/WHEEL. // > 1.b Check that installer is compatible with Wheel-Version. Warn if minor version is greater, abort if major version is greater. let wheel_file_path = wheel_path.join(format!("{dist_info_prefix}.dist-info/WHEEL")); - let wheel_text = fs::read_to_string(wheel_file_path).into_diagnostic()?; + let wheel_text = fs_err::read_to_string(wheel_file_path).into_diagnostic()?; let lib_kind = parse_wheel_file(&wheel_text)?; Ok(lib_kind) } use std::{ collections::HashMap, - fs::{self, File}, + fs::File, io::{BufRead, BufReader, Read}, path::{Path, PathBuf}, }; diff --git a/src/lock_file/resolve/uv_resolution_context.rs b/src/lock_file/resolve/uv_resolution_context.rs index 0b0d8c59f..7155ae19c 100644 --- a/src/lock_file/resolve/uv_resolution_context.rs +++ b/src/lock_file/resolve/uv_resolution_context.rs @@ -30,7 +30,7 @@ impl UvResolutionContext { pub(crate) fn from_project(project: &Project) -> miette::Result { let uv_cache = get_cache_dir()?.join(consts::PYPI_CACHE_DIR); if !uv_cache.exists() { - std::fs::create_dir_all(&uv_cache) + fs_err::create_dir_all(&uv_cache) .into_diagnostic() .context("failed to create uv cache directory")?; } diff --git a/src/prefix.rs b/src/prefix.rs index e17d93d2c..db1d549e0 100644 --- a/src/prefix.rs +++ b/src/prefix.rs @@ -56,7 +56,7 @@ impl Prefix { let concurrency_limit = concurrency_limit.unwrap_or(100); let mut meta_futures = FuturesUnordered::>>::new(); let mut result = Vec::new(); - for entry in std::fs::read_dir(self.root.join("conda-meta")) + for entry in fs_err::read_dir(self.root.join("conda-meta")) .into_iter() .flatten() { diff --git a/src/project/environment.rs b/src/project/environment.rs index 2ff1e2425..3b78db4f2 100644 --- a/src/project/environment.rs +++ b/src/project/environment.rs @@ -1,7 +1,6 @@ use std::{ collections::{HashMap, HashSet}, fmt::Debug, - fs, hash::{Hash, Hasher}, sync::Once, }; @@ -133,8 +132,8 @@ impl<'p> Environment<'p> { "osx-arm64 (Apple Silicon) is not supported by the pixi.toml, falling back to osx-64 (emulated with Rosetta)" ); // Create a file to prevent the warning from showing up multiple times. Also ignore the result. - fs::create_dir_all(warn_folder).and_then(|_| { - std::fs::File::create(emulation_warn) + fs_err::create_dir_all(warn_folder).and_then(|_| { + fs_err::File::create(emulation_warn) }).ok(); } }); @@ -152,8 +151,8 @@ impl<'p> Environment<'p> { "win-arm64 is not supported by the pixi.toml, falling back to win-64 (emulation)" ); // Create a file to prevent the warning from showing up multiple times. Also ignore the result. - fs::create_dir_all(warn_folder).and_then(|_| { - std::fs::File::create(emulation_warn) + fs_err::create_dir_all(warn_folder).and_then(|_| { + fs_err::File::create(emulation_warn) }).ok(); } }); diff --git a/src/project/mod.rs b/src/project/mod.rs index f1e2f0df7..a27ef18c0 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -1043,7 +1043,7 @@ pub(crate) fn find_project_manifest(current_dir: PathBuf) -> Option { match *manifest { consts::PROJECT_MANIFEST => return Some(path), consts::PYPROJECT_MANIFEST => { - if let Ok(content) = std::fs::read_to_string(&path) { + if let Ok(content) = fs_err::read_to_string(&path) { if content.contains("[tool.pixi") { return Some(path); } @@ -1523,13 +1523,13 @@ mod tests { writeln!(file, "[project]").unwrap(); // Pixi child manifest is pyproject.toml with pixi tool - std::fs::create_dir_all(&pixi_child_dir).unwrap(); + fs_err::create_dir_all(&pixi_child_dir).unwrap(); let mut file = File::create(&manifest_path_pixi_child).unwrap(); writeln!(file, "[project]").unwrap(); writeln!(file, "[tool.pixi.project]").unwrap(); // Non pixi child manifest is pyproject.toml without pixi tool - std::fs::create_dir_all(&non_pixi_child_dir).unwrap(); + fs_err::create_dir_all(&non_pixi_child_dir).unwrap(); let mut file = File::create(&manifest_path_non_pixi_child).unwrap(); writeln!(file, "[project]").unwrap(); diff --git a/src/task/executable_task.rs b/src/task/executable_task.rs index e28001bf8..bde9a100f 100644 --- a/src/task/executable_task.rs +++ b/src/task/executable_task.rs @@ -21,6 +21,7 @@ use crate::{ task::task_graph::{TaskGraph, TaskId}, Project, }; +use fs_err::tokio as tokio_fs; use pixi_consts::consts; use crate::activation::CurrentEnvVarBehavior; @@ -252,7 +253,7 @@ impl<'p> ExecutableTask<'p> { let cache_name = self.cache_name(); let cache_file = self.project().task_cache_folder().join(cache_name); if cache_file.exists() { - let cache = tokio::fs::read_to_string(&cache_file).await?; + let cache = tokio_fs::read_to_string(&cache_file).await?; let cache: TaskCache = serde_json::from_str(&cache)?; let hash = TaskHash::from_task(self, lock_file).await; if let Ok(Some(hash)) = hash { diff --git a/src/task/file_hashes.rs b/src/task/file_hashes.rs index 0fb2fbbac..b31782943 100644 --- a/src/task/file_hashes.rs +++ b/src/task/file_hashes.rs @@ -177,7 +177,7 @@ fn compute_file_hash(path: &Path) -> Result { mod test { use super::*; use assert_matches::assert_matches; - use std::fs::{create_dir, write}; + use fs_err::{create_dir, write}; use tempfile::tempdir; #[tokio::test] diff --git a/src/utils.rs b/src/utils.rs index 0c076e29e..bfaa2397c 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -24,10 +24,10 @@ const EXDEV: i32 = 17; /// the file if possible and otherwise copying the file and removing the /// original. pub(crate) fn move_file(from: &Path, to: &Path) -> Result<(), MoveError> { - if let Err(e) = std::fs::rename(from, to) { + if let Err(e) = fs_err::rename(from, to) { if e.raw_os_error() == Some(EXDEV) { - std::fs::copy(from, to).map_err(MoveError::CopyFailed)?; - std::fs::remove_file(from).map_err(MoveError::FailedToRemove)? + fs_err::copy(from, to).map_err(MoveError::CopyFailed)?; + fs_err::remove_file(from).map_err(MoveError::FailedToRemove)? } else { return Err(MoveError::MoveFailed(e)); } diff --git a/tests/integration_rust/common/mod.rs b/tests/integration_rust/common/mod.rs index 1973947ad..55df5e3e6 100644 --- a/tests/integration_rust/common/mod.rs +++ b/tests/integration_rust/common/mod.rs @@ -217,8 +217,8 @@ impl PixiControl { // Add default project config let pixi_path = tempdir.path().join(".pixi"); - std::fs::create_dir_all(&pixi_path).unwrap(); - std::fs::write(pixi_path.join("config.toml"), DEFAULT_PROJECT_CONFIG).unwrap(); + fs_err::create_dir_all(&pixi_path).unwrap(); + fs_err::write(pixi_path.join("config.toml"), DEFAULT_PROJECT_CONFIG).unwrap(); // Hide the progress bars for the tests // Otherwise the override the test output @@ -229,7 +229,7 @@ impl PixiControl { /// Creates a new PixiControl instance from an existing manifest pub fn from_manifest(manifest: &str) -> miette::Result { let pixi = Self::new()?; - std::fs::write(pixi.manifest_path(), manifest) + fs_err::write(pixi.manifest_path(), manifest) .into_diagnostic() .context("failed to write pixi.toml")?; Ok(pixi) @@ -237,7 +237,7 @@ impl PixiControl { /// Updates the complete manifest pub fn update_manifest(&self, manifest: &str) -> miette::Result<()> { - std::fs::write(self.manifest_path(), manifest) + fs_err::write(self.manifest_path(), manifest) .into_diagnostic() .context("failed to write pixi.toml")?; Ok(()) @@ -278,7 +278,7 @@ impl PixiControl { /// Get the manifest contents pub fn manifest_contents(&self) -> miette::Result { - std::fs::read_to_string(self.manifest_path()) + fs_err::read_to_string(self.manifest_path()) .into_diagnostic() .context("failed to read manifest") } diff --git a/tests/integration_rust/init_tests.rs b/tests/integration_rust/init_tests.rs index 235e5330f..e43ed34f9 100644 --- a/tests/integration_rust/init_tests.rs +++ b/tests/integration_rust/init_tests.rs @@ -64,7 +64,7 @@ async fn init_from_existing_pyproject_toml() { let project_path = pixi.project_path(); let pyproject_toml = project_path.join("pyproject.toml"); let pyproject_toml_contents = include_str!("../data/pixi_tomls/pyproject_no_pixi.toml"); - std::fs::write(&pyproject_toml, pyproject_toml_contents).unwrap(); + fs_err::write(&pyproject_toml, pyproject_toml_contents).unwrap(); // Init a new project pixi.init() diff --git a/tests/integration_rust/install_tests.rs b/tests/integration_rust/install_tests.rs index b70f767fd..f11ac9567 100644 --- a/tests/integration_rust/install_tests.rs +++ b/tests/integration_rust/install_tests.rs @@ -3,6 +3,7 @@ use crate::common::{ package_database::{Package, PackageDatabase}, }; use crate::common::{LockFileExt, PixiControl}; +use fs_err::tokio as tokio_fs; use pixi::cli::cli_config::{PrefixUpdateConfig, ProjectConfig}; use pixi::cli::{run, run::Args, LockFileUsageArgs}; use pixi::environment::LockFileUsage; @@ -13,7 +14,7 @@ use pixi_consts::consts; use pixi_manifest::{FeatureName, FeaturesExt}; use rattler_conda_types::Platform; use std::{ - fs::{create_dir_all, File}, + fs::File, io::Write, path::{Path, PathBuf}, str::FromStr, @@ -159,10 +160,10 @@ async fn install_locked_with_config() { let mut config = Config::default(); let target_dir = pixi.project_path().join("target"); config.detached_environments = Some(DetachedEnvironments::Path(target_dir.clone())); - create_dir_all(target_dir.clone()).unwrap(); + fs_err::create_dir_all(target_dir.clone()).unwrap(); let config_path = pixi.project().unwrap().pixi_dir().join("config.toml"); - create_dir_all(config_path.parent().unwrap()).unwrap(); + fs_err::create_dir_all(config_path.parent().unwrap()).unwrap(); let mut file = File::create(config_path).unwrap(); file.write_all(toml_edit::ser::to_string(&config).unwrap().as_bytes()) @@ -527,12 +528,12 @@ async fn test_installer_name() { // Check that installer name is uv-pixi assert!(dist_info.exists(), "{dist_info:?} does not exist"); let installer = dist_info.join("INSTALLER"); - let installer = std::fs::read_to_string(installer).unwrap(); + let installer = fs_err::read_to_string(installer).unwrap(); assert_eq!(installer, consts::PIXI_UV_INSTALLER); // Write a new installer name to the INSTALLER file // so that we fake that it is not installed by pixi - std::fs::write(dist_info.join("INSTALLER"), "not-pixi").unwrap(); + fs_err::write(dist_info.join("INSTALLER"), "not-pixi").unwrap(); pixi.remove("click==8.0.0") .with_install(true) .set_type(pixi::DependencyType::PypiDependency) @@ -544,7 +545,7 @@ async fn test_installer_name() { // we know that pixi did not touch the package assert!(dist_info.exists()); let installer = dist_info.join("INSTALLER"); - let installer = std::fs::read_to_string(installer).unwrap(); + let installer = fs_err::read_to_string(installer).unwrap(); assert_eq!(installer, "not-pixi"); // re-manage the package by adding it, this should cause a reinstall @@ -554,7 +555,7 @@ async fn test_installer_name() { .await .unwrap(); let installer = dist_info.join("INSTALLER"); - let installer = std::fs::read_to_string(installer).unwrap(); + let installer = fs_err::read_to_string(installer).unwrap(); assert_eq!(installer, consts::PIXI_UV_INSTALLER); } @@ -565,7 +566,7 @@ async fn test_installer_name() { /// installed. async fn test_old_lock_install() { let lock_str = - std::fs::read_to_string("tests/data/satisfiability/old_lock_file/pixi.lock").unwrap(); + fs_err::read_to_string("tests/data/satisfiability/old_lock_file/pixi.lock").unwrap(); let project = Project::from_path(Path::new( "tests/data/satisfiability/old_lock_file/pyproject.toml", )) @@ -583,7 +584,7 @@ async fn test_old_lock_install() { .unwrap(); assert_eq!( lock_str, - std::fs::read_to_string("tests/data/satisfiability/old_lock_file/pixi.lock").unwrap() + fs_err::read_to_string("tests/data/satisfiability/old_lock_file/pixi.lock").unwrap() ); } @@ -645,8 +646,8 @@ setup( let project_path = pixi.project_path(); // Write setup.py to a my-pkg folder let my_pkg = project_path.join("my-pkg"); - std::fs::create_dir_all(&my_pkg).unwrap(); - std::fs::write(my_pkg.join("setup.py"), setup_py).unwrap(); + fs_err::create_dir_all(&my_pkg).unwrap(); + fs_err::write(my_pkg.join("setup.py"), setup_py).unwrap(); let has_pkg = pixi .project() @@ -726,7 +727,7 @@ async fn test_ensure_gitignore_file_creation() { gitignore_path.exists(), ".pixi/.gitignore file was not created" ); - let contents = tokio::fs::read_to_string(&gitignore_path).await.unwrap(); + let contents = tokio_fs::read_to_string(&gitignore_path).await.unwrap(); assert_eq!( contents, "*\n", ".pixi/.gitignore file does not contain the expected content" @@ -737,7 +738,7 @@ async fn test_ensure_gitignore_file_creation() { .await .unwrap(); pixi.install().await.unwrap(); - let contents = tokio::fs::read_to_string(&gitignore_path).await.unwrap(); + let contents = tokio_fs::read_to_string(&gitignore_path).await.unwrap(); assert_eq!( contents, "*\nsome_file\n", ".pixi/.gitignore file does not contain the expected content" @@ -754,7 +755,7 @@ async fn test_ensure_gitignore_file_creation() { gitignore_path.exists(), ".pixi/.gitignore file was not recreated" ); - let contents = tokio::fs::read_to_string(&gitignore_path).await.unwrap(); + let contents = tokio_fs::read_to_string(&gitignore_path).await.unwrap(); assert_eq!( contents, "*\n", ".pixi/.gitignore file does not contain the expected content" diff --git a/tests/integration_rust/project_tests.rs b/tests/integration_rust/project_tests.rs index 6da6e6173..856d2d343 100644 --- a/tests/integration_rust/project_tests.rs +++ b/tests/integration_rust/project_tests.rs @@ -104,11 +104,11 @@ async fn parse_project() { async fn parse_valid_schema_projects() { // Test all files in the schema/examples/valid directory let schema_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("schema/examples/valid"); - for entry in std::fs::read_dir(schema_dir).unwrap() { + for entry in fs_err::read_dir(schema_dir).unwrap() { let entry = entry.unwrap(); let path = entry.path(); if path.extension().map(|ext| ext == "toml").unwrap_or(false) { - let pixi_toml = std::fs::read_to_string(&path).unwrap(); + let pixi_toml = fs_err::read_to_string(&path).unwrap(); let _project = Project::from_str(&PathBuf::from("pixi.toml"), &pixi_toml).unwrap(); } } @@ -118,11 +118,11 @@ async fn parse_valid_schema_projects() { fn parse_valid_docs_manifests() { // Test all files in the docs/source_files/pixi_tomls directory let schema_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("docs/source_files/pixi_tomls"); - for entry in std::fs::read_dir(schema_dir).unwrap() { + for entry in fs_err::read_dir(schema_dir).unwrap() { let entry = entry.unwrap(); let path = entry.path(); if path.extension().map(|ext| ext == "toml").unwrap_or(false) { - let pixi_toml = std::fs::read_to_string(&path).unwrap(); + let pixi_toml = fs_err::read_to_string(&path).unwrap(); let _project = Project::from_str(&PathBuf::from("pixi.toml"), &pixi_toml).unwrap(); } } @@ -133,11 +133,11 @@ fn parse_valid_docs_configs() { // Test all files in the docs/source_files/pixi_config_tomls directory let schema_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("docs/source_files/pixi_config_tomls"); - for entry in std::fs::read_dir(schema_dir).unwrap() { + for entry in fs_err::read_dir(schema_dir).unwrap() { let entry = entry.unwrap(); let path = entry.path(); if path.extension().map(|ext| ext == "toml").unwrap_or(false) { - let toml = std::fs::read_to_string(&path).unwrap(); + let toml = fs_err::read_to_string(&path).unwrap(); let (_config, unused_keys) = Config::from_toml(&toml).unwrap(); assert_eq!( unused_keys, diff --git a/tests/integration_rust/solve_group_tests.rs b/tests/integration_rust/solve_group_tests.rs index 26a7d38b1..5f945bfd3 100644 --- a/tests/integration_rust/solve_group_tests.rs +++ b/tests/integration_rust/solve_group_tests.rs @@ -619,7 +619,7 @@ async fn test_file_url_as_mapping_location() { let tmp_dir = tempfile::tempdir().unwrap(); let mapping_file = tmp_dir.path().join("custom_mapping.json"); - let _ = std::fs::write( + let _ = fs_err::write( &mapping_file, r#" { diff --git a/tests/integration_rust/task_tests.rs b/tests/integration_rust/task_tests.rs index b8d2e706a..d3ca73d03 100644 --- a/tests/integration_rust/task_tests.rs +++ b/tests/integration_rust/task_tests.rs @@ -5,7 +5,6 @@ use pixi::task::TaskName; use pixi_manifest::task::CmdArgs; use pixi_manifest::{FeatureName, Task}; use rattler_conda_types::Platform; -use std::fs; use std::path::PathBuf; #[tokio::test] @@ -174,7 +173,7 @@ async fn test_cwd() { pixi.init().without_channels().await.unwrap(); // Create test dir - fs::create_dir(pixi.project_path().join("test")).unwrap(); + fs_err::create_dir(pixi.project_path().join("test")).unwrap(); pixi.tasks() .add("pwd-test".into(), None, FeatureName::Default) From d4f0dd74656c84e5d0ac78ffb20cc3be34f13719 Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Tue, 3 Dec 2024 16:34:32 +0100 Subject: [PATCH 05/16] feat: parsing of build backend configuration (#2624) Adds parsing of build backend configuration to the manifest. ### Description Backends sometimes require explicit configuration for parameters that cannot be derived from the source or the manifest. Examples of these are additional CMake arguments, whether to build a noarch package for python and potentially many more settings that are configurable in a rattler-build recipe. ### Design To facilitate this we want to allow people to configure the backends in their `pixi.toml`/`pyproject.toml` while retaining the following properties: 1. The manifest must have a schema. This should include configuration for the backend. 2. The backend is responsible for the semantics of the configuration. E.g. how to merge certain configuration values. 3. The backend should not have to read the manifest file. Pixi should pass in any configuration values. With these requirements we designed the following: ```toml [build-system] build-backend = { name = "pixi-build-python", version = "*" } [build-backend.pixi-build-python] noarch = false ``` ### Considerations and implementation We add the `build-backend` section which has one key that should be equal to the name of the build backend. This allows us to write sub-schemas that match on that specific key. We choose to add an additional section because we are afraid otherwise the key becomes very long. E.g. `build-system.config.pixi-build-python`. Pixi reads the configuration verbatim and passes this over JSONRPC to the build backend. The immediate downside of this approach is that providing context-aware errors becomes much harder. This is because there is no direct mapping from the TOML config to the parameters passed in JSON. This PR does not provide any mechanism to facilitate this either. --- Cargo.lock | 7 +- Cargo.toml | 2 + crates/pixi_build_frontend/Cargo.toml | 4 + .../src/protocols/builders/pixi.rs | 31 ++- .../src/protocols/builders/rattler_build.rs | 1 + .../pixi_build_frontend/src/protocols/mod.rs | 4 + .../pixi_build_frontend/tests/diagnostics.rs | 116 +++++++++-- .../diagnostics__backend_configuration.snap | 7 + .../diagnostics__invalid_backend.snap | 2 +- crates/pixi_build_types/Cargo.toml | 1 + .../src/procedures/initialize.rs | 5 + crates/pixi_manifest/src/build_system.rs | 4 + crates/pixi_manifest/src/error.rs | 3 + ..._workspace__tests__invalid_key@foobar.snap | 2 +- crates/pixi_manifest/src/toml/build_system.rs | 5 +- crates/pixi_manifest/src/toml/manifest.rs | 181 +++++++++++++++++- ..._test__invalid_build_backend_sections.snap | 11 ++ ...orrectly_named_build_backend_sections.snap | 16 ++ ..._invalid_named_build_backend_sections.snap | 11 ++ ...nifest__test__multiple_backend_config.snap | 11 ++ schema/examples/valid/full.toml | 3 + schema/model.py | 3 + schema/schema.json | 5 + 23 files changed, 409 insertions(+), 26 deletions(-) create mode 100644 crates/pixi_build_frontend/tests/snapshots/diagnostics__backend_configuration.snap create mode 100644 crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_build_backend_sections.snap create mode 100644 crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_incorrectly_named_build_backend_sections.snap create mode 100644 crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_named_build_backend_sections.snap create mode 100644 crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__multiple_backend_config.snap diff --git a/Cargo.lock b/Cargo.lock index dbc91130f..cf830e380 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -581,9 +581,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "bzip2" @@ -3581,6 +3581,7 @@ dependencies = [ name = "pixi_build_frontend" version = "0.1.0" dependencies = [ + "bytes", "dashmap", "fs-err 2.11.0", "futures", @@ -3612,6 +3613,7 @@ dependencies = [ "tempfile", "thiserror", "tokio", + "tokio-stream", "tokio-util", "tracing", "url", @@ -3624,6 +3626,7 @@ version = "0.1.0" dependencies = [ "rattler_conda_types", "serde", + "serde_json", "serde_with", "url", ] diff --git a/Cargo.toml b/Cargo.toml index 57723e1ac..2d736e847 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ async-fd-lock = "0.2.0" async-once-cell = "0.5.3" async-trait = "0.1.82" base64 = "0.22.1" +bytes = "1.9.0" chrono = "0.4.38" clap = { version = "4.5.9", default-features = false } clap-verbosity-flag = "2.2.0" @@ -86,6 +87,7 @@ tar = "0.4.40" tempfile = "3.10.1" thiserror = "1.0.58" tokio = "1.37.0" +tokio-stream = "0.1.16" tokio-util = "0.7.10" toml_edit = "0.22.11" tracing = "0.1.40" diff --git a/crates/pixi_build_frontend/Cargo.toml b/crates/pixi_build_frontend/Cargo.toml index c154b48ea..442fad106 100644 --- a/crates/pixi_build_frontend/Cargo.toml +++ b/crates/pixi_build_frontend/Cargo.toml @@ -44,7 +44,9 @@ which = { workspace = true } pixi_build_types = { path = "../pixi_build_types" } + [dev-dependencies] +bytes = { workspace = true } insta = { workspace = true, features = ["yaml", "filters"] } rstest = { workspace = true } tempfile = { workspace = true } @@ -53,3 +55,5 @@ tokio = { workspace = true, features = [ "io-std", "rt-multi-thread", ] } +tokio-stream = { workspace = true } +tokio-util = { workspace = true, features = ["io"] } diff --git a/crates/pixi_build_frontend/src/protocols/builders/pixi.rs b/crates/pixi_build_frontend/src/protocols/builders/pixi.rs index 40df45df2..88ac9c3af 100644 --- a/crates/pixi_build_frontend/src/protocols/builders/pixi.rs +++ b/crates/pixi_build_frontend/src/protocols/builders/pixi.rs @@ -8,6 +8,7 @@ use miette::Diagnostic; use pixi_consts::consts; use pixi_manifest::{Manifest, PackageManifest, PrioritizedChannel, WorkspaceManifest}; use rattler_conda_types::{ChannelConfig, MatchSpec}; +use serde::{de::IntoDeserializer, Deserialize}; use thiserror::Error; use which::Error; @@ -78,8 +79,8 @@ impl ProtocolBuilder { manifest_path: PathBuf, workspace_manifest: WorkspaceManifest, package_manifest: PackageManifest, - ) -> Result { - Ok(Self { + ) -> Self { + Self { source_dir, manifest_path, workspace_manifest, @@ -87,7 +88,7 @@ impl ProtocolBuilder { override_backend_spec: None, channel_config: None, cache_dir: None, - }) + } } /// Sets an optional backend override. @@ -128,7 +129,7 @@ impl ProtocolBuilder { manifest_path, manifest.workspace, package_manifest, - )?; + ); return Ok(Some(builder)); } Err(e) => { @@ -195,9 +196,20 @@ impl ProtocolBuilder { .await .map_err(FinishError::Tool)?; + let configuration = self + .package_manifest + .build_system + .build_backend + .additional_args + .map_or(serde_json::Value::Null, |value| { + let deserializer = value.into_deserializer(); + serde_json::Value::deserialize(deserializer).unwrap_or(serde_json::Value::Null) + }); + Ok(JsonRPCBuildProtocol::setup( self.source_dir, self.manifest_path, + configuration, build_id, self.cache_dir, tool, @@ -212,10 +224,21 @@ impl ProtocolBuilder { ipc: InProcessBackend, build_id: usize, ) -> Result { + let configuration = self + .package_manifest + .build_system + .build_backend + .additional_args + .map_or(serde_json::Value::Null, |value| { + let deserializer = value.into_deserializer(); + serde_json::Value::deserialize(deserializer).unwrap_or(serde_json::Value::Null) + }); + Ok(JsonRPCBuildProtocol::setup_with_transport( "".to_string(), self.source_dir, self.manifest_path, + configuration, build_id, self.cache_dir, Sender::from(ipc.rpc_out), diff --git a/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs b/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs index efe83f38b..1adb169e8 100644 --- a/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs +++ b/crates/pixi_build_frontend/src/protocols/builders/rattler_build.rs @@ -142,6 +142,7 @@ impl ProtocolBuilder { Ok(JsonRPCBuildProtocol::setup( self.source_dir, self.recipe_dir.join("recipe.yaml"), + serde_json::Value::Null, build_id, self.cache_dir, tool, diff --git a/crates/pixi_build_frontend/src/protocols/mod.rs b/crates/pixi_build_frontend/src/protocols/mod.rs index 0e83814e4..467254b0b 100644 --- a/crates/pixi_build_frontend/src/protocols/mod.rs +++ b/crates/pixi_build_frontend/src/protocols/mod.rs @@ -145,6 +145,7 @@ impl JsonRPCBuildProtocol { async fn setup( source_dir: PathBuf, manifest_path: PathBuf, + configuration: serde_json::Value, build_id: usize, cache_dir: Option, tool: Tool, @@ -177,6 +178,7 @@ impl JsonRPCBuildProtocol { backend_identifier, source_dir, manifest_path, + configuration, build_id, cache_dir, tx, @@ -193,6 +195,7 @@ impl JsonRPCBuildProtocol { source_dir: PathBuf, // In case of rattler-build it's recipe.yaml manifest_path: PathBuf, + configuration: serde_json::Value, build_id: usize, cache_dir: Option, sender: impl TransportSenderT + Send, @@ -212,6 +215,7 @@ impl JsonRPCBuildProtocol { manifest_path: manifest_path.clone(), capabilities: FrontendCapabilities {}, cache_directory: cache_dir, + configuration, }), ) .await diff --git a/crates/pixi_build_frontend/tests/diagnostics.rs b/crates/pixi_build_frontend/tests/diagnostics.rs index 68f18f943..a1964814a 100644 --- a/crates/pixi_build_frontend/tests/diagnostics.rs +++ b/crates/pixi_build_frontend/tests/diagnostics.rs @@ -1,8 +1,18 @@ use std::path::Path; +use bytes::Bytes; +use futures::{SinkExt, StreamExt}; +use jsonrpsee::types::Request; use miette::{Diagnostic, GraphicalReportHandler, GraphicalTheme}; use pixi_build_frontend::{BuildFrontend, InProcessBackend, SetupRequest}; +use pixi_build_types::procedures::initialize::InitializeParams; use pixi_manifest::toml::{ExternalWorkspaceProperties, TomlManifest}; +use tokio::io::{AsyncBufReadExt, AsyncRead, AsyncWrite, BufReader}; +use tokio_stream::wrappers::ReceiverStream; +use tokio_util::{ + io::{CopyToBytes, SinkWriter, StreamReader}, + sync::PollSender, +}; fn error_to_snapshot(diag: &impl Diagnostic) -> String { let mut report_str = String::new(); @@ -130,34 +140,118 @@ async fn test_invalid_backend() { build-backend = { name = "ipc", version = "*" } "#; - tokio::fs::write(&manifest, toml).await.unwrap(); - - let (in_tx, in_rx) = tokio::io::duplex(1024); - let (out_tx, _out_rx) = tokio::io::duplex(1024); + let (frontend_tx, backend_rx) = pipe(); + let (backend_tx, frontend_rx) = pipe(); let ipc = InProcessBackend { - rpc_in: Box::new(in_rx), - rpc_out: Box::new(out_tx), + rpc_in: Box::new(frontend_rx), + rpc_out: Box::new(frontend_tx), }; // Explicitly drop the sending end of the channel to simulate a closed // connection. - drop(in_tx); + drop(backend_rx); + drop(backend_tx); let (workspace, package) = TomlManifest::from_toml_str(toml) .unwrap() .into_manifests(ExternalWorkspaceProperties::default()) .unwrap(); - let protocol = pixi_build_frontend::pixi_protocol::ProtocolBuilder::new( + let err = pixi_build_frontend::pixi_protocol::ProtocolBuilder::new( source_dir.path().to_path_buf(), manifest.to_path_buf(), workspace, package.unwrap(), ) - .unwrap(); - - let err = protocol.finish_with_ipc(ipc, 0).await.unwrap_err(); + .finish_with_ipc(ipc, 0) + .await + .unwrap_err(); let snapshot = error_to_snapshot(&err); let snapshot = replace_source_dir(&snapshot, source_dir.path()); insta::assert_snapshot!(snapshot); } + +#[tokio::test] +async fn test_backend_configuration() { + let toml = r#" + [workspace] + platforms = [] + channels = [] + preview = ['pixi-build'] + + [package] + version = "0.1.0" + name = "project" + + [build-system] + build-backend = { name = "ipc", version = "*" } + + [build-backend.ipc] + hello = "world" + "#; + + let source_dir = tempfile::TempDir::new().unwrap(); + let manifest = source_dir + .path() + .join(pixi_consts::consts::PROJECT_MANIFEST); + + let (frontend_tx, backend_rx) = pipe(); + let (backend_tx, frontend_rx) = pipe(); + let ipc = InProcessBackend { + rpc_in: Box::new(frontend_rx), + rpc_out: Box::new(frontend_tx), + }; + + let protocol_setup = tokio::spawn(async move { + let (workspace, package) = TomlManifest::from_toml_str(toml) + .unwrap() + .into_manifests(ExternalWorkspaceProperties::default()) + .unwrap(); + pixi_build_frontend::pixi_protocol::ProtocolBuilder::new( + source_dir.path().to_path_buf(), + manifest.to_path_buf(), + workspace, + package.unwrap(), + ) + .finish_with_ipc(ipc, 0) + .await + .expect_err("the test never sends a response to the initialize request"); + }); + + let read_initialize_message = async move { + let initialize_line = BufReader::new(backend_rx) + .lines() + .next_line() + .await + .unwrap() + .unwrap(); + let request: Request = serde_json::from_str(&initialize_line).unwrap(); + let init_params: InitializeParams = request.params().parse().unwrap(); + drop(backend_tx); // Simulates the backend closing the connection. + init_params + }; + + let (_, init_params) = tokio::join!(protocol_setup, read_initialize_message); + + insta::assert_snapshot!(serde_json::to_string_pretty(&init_params.configuration).unwrap()); +} + +/// Creates a pipe that connects an async write instance to an async read +/// instance. +pub fn pipe() -> ( + impl AsyncWrite + Unpin + Send, + impl AsyncRead + Unpin + Send, +) { + let (tx, rx) = tokio::sync::mpsc::channel::(1); + + // Convert the sender into an async write instance + let sink = + PollSender::new(tx).sink_map_err(|_| std::io::Error::from(std::io::ErrorKind::BrokenPipe)); + let writer = SinkWriter::new(CopyToBytes::new(sink)); + + // Convert the receiver into an async read instance + let stream = ReceiverStream::new(rx).map(Ok::<_, std::io::Error>); + let reader = StreamReader::new(stream); + + (writer, reader) +} diff --git a/crates/pixi_build_frontend/tests/snapshots/diagnostics__backend_configuration.snap b/crates/pixi_build_frontend/tests/snapshots/diagnostics__backend_configuration.snap new file mode 100644 index 000000000..099607aa9 --- /dev/null +++ b/crates/pixi_build_frontend/tests/snapshots/diagnostics__backend_configuration.snap @@ -0,0 +1,7 @@ +--- +source: crates/pixi_build_frontend/tests/diagnostics.rs +expression: "serde_json::to_string_pretty(&init_params.configuration).unwrap()" +--- +{ + "hello": "world" +} diff --git a/crates/pixi_build_frontend/tests/snapshots/diagnostics__invalid_backend.snap b/crates/pixi_build_frontend/tests/snapshots/diagnostics__invalid_backend.snap index 3451b4fa4..b6b4059c3 100644 --- a/crates/pixi_build_frontend/tests/snapshots/diagnostics__invalid_backend.snap +++ b/crates/pixi_build_frontend/tests/snapshots/diagnostics__invalid_backend.snap @@ -3,5 +3,5 @@ source: crates/pixi_build_frontend/tests/diagnostics.rs expression: snapshot --- × failed to communicate with the build backend () - ╰─▶ The background task closed EOF; restart required + ╰─▶ The background task closed broken pipe; restart required help: Ensure that the build backend implements the JSON-RPC protocol correctly. diff --git a/crates/pixi_build_types/Cargo.toml b/crates/pixi_build_types/Cargo.toml index e0925471e..c27ff31c4 100644 --- a/crates/pixi_build_types/Cargo.toml +++ b/crates/pixi_build_types/Cargo.toml @@ -12,5 +12,6 @@ version = "0.1.0" [dependencies] rattler_conda_types = { workspace = true } serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } serde_with = { workspace = true } url = { workspace = true } diff --git a/crates/pixi_build_types/src/procedures/initialize.rs b/crates/pixi_build_types/src/procedures/initialize.rs index 8124776a0..daf574d81 100644 --- a/crates/pixi_build_types/src/procedures/initialize.rs +++ b/crates/pixi_build_types/src/procedures/initialize.rs @@ -24,6 +24,11 @@ pub const METHOD_NAME: &str = "initialize"; pub struct InitializeParams { /// The manifest that the build backend should use. pub manifest_path: PathBuf, + + /// Additional configuration to configure the backend. This configuration is + /// specific to the backend. + pub configuration: serde_json::Value, + /// The capabilities that the frontend provides. pub capabilities: FrontendCapabilities, diff --git a/crates/pixi_manifest/src/build_system.rs b/crates/pixi_manifest/src/build_system.rs index db9eb9402..c4f3d91a2 100644 --- a/crates/pixi_manifest/src/build_system.rs +++ b/crates/pixi_manifest/src/build_system.rs @@ -28,6 +28,10 @@ pub struct BuildBackend { /// The spec for the backend pub spec: BinarySpec, + + /// Additional arguments to pass to the build backend. In the manifest these are read from the + /// `[build-backend]` section. + pub additional_args: Option, } impl BuildSystem { diff --git a/crates/pixi_manifest/src/error.rs b/crates/pixi_manifest/src/error.rs index e6009940e..37aecdeb4 100644 --- a/crates/pixi_manifest/src/error.rs +++ b/crates/pixi_manifest/src/error.rs @@ -44,6 +44,8 @@ pub enum TomlError { MissingField(Cow<'static, str>, Option>), #[error("{0}")] Generic(Cow<'static, str>, Option>), + #[error("{0}")] + GenericLabels(Cow<'static, str>, Vec), #[error(transparent)] FeatureNotEnabled(#[from] FeatureNotEnabled), #[error("Could not find or access the part '{part}' in the path '[{table_name}]'")] @@ -114,6 +116,7 @@ impl Diagnostic for TomlError { TomlError::Generic(_, span) | TomlError::MissingField(_, span) => { span.clone().map(SourceSpan::from) } + TomlError::GenericLabels(_, spans) => return Some(Box::new(spans.clone().into_iter())), TomlError::FeatureNotEnabled(err) => return err.labels(), TomlError::InvalidNonPackageDependencies(err) => return err.labels(), _ => None, diff --git a/crates/pixi_manifest/src/manifests/snapshots/pixi_manifest__manifests__workspace__tests__invalid_key@foobar.snap b/crates/pixi_manifest/src/manifests/snapshots/pixi_manifest__manifests__workspace__tests__invalid_key@foobar.snap index aa67cbf37..585bb48f3 100644 --- a/crates/pixi_manifest/src/manifests/snapshots/pixi_manifest__manifests__workspace__tests__invalid_key@foobar.snap +++ b/crates/pixi_manifest/src/manifests/snapshots/pixi_manifest__manifests__workspace__tests__invalid_key@foobar.snap @@ -3,7 +3,7 @@ source: crates/pixi_manifest/src/manifests/workspace.rs expression: "expect_parse_failure(&format!(\"{PROJECT_BOILERPLATE}\\n[foobar]\"))" --- × unknown field `foobar`, expected one of `project`, `workspace`, `package`, `system-requirements`, `target`, `dependencies`, `host-dependencies`, `build-dependencies`, `run-dependencies`, `pypi- - │ dependencies`, `activation`, `tasks`, `feature`, `environments`, `pypi-options`, `build-system`, `$schema`, `tool` + │ dependencies`, `activation`, `tasks`, `feature`, `environments`, `pypi-options`, `build-system`, `build-backend`, `$schema`, `tool` ╭─[pixi.toml:8:2] 7 │ 8 │ [foobar] diff --git a/crates/pixi_manifest/src/toml/build_system.rs b/crates/pixi_manifest/src/toml/build_system.rs index 9469ef7e1..f968591fb 100644 --- a/crates/pixi_manifest/src/toml/build_system.rs +++ b/crates/pixi_manifest/src/toml/build_system.rs @@ -24,7 +24,7 @@ pub struct TomlBuildSystem { #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields, rename_all = "kebab-case")] pub struct TomlBuildBackend { - pub name: rattler_conda_types::PackageName, + pub name: PixiSpanned, #[serde(flatten)] pub spec: TomlSpec, @@ -80,8 +80,9 @@ impl TomlBuildSystem { Ok(BuildSystem { build_backend: BuildBackend { - name: self.build_backend.value.name, + name: self.build_backend.value.name.value, spec: build_backend_spec, + additional_args: None, }, additional_dependencies, channels: self.channels.map(|channels| channels.value), diff --git a/crates/pixi_manifest/src/toml/manifest.rs b/crates/pixi_manifest/src/toml/manifest.rs index 1d57f4c07..551fc79b9 100644 --- a/crates/pixi_manifest/src/toml/manifest.rs +++ b/crates/pixi_manifest/src/toml/manifest.rs @@ -1,8 +1,12 @@ -use std::collections::HashMap; +use std::{borrow::Cow, collections::HashMap, fmt::Formatter}; use indexmap::IndexMap; use itertools::chain; -use serde::Deserialize; +use miette::LabeledSpan; +use serde::{ + de::{MapAccess, Visitor}, + Deserialize, Deserializer, +}; use serde_with::serde_as; use crate::{ @@ -85,6 +89,11 @@ pub struct TomlManifest { #[serde(default)] pub build_system: Option>, + /// The build backend is unused by pixi and is only used by build backend + /// instead. + #[serde(default)] + pub build_backend: Option, + /// The URI for the manifest schema which is unused by pixi #[serde(rename = "$schema")] pub _schema: Option, @@ -94,6 +103,48 @@ pub struct TomlManifest { pub _tool: serde::de::IgnoredAny, } +#[derive(Debug)] +pub struct TomlBuildBackendConfig { + name: PixiSpanned, + additional_args: serde_value::Value, +} + +impl<'de> Deserialize<'de> for TomlBuildBackendConfig { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct TomlBuildBackendConfigVisitor; + impl<'de> Visitor<'de> for TomlBuildBackendConfigVisitor { + type Value = TomlBuildBackendConfig; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + write!(formatter, "expecting a map") + } + + fn visit_map(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + let result = TomlBuildBackendConfig { + name: map + .next_key()? + .ok_or_else(|| serde::de::Error::missing_field("name"))?, + additional_args: map.next_value()?, + }; + + let key: Option> = map.next_key()?; + if let Some(key) = key { + return Err(serde::de::Error::unknown_field(key.as_ref(), &[])); + } + Ok(result) + } + } + + deserializer.deserialize_map(TomlBuildBackendConfigVisitor) + } +} + impl TomlManifest { /// Parses a toml string into a project manifest. pub fn from_toml_str(source: &str) -> Result { @@ -314,7 +365,7 @@ impl TomlManifest { let PixiSpanned { value: build_system, - span: _build_system_span, + span: build_system_span, } = self .build_system .ok_or_else(|| TomlError::MissingField("[build-system]".into(), None))?; @@ -341,9 +392,52 @@ impl TomlManifest { } })?; + let backend_configuration = if let Some(map) = self.build_backend { + let PixiSpanned { + value: name, + span: name_span, + } = map.name; + let expected_build_backend_name = + build_system.build_backend.value.name.value.as_source(); + if name != build_system.build_backend.value.name.value.as_source() { + let backend_name_span = build_system + .build_backend + .value + .name + .span + .or(build_system.build_backend.span) + .or(build_system_span); + + return Err(TomlError::GenericLabels( + format!( + "The build backend name `{name}` does not match the name defined in the build system `{expected_build_backend_name}`", + ) + .into(), + [ + name_span.map(|span| LabeledSpan::new_primary_with_span(Some(format!("this should be {expected_build_backend_name}")), span)), + backend_name_span.map(|span| { + LabeledSpan::new_with_span( + Some(String::from("the backend name is defined here")), + span, + ) + }), + ] + .into_iter() + .flatten() + .collect(), + )); + } + Some(map.additional_args) + } else { + None + }; + + let mut build_system = build_system.into_build_system()?; + build_system.build_backend.additional_args = backend_configuration; + Some(PackageManifest { package, - build_system: build_system.into_build_system()?, + build_system, targets: Targets::from_default_and_user_defined( default_package_target.unwrap_or_default(), package_targets, @@ -372,7 +466,12 @@ impl TomlManifest { build_system_span, )) }; - } + } else if let Some(map) = self.build_backend { + return Err(TomlError::Generic( + "Cannot use [build-backend] without [build-system]".into(), + map.name.span, + )); + }; None }; @@ -580,4 +679,76 @@ mod test { "#, )); } + + #[test] + fn test_invalid_build_backend_sections() { + assert_snapshot!(expect_parse_failure( + r#" + [workspace] + name = "foobar" + channels = [] + platforms = [] + + [build-backend] + "#, + )); + } + + #[test] + fn test_invalid_named_build_backend_sections() { + assert_snapshot!(expect_parse_failure( + r#" + [workspace] + name = "foobar" + channels = [] + platforms = [] + + [build-backend.backend] + "#, + )); + } + + #[test] + fn test_invalid_incorrectly_named_build_backend_sections() { + assert_snapshot!(expect_parse_failure( + r#" + [workspace] + channels = [] + platforms = [] + preview = ["pixi-build"] + + [package] + name = "foobar" + version = "0.1.0" + + [build-system] + build-backend = { name = "foobar", version = "*" } + + [build-backend.backend] + "#, + )); + } + + #[test] + fn test_multiple_backend_config() { + assert_snapshot!(expect_parse_failure( + r#" + [workspace] + channels = [] + platforms = [] + preview = ["pixi-build"] + + [package] + name = "foobar" + version = "0.1.0" + + [build-system] + build-backend = { name = "foobar", version = "*" } + + [build-backend.foobar] + + [build-backend.foobar2] + "#, + )); + } } diff --git a/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_build_backend_sections.snap b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_build_backend_sections.snap new file mode 100644 index 000000000..e1398fe99 --- /dev/null +++ b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_build_backend_sections.snap @@ -0,0 +1,11 @@ +--- +source: crates/pixi_manifest/src/toml/manifest.rs +expression: "expect_parse_failure(r#\"\n [workspace]\n name = \"foobar\"\n channels = []\n platforms = []\n\n [build-backend]\n \"#,)" +--- + × missing field `name` + ╭─[pixi.toml:7:9] + 6 │ + 7 │ [build-backend] + · ─────────────── + 8 │ + ╰──── diff --git a/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_incorrectly_named_build_backend_sections.snap b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_incorrectly_named_build_backend_sections.snap new file mode 100644 index 000000000..438cee877 --- /dev/null +++ b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_incorrectly_named_build_backend_sections.snap @@ -0,0 +1,16 @@ +--- +source: crates/pixi_manifest/src/toml/manifest.rs +expression: "expect_parse_failure(r#\"\n [workspace]\n channels = []\n platforms = []\n preview = [\"pixi-build\"]\n\n [package]\n name = \"foobar\"\n version = \"0.1.0\"\n\n [build-system]\n build-backend = { name = \"foobar\", version = \"*\" }\n\n [build-backend.backend]\n \"#,)" +--- + × The build backend name `backend` does not match the name defined in the build system `foobar` + ╭─[pixi.toml:14:24] + 11 │ [build-system] + 12 │ build-backend = { name = "foobar", version = "*" } + · ────┬─── + · ╰── the backend name is defined here + 13 │ + 14 │ [build-backend.backend] + · ───┬─── + · ╰── this should be foobar + 15 │ + ╰──── diff --git a/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_named_build_backend_sections.snap b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_named_build_backend_sections.snap new file mode 100644 index 000000000..41bd38f18 --- /dev/null +++ b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__invalid_named_build_backend_sections.snap @@ -0,0 +1,11 @@ +--- +source: crates/pixi_manifest/src/toml/manifest.rs +expression: "expect_parse_failure(r#\"\n [workspace]\n name = \"foobar\"\n channels = []\n platforms = []\n\n [build-backend.backend]\n \"#,)" +--- + × Cannot use [build-backend] without [build-system] + ╭─[pixi.toml:7:24] + 6 │ + 7 │ [build-backend.backend] + · ─────── + 8 │ + ╰──── diff --git a/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__multiple_backend_config.snap b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__multiple_backend_config.snap new file mode 100644 index 000000000..de645017c --- /dev/null +++ b/crates/pixi_manifest/src/toml/snapshots/pixi_manifest__toml__manifest__test__multiple_backend_config.snap @@ -0,0 +1,11 @@ +--- +source: crates/pixi_manifest/src/toml/manifest.rs +expression: "expect_parse_failure(r#\"\n [workspace]\n channels = []\n platforms = []\n preview = [\"pixi-build\"]\n\n [package]\n name = \"foobar\"\n version = \"0.1.0\"\n\n [build-system]\n build-backend = { name = \"foobar\", version = \"*\" }\n\n [build-backend.foobar]\n\n [build-backend.foobar2]\n \"#,)" +--- + × unknown field `foobar2`, there are no fields + ╭─[pixi.toml:14:10] + 13 │ + 14 │ [build-backend.foobar] + · ───────────── + 15 │ + ╰──── diff --git a/schema/examples/valid/full.toml b/schema/examples/valid/full.toml index cdb559e52..3162090f8 100644 --- a/schema/examples/valid/full.toml +++ b/schema/examples/valid/full.toml @@ -27,6 +27,9 @@ channels = [ "https://prefix.dev/conda-forge", ] +[build-backend.pixi-build-python] +noarch = false + [dependencies] detailed = { version = ">=1.2.3" } detailed-full = { version = ">=1.2.3", build = "py34_0", channel = "pytorch", subdir = "linux-64", md5 = "6f5902ac237024bdd0c176cb93063dc4", sha256 = "a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447" } diff --git a/schema/model.py b/schema/model.py index b2b9ec2df..995ea8833 100644 --- a/schema/model.py +++ b/schema/model.py @@ -648,6 +648,9 @@ class Config: build_system: BuildSystem | None = Field( None, description="The build-system used to build the package." ) + build_backend: dict[NonEmptyStr, Any] | None = Field( + None, description="Configuration for the build backend." + ) ######################### diff --git a/schema/schema.json b/schema/schema.json index 75494f385..b5673b7e3 100644 --- a/schema/schema.json +++ b/schema/schema.json @@ -29,6 +29,11 @@ "$ref": "#/$defs/Activation", "description": "The scripts used on the activation of the project" }, + "build-backend": { + "title": "Build-Backend", + "description": "Configuration for the build backend.", + "type": "object" + }, "build-dependencies": { "title": "Build-Dependencies", "description": "The build `conda` dependencies, used in the build process", From cba5830562699649422f3540eca93421a104ea8e Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 3 Dec 2024 16:56:09 +0100 Subject: [PATCH 06/16] feat: add variant config to `[workspace.build-variants]` (#2634) --- .../src/procedures/conda_build.rs | 5 ++- .../src/procedures/conda_metadata.rs | 5 ++- crates/pixi_manifest/src/pyproject.rs | 1 + crates/pixi_manifest/src/toml/workspace.rs | 4 +++ crates/pixi_manifest/src/workspace.rs | 3 ++ schema/model.py | 3 ++ schema/schema.json | 11 +++++++ src/build/mod.rs | 32 ++++++++++++++++++- src/cli/build.rs | 2 ++ src/lock_file/update.rs | 26 +++------------ 10 files changed, 67 insertions(+), 25 deletions(-) diff --git a/crates/pixi_build_types/src/procedures/conda_build.rs b/crates/pixi_build_types/src/procedures/conda_build.rs index 0f21c085e..f629d168f 100644 --- a/crates/pixi_build_types/src/procedures/conda_build.rs +++ b/crates/pixi_build_types/src/procedures/conda_build.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::{collections::HashMap, path::PathBuf}; use rattler_conda_types::GenericVirtualPackage; use serde::{Deserialize, Serialize}; @@ -34,6 +34,9 @@ pub struct CondaBuildParams { #[serde(default)] pub outputs: Option>, + /// The variants that we want to build + pub variant_configuration: Option>>, + /// A directory that can be used by the backend to store files for /// subsequent requests. This directory is unique for each separate source /// dependency. diff --git a/crates/pixi_build_types/src/procedures/conda_metadata.rs b/crates/pixi_build_types/src/procedures/conda_metadata.rs index 9951177c0..9fffe38ad 100644 --- a/crates/pixi_build_types/src/procedures/conda_metadata.rs +++ b/crates/pixi_build_types/src/procedures/conda_metadata.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use std::path::PathBuf; +use std::{collections::HashMap, path::PathBuf}; use url::Url; use crate::{ChannelConfiguration, CondaPackageMetadata, PlatformAndVirtualPackages}; @@ -27,6 +27,9 @@ pub struct CondaMetadataParams { /// The channel configuration to use to resolve dependencies. pub channel_configuration: ChannelConfiguration, + /// The variants that we want to build + pub variant_configuration: Option>>, + /// A directory that can be used by the backend to store files for /// subsequent requests. This directory is unique for each separate source /// dependency. diff --git a/crates/pixi_manifest/src/pyproject.rs b/crates/pixi_manifest/src/pyproject.rs index 3388a5370..58b3fcc04 100644 --- a/crates/pixi_manifest/src/pyproject.rs +++ b/crates/pixi_manifest/src/pyproject.rs @@ -267,6 +267,7 @@ impl PyProjectManifest { homepage: None, repository: None, documentation: None, + build_variants: None, })?; // Add python as dependency based on the `project.requires_python` property diff --git a/crates/pixi_manifest/src/toml/workspace.rs b/crates/pixi_manifest/src/toml/workspace.rs index 9c77ad14c..63aeea360 100644 --- a/crates/pixi_manifest/src/toml/workspace.rs +++ b/crates/pixi_manifest/src/toml/workspace.rs @@ -45,6 +45,8 @@ pub struct TomlWorkspace { #[serde(default)] pub preview: Preview, + + pub build_variants: Option>>, } /// Defines some of the properties that might be defined in other parts of the @@ -63,6 +65,7 @@ pub struct ExternalWorkspaceProperties { pub homepage: Option, pub repository: Option, pub documentation: Option, + pub build_variants: Option>>, } #[derive(Debug, Error)] @@ -96,6 +99,7 @@ impl TomlWorkspace { conda_pypi_map: self.conda_pypi_map, pypi_options: self.pypi_options, preview: self.preview, + build_variants: self.build_variants.or(external.build_variants), }) } } diff --git a/crates/pixi_manifest/src/workspace.rs b/crates/pixi_manifest/src/workspace.rs index 82f47373b..cac3c3d8e 100644 --- a/crates/pixi_manifest/src/workspace.rs +++ b/crates/pixi_manifest/src/workspace.rs @@ -60,4 +60,7 @@ pub struct Workspace { /// Preview features pub preview: Preview, + + /// Build variants + pub build_variants: Option>>, } diff --git a/schema/model.py b/schema/model.py index 995ea8833..669107b7c 100644 --- a/schema/model.py +++ b/schema/model.py @@ -157,6 +157,9 @@ class Workspace(StrictBaseModel): preview: list[KnownPreviewFeature | str] | bool | None = Field( None, description="Defines the enabling of preview features of the project" ) + build_variants: dict[NonEmptyStr, list[str]] | None = Field( + None, description="The build variants of the project" + ) class Package(StrictBaseModel): diff --git a/schema/schema.json b/schema/schema.json index b5673b7e3..5bc182e36 100644 --- a/schema/schema.json +++ b/schema/schema.json @@ -1543,6 +1543,17 @@ "John Doe " ] }, + "build-variants": { + "title": "Build-Variants", + "description": "The build variants of the project", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, "channel-priority": { "$ref": "#/$defs/ChannelPriority", "description": "The type of channel priority that is used in the solve.- 'strict': only take the package from the channel it exist in first.- 'disabled': group all dependencies together as if there is no channel difference.", diff --git a/src/build/mod.rs b/src/build/mod.rs index 11ed7b51e..fb2cd3cdf 100644 --- a/src/build/mod.rs +++ b/src/build/mod.rs @@ -2,6 +2,7 @@ mod cache; mod reporters; use std::{ + collections::HashMap, ffi::OsStr, hash::{Hash, Hasher}, ops::Not, @@ -13,7 +14,7 @@ use std::{ use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine}; use chrono::Utc; use itertools::Itertools; -use miette::Diagnostic; +use miette::{Diagnostic, IntoDiagnostic}; use pixi_build_frontend::{BackendOverride, SetupRequest, ToolContext}; use pixi_build_types::{ procedures::{ @@ -22,6 +23,7 @@ use pixi_build_types::{ }, ChannelConfiguration, CondaPackageMetadata, PlatformAndVirtualPackages, }; +use pixi_config::get_cache_dir; pub use pixi_glob::{GlobHashCache, GlobHashError}; use pixi_glob::{GlobHashKey, GlobModificationTime, GlobModificationTimeError}; use pixi_record::{InputHash, PinnedPathSpec, PinnedSourceSpec, SourceRecord}; @@ -52,6 +54,7 @@ pub struct BuildContext { cache_dir: PathBuf, work_dir: PathBuf, tool_context: Arc, + variant_config: Option>>, } #[derive(Debug, Error, Diagnostic)] @@ -114,6 +117,7 @@ impl BuildContext { cache_dir: PathBuf, dot_pixi_dir: PathBuf, channel_config: ChannelConfig, + variant_config: Option>>, tool_context: Arc, ) -> Result { Ok(Self { @@ -124,9 +128,33 @@ impl BuildContext { cache_dir, work_dir: dot_pixi_dir.join("build-v0"), tool_context, + variant_config, }) } + pub fn from_project(project: &crate::project::Project) -> miette::Result { + Self::new( + get_cache_dir()?, + project.pixi_dir(), + project.channel_config(), + project + .manifest() + .workspace + .workspace + .build_variants + .clone(), + Arc::new(ToolContext::default()), + ) + .into_diagnostic() + } + + pub fn with_tool_context(self, tool_context: Arc) -> Self { + Self { + tool_context, + ..self + } + } + /// Sets the input hash cache to use for caching input hashes. pub fn with_glob_hash_cache(self, glob_hash_cache: GlobHashCache) -> Self { Self { @@ -291,6 +319,7 @@ impl BuildContext { } .key(), ), + variant_configuration: self.variant_config.clone(), }, build_reporter.as_conda_build_reporter(), ) @@ -529,6 +558,7 @@ impl BuildContext { } .key(), ), + variant_configuration: self.variant_config.clone(), }, metadata_reporter.as_conda_metadata_reporter().clone(), ) diff --git a/src/cli/build.rs b/src/cli/build.rs index ea3cbd567..8760f5623 100644 --- a/src/cli/build.rs +++ b/src/cli/build.rs @@ -119,6 +119,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { pixi_dir.display() ) })?; + let work_dir = tempfile::Builder::new() .prefix("pixi-build-") .tempdir_in(project.pixi_dir()) @@ -165,6 +166,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { }, outputs: None, work_directory: work_dir.path().to_path_buf(), + variant_configuration: Some(Default::default()), }, progress.clone(), ) diff --git a/src/lock_file/update.rs b/src/lock_file/update.rs index 741647441..d2718372b 100644 --- a/src/lock_file/update.rs +++ b/src/lock_file/update.rs @@ -16,7 +16,6 @@ use indicatif::ProgressBar; use itertools::{Either, Itertools}; use miette::{Diagnostic, IntoDiagnostic, LabeledSpan, MietteDiagnostic, Report, WrapErr}; use pixi_build_frontend::ToolContext; -use pixi_config::get_cache_dir; use pixi_consts::consts; use pixi_manifest::{EnvironmentName, FeaturesExt, HasFeaturesIter}; use pixi_progress::global_multi_progress; @@ -680,13 +679,7 @@ pub async fn update_lock_file( updated_pypi_prefixes: Default::default(), uv_context: None, io_concurrency_limit: IoConcurrencyLimit::default(), - build_context: BuildContext::new( - get_cache_dir()?, - project.pixi_dir(), - project.channel_config(), - Arc::new(ToolContext::default()), - ) - .into_diagnostic()?, + build_context: BuildContext::from_project(project)?, glob_hash_cache, }); } @@ -710,13 +703,7 @@ pub async fn update_lock_file( updated_pypi_prefixes: Default::default(), uv_context: None, io_concurrency_limit: IoConcurrencyLimit::default(), - build_context: BuildContext::new( - get_cache_dir()?, - project.pixi_dir(), - project.channel_config(), - Arc::new(ToolContext::default()), - ) - .into_diagnostic()?, + build_context: BuildContext::from_project(project)?, glob_hash_cache, }); } @@ -1011,13 +998,8 @@ impl<'p> UpdateContextBuilder<'p> { .with_client(client) .build(); - let build_context = BuildContext::new( - pixi_config::get_cache_dir()?, - project.pixi_dir(), - project.channel_config(), - tool_context.into(), - ) - .into_diagnostic()?; + let build_context = + BuildContext::from_project(project)?.with_tool_context(Arc::new(tool_context)); Ok(UpdateContext { project, From d4d3c6d68c3e96f932d57d1c92d7fe767095a138 Mon Sep 17 00:00:00 2001 From: Tim de Jager Date: Wed, 4 Dec 2024 08:42:22 +0100 Subject: [PATCH 07/16] feat: add proper unit testing for PyPI installation (#2617) ## Description This adds proper unit testing, for PyPI installations and adds a test harness to test these things. This is a much more efficient and smaller way of testing the functionality, specifically the need to install/re-install then doing full integration tests. ## Checklist - [x] Tests for direct url archives - [x] Test for vcs installs. - [x] See if we need to remove integration tests, because some of it is tested here. --------- Co-authored-by: Bas Zalmstra --- examples/pypi-source-deps/pixi.lock | 1451 +++++++---------- examples/pypi-source-deps/pixi.toml | 2 +- ...t_conda_env_yaml_with_source_editable.snap | 2 +- src/install_pypi/conversions.rs | 1 - src/install_pypi/mod.rs | 34 +- src/install_pypi/{plan.rs => plan/mod.rs} | 164 +- src/install_pypi/plan/test/harness.rs | 521 ++++++ src/install_pypi/plan/test/mod.rs | 471 ++++++ 8 files changed, 1735 insertions(+), 911 deletions(-) rename src/install_pypi/{plan.rs => plan/mod.rs} (77%) create mode 100644 src/install_pypi/plan/test/harness.rs create mode 100644 src/install_pypi/plan/test/mod.rs diff --git a/examples/pypi-source-deps/pixi.lock b/examples/pypi-source-deps/pixi.lock index 89e7a76f3..ab3f559d5 100644 --- a/examples/pypi-source-deps/pixi.lock +++ b/examples/pypi-source-deps/pixi.lock @@ -1,4 +1,4 @@ -version: 5 +version: 6 environments: default: channels: @@ -10,174 +10,170 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.0-h9ebbce0_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: direct+https://github.com/pallets/click/releases/download/8.1.7/click-8.1.7-py3-none-any.whl - - pypi: git+https://github.com/pallets/flask@f93dd6e826a9bf00bf9e08d9bb3a03abcb1e974c - - pypi: https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl + - pypi: git+https://github.com/pallets/flask@f2674c5bb4f7a79f836069859a346b81771eeee5 + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - - pypi: git+https://github.com/pytest-dev/pytest.git@c947145fbb4aeec810a259b19f70fcb52fd53ad4 - - pypi: git+https://github.com/psf/requests.git@0106aced5faa299e6ede89d1230bd6784f2c3660 - - pypi: https://files.pythonhosted.org/packages/c7/d9/c2a126eeae791e90ea099d05cb0515feea3688474b978343f3cdcfe04523/rich-13.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/84/997bbf7c2bf2dc3f09565c6d0b4959fefe5355c18c4096cfd26d83e0785b/werkzeug-3.0.4-py3-none-any.whl + - pypi: git+https://github.com/pytest-dev/pytest.git@9d4f36d87dae9a968fb527e2cb87e8a507b0beb3 + - pypi: git+https://github.com/psf/requests.git@147c8511ddbfa5e8f71bbf5c18ede0c4ceb3bba4 + - pypi: https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl - pypi: ./minimal-project osx-64: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-hd23fc13_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.5-h37a9e06_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.0-h3a8ca6c_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-5_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: direct+https://github.com/pallets/click/releases/download/8.1.7/click-8.1.7-py3-none-any.whl - - pypi: git+https://github.com/pallets/flask@f93dd6e826a9bf00bf9e08d9bb3a03abcb1e974c - - pypi: https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl + - pypi: git+https://github.com/pallets/flask@f2674c5bb4f7a79f836069859a346b81771eeee5 + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - - pypi: git+https://github.com/pytest-dev/pytest.git@c947145fbb4aeec810a259b19f70fcb52fd53ad4 - - pypi: git+https://github.com/psf/requests.git@0106aced5faa299e6ede89d1230bd6784f2c3660 - - pypi: https://files.pythonhosted.org/packages/c7/d9/c2a126eeae791e90ea099d05cb0515feea3688474b978343f3cdcfe04523/rich-13.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/84/997bbf7c2bf2dc3f09565c6d0b4959fefe5355c18c4096cfd26d83e0785b/werkzeug-3.0.4-py3-none-any.whl + - pypi: git+https://github.com/pytest-dev/pytest.git@9d4f36d87dae9a968fb527e2cb87e8a507b0beb3 + - pypi: git+https://github.com/psf/requests.git@147c8511ddbfa5e8f71bbf5c18ede0c4ceb3bba4 + - pypi: https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl - pypi: ./minimal-project osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.5-h30c5eda_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.0-hbbac1ca_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: direct+https://github.com/pallets/click/releases/download/8.1.7/click-8.1.7-py3-none-any.whl - - pypi: git+https://github.com/pallets/flask@f93dd6e826a9bf00bf9e08d9bb3a03abcb1e974c - - pypi: https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl + - pypi: git+https://github.com/pallets/flask@f2674c5bb4f7a79f836069859a346b81771eeee5 + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - - pypi: git+https://github.com/pytest-dev/pytest.git@c947145fbb4aeec810a259b19f70fcb52fd53ad4 - - pypi: git+https://github.com/psf/requests.git@0106aced5faa299e6ede89d1230bd6784f2c3660 - - pypi: https://files.pythonhosted.org/packages/c7/d9/c2a126eeae791e90ea099d05cb0515feea3688474b978343f3cdcfe04523/rich-13.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/84/997bbf7c2bf2dc3f09565c6d0b4959fefe5355c18c4096cfd26d83e0785b/werkzeug-3.0.4-py3-none-any.whl + - pypi: git+https://github.com/pytest-dev/pytest.git@9d4f36d87dae9a968fb527e2cb87e8a507b0beb3 + - pypi: git+https://github.com/psf/requests.git@147c8511ddbfa5e8f71bbf5c18ede0c4ceb3bba4 + - pypi: https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl - pypi: ./minimal-project win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.7.4-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.5-h889d299_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.0-hf5aa216_101_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.13-5_cp313.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl - pypi: direct+https://github.com/pallets/click/releases/download/8.1.7/click-8.1.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - - pypi: git+https://github.com/pallets/flask@f93dd6e826a9bf00bf9e08d9bb3a03abcb1e974c - - pypi: https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl + - pypi: git+https://github.com/pallets/flask@f2674c5bb4f7a79f836069859a346b81771eeee5 + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl - - pypi: git+https://github.com/pytest-dev/pytest.git@c947145fbb4aeec810a259b19f70fcb52fd53ad4 - - pypi: git+https://github.com/psf/requests.git@0106aced5faa299e6ede89d1230bd6784f2c3660 - - pypi: https://files.pythonhosted.org/packages/c7/d9/c2a126eeae791e90ea099d05cb0515feea3688474b978343f3cdcfe04523/rich-13.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/84/997bbf7c2bf2dc3f09565c6d0b4959fefe5355c18c4096cfd26d83e0785b/werkzeug-3.0.4-py3-none-any.whl + - pypi: git+https://github.com/pytest-dev/pytest.git@9d4f36d87dae9a968fb527e2cb87e8a507b0beb3 + - pypi: git+https://github.com/psf/requests.git@147c8511ddbfa5e8f71bbf5c18ede0c4ceb3bba4 + - pypi: https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl - pypi: ./minimal-project packages: -- kind: conda - name: _libgcc_mutex - version: '0.1' - build: conda_forge - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 md5: d7c89558ba9fa0495403155b64376d81 license: None purls: [] size: 2562 timestamp: 1578324546067 -- kind: conda - name: _openmp_mutex - version: '4.5' - build: 2_gnu +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 build_number: 16 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 md5: 73aaf86a425cc6e73fcf236a5a46396d depends: @@ -190,37 +186,12 @@ packages: purls: [] size: 23621 timestamp: 1650670423406 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl name: blinker - version: 1.8.2 - url: https://files.pythonhosted.org/packages/bb/2a/10164ed1f31196a2f7f3799368a821765c62851ead0e630ab52b8e14b4d0/blinker-1.8.2-py3-none-any.whl - sha256: 1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01 - requires_python: '>=3.8' -- kind: conda - name: bzip2 - version: 1.0.8 - build: h2466b09_7 - build_number: 7 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b - md5: 276e7ffe9ffe39688abc665ef0f45596 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 54927 - timestamp: 1720974860185 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h4bc722e_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + version: 1.9.0 + sha256: ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d md5: 62ee74e96c5ebb0af99386de58cf9553 depends: @@ -231,13 +202,17 @@ packages: purls: [] size: 252783 timestamp: 1720974456583 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h99b78c6_7 - build_number: 7 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 134188 + timestamp: 1720974491916 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab depends: @@ -247,240 +222,198 @@ packages: purls: [] size: 122909 timestamp: 1720974522888 -- kind: conda - name: bzip2 - version: 1.0.8 - build: hfdf4475_7 - build_number: 7 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 - md5: 7ed4301d437b59045be7e051a0308211 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 depends: - - __osx >=10.13 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: bzip2-1.0.6 license_family: BSD purls: [] - size: 134188 - timestamp: 1720974491916 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: h56e8100_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.7.4-h56e8100_0.conda - sha256: 7f37bb33c7954de1b4d19ad622859feb4f6c58f751c38b895524cad4e44af72e - md5: 9caa97c9504072cd060cf0a3142cc0ed + size: 54927 + timestamp: 1720974860185 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea + md5: c27d1c142233b5bc9ca570c6e2e0c244 license: ISC purls: [] - size: 154943 - timestamp: 1720077592592 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: h8857fd0_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda - sha256: d16f46c489cb3192305c7d25b795333c5fc17bb0986de20598ed519f8c9cc9e4 - md5: 7df874a4b05b2d2b82826190170eaa0f + size: 159003 + timestamp: 1725018903918 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + sha256: 593f302d0f44c2c771e1614ee6d56fffdc7d616e6f187669c8b0e34ffce3e1ae + md5: b7e5424e7f06547a903d28e4651dbb21 license: ISC purls: [] - size: 154473 - timestamp: 1720077510541 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: hbcca054_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - sha256: c1548a3235376f464f9931850b64b02492f379b2f2bb98bc786055329b080446 - md5: 23ab7665c5f63cfb9f1f6195256daac6 + size: 158665 + timestamp: 1725019059295 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 + md5: 40dec13fd8348dbe303e57be74bd3d35 license: ISC purls: [] - size: 154853 - timestamp: 1720077432978 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: hf0a4a13_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - sha256: 33a61116dae7f369b6ce92a7f2a1ff361ae737c675a493b11feb5570b89e0e3b - md5: 21f9a33e5fe996189e470c19c5354dbe + size: 158482 + timestamp: 1725019034582 +- conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + sha256: 0fcac3a7ffcc556649e034a1802aedf795e64227eaa7194d207b01eaf26454c4 + md5: 4c4fd67c18619be5aa65dc5b6c72e490 license: ISC purls: [] - size: 154517 - timestamp: 1720077468981 -- kind: pypi + size: 158773 + timestamp: 1725019107649 +- pypi: https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl name: certifi - version: 2024.7.4 - url: https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl - sha256: c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 + version: 2024.8.30 + sha256: 922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 requires_python: '>=3.6' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: charset-normalizer - version: 3.3.2 - url: https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl - sha256: ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b + version: 3.4.0 + sha256: 4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc requires_python: '>=3.7.0' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl name: charset-normalizer - version: 3.3.2 - url: https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl - sha256: 55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 + version: 3.4.0 + sha256: e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed requires_python: '>=3.7.0' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl name: charset-normalizer - version: 3.3.2 - url: https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl - sha256: 96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 + version: 3.4.0 + sha256: 92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250 requires_python: '>=3.7.0' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl name: charset-normalizer - version: 3.3.2 - url: https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b + version: 3.4.0 + sha256: 707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b requires_python: '>=3.7.0' -- kind: pypi +- pypi: direct+https://github.com/pallets/click/releases/download/8.1.7/click-8.1.7-py3-none-any.whl name: click version: 8.1.7 - url: direct+https://github.com/pallets/click/releases/download/8.1.7/click-8.1.7-py3-none-any.whl requires_dist: - colorama ; platform_system == 'Windows' - importlib-metadata ; python_full_version < '3.8' requires_python: '>=3.7' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl name: colorama version: 0.4.6 - url: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' -- kind: pypi + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*' +- pypi: git+https://github.com/pallets/flask@f2674c5bb4f7a79f836069859a346b81771eeee5 name: flask - version: 3.1.0.dev0 - url: git+https://github.com/pallets/flask@f93dd6e826a9bf00bf9e08d9bb3a03abcb1e974c + version: 3.1.1.dev0 requires_dist: - - werkzeug>=3.0.0 + - werkzeug>=3.1 - jinja2>=3.1.2 - - itsdangerous>=2.1.2 + - itsdangerous>=2.2 - click>=8.1.3 - - blinker>=1.6.2 - - importlib-metadata>=3.6.0 ; python_full_version < '3.10' + - blinker>=1.9 + - importlib-metadata>=3.6 ; python_full_version < '3.10' - asgiref>=3.2 ; extra == 'async' - python-dotenv ; extra == 'dotenv' - requires_python: '>=3.8' -- kind: pypi + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl name: idna - version: '3.8' - url: https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl - sha256: 050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac + version: '3.10' + sha256: 946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 + requires_dist: + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' + - flake8>=7.1.1 ; extra == 'all' requires_python: '>=3.6' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl name: iniconfig version: 2.0.0 - url: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl sha256: b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 requires_python: '>=3.7' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl name: itsdangerous version: 2.2.0 - url: https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl sha256: c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef requires_python: '>=3.8' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl name: jinja2 version: 3.1.4 - url: https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl sha256: bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d requires_dist: - markupsafe>=2.0 - babel>=2.7 ; extra == 'i18n' requires_python: '>=3.7' -- kind: conda - name: ld_impl_linux-64 - version: '2.40' - build: hf3520f5_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - sha256: 764b6950aceaaad0c67ef925417594dd14cd2e22fff864aeef455ac259263d15 - md5: b80f2f396ca2c28b8c14c437a4ed1e74 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 constrains: - - binutils_impl_linux-64 2.40 + - binutils_impl_linux-64 2.43 license: GPL-3.0-only license_family: GPL purls: [] - size: 707602 - timestamp: 1718625640445 -- kind: conda - name: libexpat - version: 2.6.2 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 - md5: e7ba12deb7020dd080c6c70e7b6f6a3d + size: 669211 + timestamp: 1729655358674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c depends: - - libgcc-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 constrains: - - expat 2.6.2.* + - expat 2.6.4.* license: MIT license_family: MIT purls: [] - size: 73730 - timestamp: 1710362120304 -- kind: conda - name: libexpat - version: 2.6.2 - build: h63175ca_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 - md5: bc592d03f62779511d392c175dcece64 + size: 73304 + timestamp: 1730967041968 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda + sha256: d10f43d0c5df6c8cf55259bce0fe14d2377eed625956cddce06f58827d288c59 + md5: 20307f4049a735a78a29073be1be2626 + depends: + - __osx >=10.13 constrains: - - expat 2.6.2.* + - expat 2.6.4.* license: MIT license_family: MIT purls: [] - size: 139224 - timestamp: 1710362609641 -- kind: conda - name: libexpat - version: 2.6.2 - build: h73e2aa4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - sha256: a188a77b275d61159a32ab547f7d17892226e7dac4518d2c6ac3ac8fc8dfde92 - md5: 3d1d51c8f716d97c864d12f7af329526 + size: 70758 + timestamp: 1730967204736 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 constrains: - - expat 2.6.2.* + - expat 2.6.4.* license: MIT license_family: MIT purls: [] - size: 69246 - timestamp: 1710362566073 -- kind: conda - name: libexpat - version: 2.6.2 - build: hebf3989_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - sha256: ba7173ac30064ea901a4c9fb5a51846dcc25512ceb565759be7d18cbf3e5415e - md5: e3cde7cfa87f82f7cb13d482d5e0ad09 + size: 64693 + timestamp: 1730967175868 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + sha256: 0c0447bf20d1013d5603499de93a16b6faa92d7ead870d96305c0f065b6a5a12 + md5: eb383771c680aa792feb529eaf9df82f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - - expat 2.6.2.* + - expat 2.6.4.* license: MIT license_family: MIT purls: [] - size: 63655 - timestamp: 1710362424980 -- kind: conda - name: libffi - version: 3.4.2 - build: h0d85af4_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + size: 139068 + timestamp: 1730967442102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 58292 + timestamp: 1636488182923 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f md5: ccb34fb14960ad8b125962d3d79b31a9 license: MIT @@ -488,13 +421,7 @@ packages: purls: [] size: 51348 timestamp: 1636488394370 -- kind: conda - name: libffi - version: 3.4.2 - build: h3422bc3_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca md5: 086914b672be056eb70fd4285b6783b6 license: MIT @@ -502,29 +429,7 @@ packages: purls: [] size: 39020 timestamp: 1636488587153 -- kind: conda - name: libffi - version: 3.4.2 - build: h7f98852_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - purls: [] - size: 58292 - timestamp: 1636488182923 -- kind: conda - name: libffi - version: 3.4.2 - build: h8ffe710_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 md5: 2c96d1b6915b408893f9472569dee135 depends: @@ -535,140 +440,126 @@ packages: purls: [] size: 42063 timestamp: 1636489106777 -- kind: conda - name: libgcc - version: 14.1.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda - sha256: 10fa74b69266a2be7b96db881e18fa62cfa03082b65231e8d652e897c4b335a3 - md5: 002ef4463dd1e2b44a94a4ace468f5d2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df depends: - _libgcc_mutex 0.1 conda_forge - _openmp_mutex >=4.5 constrains: - - libgomp 14.1.0 h77fa898_1 - - libgcc-ng ==14.1.0=*_1 + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 846380 - timestamp: 1724801836552 -- kind: conda - name: libgcc-ng - version: 14.1.0 - build: h69a702a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda - sha256: b91f7021e14c3d5c840fbf0dc75370d6e1f7c7ff4482220940eaafb9c64613b7 - md5: 1efc0ad219877a73ef977af7dbb51f17 + size: 848745 + timestamp: 1729027721139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b depends: - - libgcc 14.1.0 h77fa898_1 + - libgcc 14.2.0 h77fa898_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 52170 - timestamp: 1724801842101 -- kind: conda - name: libgomp - version: 14.1.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - sha256: c96724c8ae4ee61af7674c5d9e5a3fbcf6cd887a40ad5a52c99aa36f1d4f9680 - md5: 23c255b008c4f2ae008f81edcabaca89 + size: 54142 + timestamp: 1729027726517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 depends: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 460218 - timestamp: 1724801743478 -- kind: conda - name: libnsl - version: 2.0.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 - md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + size: 460992 + timestamp: 1729027639220 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + sha256: d02d1d3304ecaf5c728e515eb7416517a0b118200cd5eacbe829c432d1664070 + md5: aeb98fdeb2e8f25d43ef71fbacbeec80 depends: + - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - license: LGPL-2.1-only - license_family: GPL + license: BSD-2-Clause + license_family: BSD purls: [] - size: 33408 - timestamp: 1697359010159 -- kind: conda - name: libsqlite - version: 3.46.0 - build: h1b8f9f3_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda - sha256: 63af1a9e3284c7e4952364bafe7267e41e2d9d8bcc0e85a4ea4b0ec02d3693f6 - md5: 5dadfbc1a567fe6e475df4ce3148be09 + size: 89991 + timestamp: 1723817448345 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + sha256: 791be3d30d8e37ec49bcc23eb8f1e1415d911a7c023fa93685f2ea485179e258 + md5: ed625b2e59dff82859c23dd24774156b depends: - __osx >=10.13 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense + license: BSD-2-Clause + license_family: BSD purls: [] - size: 908643 - timestamp: 1718050720117 -- kind: conda - name: libsqlite - version: 3.46.0 - build: h2466b09_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.0-h2466b09_0.conda - sha256: 662bd7e0d63c5b8c31cca19b91649e798319b93568a2ba8d1375efb91eeb251b - md5: 951b0a3a463932e17414cd9f047fa03d + size: 76561 + timestamp: 1723817691512 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + sha256: f7917de9117d3a5fe12a39e185c7ce424f8d5010a6f97b4333e8a1dcb2889d16 + md5: 7476305c35dd9acef48da8f754eedb40 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 69263 + timestamp: 1723817629767 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 88657 + timestamp: 1723861474602 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 + md5: b6f02b52a174e612e89548f4663ce56a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 876677 - timestamp: 1718051113874 -- kind: conda - name: libsqlite - version: 3.46.0 - build: hde9e2c9_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 - md5: 18aa975d2094c34aef978060ae7da7d8 + size: 875349 + timestamp: 1730208050020 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + sha256: a0f7381c867898a45018b1e5cf1aca68659d292d58252e8f489a4270b010fed8 + md5: af445c495253a871c3d809e1199bb12b depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0a0 + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 license: Unlicense purls: [] - size: 865346 - timestamp: 1718050628718 -- kind: conda - name: libsqlite - version: 3.46.0 - build: hfb93653_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda - sha256: 73048f9cb8647d3d3bfe6021c0b7d663e12cffbe9b4f31bd081e713b0a9ad8f9 - md5: 12300188028c9bc02da965128b91b517 + size: 915300 + timestamp: 1730208101739 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + sha256: 5a96caa566c11e5a5ebdcdb86a0759a7fb27d3c5f42e6a0fd0d6023c1e935d9e + md5: 07a14fbe439eef078cc479deca321161 depends: - __osx >=11.0 - - libzlib >=1.2.13,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 837683 + timestamp: 1730208293578 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda + sha256: 3342d6fe787f5830f7e8466d9c65c914bfd8d67220fb5673041b338cbba47afe + md5: 5b1f36012cc3d09c4eb9f24ad0e2c379 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Unlicense purls: [] - size: 830198 - timestamp: 1718050644825 -- kind: conda - name: libuuid - version: 2.38.1 - build: h0b41bf4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + size: 892175 + timestamp: 1730208431651 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b depends: @@ -678,99 +569,60 @@ packages: purls: [] size: 33601 timestamp: 1680112270483 -- kind: conda - name: libxcrypt - version: 4.4.36 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 100393 - timestamp: 1702724383534 -- kind: conda - name: libzlib - version: 1.3.1 - build: h2466b09_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda - sha256: b13846a54a15243e15f96fec06b526d8155adc6a1ac2b6ed47a88f6a71a94b68 - md5: d4483ca8afc57ddf1f6dded53b36c17f - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 constrains: - - zlib 1.3.1 *_1 + - zlib 1.3.1 *_2 license: Zlib license_family: Other purls: [] - size: 56186 - timestamp: 1716874730539 -- kind: conda - name: libzlib - version: 1.3.1 - build: h4ab18f5_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d - md5: 57d7dc60e9325e3de37ff8dffd18e814 + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da depends: - - libgcc-ng >=12 + - __osx >=10.13 constrains: - - zlib 1.3.1 *_1 + - zlib 1.3.1 *_2 license: Zlib license_family: Other purls: [] - size: 61574 - timestamp: 1716874187109 -- kind: conda - name: libzlib - version: 1.3.1 - build: h87427d6_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda - sha256: 80a62db652b1da0ccc100812a1d86e94f75028968991bfb17f9536f3aa72d91d - md5: b7575b5aa92108dcc9aaab0f05f2dbce + size: 57133 + timestamp: 1727963183990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 depends: - - __osx >=10.13 + - __osx >=11.0 constrains: - - zlib 1.3.1 *_1 + - zlib 1.3.1 *_2 license: Zlib license_family: Other purls: [] - size: 57372 - timestamp: 1716874211519 -- kind: conda - name: libzlib - version: 1.3.1 - build: hfb2fe0b_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - sha256: c34365dd37b0eab27b9693af32a1f7f284955517c2cc91f1b88a7ef4738ff03e - md5: 636077128927cf79fd933276dc3aed47 + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 depends: - - __osx >=11.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - - zlib 1.3.1 *_1 + - zlib 1.3.1 *_2 license: Zlib license_family: Other purls: [] - size: 46921 - timestamp: 1716874262512 -- kind: pypi + size: 55476 + timestamp: 1727963768015 +- pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl name: markdown-it-py version: 3.0.0 - url: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl sha256: 355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 requires_dist: - mdurl~=0.1 @@ -799,64 +651,37 @@ packages: - pytest-cov ; extra == 'testing' - pytest-regressions ; extra == 'testing' requires_python: '>=3.8' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: markupsafe - version: 2.1.5 - url: https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 - requires_python: '>=3.7' -- kind: pypi + version: 3.0.2 + sha256: 15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl name: markupsafe - version: 2.1.5 - url: https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl - sha256: 823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb - requires_python: '>=3.7' -- kind: pypi + version: 3.0.2 + sha256: e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl name: markupsafe - version: 2.1.5 - url: https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl - sha256: 3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 - requires_python: '>=3.7' -- kind: pypi + version: 3.0.2 + sha256: f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl name: markupsafe - version: 2.1.5 - url: https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl - sha256: 8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 - requires_python: '>=3.7' -- kind: pypi + version: 3.0.2 + sha256: ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl name: mdurl version: 0.1.2 - url: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 requires_python: '>=3.7' -- kind: pypi +- pypi: ./minimal-project name: minimal-project version: '0.1' - path: ./minimal-project sha256: 590cda021c427ceaff15b4aa13245e6fd493b6ffb759c0a017f5d1b485b75c57 editable: true -- kind: conda - name: ncurses - version: '6.5' - build: h7bae524_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc - md5: cb2b0ea909b97b3d70cd3921d1445e1a - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - purls: [] - size: 802321 - timestamp: 1724658775723 -- kind: conda - name: ncurses - version: '6.5' - build: he02047a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a md5: 70caf8bb6cf39a0b6b7efc885f51c0fe depends: @@ -866,13 +691,7 @@ packages: purls: [] size: 889086 timestamp: 1724658547447 -- kind: conda - name: ncurses - version: '6.5' - build: hf036a51_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af md5: e102bbf8a6ceeaf429deab8032fc8977 depends: @@ -881,87 +700,70 @@ packages: purls: [] size: 822066 timestamp: 1724658603042 -- kind: conda - name: openssl - version: 3.3.1 - build: h2466b09_3 - build_number: 3 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_3.conda - sha256: 76a10564ca450f56495cff06bf60bdf0fe42e6ef7a20469276894d4ac7c0140a - md5: c6ebd3a1a2b393e040ca71c9f9ef8d97 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc + md5: cb2b0ea909b97b3d70cd3921d1445e1a depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 802321 + timestamp: 1724658775723 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 + md5: 23cc74f77eb99315c0360ec3533147a9 + depends: + - __glibc >=2.17,<3.0.a0 - ca-certificates - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - libgcc >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 8362062 - timestamp: 1724404916759 -- kind: conda - name: openssl - version: 3.3.1 - build: h8359307_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda - sha256: 9dd1ee7a8c21ff4fcbb98e9d0be0e83e5daf8a555c73589ad9e3046966b72e5e - md5: 644904d696d83c0ac78d594e0cf09f66 + size: 2947466 + timestamp: 1731377666602 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + sha256: ba7e068ed469d6625e32ae60e6ad893e655b6695280dadf7e065ed0b6f3b885c + md5: ec99d2ce0b3033a75cbad01bbc7c5b71 depends: - - __osx >=11.0 + - __osx >=10.13 - ca-certificates license: Apache-2.0 license_family: Apache purls: [] - size: 2888820 - timestamp: 1724402552318 -- kind: conda - name: openssl - version: 3.3.1 - build: hb9d3cd8_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda - sha256: 9e27441b273a7cf9071f6e88ba9ad565d926d8083b154c64a74b99fba167b137 - md5: 6c566a46baae794daf34775d41eb180a + size: 2590683 + timestamp: 1731378034404 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + sha256: bd1d58ced46e75efa3b842c61642fd12272c69e9fe4d7261078bc082153a1d53 + md5: df307bbc703324722df0293c9ca2e418 depends: - - __glibc >=2.17,<3.0.a0 + - __osx >=11.0 - ca-certificates - - libgcc-ng >=13 license: Apache-2.0 license_family: Apache purls: [] - size: 2892042 - timestamp: 1724402701933 -- kind: conda - name: openssl - version: 3.3.1 - build: hd23fc13_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-hd23fc13_3.conda - sha256: 63921822fbb66337e0fd50b2a07412583fbe7783bc92c663bdf93c9a09026fdc - md5: ad8c8c9556a701817bd1aca75a302e96 + size: 2935176 + timestamp: 1731377561525 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + sha256: e03045a0837e01ff5c75e9273a572553e7522290799807f918c917a9826a6484 + md5: d0d805d9b5524a14efb51b3bff965e83 depends: - - __osx >=10.13 - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache purls: [] - size: 2549881 - timestamp: 1724403015051 -- kind: pypi + size: 8491156 + timestamp: 1731379715927 +- pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl name: packaging - version: '24.1' - url: https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl - sha256: 5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 + version: '24.2' + sha256: 09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 requires_python: '>=3.8' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl name: pluggy version: 1.5.0 - url: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl sha256: 44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 requires_dist: - pre-commit ; extra == 'dev' @@ -969,25 +771,23 @@ packages: - pytest ; extra == 'testing' - pytest-benchmark ; extra == 'testing' requires_python: '>=3.8' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl name: pygments version: 2.18.0 - url: https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl sha256: b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a requires_dist: - colorama>=0.4.6 ; extra == 'windows-terminal' requires_python: '>=3.8' -- kind: pypi +- pypi: git+https://github.com/pytest-dev/pytest.git@9d4f36d87dae9a968fb527e2cb87e8a507b0beb3 name: pytest - version: 8.4.0.dev54+gc947145fb - url: git+https://github.com/pytest-dev/pytest.git@c947145fbb4aeec810a259b19f70fcb52fd53ad4 + version: 8.4.0.dev250+g9d4f36d87 requires_dist: + - colorama ; sys_platform == 'win32' + - exceptiongroup>=1.0.0rc8 ; python_full_version < '3.11' - iniconfig - packaging - - pluggy<2,>=1.5 - - exceptiongroup>=1.0.0rc8 ; python_full_version < '3.11' + - pluggy>=1.5,<2 - tomli>=1 ; python_full_version < '3.11' - - colorama ; sys_platform == 'win32' - argcomplete ; extra == 'dev' - attrs>=19.2 ; extra == 'dev' - hypothesis>=3.56 ; extra == 'dev' @@ -996,127 +796,147 @@ packages: - requests ; extra == 'dev' - setuptools ; extra == 'dev' - xmlschema ; extra == 'dev' - requires_python: '>=3.8' -- kind: conda - name: python - version: 3.12.5 - build: h2ad013b_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda - sha256: e2aad83838988725d4ffba4e9717b9328054fd18a668cff3377e0c50f109e8bd - md5: 9c56c4df45f6571b13111d8df2448692 + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.0-h9ebbce0_101_cp313.conda + build_number: 101 + sha256: 66a7997b24b2dca636df11402abec7bd2199ddf6971eb47a3ee6b1d27d4faee9 + md5: f4fea9d5bb3f2e61a39950a7ab70ee4e depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.2,<3.0a0 + - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.46.0,<4.0a0 + - libgcc >=13 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.3.1,<4.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 license: Python-2.0 purls: [] - size: 31663253 - timestamp: 1723143721353 -- kind: conda - name: python - version: 3.12.5 - build: h30c5eda_0_cpython - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.5-h30c5eda_0_cpython.conda - sha256: 1319e918fb54c9491832a9731cad00235a76f61c6f9b23fc0f70cdfb74c950ea - md5: 5e315581e2948dfe3bcac306540e9803 + size: 33054218 + timestamp: 1732736838043 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.13.0-h3a8ca6c_101_cp313.conda + build_number: 101 + sha256: c8b23bbdcd0e4f24fed2028cba20bd81325a4220439c1b8e6b06694f16642a2c + md5: 0acea4c3eee2454fd642d1a4eafa2943 depends: - - __osx >=11.0 + - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 + - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.0,<4.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.3.1,<4.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 license: Python-2.0 purls: [] - size: 12926356 - timestamp: 1723142203193 -- kind: conda - name: python - version: 3.12.5 - build: h37a9e06_0_cpython - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.5-h37a9e06_0_cpython.conda - sha256: c0f39e625b2fd65f70a9cc086fe4b25cc72228453dbbcd92cd5d140d080e38c5 - md5: 517cb4e16466f8d96ba2a72897d14c48 + size: 13941305 + timestamp: 1732736712289 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.0-hbbac1ca_101_cp313.conda + build_number: 101 + sha256: 742544a4cf9a10cf2c16d35d96fb696c27d58b9df0cc29fbef5629283aeca941 + md5: e972e146a1e0cfb1f26da42cb6f6648c depends: - - __osx >=10.13 + - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 + - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.0,<4.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.3.1,<4.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 license: Python-2.0 purls: [] - size: 12173272 - timestamp: 1723142761765 -- kind: conda - name: python - version: 3.12.5 - build: h889d299_0_cpython - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.5-h889d299_0_cpython.conda - sha256: 4cef304eb8877fd3094c14b57097ccc1b817b4afbf2223dd45d2b61e44064740 - md5: db056d8b140ab2edd56a2f9bdb203dcd + size: 12806496 + timestamp: 1732735488999 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.13.0-hf5aa216_101_cp313.conda + build_number: 101 + sha256: b8eba57bd86c7890b27e67b477b52b5bd547946c354f29b9dbbc70ad83f2863b + md5: 158d6077a635cf0c0c23bec3955a4833 depends: - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 + - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.0,<4.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.1,<4.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 license: Python-2.0 purls: [] - size: 15897752 - timestamp: 1723141830317 -- kind: conda - name: readline - version: '8.2' - build: h8228510_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + size: 16697406 + timestamp: 1732734725404 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 438225b241c5f9bddae6f0178a97f5870a89ecf927dfca54753e689907331442 + md5: 381bbd2a92c863f640a55b6ff3c35161 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6217 + timestamp: 1723823393322 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 075ad768648e88b78d2a94099563b43d3082e7c35979f457164f26d1079b7b5c + md5: 927a2186f1f997ac018d67c4eece90a6 + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6291 + timestamp: 1723823083064 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 4437198eae80310f40b23ae2f8a9e0a7e5c2b9ae411a8621eb03d87273666199 + md5: b8e82d0a5c1664638f87f63cc5d241fb + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6322 + timestamp: 1723823058879 +- conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 0c12cc1b84962444002c699ed21e815fb9f686f950d734332a1b74d07db97756 + md5: 44b4fe6f22b57103afb2299935c8b68e + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6716 + timestamp: 1723823166911 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 md5: 47d31b792659ce70f470b5c82fdfb7a4 depends: @@ -1127,68 +947,59 @@ packages: purls: [] size: 281456 timestamp: 1679532220005 -- kind: conda - name: readline - version: '8.2' - build: h92ec313_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 - md5: 8cbb776a2f641b943d413b3e19df71f4 +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + md5: f17f77f2acf4d344734bda76829ce14e depends: - ncurses >=6.3,<7.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 250351 - timestamp: 1679532511311 -- kind: conda - name: readline - version: '8.2' - build: h9e318b2_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 - md5: f17f77f2acf4d344734bda76829ce14e + size: 255870 + timestamp: 1679532707590 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 depends: - ncurses >=6.3,<7.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 255870 - timestamp: 1679532707590 -- kind: pypi + size: 250351 + timestamp: 1679532511311 +- pypi: git+https://github.com/psf/requests.git@147c8511ddbfa5e8f71bbf5c18ede0c4ceb3bba4 name: requests version: 2.31.0 - url: git+https://github.com/psf/requests.git@0106aced5faa299e6ede89d1230bd6784f2c3660 requires_dist: - - charset-normalizer<4,>=2 - - idna<4,>=2.5 - - urllib3<3,>=1.21.1 + - charset-normalizer>=2,<4 + - idna>=2.5,<4 + - urllib3>=1.21.1,<3 - certifi>=2017.4.17 - - pysocks!=1.5.7,>=1.5.6 ; extra == 'socks' - - chardet<6,>=3.0.2 ; extra == 'use-chardet-on-py3' + - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' + - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3' requires_python: '>=3.7' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl name: rich - version: 13.8.0 - url: https://files.pythonhosted.org/packages/c7/d9/c2a126eeae791e90ea099d05cb0515feea3688474b978343f3cdcfe04523/rich-13.8.0-py3-none-any.whl - sha256: 2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc + version: 13.9.4 + sha256: 6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90 requires_dist: - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' - markdown-it-py>=2.2.0 - pygments>=2.13.0,<3.0.0 - - typing-extensions>=4.0.0,<5.0 ; python_full_version < '3.9' - requires_python: '>=3.7.0' -- kind: conda - name: tk - version: 8.6.13 - build: h1abcd95_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - typing-extensions>=4.0.0,<5.0 ; python_full_version < '3.11' + requires_python: '>=3.8.0' +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 md5: bf830ba5afc507c6232d4ef0fb1a882d depends: @@ -1198,13 +1009,7 @@ packages: purls: [] size: 3270220 timestamp: 1699202389792 -- kind: conda - name: tk - version: 8.6.13 - build: h5083fa2_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 md5: b50a57ba89c32b62428b71a875291c9b depends: @@ -1214,13 +1019,7 @@ packages: purls: [] size: 3145523 timestamp: 1699202432999 -- kind: conda - name: tk - version: 8.6.13 - build: h5226925_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 md5: fc048363eb8f03cd1737600a5d08aafe depends: @@ -1232,131 +1031,76 @@ packages: purls: [] size: 3503410 timestamp: 1699202577803 -- kind: conda - name: tk - version: 8.6.13 - build: noxft_h4845f30_101 - build_number: 101 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3318875 - timestamp: 1699202167581 -- kind: conda - name: tzdata - version: 2024a - build: h8827d51_1 - build_number: 1 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - sha256: 7d21c95f61319dba9209ca17d1935e6128af4235a67ee4e57a00908a1450081e - md5: 8bfdead4e0fff0383ae4c9c50d0531bd +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 license: LicenseRef-Public-Domain purls: [] - size: 124164 - timestamp: 1724736371498 -- kind: conda - name: ucrt - version: 10.0.22621.0 - build: h57928b3_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 - md5: 72608f6cd3e5898229c3ea16deb1ac43 + size: 122354 + timestamp: 1728047496079 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 constrains: - vs2015_runtime >=14.29.30037 - license: LicenseRef-Proprietary - license_family: PROPRIETARY + license: LicenseRef-MicrosoftWindowsSDK10 purls: [] - size: 1283972 - timestamp: 1666630199266 -- kind: pypi + size: 559710 + timestamp: 1728377334097 +- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl name: urllib3 - version: 2.2.2 - url: https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl - sha256: a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 + version: 2.2.3 + sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac requires_dist: - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' - - h2<5,>=4 ; extra == 'h2' - - pysocks!=1.5.7,<2.0,>=1.5.6 ; extra == 'socks' + - h2>=4,<5 ; extra == 'h2' + - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - zstandard>=0.18.0 ; extra == 'zstd' requires_python: '>=3.8' -- kind: conda - name: vc - version: '14.3' - build: h8a93ad2_20 - build_number: 20 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - sha256: 23ac5feb15a9adf3ab2b8c4dcd63650f8b7ae860c5ceb073e49cf71d203eddef - md5: 8558f367e1d7700554f7cdb823c46faf +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + sha256: 986ddaf8feec2904eac9535a7ddb7acda1a1dfb9482088fdb8129f1595181663 + md5: 7c10ec3158d1eb4ddff7007c9101adb0 depends: - - vc14_runtime >=14.40.33810 + - vc14_runtime >=14.38.33135 track_features: - vc14 license: BSD-3-Clause license_family: BSD purls: [] - size: 17391 - timestamp: 1717709040616 -- kind: conda - name: vc14_runtime - version: 14.40.33810 - build: hcc2c482_20 - build_number: 20 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda - sha256: bba8daa6f78b26b48fb7e1377eb52160e25495710bf53146c5f405bd50565982 - md5: ad33c7cd933d69b9dee0f48317cdf137 + size: 17479 + timestamp: 1731710827215 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + sha256: c483b090c4251a260aba6ff3e83a307bcfb5fb24ad7ced872ab5d02971bd3a49 + md5: 32b37d0cfa80da34548501cdc913a832 depends: - ucrt >=10.0.20348.0 constrains: - - vs2015_runtime 14.40.33810.* *_20 - license: LicenseRef-ProprietaryMicrosoft + - vs2015_runtime 14.42.34433.* *_23 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary purls: [] - size: 751028 - timestamp: 1724712684919 -- kind: conda - name: vs2015_runtime - version: 14.40.33810 - build: h3bf8584_20 - build_number: 20 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda - sha256: 0c2803f7a788c51f28235a7228dc2ab3f107b4b16ab0845a3e595c8c51e50a7a - md5: c21f1b4a3a30bbc3ef35a50957578e0e + size: 754247 + timestamp: 1731710681163 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + sha256: 568ce8151eaae256f1cef752fc78651ad7a86ff05153cc7a4740b52ae6536118 + md5: 5c176975ca2b8366abad3c97b3cd1e83 depends: - - vc14_runtime >=14.40.33810 + - vc14_runtime >=14.42.34433 license: BSD-3-Clause license_family: BSD purls: [] - size: 17395 - timestamp: 1717709043353 -- kind: pypi + size: 17572 + timestamp: 1731710685291 +- pypi: https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl name: werkzeug - version: 3.0.4 - url: https://files.pythonhosted.org/packages/4b/84/997bbf7c2bf2dc3f09565c6d0b4959fefe5355c18c4096cfd26d83e0785b/werkzeug-3.0.4-py3-none-any.whl - sha256: 02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c + version: 3.1.3 + sha256: 54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e requires_dist: - markupsafe>=2.1.1 - watchdog>=2.3 ; extra == 'watchdog' - requires_python: '>=3.8' -- kind: conda - name: xz - version: 5.2.6 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 md5: 2161070d867d1b1204ea749c8eec4ef0 depends: @@ -1365,36 +1109,21 @@ packages: purls: [] size: 418368 timestamp: 1660346797927 -- kind: conda - name: xz - version: 5.2.6 - build: h57fd34a_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 235693 - timestamp: 1660346961024 -- kind: conda - name: xz - version: 5.2.6 - build: h775f41a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 md5: a72f9d4ea13d55d745ff1ed594747f10 license: LGPL-2.1 and GPL-2.0 purls: [] size: 238119 timestamp: 1660346964847 -- kind: conda - name: xz - version: 5.2.6 - build: h8d14728_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec + md5: 39c6b54e94014701dd157f4f576ed211 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 235693 + timestamp: 1660346961024 +- conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 md5: 515d77642eaa3639413c6b1bc3f94219 depends: diff --git a/examples/pypi-source-deps/pixi.toml b/examples/pypi-source-deps/pixi.toml index c3d949727..71f46e0d6 100644 --- a/examples/pypi-source-deps/pixi.toml +++ b/examples/pypi-source-deps/pixi.toml @@ -23,7 +23,7 @@ rich = "~=13.7" # With https flask = { git = "https://github.com/pallets/flask" } -requests = { git = "https://github.com/psf/requests.git", rev = "0106aced5faa299e6ede89d1230bd6784f2c3660" } +requests = { git = "https://github.com/psf/requests.git", rev = "147c8511ddbfa5e8f71bbf5c18ede0c4ceb3bba4" } # TODO: will support later -> or use branch = '' or tag = '' to specify a branch or tag # You can also directly add a source dependency from file diff --git a/src/cli/project/export/snapshots/pixi__cli__project__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap b/src/cli/project/export/snapshots/pixi__cli__project__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap index 49f0171f5..ed31217c2 100644 --- a/src/cli/project/export/snapshots/pixi__cli__project__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap +++ b/src/cli/project/export/snapshots/pixi__cli__project__export__conda_environment__tests__test_export_conda_env_yaml_with_source_editable.snap @@ -12,7 +12,7 @@ dependencies: - pip: - rich~=13.7 - flask @ git+https://github.com/pallets/flask - - requests @ git+https://github.com/psf/requests.git@0106aced5faa299e6ede89d1230bd6784f2c3660 + - requests @ git+https://github.com/psf/requests.git@147c8511ddbfa5e8f71bbf5c18ede0c4ceb3bba4 - -e ./minimal-project - click @ https://github.com/pallets/click/releases/download/8.1.7/click-8.1.7-py3-none-any.whl - pytest @ git+https://github.com/pytest-dev/pytest.git diff --git a/src/install_pypi/conversions.rs b/src/install_pypi/conversions.rs index 6084f4295..2e7750088 100644 --- a/src/install_pypi/conversions.rs +++ b/src/install_pypi/conversions.rs @@ -120,7 +120,6 @@ pub fn convert_to_dist( filename_decoded.as_ref(), pkg.requires_python.clone(), )?; - // Recreate the filename from the extracted last component // If this errors this is not a valid wheel filename // and we should consider it a sdist diff --git a/src/install_pypi/mod.rs b/src/install_pypi/mod.rs index 21c7ac08f..284e7c59d 100644 --- a/src/install_pypi/mod.rs +++ b/src/install_pypi/mod.rs @@ -295,7 +295,7 @@ pub async fn update_python_distributions( } // Download, build, and unzip any missing distributions. - let wheels = if remote.is_empty() { + let remote_dists = if remote.is_empty() { Vec::new() } else { let start = std::time::Instant::now(); @@ -328,7 +328,7 @@ pub async fn update_python_distributions( ) .with_reporter(UvReporter::new(options)); - let wheels = preparer + let remote_dists = preparer .prepare( remote.iter().map(|(d, _)| d.clone()).collect(), &uv_context.in_flight, @@ -337,17 +337,17 @@ pub async fn update_python_distributions( .into_diagnostic() .context("Failed to prepare distributions")?; - let s = if wheels.len() == 1 { "" } else { "s" }; + let s = if remote_dists.len() == 1 { "" } else { "s" }; tracing::info!( "{}", format!( "Prepared {} in {}", - format!("{} package{}", wheels.len(), s), + format!("{} package{}", remote_dists.len(), s), elapsed(start.elapsed()) ) ); - wheels + remote_dists }; // Remove any unnecessary packages. @@ -408,8 +408,12 @@ pub async fn update_python_distributions( } // Install the resolved distributions. - let local_iter = local.iter().map(|(d, _)| d.clone()); - let wheels = wheels.into_iter().chain(local_iter).collect::>(); + // At this point we have all the wheels we need to install available to link locally + let local_dists = local.iter().map(|(d, _)| d.clone()); + let all_dists = remote_dists + .into_iter() + .chain(local_dists) + .collect::>(); // Figure what wheels needed to be re-installed because of an installer mismatch // we want to handle these somewhat differently and warn the user about them @@ -427,7 +431,7 @@ pub async fn update_python_distributions( // Verify if pypi wheels will override existing conda packages // and warn if they are if let Ok(Some(clobber_packages)) = - pypi_conda_clobber.clobber_on_installation(wheels.clone(), &venv) + pypi_conda_clobber.clobber_on_installation(all_dists.clone(), &venv) { let packages_names = clobber_packages.iter().join(", "); @@ -452,27 +456,27 @@ pub async fn update_python_distributions( } let options = UvReporterOptions::new() - .with_length(wheels.len() as u64) - .with_capacity(wheels.len() + 30) - .with_starting_tasks(wheels.iter().map(|d| format!("{}", d.name()))) + .with_length(all_dists.len() as u64) + .with_capacity(all_dists.len() + 30) + .with_starting_tasks(all_dists.iter().map(|d| format!("{}", d.name()))) .with_top_level_message("Installing distributions"); - if !wheels.is_empty() { + if !all_dists.is_empty() { let start = std::time::Instant::now(); uv_installer::Installer::new(&venv) .with_link_mode(LinkMode::default()) .with_installer_name(Some(consts::PIXI_UV_INSTALLER.to_string())) .with_reporter(UvReporter::new(options)) - .install(wheels.clone()) + .install(all_dists.clone()) .await .unwrap(); - let s = if wheels.len() == 1 { "" } else { "s" }; + let s = if all_dists.len() == 1 { "" } else { "s" }; tracing::info!( "{}", format!( "Installed {} in {}", - format!("{} package{}", wheels.len(), s), + format!("{} package{}", all_dists.len(), s), elapsed(start.elapsed()) ) ); diff --git a/src/install_pypi/plan.rs b/src/install_pypi/plan/mod.rs similarity index 77% rename from src/install_pypi/plan.rs rename to src/install_pypi/plan/mod.rs index d36f53d68..f9bd3e06e 100644 --- a/src/install_pypi/plan.rs +++ b/src/install_pypi/plan/mod.rs @@ -19,6 +19,9 @@ use super::{ utils::{check_url_freshness, strip_direct_scheme}, }; +#[cfg(test)] +mod test; + #[derive(Debug)] pub enum InstallReason { /// Reinstall a package from the local cache, will link from the cache @@ -116,8 +119,13 @@ pub(crate) enum NeedReinstall { SourceDirectoryNewerThanCache, /// Url file parse error UnableToParseFileUrl { url: String }, + /// Unable to convert locked directory to a url + UnableToConvertLockedPath { path: String }, /// The editable status of the installed wheel changed with regards to the locked version - EditableStatusChanged { is_now_editable: bool }, + EditableStatusChanged { + locked_editable: bool, + installed_editable: bool, + }, /// Somehow unable to parse the installed dist url UnableToParseInstalledDistUrl { url: String }, /// Archive is newer than the cache @@ -132,14 +140,19 @@ pub(crate) enum NeedReinstall { /// Unable to parse the installed git url UnableToParseGitUrl { url: String }, /// Unable to get the installed dist metadata, something is definitely broken - UnableToGetInstalledDistMetadata, + UnableToGetInstalledDistMetadata { cause: String }, /// The requires-python is different than the installed version RequiredPythonChanged { - installed_python_version: uv_pep440::VersionSpecifiers, + installed_python_require: uv_pep440::VersionSpecifiers, locked_python_version: uv_pep440::Version, }, /// Re-installing because of an installer mismatch, but we are managing the package InstallerMismatch { previous_installer: String }, + /// The installed url does not match the locked url + UrlMismatch { + installed_url: String, + locked_url: Option, + }, } impl std::fmt::Display for NeedReinstall { @@ -160,11 +173,14 @@ impl std::fmt::Display for NeedReinstall { NeedReinstall::UnableToParseFileUrl { url } => { write!(f, "Unable to parse file url: {}", url) } - NeedReinstall::EditableStatusChanged { is_now_editable } => { + NeedReinstall::EditableStatusChanged { + locked_editable, + installed_editable, + } => { write!( f, - "Editable status changed, editable status is: {}", - is_now_editable + "Editable status changed, editable status is: {} installed editable is: {}", + locked_editable, installed_editable ) } NeedReinstall::UnableToParseInstalledDistUrl { url } => { @@ -185,11 +201,11 @@ impl std::fmt::Display for NeedReinstall { NeedReinstall::UnableToParseGitUrl { url } => { write!(f, "Unable to parse git url: {}", url) } - NeedReinstall::UnableToGetInstalledDistMetadata => { - write!(f, "Unable to get installed dist metadata") + NeedReinstall::UnableToGetInstalledDistMetadata { cause } => { + write!(f, "Unable to get installed dist metadata: {}", cause) } NeedReinstall::RequiredPythonChanged { - installed_python_version, + installed_python_require: installed_python_version, locked_python_version, } => { write!( @@ -205,6 +221,18 @@ impl std::fmt::Display for NeedReinstall { previous_installer ) } + NeedReinstall::UrlMismatch { + installed_url, + locked_url, + } => write!( + f, + "Installed url {} does not match locked url {}", + installed_url, + locked_url.clone().unwrap_or_else(|| "None".to_string()) + ), + NeedReinstall::UnableToConvertLockedPath { path } => { + write!(f, "Unable to convert locked path to url: {}", path) + } } } } @@ -221,6 +249,7 @@ fn need_reinstall( installed: &InstalledDist, locked: &PypiPackageData, python_version: &uv_pep440::Version, + lock_file_dir: &Path, ) -> miette::Result { // Check if the installed version is the same as the required version match installed { @@ -259,14 +288,50 @@ fn need_reinstall( let result = Url::parse(&url); match result { Ok(url) => { + // Convert the locked location, which can be a path or a url, to a url + let locked_url = match &locked.location { + // Fine if it is already a url + UrlOrPath::Url(url) => url.clone(), + // Do some path mangling if it is actually a path to get it into a url + UrlOrPath::Path(path) => { + let path = PathBuf::from(path.as_str()); + // Because the path we are comparing to is absolute we need to convert + let path = if path.is_absolute() { + path + } else { + // Relative paths will be relative to the lock file directory + lock_file_dir.join(path) + }; + // Okay, now convert to a file path, if we cant do that we need to re-install + match Url::from_file_path(path.clone()) { + Ok(url) => url, + Err(_) => { + return Ok(ValidateCurrentInstall::Reinstall( + NeedReinstall::UnableToConvertLockedPath { + path: path.display().to_string(), + }, + )); + } + } + } + }; + // Check if the urls are different - if Some(&url) == locked.location.as_url() { - // Check cache freshness + if url == locked_url { + // Okay so these are the same, but we need to check if the cache is newer + // than the source directory if !check_url_freshness(&url, installed)? { return Ok(ValidateCurrentInstall::Reinstall( NeedReinstall::SourceDirectoryNewerThanCache, )); } + } else { + return Ok(ValidateCurrentInstall::Reinstall( + NeedReinstall::UrlMismatch { + installed_url: url.to_string(), + locked_url: locked.location.as_url().map(|u| u.to_string()), + }, + )); } } Err(_) => { @@ -279,7 +344,8 @@ fn need_reinstall( if dir_info.editable.unwrap_or_default() != locked.editable { return Ok(ValidateCurrentInstall::Reinstall( NeedReinstall::EditableStatusChanged { - is_now_editable: dir_info.editable.unwrap_or_default(), + locked_editable: locked.editable, + installed_editable: dir_info.editable.unwrap_or_default(), }, )); } @@ -321,6 +387,13 @@ fn need_reinstall( NeedReinstall::ArchiveDistNewerThanCache, )); } + } else { + return Ok(ValidateCurrentInstall::Reinstall( + NeedReinstall::UrlMismatch { + installed_url: installed_url.to_string(), + locked_url: locked.location.as_url().map(|u| u.to_string()), + }, + )); } } uv_pypi_types::DirectUrl::VcsUrl { @@ -328,8 +401,14 @@ fn need_reinstall( vcs_info, subdirectory: _, } => { - let url = Url::parse(&url).into_diagnostic()?; - let git_url = match &locked.location { + // Check if the installed git url is the same as the locked git url + // if this fails, it should be an error, because then installed url is not a git url + let installed_git_url = + ParsedGitUrl::try_from(Url::parse(url.as_str()).into_diagnostic()?) + .into_diagnostic()?; + // Try to parse the locked git url, this can be any url, so this may fail + // in practice it always seems to succeed, even with a non-git url + let locked_git_url = match &locked.location { UrlOrPath::Url(url) => ParsedGitUrl::try_from(url.clone()), UrlOrPath::Path(_path) => { // Previously @@ -338,18 +417,27 @@ fn need_reinstall( )); } }; - match git_url { - Ok(git) => { - // Check the repository base url - if git.url.repository() != &url - // Check the sha from the direct_url.json and the required sha - // Use the uv git url to get the sha - || vcs_info.commit_id != git.url.precise().map(|p| p.to_string()) + match locked_git_url { + Ok(locked_git_url) => { + // Check the repository base url with the locked url + if locked_git_url.url.repository() != installed_git_url.url.repository() { + // This happens when this is not a git url + return Ok(ValidateCurrentInstall::Reinstall( + NeedReinstall::UrlMismatch { + installed_url: installed_git_url.url.to_string(), + locked_url: Some(locked_git_url.url.to_string()), + }, + )); + } + if vcs_info.commit_id + != locked_git_url.url.precise().map(|p| p.to_string()) + { + // The commit id is different, we need to reinstall return Ok(ValidateCurrentInstall::Reinstall( NeedReinstall::GitCommitsMismatch { installed_commit: vcs_info.commit_id.unwrap_or_default(), - locked_commit: git + locked_commit: locked_git_url .url .precise() .map(|p| p.to_string()) @@ -361,7 +449,11 @@ fn need_reinstall( Err(_) => { return Ok(ValidateCurrentInstall::Reinstall( NeedReinstall::UnableToParseGitUrl { - url: url.to_string(), + url: locked + .location + .as_url() + .map(|u| u.to_string()) + .unwrap_or_default(), }, )); } @@ -391,13 +483,16 @@ fn need_reinstall( }; // Do some extra checks if the version is the same - let metadata = if let Ok(metadata) = installed.metadata() { - metadata - } else { - // Can't be sure lets reinstall - return Ok(ValidateCurrentInstall::Reinstall( - NeedReinstall::UnableToGetInstalledDistMetadata, - )); + let metadata = match installed.metadata() { + Ok(metadata) => metadata, + Err(err) => { + // Can't be sure lets reinstall + return Ok(ValidateCurrentInstall::Reinstall( + NeedReinstall::UnableToGetInstalledDistMetadata { + cause: err.to_string(), + }, + )); + } }; if let Some(requires_python) = metadata.requires_python { @@ -405,7 +500,7 @@ fn need_reinstall( if !requires_python.contains(python_version) { return Ok(ValidateCurrentInstall::Reinstall( NeedReinstall::RequiredPythonChanged { - installed_python_version: requires_python, + installed_python_require: requires_python, locked_python_version: python_version.clone(), }, )); @@ -577,7 +672,12 @@ impl InstallPlanner { )); } else { // Check if we need to reinstall - match need_reinstall(dist, required_pkg, &self.python_version)? { + match need_reinstall( + dist, + required_pkg, + &self.python_version, + &self.lock_file_dir, + )? { ValidateCurrentInstall::Keep => { // No need to reinstall continue; diff --git a/src/install_pypi/plan/test/harness.rs b/src/install_pypi/plan/test/harness.rs new file mode 100644 index 000000000..e44180a61 --- /dev/null +++ b/src/install_pypi/plan/test/harness.rs @@ -0,0 +1,521 @@ +use crate::install_pypi::plan::{CachedDistProvider, InstallPlanner, InstalledDistProvider}; +use pixi_consts::consts; +use pixi_manifest::pypi::pypi_requirement::ParsedGitUrl; +use rattler_lock::{PypiPackageData, UrlOrPath}; +use std::collections::HashMap; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::str::FromStr; +use tempfile::TempDir; +use typed_path::Utf8TypedPathBuf; +use url::Url; +use uv_distribution_filename::WheelFilename; +use uv_distribution_types::{InstalledDirectUrlDist, InstalledDist, InstalledRegistryDist}; +use uv_pypi_types::DirectUrl::VcsUrl; +use uv_pypi_types::{ArchiveInfo, DirectUrl, VcsInfo, VcsKind}; + +#[derive(Default)] +/// Builder to create installed dists +struct InstalledDistBuilder; + +impl InstalledDistBuilder { + pub fn registry>(name: S, version: S, path: PathBuf) -> InstalledDist { + let name = + uv_pep508::PackageName::new(name.as_ref().to_owned()).expect("unable to normalize"); + let version = + uv_pep440::Version::from_str(version.as_ref()).expect("cannot parse pep440 version"); + + let registry = InstalledRegistryDist { + name, + version, + path, + cache_info: None, + }; + InstalledDist::Registry(registry) + } + + pub fn directory>( + name: S, + version: S, + install_path: PathBuf, + source_path: PathBuf, + editable: bool, + ) -> (InstalledDist, DirectUrl) { + let name = + uv_pep508::PackageName::new(name.as_ref().to_owned()).expect("unable to normalize"); + let version = + uv_pep440::Version::from_str(version.as_ref()).expect("cannot parse pep440 version"); + let directory_url = Url::from_file_path(&source_path).unwrap(); + + let direct_url = DirectUrl::LocalDirectory { + url: directory_url.to_string(), + dir_info: uv_pypi_types::DirInfo { + editable: Some(editable), + }, + }; + + let installed_direct_url = InstalledDirectUrlDist { + name, + version, + direct_url: Box::new(direct_url.clone()), + url: directory_url, + editable, + path: install_path, + cache_info: None, + }; + (InstalledDist::Url(installed_direct_url), direct_url) + } + + pub fn archive>( + name: S, + version: S, + install_path: PathBuf, + url: Url, + ) -> (InstalledDist, DirectUrl) { + let name = + uv_pep508::PackageName::new(name.as_ref().to_owned()).expect("unable to normalize"); + let version = + uv_pep440::Version::from_str(version.as_ref()).expect("cannot parse pep440 version"); + + let direct_url = DirectUrl::ArchiveUrl { + url: url.to_string(), + archive_info: ArchiveInfo { + hashes: None, + hash: None, + }, + subdirectory: None, + }; + + let installed_direct_url = InstalledDirectUrlDist { + name, + version, + direct_url: Box::new(direct_url.clone()), + url, + editable: false, + path: install_path, + cache_info: None, + }; + (InstalledDist::Url(installed_direct_url), direct_url) + } + + pub fn git>( + name: S, + version: S, + install_path: PathBuf, + url: Url, + ) -> (InstalledDist, DirectUrl) { + let name = + uv_pep508::PackageName::new(name.as_ref().to_owned()).expect("unable to normalize"); + let version = + uv_pep440::Version::from_str(version.as_ref()).expect("cannot parse pep440 version"); + + // Parse git url and extract git commit, use this as the commit_id + let parsed_git_url = ParsedGitUrl::try_from(url.clone()).expect("should parse git url"); + + let direct_url = VcsUrl { + url: url.to_string(), + subdirectory: None, + vcs_info: VcsInfo { + vcs: VcsKind::Git, + commit_id: parsed_git_url.rev.map(|r| r.to_string()), + requested_revision: None, + }, + }; + + let installed_direct_url = InstalledDirectUrlDist { + name, + version, + direct_url: Box::new(direct_url.clone()), + url, + path: install_path, + editable: false, + cache_info: None, + }; + (InstalledDist::Url(installed_direct_url), direct_url) + } +} + +#[derive(Default)] +/// Some configuration options for the installed dist +pub struct InstalledDistOptions { + installer: Option, + requires_python: Option, + metadata_mtime: Option, +} + +impl InstalledDistOptions { + pub fn with_installer>(mut self, installer: S) -> Self { + self.installer = Some(installer.as_ref().to_owned()); + self + } + + pub fn with_requires_python>(mut self, requires_python: S) -> Self { + self.requires_python = + uv_pep440::VersionSpecifiers::from_str(requires_python.as_ref()).ok(); + self + } + + pub fn with_metadata_mtime(mut self, metadata_mtime: std::time::SystemTime) -> Self { + self.metadata_mtime = Some(metadata_mtime); + self + } + + pub fn installer(&self) -> &str { + self.installer + .as_deref() + .unwrap_or(consts::PIXI_UV_INSTALLER) + } + + pub fn requires_python(&self) -> Option<&uv_pep440::VersionSpecifiers> { + self.requires_python.as_ref() + } + + pub fn metadata_mtime(&self) -> Option { + self.metadata_mtime + } +} + +pub struct MockedSitePackages { + installed_dist: Vec, + /// This is the fake site packages directory, we need a file-backing for some of the + /// re-installation checks + fake_site_packages: TempDir, +} + +impl MockedSitePackages { + pub fn new() -> Self { + Self { + installed_dist: vec![], + fake_site_packages: tempfile::tempdir().expect("should create temp dir"), + } + } + + /// Create INSTALLER and METADATA files for the installed dist + /// these are checked for the installer and requires python + fn create_file_backing( + &self, + name: &str, + version: &str, + opts: InstalledDistOptions, + ) -> PathBuf { + // Create the dist-info directory + let dist_info = format!("{}-{}.dist-info", name, version); + let dist_info = self.fake_site_packages.path().join(dist_info); + fs_err::create_dir_all(&dist_info).expect("should create dist-info"); + + // Write the INSTALLER file + let installer = opts.installer(); + fs_err::write(dist_info.join("INSTALLER"), installer).expect("could not write INSTALLER"); + + // Write the METADATA file + let raw_metadata = "Name: {name}\nVersion: {version}\nSummary: A test package"; + let mut minimal_metadata = raw_metadata + .replace("{name}", name) + .replace("{version}", version); + if let Some(requires_python) = opts.requires_python() { + let requires_python = format!("\nRequires-Python: {}", requires_python); + minimal_metadata.push_str(&requires_python); + } + let mut file = std::fs::OpenOptions::new() + .write(true) + .read(true) + .create(true) + .truncate(true) + .open(dist_info.join("METADATA")) + .unwrap(); + file.write_all(minimal_metadata.as_bytes()) + .expect("should write metadata"); + + if let Some(metadata_mtime) = opts.metadata_mtime() { + file.set_modified(metadata_mtime) + .expect("should set modified time"); + file.sync_all().expect("should sync file"); + } + + dist_info + } + + /// Create a direct url for the installed dist + fn create_direct_url(&self, dist_info: &Path, direct_url: DirectUrl) { + let json = serde_json::to_string(&direct_url).expect("should serialize"); + let direct_url = dist_info.join("direct_url.json"); + fs_err::write(&direct_url, json).expect("should write direct url"); + } + + /// Add a registry installed dist to the site packages + pub fn add_registry>( + mut self, + name: S, + version: S, + opts: InstalledDistOptions, + ) -> Self { + let dist_info = self.create_file_backing(name.as_ref(), version.as_ref(), opts); + self.installed_dist + .push(InstalledDistBuilder::registry(name, version, dist_info)); + self + } + + /// Add a local directory that serves as an installed dist to the site-packages + pub fn add_directory>( + mut self, + name: S, + version: S, + source_path: PathBuf, + editable: bool, + opts: InstalledDistOptions, + ) -> Self { + let dist_info = self.create_file_backing(name.as_ref(), version.as_ref(), opts); + let (installed_dist, direct_url) = InstalledDistBuilder::directory( + name, + version, + dist_info.clone(), + source_path, + editable, + ); + self.create_direct_url(&dist_info, direct_url); + self.installed_dist.push(installed_dist); + self + } + + /// Add an archive installed dist to the site packages + pub fn add_archive>( + mut self, + name: S, + version: S, + url: Url, + opts: InstalledDistOptions, + ) -> Self { + let dist_info = self.create_file_backing(name.as_ref(), version.as_ref(), opts); + let (installed_dist, direct_url) = + InstalledDistBuilder::archive(name, version, dist_info.clone(), url); + self.create_direct_url(&dist_info, direct_url); + self.installed_dist.push(installed_dist); + self + } + + /// Add a git installed dist to the site packages + pub fn add_git>( + mut self, + name: S, + version: S, + url: Url, + opts: InstalledDistOptions, + ) -> Self { + let dist_info = self.create_file_backing(name.as_ref(), version.as_ref(), opts); + let (installed_dist, direct_url) = + InstalledDistBuilder::git(name, version, dist_info.clone(), url); + self.create_direct_url(&dist_info, direct_url); + self.installed_dist.push(installed_dist); + self + } +} + +impl<'a> InstalledDistProvider<'a> for MockedSitePackages { + fn iter(&'a self) -> impl Iterator { + self.installed_dist.iter() + } +} + +#[derive(Default)] +/// Builder to create pypi package data, this is essentially the locked data +struct PyPIPackageDataBuilder; + +impl PyPIPackageDataBuilder { + fn registry>(name: S, version: S) -> PypiPackageData { + PypiPackageData { + name: pep508_rs::PackageName::new(name.as_ref().to_owned()).unwrap(), + version: pep440_rs::Version::from_str(version.as_ref()).unwrap(), + // We dont check these fields, for determining the installation from a registry + // + requires_dist: vec![], + requires_python: None, + location: UrlOrPath::Url( + Url::parse(&format!( + "https://pypi.org/{name}-{version}-py3-none-any.whl", + name = name.as_ref(), + version = version.as_ref() + )) + .unwrap(), + ), + hash: None, + editable: false, + } + } + + fn directory>( + name: S, + version: S, + path: PathBuf, + editable: bool, + ) -> PypiPackageData { + PypiPackageData { + name: pep508_rs::PackageName::new(name.as_ref().to_owned()).unwrap(), + version: pep440_rs::Version::from_str(version.as_ref()).unwrap(), + requires_dist: vec![], + requires_python: None, + location: UrlOrPath::Path(Utf8TypedPathBuf::from(path.to_string_lossy().to_string())), + hash: None, + editable, + } + } + + fn direct_url>(name: S, version: S, url: Url) -> PypiPackageData { + // Create new url with direct+ in the scheme + let url = Url::parse(&format!("direct+{}", url)).unwrap(); + PypiPackageData { + name: pep508_rs::PackageName::new(name.as_ref().to_owned()).unwrap(), + version: pep440_rs::Version::from_str(version.as_ref()).unwrap(), + requires_dist: vec![], + requires_python: None, + location: UrlOrPath::Url(url), + hash: None, + editable: false, + } + } + + fn git>(name: S, version: S, url: Url) -> PypiPackageData { + PypiPackageData { + name: pep508_rs::PackageName::new(name.as_ref().to_owned()).unwrap(), + version: pep440_rs::Version::from_str(version.as_ref()).unwrap(), + requires_dist: vec![], + requires_python: None, + location: UrlOrPath::Url(url), + hash: None, + editable: false, + } + } +} + +/// Implementor of the [`CachedDistProvider`] that does not cache anything +pub struct NoCache; + +impl<'a> CachedDistProvider<'a> for NoCache { + fn get_cached_dist( + &mut self, + _name: &'a uv_normalize::PackageName, + _version: uv_pep440::Version, + ) -> Option { + None + } +} + +/// Implementor of the [`CachedDistProvider`] that assumes to have cached everything +pub struct AllCached; +impl<'a> CachedDistProvider<'a> for AllCached { + fn get_cached_dist( + &mut self, + name: &'a uv_normalize::PackageName, + version: uv_pep440::Version, + ) -> Option { + let wheel_filename = + WheelFilename::from_str(format!("{}-{}-py3-none-any.whl", name, version).as_str()) + .unwrap(); + let dist = uv_distribution_types::CachedRegistryDist { + filename: wheel_filename, + path: Default::default(), + hashes: vec![], + cache_info: Default::default(), + }; + Some(dist) + } +} + +/// Struct to create the required packages map +#[derive(Default)] +pub struct RequiredPackages { + required: HashMap, +} + +impl RequiredPackages { + pub fn new() -> Self { + Self::default() + } + + /// Add a registry package to the required packages + pub fn add_registry>(mut self, name: S, version: S) -> Self { + let package_name = + uv_normalize::PackageName::new(name.as_ref().to_owned()).expect("should be correct"); + let data = PyPIPackageDataBuilder::registry(name, version); + self.required.insert(package_name, data); + self + } + + /// Add a directory package to the required packages + pub fn add_directory>( + mut self, + name: S, + version: S, + path: PathBuf, + editable: bool, + ) -> Self { + let package_name = + uv_normalize::PackageName::new(name.as_ref().to_owned()).expect("should be correct"); + let data = PyPIPackageDataBuilder::directory(name, version, path, editable); + self.required.insert(package_name, data); + self + } + + pub fn add_archive>(mut self, name: S, version: S, url: Url) -> Self { + let package_name = + uv_normalize::PackageName::new(name.as_ref().to_owned()).expect("should be correct"); + let data = PyPIPackageDataBuilder::direct_url(name, version, url); + self.required.insert(package_name, data); + self + } + + pub fn add_git>(mut self, name: S, version: S, url: Url) -> Self { + let package_name = + uv_normalize::PackageName::new(name.as_ref().to_owned()).expect("should be correct"); + let data = PyPIPackageDataBuilder::git(name, version, url); + self.required.insert(package_name, data); + self + } + + /// Convert the required packages where it the data is borrowed + /// this is needed to pass it into the [`InstallPlanner`] + pub fn to_borrowed(&self) -> HashMap { + self.required.iter().map(|(k, v)| (k.clone(), v)).collect() + } +} + +/// Python version to use throughout the tests +pub const TEST_PYTHON_VERSION: &str = "3.12"; + +/// Some python version +fn python_version() -> uv_pep440::Version { + uv_pep440::Version::from_str(TEST_PYTHON_VERSION).unwrap() +} + +/// Simple function to create an install planner +pub fn install_planner() -> InstallPlanner { + InstallPlanner::new( + uv_cache::Cache::temp().unwrap(), + &python_version(), + PathBuf::new(), + ) +} + +/// Create a fake pyproject.toml file in a temp dir +/// return the temp dir +pub fn fake_pyproject_toml( + modification_time: Option, +) -> (TempDir, std::fs::File) { + let temp_dir = tempfile::tempdir().unwrap(); + let pyproject_toml = temp_dir.path().join("pyproject.toml"); + let mut pyproject_toml = std::fs::File::create(pyproject_toml).unwrap(); + pyproject_toml + .write_all( + r#" + [build-system] + requires = ["setuptools>=42"] + build-backend = "setuptools.build_meta" + "# + .as_bytes(), + ) + .unwrap(); + // Set the modification time if it is provided + if let Some(modification_time) = modification_time { + pyproject_toml.set_modified(modification_time).unwrap(); + } + (temp_dir, pyproject_toml) +} diff --git a/src/install_pypi/plan/test/mod.rs b/src/install_pypi/plan/test/mod.rs new file mode 100644 index 000000000..a6b48d43e --- /dev/null +++ b/src/install_pypi/plan/test/mod.rs @@ -0,0 +1,471 @@ +use self::harness::{InstalledDistOptions, MockedSitePackages, NoCache, RequiredPackages}; +use crate::install_pypi::plan::test::harness::{AllCached, TEST_PYTHON_VERSION}; +use crate::install_pypi::NeedReinstall; +use assert_matches::assert_matches; +use url::Url; + +mod harness; + +/// When no site-packages exist, and we have requested an uncached package +/// we expect an installation from the remote +#[test] +fn test_no_installed_require_one() { + // No installed packages + let site_packages = MockedSitePackages::new(); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.6.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + // We should install a single package + // from the remote because we do not cache + assert_eq!(install_plan.remote.len(), 1); +} + +/// Test that we can install a package from the cache when it is available +#[test] +fn test_no_installed_require_one_cached() { + // No installed packages + let site_packages = MockedSitePackages::new(); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.6.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, AllCached, &required.to_borrowed()) + .expect("should install"); + + // We should install a single package + // from the remote because we do not cache + assert!(install_plan.remote.is_empty()); + assert_eq!(install_plan.local.len(), 1); +} + +/// When we have a site-packages with the requested package, and the version matches we expect +/// no re-installation to occur +#[test] +fn test_install_required_equivalent() { + // No installed packages + let site_packages = MockedSitePackages::new().add_registry( + "aiofiles", + "0.6.0", + InstalledDistOptions::default(), + ); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.6.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + // Should not install package + assert!( + install_plan.reinstalls.is_empty(), + "found reinstalls: {:?}", + install_plan.reinstalls + ); + assert!(install_plan.local.is_empty()); + assert!(install_plan.remote.is_empty()); +} + +/// When we have a site-packages with the requested package, and the version does not match we expect +/// a re-installation to occur, with a version mismatch indication +#[test] +fn test_install_required_mismatch() { + // No installed packages + let site_packages = MockedSitePackages::new().add_registry( + "aiofiles", + "0.6.0", + InstalledDistOptions::default(), + ); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.7.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + // We should install a single package + // from the remote because we do not cache + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::VersionMismatch { ref installed_version, ref locked_version } + if installed_version.to_string() == "0.6.0" && locked_version.to_string() == "0.7.0" + ); + assert!(install_plan.local.is_empty()); + // Not cached we get it from the remote + assert_eq!(install_plan.remote.len(), 1); +} + +/// When we have a site-packages with the requested package, and the version does not match we expect +/// a re-installation to occur, with a version mismatch indication +#[test] +fn test_install_required_mismatch_cached() { + // No installed packages + let site_packages = MockedSitePackages::new().add_registry( + "aiofiles", + "0.6.0", + InstalledDistOptions::default(), + ); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.7.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, AllCached, &required.to_borrowed()) + .expect("should install"); + + // We should install a single package + // from the remote because we do not cache + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::VersionMismatch { ref installed_version, ref locked_version } + if installed_version.to_string() == "0.6.0" && locked_version.to_string() == "0.7.0" + ); + assert!(install_plan.remote.is_empty()); + // Not cached we get it from the remote + assert_eq!(install_plan.local.len(), 1); +} + +/// When requiring a package that has a different INSTALLER but we *do require* it +/// we should reinstall it +#[test] +fn test_install_required_installer_mismatch() { + let site_packages = MockedSitePackages::new().add_registry( + "aiofiles", + "0.6.0", + InstalledDistOptions::default().with_installer("i-am-not-pixi"), + ); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.6.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::InstallerMismatch { ref previous_installer } if previous_installer == "i-am-not-pixi" + ); + assert!(install_plan.local.is_empty()); + // Not cached we get it from the remote + assert_eq!(install_plan.remote.len(), 1); +} + +/// When having a package with a different INSTALLER, and we do not require it, we should leave it alone +/// and not reinstall it +#[test] +fn test_installed_one_other_installer() { + let site_packages = MockedSitePackages::new().add_registry( + "aiofiles", + "0.6.0", + InstalledDistOptions::default().with_installer("i-am-not-pixi"), + ); + // Nothing is required + let required = RequiredPackages::new(); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + // We should not do anything + assert!(install_plan.local.is_empty()); + assert!(install_plan.remote.is_empty()); +} + +/// When requiring a package that has a different required python then we have installed we want to reinstall +/// the package +#[test] +fn test_install_required_python_mismatch() { + let site_packages = MockedSitePackages::new().add_registry( + "aiofiles", + "0.6.0", + InstalledDistOptions::default().with_requires_python("<3.12"), + ); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.6.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::RequiredPythonChanged { + ref installed_python_require, + ref locked_python_version + } if installed_python_require.to_string() == "<3.12" + && locked_python_version.to_string() == TEST_PYTHON_VERSION + ); + assert!(install_plan.local.is_empty()); + // Not cached we get it from the remote + assert_eq!(install_plan.remote.len(), 1); +} + +/// When no longer requiring a package that is installed we should uninstall it, +/// i.e. mark as extraneous +#[test] +fn test_installed_one_none_required() { + let site_packages = MockedSitePackages::new().add_registry( + "aiofiles", + "0.6.0", + InstalledDistOptions::default(), + ); + let required = RequiredPackages::new(); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + assert_eq!(install_plan.extraneous.len(), 1); +} + +/// When requiring a package from the registry that is currently installed as a directory +/// it should be re-installed +#[test] +fn test_installed_local_required_registry() { + let (temp_dir, _) = harness::fake_pyproject_toml(None); + let site_packages = MockedSitePackages::new().add_directory( + "aiofiles", + "0.6.0", + temp_dir.path().to_path_buf(), + false, + InstalledDistOptions::default(), + ); + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.6.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::UrlMismatch{ ref installed_url, ref locked_url } if *installed_url != locked_url.clone().unwrap() + ); +} + +/// When requiring a local package and that same local package is installed, we should not reinstall it +/// except if the pyproject.toml file, or some other source files we won't check here is newer than the cache +#[test] +fn test_installed_local_required_local() { + let ten_minutes_ago = std::time::SystemTime::now() - std::time::Duration::from_secs(60 * 10); + let (fake, _) = harness::fake_pyproject_toml(Some(ten_minutes_ago)); + let site_packages = MockedSitePackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + false, + InstalledDistOptions::default(), + ); + // Requires following package + let required = RequiredPackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + false, + ); + + // pyproject.toml file is older than the cache, all else is the same + // so we do not expect a re-installation + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + assert_eq!( + install_plan.reinstalls.len(), + 0, + "found reinstall: {:?}", + install_plan.reinstalls + ); + assert!(install_plan.remote.is_empty()); + assert!(install_plan.local.is_empty()); +} +/// When requiring a local package and that same local package is installed, we should not reinstall it +/// except if the pyproject.toml file, or some other source files we won't check here is newer than the cache +#[test] +fn test_local_source_newer_than_local_metadata() { + let (fake, pyproject) = harness::fake_pyproject_toml(None); + let site_packages = MockedSitePackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + false, + // Set the metadata mtime to 1 day ago + InstalledDistOptions::default().with_metadata_mtime( + std::time::SystemTime::now() - std::time::Duration::from_secs(60 * 60 * 24), + ), + ); + // Requires following package + let required = RequiredPackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + false, + ); + // Set the pyproject.toml file to be newer than the installed metadata + // We need to do this otherwise the test seems to fail even though the file should be newer + pyproject + .set_modified(std::time::SystemTime::now() + std::time::Duration::from_secs(60 * 60 * 24)) + .unwrap(); + pyproject.sync_all().unwrap(); + + // pyproject.toml file is older than the cache, all else is the same + // so we do not expect a re-installation + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::SourceDirectoryNewerThanCache + ); +} + +/// When we have an editable package installed and we require a non-editable package +/// we should reinstall the non-editable package +#[test] +fn test_installed_editable_required_non_editable() { + let (fake, _) = harness::fake_pyproject_toml(None); + let site_packages = MockedSitePackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + true, + InstalledDistOptions::default(), + ); + + // Requires following package + let required = RequiredPackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + false, + ); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::EditableStatusChanged { + locked_editable: false, + installed_editable: true + } + ); +} + +/// When having a direct archive installed and we require the same version from the registry +/// we should reinstall +#[test] +fn test_installed_archive_require_registry() { + let remote_url = + Url::parse("https://some-other-registry.org/aiofiles-0.6.0-py3-none-any.whl").unwrap(); + let site_packages = MockedSitePackages::new().add_archive( + "aiofiles", + "0.6.0", + remote_url.clone(), + InstalledDistOptions::default(), + ); + + // Requires following package + let required = RequiredPackages::new().add_registry("aiofiles", "0.6.0"); + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::UrlMismatch { .. } + ); + + // If we have the correct archive installed it should not reinstall + let required = RequiredPackages::new().add_archive("aiofiles", "0.6.0", remote_url.clone()); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + assert!(install_plan.local.is_empty()); + assert!(install_plan.remote.is_empty()); +} + +/// When having a git installed, and we require the same version from the registry +/// we should reinstall, otherwise we should not +/// note that we are using full git commits here, because it seems from my (Tim) +/// testing that these are the ones used in the lock file +#[test] +fn test_installed_git_require_registry() { + let git_url = + Url::parse("git+https://github.com/pypa/pip.git@9d4f36d87dae9a968fb527e2cb87e8a507b0beb3") + .expect("could not parse git url"); + + let site_packages = MockedSitePackages::new().add_git( + "pip", + "1.0.0", + git_url.clone(), + InstalledDistOptions::default(), + ); + let required = RequiredPackages::new().add_registry("pip", "1.0.0"); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::UrlMismatch { .. } + ); + + // Okay now we require the same git package, it should not reinstall + let required = RequiredPackages::new().add_git("pip", "1.0.0", git_url.clone()); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + assert!( + install_plan.reinstalls.is_empty(), + "found reinstalls: {:?}", + install_plan.reinstalls + ); +} + +/// When the git commit differs we should reinstall +#[test] +fn test_installed_git_require_git_commit_mismatch() { + let installed = "9d4f36d87dae9a968fb527e2cb87e8a507b0beb3"; + let git_url = Url::parse(format!("git+https://github.com/pypa/pip.git@{installed}").as_str()) + .expect("could not parse git url"); + + let site_packages = MockedSitePackages::new().add_git( + "pip", + "1.0.0", + git_url.clone(), + InstalledDistOptions::default(), + ); + let locked = "cf20850e5e42ba9a71748fdf04193c7857cf5f61"; + let git_url_2 = Url::parse(format!("git+https://github.com/pypa/pip.git@{locked}").as_str()) + .expect("could not parse git url"); + let required = RequiredPackages::new().add_git("pip", "1.0.0", git_url_2); + + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + + assert_matches!( + install_plan.reinstalls[0].1, + NeedReinstall::GitCommitsMismatch { ref installed_commit, ref locked_commit } + if installed == installed_commit && locked == locked_commit + ); +} From 35b7f7d7f1ef7180e29dd77a76c40ed8a39476c6 Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:59:30 +0100 Subject: [PATCH 08/16] test: reorganize `pixi build` tests (#2639) - move test data to common directory - move helper functions to fixtures --- .../rattler-build-backend/pixi/pixi.toml | 0 .../recipes/boltons/recipe.yaml | 0 .../recipes/smokey/recipe.yaml | 0 .../rattler-build-backend/smokey/pixi.toml | 0 tests/integration_python/conftest.py | 9 ++++-- .../integration_python/pixi_build/conftest.py | 18 +++++++++++ .../pixi_build/test_build.py | 31 +++++-------------- 7 files changed, 33 insertions(+), 25 deletions(-) rename tests/{integration_python/pixi_build/test-data => data/pixi_build}/rattler-build-backend/pixi/pixi.toml (100%) rename tests/{integration_python/pixi_build/test-data => data/pixi_build}/rattler-build-backend/recipes/boltons/recipe.yaml (100%) rename tests/{integration_python/pixi_build/test-data => data/pixi_build}/rattler-build-backend/recipes/smokey/recipe.yaml (100%) rename tests/{integration_python/pixi_build/test-data => data/pixi_build}/rattler-build-backend/smokey/pixi.toml (100%) diff --git a/tests/integration_python/pixi_build/test-data/rattler-build-backend/pixi/pixi.toml b/tests/data/pixi_build/rattler-build-backend/pixi/pixi.toml similarity index 100% rename from tests/integration_python/pixi_build/test-data/rattler-build-backend/pixi/pixi.toml rename to tests/data/pixi_build/rattler-build-backend/pixi/pixi.toml diff --git a/tests/integration_python/pixi_build/test-data/rattler-build-backend/recipes/boltons/recipe.yaml b/tests/data/pixi_build/rattler-build-backend/recipes/boltons/recipe.yaml similarity index 100% rename from tests/integration_python/pixi_build/test-data/rattler-build-backend/recipes/boltons/recipe.yaml rename to tests/data/pixi_build/rattler-build-backend/recipes/boltons/recipe.yaml diff --git a/tests/integration_python/pixi_build/test-data/rattler-build-backend/recipes/smokey/recipe.yaml b/tests/data/pixi_build/rattler-build-backend/recipes/smokey/recipe.yaml similarity index 100% rename from tests/integration_python/pixi_build/test-data/rattler-build-backend/recipes/smokey/recipe.yaml rename to tests/data/pixi_build/rattler-build-backend/recipes/smokey/recipe.yaml diff --git a/tests/integration_python/pixi_build/test-data/rattler-build-backend/smokey/pixi.toml b/tests/data/pixi_build/rattler-build-backend/smokey/pixi.toml similarity index 100% rename from tests/integration_python/pixi_build/test-data/rattler-build-backend/smokey/pixi.toml rename to tests/data/pixi_build/rattler-build-backend/smokey/pixi.toml diff --git a/tests/integration_python/conftest.py b/tests/integration_python/conftest.py index 607636591..9b963831b 100644 --- a/tests/integration_python/conftest.py +++ b/tests/integration_python/conftest.py @@ -29,8 +29,13 @@ def tmp_pixi_workspace(tmp_path: Path) -> Path: @pytest.fixture -def channels() -> Path: - return Path(__file__).parent.parent.joinpath("data", "channels", "channels").resolve() +def test_data() -> Path: + return Path(__file__).parents[1].joinpath("data").resolve() + + +@pytest.fixture +def channels(test_data: Path) -> Path: + return test_data.joinpath("channels", "channels") @pytest.fixture diff --git a/tests/integration_python/pixi_build/conftest.py b/tests/integration_python/pixi_build/conftest.py index e69de29bb..e284688fe 100644 --- a/tests/integration_python/pixi_build/conftest.py +++ b/tests/integration_python/pixi_build/conftest.py @@ -0,0 +1,18 @@ +from pathlib import Path +import pytest + + +@pytest.fixture +def build_data(test_data: Path) -> Path: + """ + Returns the pixi build test data + """ + return test_data.joinpath("pixi_build") + + +@pytest.fixture +def examples_dir() -> Path: + """ + Returns the path to the examples directory in the root of the repository + """ + return Path(__file__).parents[3].joinpath("examples").resolve() diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index c73311617..d2a533d6f 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -6,28 +6,11 @@ from ..common import verify_cli_command -def get_data_dir(backend: str | None = None) -> Path: - """ - Returns the path to the test-data directory next to the tests - """ - if backend is None: - return Path(__file__).parent / "test-data" - else: - return Path(__file__).parent / "test-data" / backend - - -def examples_dir() -> Path: - """ - Returns the path to the examples directory in the root of the repository - """ - return (Path(__file__).parent / "../../../examples").resolve() - - -def test_build_conda_package(pixi: Path, tmp_pixi_workspace: Path) -> None: +def test_build_conda_package(pixi: Path, examples_dir: Path, tmp_pixi_workspace: Path) -> None: """ This one tries to build the example flask hello world project """ - pyproject = examples_dir() / "flask-hello-world-pyproject" + pyproject = examples_dir / "flask-hello-world-pyproject" shutil.copytree(pyproject, tmp_pixi_workspace / "pyproject") manifest_path = tmp_pixi_workspace / "pyproject" / "pyproject.toml" @@ -53,8 +36,10 @@ def test_build_conda_package(pixi: Path, tmp_pixi_workspace: Path) -> None: assert package_to_be_built.exists() -def test_build_using_rattler_build_backend(pixi: Path, tmp_pixi_workspace: Path) -> None: - test_data = get_data_dir("rattler-build-backend") +def test_build_using_rattler_build_backend( + pixi: Path, build_data: Path, tmp_pixi_workspace: Path +) -> None: + test_data = build_data.joinpath("rattler-build-backend") shutil.copytree(test_data / "pixi", tmp_pixi_workspace / "pixi") shutil.copyfile( test_data / "recipes/smokey/recipe.yaml", tmp_pixi_workspace / "pixi/recipe.yaml" @@ -74,8 +59,8 @@ def test_build_using_rattler_build_backend(pixi: Path, tmp_pixi_workspace: Path) assert package_to_be_built.exists() -def test_smokey(pixi: Path, tmp_pixi_workspace: Path) -> None: - test_data = get_data_dir("rattler-build-backend") +def test_smokey(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> None: + test_data = build_data.joinpath("rattler-build-backend") # copy the whole smokey project to the tmp_pixi_workspace shutil.copytree(test_data, tmp_pixi_workspace / "test_data") manifest_path = tmp_pixi_workspace / "test_data" / "smokey" / "pixi.toml" From 8070a89a4a7ea228c5703ef71a2a980ae91e1e76 Mon Sep 17 00:00:00 2001 From: nichmor Date: Wed, 4 Dec 2024 16:55:03 +0200 Subject: [PATCH 09/16] feat: expose some public API (#2643) I need to expose these public methods so I could access manifest table from pixi-build-backend. necessary for this PR: https://github.com/prefix-dev/pixi-build-backends/compare/main...nichmor:pixi-build-backends:fix/add-entry-points-in-recipe?expand=1 --- crates/pixi_manifest/src/manifests/source.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/pixi_manifest/src/manifests/source.rs b/crates/pixi_manifest/src/manifests/source.rs index d3d317f59..83bbac62d 100644 --- a/crates/pixi_manifest/src/manifests/source.rs +++ b/crates/pixi_manifest/src/manifests/source.rs @@ -63,13 +63,19 @@ impl ManifestSource { } } - fn manifest(&self) -> &TomlDocument { + /// Returns the inner TOML document + pub fn manifest(&self) -> &TomlDocument { match self { ManifestSource::PyProjectToml(document) => document, ManifestSource::PixiToml(document) => document, } } + /// Returns `true` if the manifest is a 'pyproject.toml' manifest. + pub fn is_pyproject_toml(&self) -> bool { + matches!(self, ManifestSource::PyProjectToml(_)) + } + /// Returns a mutable reference to the specified array either in project or /// feature. pub fn get_array_mut( From f29c3eba1100d99a703d37cf22a49f44d95ad320 Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Wed, 4 Dec 2024 17:56:20 +0100 Subject: [PATCH 10/16] fix: `test_sync_migrate` (#2646) The problem is that package was splitted here: https://github.com/conda-forge/xz-feedstock/pull/42/files#diff-f3725a55bf339595bf865fec73bda8ac99f283b0810c205442021f29c06eea9a so now we will have xz and xz-tools. When migrating from xz we will got xz-tools so we will just modify the test dependency directly. --- tests/integration_python/pixi_global/test_global.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration_python/pixi_global/test_global.py b/tests/integration_python/pixi_global/test_global.py index 51888bd0d..c3b99362f 100644 --- a/tests/integration_python/pixi_global/test_global.py +++ b/tests/integration_python/pixi_global/test_global.py @@ -186,7 +186,7 @@ def test_sync_migrate( [envs.test2] channels = ["https://prefix.dev/conda-forge"] # Small package with binary for testing purposes -dependencies = {{ xz = "*" }} +dependencies = {{ xz-tools = "*" }} exposed = {{ xz = "xz" }} """ manifest.write_text(toml) From 1d940a8ca319920f488a04bb83bd0bf391f71ab0 Mon Sep 17 00:00:00 2001 From: Liam Connors Date: Thu, 5 Dec 2024 01:07:12 -0500 Subject: [PATCH 11/16] docs: update contributing guide (#2650) `build` task doesn't seem to exist anymore. Was replaced with two separate build commands --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df9814bdf..948f43d1f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,7 @@ By contributing to Pixi, you agree that your contributions will be licensed unde ## Pixi is a pixi project so use a preinstalled `pixi` to run the predefined tasks ```shell -pixi run build +pixi run build-debug # or `pixi run build-release` to build with optimizations pixi run lint pixi run test-all-fast pixi run install # only works on unix systems as on windows you can't overwrite the binary while it's running From 7471787a82515f56f4f7c4f77c25bbd2a79e3e6e Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Thu, 5 Dec 2024 07:54:46 +0100 Subject: [PATCH 12/16] feat: add example using `rich` and `pixi-build-python` and remove flask (#2638) The other examples where not actually building a Python package with `pixi-build-python` --------- Co-authored-by: Tim de Jager Co-authored-by: Bas Zalmstra Co-authored-by: nichmor --- .../.gitattributes | 2 - .../flask-hello-world-pyproject/README.md | 3 - .../flask_hello_world_pyproject/__init__.py | 0 .../flask_hello_world_pyproject/app.py | 8 - .../flask-hello-world-pyproject/pixi.lock | 1194 --------------- .../flask-hello-world-pyproject/tests/test.py | 6 - examples/flask-hello-world/README.md | 3 - examples/flask-hello-world/app.py | 8 - examples/flask-hello-world/pixi.lock | 1346 ----------------- examples/flask-hello-world/pixi.toml | 23 - examples/rich_example/.gitattributes | 2 + .../.gitignore | 1 + examples/rich_example/pixi.lock | 881 +++++++++++ .../pyproject.toml | 76 +- .../rich_example/src/rich_example/__init__.py | 18 + .../pixi_build/test_build.py | 11 +- tests/scripts/test-examples.sh | 5 +- 17 files changed, 943 insertions(+), 2644 deletions(-) delete mode 100644 examples/flask-hello-world-pyproject/.gitattributes delete mode 100644 examples/flask-hello-world-pyproject/README.md delete mode 100644 examples/flask-hello-world-pyproject/flask_hello_world_pyproject/__init__.py delete mode 100644 examples/flask-hello-world-pyproject/flask_hello_world_pyproject/app.py delete mode 100644 examples/flask-hello-world-pyproject/pixi.lock delete mode 100644 examples/flask-hello-world-pyproject/tests/test.py delete mode 100644 examples/flask-hello-world/README.md delete mode 100644 examples/flask-hello-world/app.py delete mode 100644 examples/flask-hello-world/pixi.lock delete mode 100644 examples/flask-hello-world/pixi.toml create mode 100644 examples/rich_example/.gitattributes rename examples/{flask-hello-world-pyproject => rich_example}/.gitignore (97%) create mode 100644 examples/rich_example/pixi.lock rename examples/{flask-hello-world-pyproject => rich_example}/pyproject.toml (66%) create mode 100644 examples/rich_example/src/rich_example/__init__.py diff --git a/examples/flask-hello-world-pyproject/.gitattributes b/examples/flask-hello-world-pyproject/.gitattributes deleted file mode 100644 index d5799bd69..000000000 --- a/examples/flask-hello-world-pyproject/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# GitHub syntax highlighting -pixi.lock linguist-language=YAML diff --git a/examples/flask-hello-world-pyproject/README.md b/examples/flask-hello-world-pyproject/README.md deleted file mode 100644 index 4e0cbd004..000000000 --- a/examples/flask-hello-world-pyproject/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# This is a very simple example of a flask project - -Just run `pixi run start` to get going with a flask server. diff --git a/examples/flask-hello-world-pyproject/flask_hello_world_pyproject/__init__.py b/examples/flask-hello-world-pyproject/flask_hello_world_pyproject/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/flask-hello-world-pyproject/flask_hello_world_pyproject/app.py b/examples/flask-hello-world-pyproject/flask_hello_world_pyproject/app.py deleted file mode 100644 index d1451cc2f..000000000 --- a/examples/flask-hello-world-pyproject/flask_hello_world_pyproject/app.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask import Flask - -app = Flask(__name__) - - -@app.route("/") -def hello(): - return "Hello, Pixi server!!" diff --git a/examples/flask-hello-world-pyproject/pixi.lock b/examples/flask-hello-world-pyproject/pixi.lock deleted file mode 100644 index 53cbc1f10..000000000 --- a/examples/flask-hello-world-pyproject/pixi.lock +++ /dev/null @@ -1,1194 +0,0 @@ -version: 6 -environments: - default: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: . - osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312hbe3f5e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-hd23fc13_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.5-h37a9e06_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: . - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312ha0ccf2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.5-h30c5eda_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: . - win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.7.4-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py312h31fea79_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.5-h889d299_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: . - test: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl - - pypi: . - osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312hbe3f5e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-hd23fc13_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.5-h37a9e06_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl - - pypi: . - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312ha0ccf2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.5-h30c5eda_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl - - pypi: . - win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.7.4-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py312h31fea79_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.5-h889d299_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl - - pypi: . -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 23621 - timestamp: 1650670423406 -- conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda - sha256: f7efd22b5c15b400ed84a996d777b6327e5c402e79e3c534a7e086236f1eb2dc - md5: 42834439227a4551b939beeeb8a4b085 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/blinker?source=hash-mapping - size: 13934 - timestamp: 1731096548765 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d - md5: 62ee74e96c5ebb0af99386de58cf9553 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 252783 - timestamp: 1720974456583 -- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 - md5: 7ed4301d437b59045be7e051a0308211 - depends: - - __osx >=10.13 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 134188 - timestamp: 1720974491916 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 - md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 122909 - timestamp: 1720974522888 -- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b - md5: 276e7ffe9ffe39688abc665ef0f45596 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 54927 - timestamp: 1720974860185 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - sha256: c1548a3235376f464f9931850b64b02492f379b2f2bb98bc786055329b080446 - md5: 23ab7665c5f63cfb9f1f6195256daac6 - license: ISC - purls: [] - size: 154853 - timestamp: 1720077432978 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda - sha256: d16f46c489cb3192305c7d25b795333c5fc17bb0986de20598ed519f8c9cc9e4 - md5: 7df874a4b05b2d2b82826190170eaa0f - license: ISC - purls: [] - size: 154473 - timestamp: 1720077510541 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - sha256: 33a61116dae7f369b6ce92a7f2a1ff361ae737c675a493b11feb5570b89e0e3b - md5: 21f9a33e5fe996189e470c19c5354dbe - license: ISC - purls: [] - size: 154517 - timestamp: 1720077468981 -- conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.7.4-h56e8100_0.conda - sha256: 7f37bb33c7954de1b4d19ad622859feb4f6c58f751c38b895524cad4e44af72e - md5: 9caa97c9504072cd060cf0a3142cc0ed - license: ISC - purls: [] - size: 154943 - timestamp: 1720077592592 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec - md5: f3ad426304898027fc619827ff428eca - depends: - - __unix - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/click?source=hash-mapping - size: 84437 - timestamp: 1692311973840 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 - md5: 3549ecbceb6cd77b91a105511b7d0786 - depends: - - __win - - colorama - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/click?source=hash-mapping - size: 85051 - timestamp: 1692312207348 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 - depends: - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/colorama?source=hash-mapping - size: 25170 - timestamp: 1666700778190 -- conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - sha256: 4f84ffdc5471236e8225db86c7508426b46aa2c3802d58ca40b3c3e174533b39 - md5: 9b0d29067484a8dfacfae85b8fba81bc - depends: - - blinker >=1.6.2 - - click >=8.1.3 - - importlib-metadata >=3.6.0 - - itsdangerous >=2.1.2 - - jinja2 >=3.1.2 - - python >=3.8 - - werkzeug >=2.3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/flask?source=hash-mapping - size: 79782 - timestamp: 1692686247131 -- pypi: . - name: flask-hello-world-pyproject - version: 0.1.0 - sha256: 0b7ba24b5033c855783c77aee6995f8856c3dd7f1a23d26df7315851ad9650ae - requires_dist: - - flask==2.* - requires_python: '>=3.11' - editable: true -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c - md5: 54198435fce4d64d8a89af22573012a8 - depends: - - python >=3.8 - - zipp >=0.5 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/importlib-metadata?source=hash-mapping - size: 28646 - timestamp: 1726082927916 -- pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - name: iniconfig - version: 2.0.0 - sha256: b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - sha256: 4e933e36e9b0401b62ea8fd63393827ebeb4250de77a56687afb387d504523c5 - md5: ff7ca04134ee8dde1d7cf491a78ef7c7 - depends: - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/itsdangerous?source=hash-mapping - size: 19333 - timestamp: 1713372766463 -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d - md5: 7b86ecb7d3557821c649b3c31e3eb9f2 - depends: - - markupsafe >=2.0 - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jinja2?source=hash-mapping - size: 111565 - timestamp: 1715127275924 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - sha256: 764b6950aceaaad0c67ef925417594dd14cd2e22fff864aeef455ac259263d15 - md5: b80f2f396ca2c28b8c14c437a4ed1e74 - constrains: - - binutils_impl_linux-64 2.40 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 707602 - timestamp: 1718625640445 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 - md5: e7ba12deb7020dd080c6c70e7b6f6a3d - depends: - - libgcc-ng >=12 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - purls: [] - size: 73730 - timestamp: 1710362120304 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - sha256: a188a77b275d61159a32ab547f7d17892226e7dac4518d2c6ac3ac8fc8dfde92 - md5: 3d1d51c8f716d97c864d12f7af329526 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - purls: [] - size: 69246 - timestamp: 1710362566073 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - sha256: ba7173ac30064ea901a4c9fb5a51846dcc25512ceb565759be7d18cbf3e5415e - md5: e3cde7cfa87f82f7cb13d482d5e0ad09 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - purls: [] - size: 63655 - timestamp: 1710362424980 -- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 - md5: bc592d03f62779511d392c175dcece64 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - purls: [] - size: 139224 - timestamp: 1710362609641 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - purls: [] - size: 58292 - timestamp: 1636488182923 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f - md5: ccb34fb14960ad8b125962d3d79b31a9 - license: MIT - license_family: MIT - purls: [] - size: 51348 - timestamp: 1636488394370 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca - md5: 086914b672be056eb70fd4285b6783b6 - license: MIT - license_family: MIT - purls: [] - size: 39020 - timestamp: 1636488587153 -- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 - md5: 2c96d1b6915b408893f9472569dee135 - depends: - - vc >=14.1,<15.0a0 - - vs2015_runtime >=14.16.27012 - license: MIT - license_family: MIT - purls: [] - size: 42063 - timestamp: 1636489106777 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda - sha256: 10fa74b69266a2be7b96db881e18fa62cfa03082b65231e8d652e897c4b335a3 - md5: 002ef4463dd1e2b44a94a4ace468f5d2 - depends: - - _libgcc_mutex 0.1 conda_forge - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.1.0 h77fa898_1 - - libgcc-ng ==14.1.0=*_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 846380 - timestamp: 1724801836552 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda - sha256: b91f7021e14c3d5c840fbf0dc75370d6e1f7c7ff4482220940eaafb9c64613b7 - md5: 1efc0ad219877a73ef977af7dbb51f17 - depends: - - libgcc 14.1.0 h77fa898_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 52170 - timestamp: 1724801842101 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - sha256: c96724c8ae4ee61af7674c5d9e5a3fbcf6cd887a40ad5a52c99aa36f1d4f9680 - md5: 23c255b008c4f2ae008f81edcabaca89 - depends: - - _libgcc_mutex 0.1 conda_forge - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 460218 - timestamp: 1724801743478 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 - md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 - depends: - - libgcc-ng >=12 - license: LGPL-2.1-only - license_family: GPL - purls: [] - size: 33408 - timestamp: 1697359010159 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 - md5: 18aa975d2094c34aef978060ae7da7d8 - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense - purls: [] - size: 865346 - timestamp: 1718050628718 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda - sha256: 63af1a9e3284c7e4952364bafe7267e41e2d9d8bcc0e85a4ea4b0ec02d3693f6 - md5: 5dadfbc1a567fe6e475df4ce3148be09 - depends: - - __osx >=10.13 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense - purls: [] - size: 908643 - timestamp: 1718050720117 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda - sha256: 73048f9cb8647d3d3bfe6021c0b7d663e12cffbe9b4f31bd081e713b0a9ad8f9 - md5: 12300188028c9bc02da965128b91b517 - depends: - - __osx >=11.0 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense - purls: [] - size: 830198 - timestamp: 1718050644825 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.0-h2466b09_0.conda - sha256: 662bd7e0d63c5b8c31cca19b91649e798319b93568a2ba8d1375efb91eeb251b - md5: 951b0a3a463932e17414cd9f047fa03d - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Unlicense - purls: [] - size: 876677 - timestamp: 1718051113874 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 - md5: 40b61aab5c7ba9ff276c41cfffe6b80b - depends: - - libgcc-ng >=12 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 33601 - timestamp: 1680112270483 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 100393 - timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d - md5: 57d7dc60e9325e3de37ff8dffd18e814 - depends: - - libgcc-ng >=12 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - purls: [] - size: 61574 - timestamp: 1716874187109 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda - sha256: 80a62db652b1da0ccc100812a1d86e94f75028968991bfb17f9536f3aa72d91d - md5: b7575b5aa92108dcc9aaab0f05f2dbce - depends: - - __osx >=10.13 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - purls: [] - size: 57372 - timestamp: 1716874211519 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - sha256: c34365dd37b0eab27b9693af32a1f7f284955517c2cc91f1b88a7ef4738ff03e - md5: 636077128927cf79fd933276dc3aed47 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - purls: [] - size: 46921 - timestamp: 1716874262512 -- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda - sha256: b13846a54a15243e15f96fec06b526d8155adc6a1ac2b6ed47a88f6a71a94b68 - md5: d4483ca8afc57ddf1f6dded53b36c17f - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - purls: [] - size: 56186 - timestamp: 1716874730539 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_0.conda - sha256: 15f14ab429c846aacd47fada0dc4f341d64491e097782830f0906d00cb7b48b6 - md5: a755704ea0e2503f8c227d84829a8e81 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 24878 - timestamp: 1729351558563 -- conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-3.0.2-py312hbe3f5e4_0.conda - sha256: b2fb54718159055fdf89da7d9f0c6743ef84b31960617a56810920d17616d944 - md5: c6238833d7dc908ec295bc490b80d845 - depends: - - __osx >=10.13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 23889 - timestamp: 1729351468966 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py312ha0ccf2a_0.conda - sha256: 360e958055f35e5087942b9c499eaafae984a951b84cf354ef7481a2806f340d - md5: c6ff9f291d011c9d4f0b840f49435c64 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 24495 - timestamp: 1729351534830 -- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.2-py312h31fea79_0.conda - sha256: eb0f3768890291f2d5fb666ab31b32b37a821e4a30968c6b3cd332472957abe7 - md5: e2ff001440760f2cbac24765d8a3d84a - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - size: 27358 - timestamp: 1729351504449 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a - md5: 70caf8bb6cf39a0b6b7efc885f51c0fe - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - purls: [] - size: 889086 - timestamp: 1724658547447 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af - md5: e102bbf8a6ceeaf429deab8032fc8977 - depends: - - __osx >=10.13 - license: X11 AND BSD-3-Clause - purls: [] - size: 822066 - timestamp: 1724658603042 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc - md5: cb2b0ea909b97b3d70cd3921d1445e1a - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - purls: [] - size: 802321 - timestamp: 1724658775723 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda - sha256: 9e27441b273a7cf9071f6e88ba9ad565d926d8083b154c64a74b99fba167b137 - md5: 6c566a46baae794daf34775d41eb180a - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc-ng >=13 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2892042 - timestamp: 1724402701933 -- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-hd23fc13_3.conda - sha256: 63921822fbb66337e0fd50b2a07412583fbe7783bc92c663bdf93c9a09026fdc - md5: ad8c8c9556a701817bd1aca75a302e96 - depends: - - __osx >=10.13 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2549881 - timestamp: 1724403015051 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda - sha256: 9dd1ee7a8c21ff4fcbb98e9d0be0e83e5daf8a555c73589ad9e3046966b72e5e - md5: 644904d696d83c0ac78d594e0cf09f66 - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2888820 - timestamp: 1724402552318 -- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_3.conda - sha256: 76a10564ca450f56495cff06bf60bdf0fe42e6ef7a20469276894d4ac7c0140a - md5: c6ebd3a1a2b393e040ca71c9f9ef8d97 - depends: - - ca-certificates - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 8362062 - timestamp: 1724404916759 -- pypi: https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl - name: packaging - version: '24.2' - sha256: 09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl - name: pluggy - version: 1.5.0 - sha256: 44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 - requires_dist: - - pre-commit ; extra == 'dev' - - tox ; extra == 'dev' - - pytest ; extra == 'testing' - - pytest-benchmark ; extra == 'testing' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl - name: pytest - version: 8.3.3 - sha256: a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2 - requires_dist: - - iniconfig - - packaging - - pluggy>=1.5,<2 - - exceptiongroup>=1.0.0rc8 ; python_full_version < '3.11' - - tomli>=1 ; python_full_version < '3.11' - - colorama ; sys_platform == 'win32' - - argcomplete ; extra == 'dev' - - attrs>=19.2 ; extra == 'dev' - - hypothesis>=3.56 ; extra == 'dev' - - mock ; extra == 'dev' - - pygments>=2.7.2 ; extra == 'dev' - - requests ; extra == 'dev' - - setuptools ; extra == 'dev' - - xmlschema ; extra == 'dev' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda - sha256: e2aad83838988725d4ffba4e9717b9328054fd18a668cff3377e0c50f109e8bd - md5: 9c56c4df45f6571b13111d8df2448692 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.46.0,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 31663253 - timestamp: 1723143721353 -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.5-h37a9e06_0_cpython.conda - sha256: c0f39e625b2fd65f70a9cc086fe4b25cc72228453dbbcd92cd5d140d080e38c5 - md5: 517cb4e16466f8d96ba2a72897d14c48 - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.0,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 12173272 - timestamp: 1723142761765 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.5-h30c5eda_0_cpython.conda - sha256: 1319e918fb54c9491832a9731cad00235a76f61c6f9b23fc0f70cdfb74c950ea - md5: 5e315581e2948dfe3bcac306540e9803 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.0,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 12926356 - timestamp: 1723142203193 -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.5-h889d299_0_cpython.conda - sha256: 4cef304eb8877fd3094c14b57097ccc1b817b4afbf2223dd45d2b61e44064740 - md5: db056d8b140ab2edd56a2f9bdb203dcd - depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.0,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.1,<4.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 15897752 - timestamp: 1723141830317 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 - md5: 0424ae29b104430108f5218a66db7260 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6238 - timestamp: 1723823388266 -- conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 4da26c7508d5bc5d8621e84dc510284402239df56aab3587a7d217de9d3c806d - md5: c34dd4920e0addf7cfcc725809f25d8e - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6312 - timestamp: 1723823137004 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 - md5: b76f9b1c862128e56ac7aa8cd2333de9 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6278 - timestamp: 1723823099686 -- conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 9486662af81a219e96d343449eff242f38d7c5128ced5ce5acf85857265058d6 - md5: e8681f534453af7afab4cd2bc1423eec - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6730 - timestamp: 1723823139725 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 - md5: 47d31b792659ce70f470b5c82fdfb7a4 - depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 281456 - timestamp: 1679532220005 -- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 - md5: f17f77f2acf4d344734bda76829ce14e - depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 255870 - timestamp: 1679532707590 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 - md5: 8cbb776a2f641b943d413b3e19df71f4 - depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 250351 - timestamp: 1679532511311 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3318875 - timestamp: 1699202167581 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 - md5: bf830ba5afc507c6232d4ef0fb1a882d - depends: - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3270220 - timestamp: 1699202389792 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 - md5: b50a57ba89c32b62428b71a875291c9b - depends: - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - purls: [] - size: 3145523 - timestamp: 1699202432999 -- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 - md5: fc048363eb8f03cd1737600a5d08aafe - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: TCL - license_family: BSD - purls: [] - size: 3503410 - timestamp: 1699202577803 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - sha256: 7d21c95f61319dba9209ca17d1935e6128af4235a67ee4e57a00908a1450081e - md5: 8bfdead4e0fff0383ae4c9c50d0531bd - license: LicenseRef-Public-Domain - purls: [] - size: 124164 - timestamp: 1724736371498 -- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 - md5: 72608f6cd3e5898229c3ea16deb1ac43 - constrains: - - vs2015_runtime >=14.29.30037 - license: LicenseRef-Proprietary - license_family: PROPRIETARY - purls: [] - size: 1283972 - timestamp: 1666630199266 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - sha256: 23ac5feb15a9adf3ab2b8c4dcd63650f8b7ae860c5ceb073e49cf71d203eddef - md5: 8558f367e1d7700554f7cdb823c46faf - depends: - - vc14_runtime >=14.40.33810 - track_features: - - vc14 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 17391 - timestamp: 1717709040616 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda - sha256: bba8daa6f78b26b48fb7e1377eb52160e25495710bf53146c5f405bd50565982 - md5: ad33c7cd933d69b9dee0f48317cdf137 - depends: - - ucrt >=10.0.20348.0 - constrains: - - vs2015_runtime 14.40.33810.* *_20 - license: LicenseRef-ProprietaryMicrosoft - license_family: Proprietary - purls: [] - size: 751028 - timestamp: 1724712684919 -- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda - sha256: 0c2803f7a788c51f28235a7228dc2ab3f107b4b16ab0845a3e595c8c51e50a7a - md5: c21f1b4a3a30bbc3ef35a50957578e0e - depends: - - vc14_runtime >=14.40.33810 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 17395 - timestamp: 1717709043353 -- conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.3-pyhff2d567_0.conda - sha256: 588cb0a2275ae10fc8d43e1e43fa597ed2c63ea72eab3531f9e66e2352871240 - md5: f06be40e91eb82775b486f485c90995e - depends: - - markupsafe >=2.1.1 - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/werkzeug?source=hash-mapping - size: 243159 - timestamp: 1731097560953 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 418368 - timestamp: 1660346797927 -- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 - md5: a72f9d4ea13d55d745ff1ed594747f10 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 238119 - timestamp: 1660346964847 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 235693 - timestamp: 1660346961024 -- conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 - md5: 515d77642eaa3639413c6b1bc3f94219 - depends: - - vc >=14.1,<15 - - vs2015_runtime >=14.16.27033 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 217804 - timestamp: 1660346976440 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - sha256: 232a30e4b0045c9de5e168dda0328dc0e28df9439cdecdfb97dd79c1c82c4cec - md5: fee389bf8a4843bd7a2248ce11b7f188 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/zipp?source=hash-mapping - size: 21702 - timestamp: 1731262194278 diff --git a/examples/flask-hello-world-pyproject/tests/test.py b/examples/flask-hello-world-pyproject/tests/test.py deleted file mode 100644 index f81c8c708..000000000 --- a/examples/flask-hello-world-pyproject/tests/test.py +++ /dev/null @@ -1,6 +0,0 @@ -import flask_hello_world_pyproject # noqa: F401 - - -def test_import(): - """Simple test to validate the package itself has been installed.""" - assert True diff --git a/examples/flask-hello-world/README.md b/examples/flask-hello-world/README.md deleted file mode 100644 index 4e0cbd004..000000000 --- a/examples/flask-hello-world/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# This is a very simple example of a flask project - -Just run `pixi run start` to get going with a flask server. diff --git a/examples/flask-hello-world/app.py b/examples/flask-hello-world/app.py deleted file mode 100644 index d1451cc2f..000000000 --- a/examples/flask-hello-world/app.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask import Flask - -app = Flask(__name__) - - -@app.route("/") -def hello(): - return "Hello, Pixi server!!" diff --git a/examples/flask-hello-world/pixi.lock b/examples/flask-hello-world/pixi.lock deleted file mode 100644 index 7b18cf7b9..000000000 --- a/examples/flask-hello-world/pixi.lock +++ /dev/null @@ -1,1346 +0,0 @@ -version: 5 -environments: - default: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda - osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py311he705e18_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-hd23fc13_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.9-h657bba9_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-5_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py311h05b510d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.9-h932a869_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda - win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.7.4-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.9-h631f459_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-5_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda -packages: -- kind: conda - name: _libgcc_mutex - version: '0.1' - build: conda_forge - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 - md5: d7c89558ba9fa0495403155b64376d81 - license: None - size: 2562 - timestamp: 1578324546067 -- kind: conda - name: _openmp_mutex - version: '4.5' - build: 2_gnu - build_number: 16 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 - md5: 73aaf86a425cc6e73fcf236a5a46396d - depends: - - _libgcc_mutex 0.1 conda_forge - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - size: 23621 - timestamp: 1650670423406 -- kind: conda - name: blinker - version: 1.8.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/blinker-1.8.2-pyhd8ed1ab_0.conda - sha256: 8ca3cd8f78d0607df28c9f76adb9800348f8f2dc8aa49d188a995a0acdc4477d - md5: cf85c002319c15e9721934104aaa1137 - depends: - - python >=3.8 - license: MIT - license_family: MIT - size: 14707 - timestamp: 1715091300511 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h2466b09_7 - build_number: 7 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b - md5: 276e7ffe9ffe39688abc665ef0f45596 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: bzip2-1.0.6 - license_family: BSD - size: 54927 - timestamp: 1720974860185 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h4bc722e_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d - md5: 62ee74e96c5ebb0af99386de58cf9553 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: bzip2-1.0.6 - license_family: BSD - size: 252783 - timestamp: 1720974456583 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h99b78c6_7 - build_number: 7 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 - md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - size: 122909 - timestamp: 1720974522888 -- kind: conda - name: bzip2 - version: 1.0.8 - build: hfdf4475_7 - build_number: 7 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 - md5: 7ed4301d437b59045be7e051a0308211 - depends: - - __osx >=10.13 - license: bzip2-1.0.6 - license_family: BSD - size: 134188 - timestamp: 1720974491916 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: h56e8100_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.7.4-h56e8100_0.conda - sha256: 7f37bb33c7954de1b4d19ad622859feb4f6c58f751c38b895524cad4e44af72e - md5: 9caa97c9504072cd060cf0a3142cc0ed - license: ISC - size: 154943 - timestamp: 1720077592592 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: h8857fd0_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.7.4-h8857fd0_0.conda - sha256: d16f46c489cb3192305c7d25b795333c5fc17bb0986de20598ed519f8c9cc9e4 - md5: 7df874a4b05b2d2b82826190170eaa0f - license: ISC - size: 154473 - timestamp: 1720077510541 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: hbcca054_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - sha256: c1548a3235376f464f9931850b64b02492f379b2f2bb98bc786055329b080446 - md5: 23ab7665c5f63cfb9f1f6195256daac6 - license: ISC - size: 154853 - timestamp: 1720077432978 -- kind: conda - name: ca-certificates - version: 2024.7.4 - build: hf0a4a13_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.7.4-hf0a4a13_0.conda - sha256: 33a61116dae7f369b6ce92a7f2a1ff361ae737c675a493b11feb5570b89e0e3b - md5: 21f9a33e5fe996189e470c19c5354dbe - license: ISC - size: 154517 - timestamp: 1720077468981 -- kind: conda - name: click - version: 8.1.7 - build: unix_pyh707e725_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec - md5: f3ad426304898027fc619827ff428eca - depends: - - __unix - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - size: 84437 - timestamp: 1692311973840 -- kind: conda - name: click - version: 8.1.7 - build: win_pyh7428d3b_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 - md5: 3549ecbceb6cd77b91a105511b7d0786 - depends: - - __win - - colorama - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - size: 85051 - timestamp: 1692312207348 -- kind: conda - name: colorama - version: 0.4.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 - depends: - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - size: 25170 - timestamp: 1666700778190 -- kind: conda - name: flask - version: 2.3.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/flask-2.3.3-pyhd8ed1ab_0.conda - sha256: 4f84ffdc5471236e8225db86c7508426b46aa2c3802d58ca40b3c3e174533b39 - md5: 9b0d29067484a8dfacfae85b8fba81bc - depends: - - blinker >=1.6.2 - - click >=8.1.3 - - importlib-metadata >=3.6.0 - - itsdangerous >=2.1.2 - - jinja2 >=3.1.2 - - python >=3.8 - - werkzeug >=2.3.7 - license: BSD-3-Clause - license_family: BSD - size: 79782 - timestamp: 1692686247131 -- kind: conda - name: importlib-metadata - version: 8.4.0 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda - sha256: 02c95f6f62675012e0b2ab945eba6fc14fa6a693c17bced3554db7b62d586f0c - md5: 6e3dbc422d3749ad72659243d6ac8b2b - depends: - - python >=3.8 - - zipp >=0.5 - license: Apache-2.0 - license_family: APACHE - size: 28338 - timestamp: 1724187329246 -- kind: conda - name: itsdangerous - version: 2.2.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_0.conda - sha256: 4e933e36e9b0401b62ea8fd63393827ebeb4250de77a56687afb387d504523c5 - md5: ff7ca04134ee8dde1d7cf491a78ef7c7 - depends: - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - size: 19333 - timestamp: 1713372766463 -- kind: conda - name: jinja2 - version: 3.1.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d - md5: 7b86ecb7d3557821c649b3c31e3eb9f2 - depends: - - markupsafe >=2.0 - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - size: 111565 - timestamp: 1715127275924 -- kind: conda - name: ld_impl_linux-64 - version: '2.40' - build: hf3520f5_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - sha256: 764b6950aceaaad0c67ef925417594dd14cd2e22fff864aeef455ac259263d15 - md5: b80f2f396ca2c28b8c14c437a4ed1e74 - constrains: - - binutils_impl_linux-64 2.40 - license: GPL-3.0-only - license_family: GPL - size: 707602 - timestamp: 1718625640445 -- kind: conda - name: libexpat - version: 2.6.2 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 - md5: e7ba12deb7020dd080c6c70e7b6f6a3d - depends: - - libgcc-ng >=12 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - size: 73730 - timestamp: 1710362120304 -- kind: conda - name: libexpat - version: 2.6.2 - build: h63175ca_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 - md5: bc592d03f62779511d392c175dcece64 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - size: 139224 - timestamp: 1710362609641 -- kind: conda - name: libexpat - version: 2.6.2 - build: h73e2aa4_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - sha256: a188a77b275d61159a32ab547f7d17892226e7dac4518d2c6ac3ac8fc8dfde92 - md5: 3d1d51c8f716d97c864d12f7af329526 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - size: 69246 - timestamp: 1710362566073 -- kind: conda - name: libexpat - version: 2.6.2 - build: hebf3989_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - sha256: ba7173ac30064ea901a4c9fb5a51846dcc25512ceb565759be7d18cbf3e5415e - md5: e3cde7cfa87f82f7cb13d482d5e0ad09 - constrains: - - expat 2.6.2.* - license: MIT - license_family: MIT - size: 63655 - timestamp: 1710362424980 -- kind: conda - name: libffi - version: 3.4.2 - build: h0d85af4_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f - md5: ccb34fb14960ad8b125962d3d79b31a9 - license: MIT - license_family: MIT - size: 51348 - timestamp: 1636488394370 -- kind: conda - name: libffi - version: 3.4.2 - build: h3422bc3_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca - md5: 086914b672be056eb70fd4285b6783b6 - license: MIT - license_family: MIT - size: 39020 - timestamp: 1636488587153 -- kind: conda - name: libffi - version: 3.4.2 - build: h7f98852_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - depends: - - libgcc-ng >=9.4.0 - license: MIT - license_family: MIT - size: 58292 - timestamp: 1636488182923 -- kind: conda - name: libffi - version: 3.4.2 - build: h8ffe710_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 - md5: 2c96d1b6915b408893f9472569dee135 - depends: - - vc >=14.1,<15.0a0 - - vs2015_runtime >=14.16.27012 - license: MIT - license_family: MIT - size: 42063 - timestamp: 1636489106777 -- kind: conda - name: libgcc - version: 14.1.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda - sha256: 10fa74b69266a2be7b96db881e18fa62cfa03082b65231e8d652e897c4b335a3 - md5: 002ef4463dd1e2b44a94a4ace468f5d2 - depends: - - _libgcc_mutex 0.1 conda_forge - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.1.0 h77fa898_1 - - libgcc-ng ==14.1.0=*_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 846380 - timestamp: 1724801836552 -- kind: conda - name: libgcc-ng - version: 14.1.0 - build: h69a702a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda - sha256: b91f7021e14c3d5c840fbf0dc75370d6e1f7c7ff4482220940eaafb9c64613b7 - md5: 1efc0ad219877a73ef977af7dbb51f17 - depends: - - libgcc 14.1.0 h77fa898_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 52170 - timestamp: 1724801842101 -- kind: conda - name: libgomp - version: 14.1.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - sha256: c96724c8ae4ee61af7674c5d9e5a3fbcf6cd887a40ad5a52c99aa36f1d4f9680 - md5: 23c255b008c4f2ae008f81edcabaca89 - depends: - - _libgcc_mutex 0.1 conda_forge - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 460218 - timestamp: 1724801743478 -- kind: conda - name: libnsl - version: 2.0.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 - md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 - depends: - - libgcc-ng >=12 - license: LGPL-2.1-only - license_family: GPL - size: 33408 - timestamp: 1697359010159 -- kind: conda - name: libsqlite - version: 3.46.0 - build: h1b8f9f3_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda - sha256: 63af1a9e3284c7e4952364bafe7267e41e2d9d8bcc0e85a4ea4b0ec02d3693f6 - md5: 5dadfbc1a567fe6e475df4ce3148be09 - depends: - - __osx >=10.13 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense - size: 908643 - timestamp: 1718050720117 -- kind: conda - name: libsqlite - version: 3.46.0 - build: h2466b09_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.0-h2466b09_0.conda - sha256: 662bd7e0d63c5b8c31cca19b91649e798319b93568a2ba8d1375efb91eeb251b - md5: 951b0a3a463932e17414cd9f047fa03d - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Unlicense - size: 876677 - timestamp: 1718051113874 -- kind: conda - name: libsqlite - version: 3.46.0 - build: hde9e2c9_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda - sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 - md5: 18aa975d2094c34aef978060ae7da7d8 - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense - size: 865346 - timestamp: 1718050628718 -- kind: conda - name: libsqlite - version: 3.46.0 - build: hfb93653_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.46.0-hfb93653_0.conda - sha256: 73048f9cb8647d3d3bfe6021c0b7d663e12cffbe9b4f31bd081e713b0a9ad8f9 - md5: 12300188028c9bc02da965128b91b517 - depends: - - __osx >=11.0 - - libzlib >=1.2.13,<2.0a0 - license: Unlicense - size: 830198 - timestamp: 1718050644825 -- kind: conda - name: libuuid - version: 2.38.1 - build: h0b41bf4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 - md5: 40b61aab5c7ba9ff276c41cfffe6b80b - depends: - - libgcc-ng >=12 - license: BSD-3-Clause - license_family: BSD - size: 33601 - timestamp: 1680112270483 -- kind: conda - name: libxcrypt - version: 4.4.36 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - size: 100393 - timestamp: 1702724383534 -- kind: conda - name: libzlib - version: 1.3.1 - build: h2466b09_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda - sha256: b13846a54a15243e15f96fec06b526d8155adc6a1ac2b6ed47a88f6a71a94b68 - md5: d4483ca8afc57ddf1f6dded53b36c17f - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - size: 56186 - timestamp: 1716874730539 -- kind: conda - name: libzlib - version: 1.3.1 - build: h4ab18f5_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d - md5: 57d7dc60e9325e3de37ff8dffd18e814 - depends: - - libgcc-ng >=12 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - size: 61574 - timestamp: 1716874187109 -- kind: conda - name: libzlib - version: 1.3.1 - build: h87427d6_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-h87427d6_1.conda - sha256: 80a62db652b1da0ccc100812a1d86e94f75028968991bfb17f9536f3aa72d91d - md5: b7575b5aa92108dcc9aaab0f05f2dbce - depends: - - __osx >=10.13 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - size: 57372 - timestamp: 1716874211519 -- kind: conda - name: libzlib - version: 1.3.1 - build: hfb2fe0b_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-hfb2fe0b_1.conda - sha256: c34365dd37b0eab27b9693af32a1f7f284955517c2cc91f1b88a7ef4738ff03e - md5: 636077128927cf79fd933276dc3aed47 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.1 *_1 - license: Zlib - license_family: Other - size: 46921 - timestamp: 1716874262512 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311h05b510d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py311h05b510d_0.conda - sha256: 3f2127bd8788dc4b7c3d6d65ae4b7d2f8c7d02a246fc17b819390edeca53fd93 - md5: a27177455a9d29f4ac9d687a489e5d52 - depends: - - python >=3.11,<3.12.0a0 - - python >=3.11,<3.12.0a0 *_cpython - - python_abi 3.11.* *_cp311 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 26578 - timestamp: 1706900556332 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311h459d7ec_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda - sha256: 14912e557a6576e03f65991be89e9d289c6e301921b6ecfb4e7186ba974f453d - md5: a322b4185121935c871d201ae00ac143 - depends: - - libgcc-ng >=12 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 27502 - timestamp: 1706900084436 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311ha68e1ae_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py311ha68e1ae_0.conda - sha256: c629f79fe78b5df7f08daa6b7f125f7a67f789bf734949c6d68aa063d7296208 - md5: 07da1326e2837e055ef6f44ef3334b0a - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 30011 - timestamp: 1706900632904 -- kind: conda - name: markupsafe - version: 2.1.5 - build: py311he705e18_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py311he705e18_0.conda - sha256: 83a2b764a4946a04e693a4dd8fe5a35bf093a378da9ce18bf0689cd5dcb3c3fe - md5: 75abe7e2e3a0874a49d7c175115f443f - depends: - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - size: 26155 - timestamp: 1706900211496 -- kind: conda - name: ncurses - version: '6.5' - build: h7bae524_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc - md5: cb2b0ea909b97b3d70cd3921d1445e1a - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - size: 802321 - timestamp: 1724658775723 -- kind: conda - name: ncurses - version: '6.5' - build: he02047a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a - md5: 70caf8bb6cf39a0b6b7efc885f51c0fe - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - size: 889086 - timestamp: 1724658547447 -- kind: conda - name: ncurses - version: '6.5' - build: hf036a51_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af - md5: e102bbf8a6ceeaf429deab8032fc8977 - depends: - - __osx >=10.13 - license: X11 AND BSD-3-Clause - size: 822066 - timestamp: 1724658603042 -- kind: conda - name: openssl - version: 3.3.1 - build: h2466b09_3 - build_number: 3 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.1-h2466b09_3.conda - sha256: 76a10564ca450f56495cff06bf60bdf0fe42e6ef7a20469276894d4ac7c0140a - md5: c6ebd3a1a2b393e040ca71c9f9ef8d97 - depends: - - ca-certificates - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: Apache - size: 8362062 - timestamp: 1724404916759 -- kind: conda - name: openssl - version: 3.3.1 - build: h8359307_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.1-h8359307_3.conda - sha256: 9dd1ee7a8c21ff4fcbb98e9d0be0e83e5daf8a555c73589ad9e3046966b72e5e - md5: 644904d696d83c0ac78d594e0cf09f66 - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - size: 2888820 - timestamp: 1724402552318 -- kind: conda - name: openssl - version: 3.3.1 - build: hb9d3cd8_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda - sha256: 9e27441b273a7cf9071f6e88ba9ad565d926d8083b154c64a74b99fba167b137 - md5: 6c566a46baae794daf34775d41eb180a - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc-ng >=13 - license: Apache-2.0 - license_family: Apache - size: 2892042 - timestamp: 1724402701933 -- kind: conda - name: openssl - version: 3.3.1 - build: hd23fc13_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.1-hd23fc13_3.conda - sha256: 63921822fbb66337e0fd50b2a07412583fbe7783bc92c663bdf93c9a09026fdc - md5: ad8c8c9556a701817bd1aca75a302e96 - depends: - - __osx >=10.13 - - ca-certificates - license: Apache-2.0 - license_family: Apache - size: 2549881 - timestamp: 1724403015051 -- kind: conda - name: python - version: 3.11.9 - build: h631f459_0_cpython - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.11.9-h631f459_0_cpython.conda - sha256: 23698d4eb24970f74911d120204318d48384fabbb25e1e57773ad74fcd38fb12 - md5: d7ed1e7c4e2dcdfd4599bd42c0613e6c - depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - openssl >=3.2.1,<4.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.11.* *_cp311 - license: Python-2.0 - size: 18232422 - timestamp: 1713551717924 -- kind: conda - name: python - version: 3.11.9 - build: h657bba9_0_cpython - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.9-h657bba9_0_cpython.conda - sha256: 3b50a5abb3b812875beaa9ab792dbd1bf44f335c64e9f9fedcf92d953995651c - md5: 612763bc5ede9552e4233ec518b9c9fb - depends: - - __osx >=10.9 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - ncurses >=6.4.20240210,<7.0a0 - - openssl >=3.2.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.11.* *_cp311 - license: Python-2.0 - size: 15503226 - timestamp: 1713553747073 -- kind: conda - name: python - version: 3.11.9 - build: h932a869_0_cpython - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.11.9-h932a869_0_cpython.conda - sha256: a436ceabde1f056a0ac3e347dadc780ee2a135a421ddb6e9a469370769829e3c - md5: 293e0713ae804b5527a673e7605c04fc - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - ncurses >=6.4.20240210,<7.0a0 - - openssl >=3.2.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.11.* *_cp311 - license: Python-2.0 - size: 14644189 - timestamp: 1713552154779 -- kind: conda - name: python - version: 3.11.9 - build: hb806964_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda - sha256: 177f33a1fb8d3476b38f73c37b42f01c0b014fa0e039a701fd9f83d83aae6d40 - md5: ac68acfa8b558ed406c75e98d3428d7b - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.2,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.45.3,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<2.0.0a0 - - ncurses >=6.4.20240210,<7.0a0 - - openssl >=3.2.1,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.11.* *_cp311 - license: Python-2.0 - size: 30884494 - timestamp: 1713553104915 -- kind: conda - name: python_abi - version: '3.11' - build: 5_cp311 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda - sha256: 2660b8059b3ee854bc5d3c6b1fce946e5bd2fe8fbca7827de2c5885ead6209de - md5: 139a8d40c8a2f430df31048949e450de - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6211 - timestamp: 1723823324668 -- kind: conda - name: python_abi - version: '3.11' - build: 5_cp311 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-5_cp311.conda - sha256: 9b092850a268aca99600b724bae849f51209ecd5628e609b4699debc59ff1945 - md5: e6d62858c06df0be0e6255c753d74787 - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6303 - timestamp: 1723823062672 -- kind: conda - name: python_abi - version: '3.11' - build: 5_cp311 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.11-5_cp311.conda - sha256: adc05729b7e0aca7b436e60a86f10822a92185dfcb48d66d6444e3629d3a1f6a - md5: 3b855e3734344134cb56c410f729c340 - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6308 - timestamp: 1723823096865 -- kind: conda - name: python_abi - version: '3.11' - build: 5_cp311 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-5_cp311.conda - sha256: 9b210e5807dd9c9ed71ff192a95f1872da597ddd10e7cefec93a922fe22e598a - md5: 895b873644c11ccc0ab7dba2d8513ae6 - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - size: 6707 - timestamp: 1723823225752 -- kind: conda - name: readline - version: '8.2' - build: h8228510_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 - md5: 47d31b792659ce70f470b5c82fdfb7a4 - depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 281456 - timestamp: 1679532220005 -- kind: conda - name: readline - version: '8.2' - build: h92ec313_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 - md5: 8cbb776a2f641b943d413b3e19df71f4 - depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 250351 - timestamp: 1679532511311 -- kind: conda - name: readline - version: '8.2' - build: h9e318b2_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 - md5: f17f77f2acf4d344734bda76829ce14e - depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 255870 - timestamp: 1679532707590 -- kind: conda - name: tk - version: 8.6.13 - build: h1abcd95_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 - md5: bf830ba5afc507c6232d4ef0fb1a882d - depends: - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - size: 3270220 - timestamp: 1699202389792 -- kind: conda - name: tk - version: 8.6.13 - build: h5083fa2_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 - md5: b50a57ba89c32b62428b71a875291c9b - depends: - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - size: 3145523 - timestamp: 1699202432999 -- kind: conda - name: tk - version: 8.6.13 - build: h5226925_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 - md5: fc048363eb8f03cd1737600a5d08aafe - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: TCL - license_family: BSD - size: 3503410 - timestamp: 1699202577803 -- kind: conda - name: tk - version: 8.6.13 - build: noxft_h4845f30_101 - build_number: 101 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD - size: 3318875 - timestamp: 1699202167581 -- kind: conda - name: tzdata - version: 2024a - build: h8827d51_1 - build_number: 1 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - sha256: 7d21c95f61319dba9209ca17d1935e6128af4235a67ee4e57a00908a1450081e - md5: 8bfdead4e0fff0383ae4c9c50d0531bd - license: LicenseRef-Public-Domain - size: 124164 - timestamp: 1724736371498 -- kind: conda - name: ucrt - version: 10.0.22621.0 - build: h57928b3_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 - md5: 72608f6cd3e5898229c3ea16deb1ac43 - constrains: - - vs2015_runtime >=14.29.30037 - license: LicenseRef-Proprietary - license_family: PROPRIETARY - size: 1283972 - timestamp: 1666630199266 -- kind: conda - name: vc - version: '14.3' - build: h8a93ad2_20 - build_number: 20 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_20.conda - sha256: 23ac5feb15a9adf3ab2b8c4dcd63650f8b7ae860c5ceb073e49cf71d203eddef - md5: 8558f367e1d7700554f7cdb823c46faf - depends: - - vc14_runtime >=14.40.33810 - track_features: - - vc14 - license: BSD-3-Clause - license_family: BSD - size: 17391 - timestamp: 1717709040616 -- kind: conda - name: vc14_runtime - version: 14.40.33810 - build: hcc2c482_20 - build_number: 20 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_20.conda - sha256: bba8daa6f78b26b48fb7e1377eb52160e25495710bf53146c5f405bd50565982 - md5: ad33c7cd933d69b9dee0f48317cdf137 - depends: - - ucrt >=10.0.20348.0 - constrains: - - vs2015_runtime 14.40.33810.* *_20 - license: LicenseRef-ProprietaryMicrosoft - license_family: Proprietary - size: 751028 - timestamp: 1724712684919 -- kind: conda - name: vs2015_runtime - version: 14.40.33810 - build: h3bf8584_20 - build_number: 20 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_20.conda - sha256: 0c2803f7a788c51f28235a7228dc2ab3f107b4b16ab0845a3e595c8c51e50a7a - md5: c21f1b4a3a30bbc3ef35a50957578e0e - depends: - - vc14_runtime >=14.40.33810 - license: BSD-3-Clause - license_family: BSD - size: 17395 - timestamp: 1717709043353 -- kind: conda - name: werkzeug - version: 3.0.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.0.4-pyhd8ed1ab_0.conda - sha256: 05cc8f76cb7b274ab1c78a1a8d421d1c084421e612829c33ce32af4e06039a92 - md5: 28753b434f2090f174d0c35ea629cc24 - depends: - - markupsafe >=2.1.1 - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - size: 242269 - timestamp: 1724330851536 -- kind: conda - name: xz - version: 5.2.6 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - size: 418368 - timestamp: 1660346797927 -- kind: conda - name: xz - version: 5.2.6 - build: h57fd34a_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 - size: 235693 - timestamp: 1660346961024 -- kind: conda - name: xz - version: 5.2.6 - build: h775f41a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 - md5: a72f9d4ea13d55d745ff1ed594747f10 - license: LGPL-2.1 and GPL-2.0 - size: 238119 - timestamp: 1660346964847 -- kind: conda - name: xz - version: 5.2.6 - build: h8d14728_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 - md5: 515d77642eaa3639413c6b1bc3f94219 - depends: - - vc >=14.1,<15 - - vs2015_runtime >=14.16.27033 - license: LGPL-2.1 and GPL-2.0 - size: 217804 - timestamp: 1660346976440 -- kind: conda - name: zipp - version: 3.20.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda - sha256: 30762bd25b6fc8714d5520a223ccf20ad4a6792dc439c54b59bf44b60bf51e72 - md5: 74a4befb4b38897e19a107693e49da20 - depends: - - python >=3.8 - license: MIT - license_family: MIT - size: 21110 - timestamp: 1724731063145 diff --git a/examples/flask-hello-world/pixi.toml b/examples/flask-hello-world/pixi.toml deleted file mode 100644 index 6b38f2d44..000000000 --- a/examples/flask-hello-world/pixi.toml +++ /dev/null @@ -1,23 +0,0 @@ -[project] -authors = ["Wolf Vollprecht "] -channels = ["conda-forge"] -description = "Example how to get started with flask in a pixi environment." -platforms = ["linux-64", "win-64", "osx-64", "osx-arm64"] -preview = ["pixi-build"] - -[tasks] -start = "python -m flask run --port=5050" - -[dependencies] -flask = "2.*" - -[package] -name = "flask-hello-world" -version = "0.1.0" - -[build-system] -build-backend = { name = "pixi-build-python", version = "*" } -channels = [ - "https://fast.prefix.dev/pixi-build-backends", - "https://fast.prefix.dev/conda-forge", -] diff --git a/examples/rich_example/.gitattributes b/examples/rich_example/.gitattributes new file mode 100644 index 000000000..8f61a8e77 --- /dev/null +++ b/examples/rich_example/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/examples/flask-hello-world-pyproject/.gitignore b/examples/rich_example/.gitignore similarity index 97% rename from examples/flask-hello-world-pyproject/.gitignore rename to examples/rich_example/.gitignore index 096b5eb54..740bb7d1a 100644 --- a/examples/flask-hello-world-pyproject/.gitignore +++ b/examples/rich_example/.gitignore @@ -1,3 +1,4 @@ + # pixi environments .pixi *.egg-info diff --git a/examples/rich_example/pixi.lock b/examples/rich_example/pixi.lock new file mode 100644 index 000000000..237108513 --- /dev/null +++ b/examples/rich_example/pixi.lock @@ -0,0 +1,881 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.0-h6355ac2_1_cp313t.conda + - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313t.conda + - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: . + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + - conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda + - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: . + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.0-h536b44d_1_cp313t.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313t.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: . + win-64: + - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + - conda: https://prefix.dev/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: . +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda + sha256: cad153608b81fb24fc8c509357daa9ae4e49dfc535b2cb49b91e23dbd68fc3c5 + md5: 7ed4301d437b59045be7e051a0308211 + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 134188 + timestamp: 1720974491916 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122909 + timestamp: 1720974522888 +- conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 54927 + timestamp: 1720974860185 +- conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea + md5: c27d1c142233b5bc9ca570c6e2e0c244 + license: ISC + purls: [] + size: 159003 + timestamp: 1725018903918 +- conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + sha256: 593f302d0f44c2c771e1614ee6d56fffdc7d616e6f187669c8b0e34ffce3e1ae + md5: b7e5424e7f06547a903d28e4651dbb21 + license: ISC + purls: [] + size: 158665 + timestamp: 1725019059295 +- conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 + md5: 40dec13fd8348dbe303e57be74bd3d35 + license: ISC + purls: [] + size: 158482 + timestamp: 1725019034582 +- conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + sha256: 0fcac3a7ffcc556649e034a1802aedf795e64227eaa7194d207b01eaf26454c4 + md5: 4c4fd67c18619be5aa65dc5b6c72e490 + license: ISC + purls: [] + size: 158773 + timestamp: 1725019107649 +- conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 669211 + timestamp: 1729655358674 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda + sha256: d10f43d0c5df6c8cf55259bce0fe14d2377eed625956cddce06f58827d288c59 + md5: 20307f4049a735a78a29073be1be2626 + depends: + - __osx >=10.13 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + purls: [] + size: 70758 + timestamp: 1730967204736 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda + sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 + md5: 38d2656dd914feb0cab8c629370768bf + depends: + - __osx >=11.0 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + purls: [] + size: 64693 + timestamp: 1730967175868 +- conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + sha256: 0c0447bf20d1013d5603499de93a16b6faa92d7ead870d96305c0f065b6a5a12 + md5: eb383771c680aa792feb529eaf9df82f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + purls: [] + size: 139068 + timestamp: 1730967442102 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 58292 + timestamp: 1636488182923 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + md5: ccb34fb14960ad8b125962d3d79b31a9 + license: MIT + license_family: MIT + purls: [] + size: 51348 + timestamp: 1636488394370 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + purls: [] + size: 42063 + timestamp: 1636489106777 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 848745 + timestamp: 1729027721139 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54142 + timestamp: 1729027726517 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 460992 + timestamp: 1729027639220 +- conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda + sha256: d02d1d3304ecaf5c728e515eb7416517a0b118200cd5eacbe829c432d1664070 + md5: aeb98fdeb2e8f25d43ef71fbacbeec80 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 89991 + timestamp: 1723817448345 +- conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda + sha256: f7917de9117d3a5fe12a39e185c7ce424f8d5010a6f97b4333e8a1dcb2889d16 + md5: 7476305c35dd9acef48da8f754eedb40 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 69263 + timestamp: 1723817629767 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 + md5: b6f02b52a174e612e89548f4663ce56a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 875349 + timestamp: 1730208050020 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + sha256: a0f7381c867898a45018b1e5cf1aca68659d292d58252e8f489a4270b010fed8 + md5: af445c495253a871c3d809e1199bb12b + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 915300 + timestamp: 1730208101739 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + sha256: 5a96caa566c11e5a5ebdcdb86a0759a7fb27d3c5f42e6a0fd0d6023c1e935d9e + md5: 07a14fbe439eef078cc479deca321161 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 837683 + timestamp: 1730208293578 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda + sha256: 3342d6fe787f5830f7e8466d9c65c914bfd8d67220fb5673041b338cbba47afe + md5: 5b1f36012cc3d09c4eb9f24ad0e2c379 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + purls: [] + size: 892175 + timestamp: 1730208431651 +- conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 55476 + timestamp: 1727963768015 +- conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 + md5: 93a8e71256479c62074356ef6ebf501b + depends: + - mdurl >=0.1,<1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + size: 64356 + timestamp: 1686175179621 +- conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 + md5: 776a8dd9e824f77abac30e6ef43a8f7a + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14680 + timestamp: 1704317789138 +- conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 889086 + timestamp: 1724658547447 +- conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda + sha256: b0b3180039ef19502525a2abd5833c00f9624af830fd391f851934d57bffb9af + md5: e102bbf8a6ceeaf429deab8032fc8977 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + purls: [] + size: 822066 + timestamp: 1724658603042 +- conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc + md5: cb2b0ea909b97b3d70cd3921d1445e1a + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + size: 802321 + timestamp: 1724658775723 +- conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 + md5: 23cc74f77eb99315c0360ec3533147a9 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2947466 + timestamp: 1731377666602 +- conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda + sha256: ba7e068ed469d6625e32ae60e6ad893e655b6695280dadf7e065ed0b6f3b885c + md5: ec99d2ce0b3033a75cbad01bbc7c5b71 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2590683 + timestamp: 1731378034404 +- conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda + sha256: bd1d58ced46e75efa3b842c61642fd12272c69e9fe4d7261078bc082153a1d53 + md5: df307bbc703324722df0293c9ca2e418 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2935176 + timestamp: 1731377561525 +- conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda + sha256: e03045a0837e01ff5c75e9273a572553e7522290799807f918c917a9826a6484 + md5: d0d805d9b5524a14efb51b3bff965e83 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 8491156 + timestamp: 1731379715927 +- conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b + md5: b7f5c092b8f9800150d998a71b76d5a1 + depends: + - python >=3.8 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 879295 + timestamp: 1714846885370 +- conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + sha256: 0d6133545f268b2b89c2617c196fc791f365b538d4057ecd636d658c3b1e885d + md5: b38dc0206e2a530e5c2cf11dc086b31a + depends: + - python >=3.9 + license: BSD-2-Clause + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 876700 + timestamp: 1733221731178 +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.0-h6355ac2_1_cp313t.conda + build_number: 1 + sha256: 9f9372b26c3509a8d798d5c1ffc58b0d34d96b7309efcbc5df40d1e72d5f8ef8 + md5: 7642e52774e72aa98c2eb1211e2978fd + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313t + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + track_features: + - py_freethreading + license: Python-2.0 + purls: [] + size: 41182351 + timestamp: 1732737151090 +- conda: https://prefix.dev/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda + sha256: 28172d94f7193c5075c0fc3c4b1bb617c512ffc991f4e2af0dbb6a2916872b76 + md5: 7f81191b1ca1113e694e90e15c27a12f + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 13761315 + timestamp: 1728058247482 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.0-h536b44d_1_cp313t.conda + build_number: 1 + sha256: efa6f1cbe92cccb0c3423a239cd0f7294273f3940954f20a523ba3ab66e97a0d + md5: 4c67396d5d15c84bf6493d6e3a76e484 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.4,<3.0a0 + - libffi >=3.4,<4.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313t + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + track_features: + - py_freethreading + license: Python-2.0 + purls: [] + size: 14646542 + timestamp: 1732735528561 +- conda: https://prefix.dev/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda + sha256: 2308cfa9ec563360d29ced7fd13a6b60b9a7b3cf8961a95c78c69f486211d018 + md5: 21f1f7c6ccf6b747c5086d2422c230e1 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 15987537 + timestamp: 1728057382072 +- conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313t.conda + build_number: 5 + sha256: 3405de6b376bc49b228b7650d2aa119a42224a7e567a82951a708fc4b914c035 + md5: ea4c21b96e8280414d9e243da0ec3201 + constrains: + - python 3.13.* *_cp313t + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6247 + timestamp: 1723823372966 +- conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313t.conda + build_number: 5 + sha256: 2165466ff175e1890b66d079d64449a1b6dd9873fb0f5e977839ccc4639b813b + md5: 24a9a05eba65586da53ad7b56a06dc02 + constrains: + - python 3.13.* *_cp313t + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6317 + timestamp: 1723823118660 +- conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + md5: f17f77f2acf4d344734bda76829ce14e + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 255870 + timestamp: 1679532707590 +- conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 250351 + timestamp: 1679532511311 +- conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 + md5: bcf8cc8924b5d20ead3d122130b8320b + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.8 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 185481 + timestamp: 1730592349978 +- conda: . + name: rich_example + version: 0.1.0 + build: pyhbf21a9e_0 + subdir: noarch + depends: + - python + input: + hash: 47136c98198c1378293ba5e45a59657fdabb454d75b620cab2a817a32404a037 + globs: + - pyproject.toml +- conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + md5: bf830ba5afc507c6232d4ef0fb1a882d + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3270220 + timestamp: 1699202389792 +- conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + purls: [] + size: 3503410 + timestamp: 1699202577803 +- conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 + depends: + - python >=3.9 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39637 + timestamp: 1733188758212 +- conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + purls: [] + size: 122354 + timestamp: 1728047496079 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + purls: [] + size: 559710 + timestamp: 1728377334097 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda + sha256: 986ddaf8feec2904eac9535a7ddb7acda1a1dfb9482088fdb8129f1595181663 + md5: 7c10ec3158d1eb4ddff7007c9101adb0 + depends: + - vc14_runtime >=14.38.33135 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17479 + timestamp: 1731710827215 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda + sha256: c483b090c4251a260aba6ff3e83a307bcfb5fb24ad7ced872ab5d02971bd3a49 + md5: 32b37d0cfa80da34548501cdc913a832 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.42.34433.* *_23 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 754247 + timestamp: 1731710681163 +- conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda + sha256: 568ce8151eaae256f1cef752fc78651ad7a86ff05153cc7a4740b52ae6536118 + md5: 5c176975ca2b8366abad3c97b3cd1e83 + depends: + - vc14_runtime >=14.42.34433 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 17572 + timestamp: 1731710685291 +- conda: https://prefix.dev/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 418368 + timestamp: 1660346797927 +- conda: https://prefix.dev/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 + md5: a72f9d4ea13d55d745ff1ed594747f10 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 238119 + timestamp: 1660346964847 +- conda: https://prefix.dev/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec + md5: 39c6b54e94014701dd157f4f576ed211 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 235693 + timestamp: 1660346961024 +- conda: https://prefix.dev/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + md5: 515d77642eaa3639413c6b1bc3f94219 + depends: + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 217804 + timestamp: 1660346976440 diff --git a/examples/flask-hello-world-pyproject/pyproject.toml b/examples/rich_example/pyproject.toml similarity index 66% rename from examples/flask-hello-world-pyproject/pyproject.toml rename to examples/rich_example/pyproject.toml index 66293ce3e..83a974ee6 100644 --- a/examples/flask-hello-world-pyproject/pyproject.toml +++ b/examples/rich_example/pyproject.toml @@ -1,9 +1,9 @@ [project] -dependencies = ["flask==2.*"] -description = "Example how to get started with flask in a pixi environment." -name = "flask-hello-world-pyproject" -readme = "README.md" -requires-python = ">=3.11" +authors = [{ name = "Julian Hofer", email = "julianhofer@gnome.org" }] +dependencies = ["rich"] +description = "A simple package showcasing a rich terminal interface and pixi-build-python" +name = "rich_example" +requires-python = ">= 3.11" version = "0.1.0" [build-system] @@ -11,43 +11,22 @@ build-backend = "hatchling.build" requires = ["hatchling"] [tool.pixi.project] -channels = ["conda-forge"] -platforms = ["linux-64", "osx-arm64", "osx-64", "win-64"] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] preview = ["pixi-build"] -[tool.pixi.pypi-dependencies] -flask-hello-world-pyproject = { path = ".", editable = true } - -[tool.pixi.dependencies] -flask = "2.*" - - -[tool.pixi.environments] -default = { solve-group = "default" } -test = { features = ["test"], solve-group = "default" } - -[tool.pixi.tasks] -start = "python -m flask --app flask_hello_world_pyproject.app:app run --port=5050" - -[tool.pixi.feature.test.tasks] -test = "pytest -v tests/*" +[tool.pixi.host-dependencies] +# To be able to install this pyproject we need to install the dependencies of +# the python build-system defined above. Note that different from the +# pyproject build-system this refers to a conda package instead of a pypi +# package. +hatchling = "==1.26.3" +# This way uv is used instead of pip +uv = "*" -[dependency-groups] -test = ["pytest>=8.3.3,<9"] - -# -# Adding this section to the pyproject.toml file will enable the Pixi build -# system. With the following configuration the package can be build directly -# into a conda package. -# - -# This section marks the project as a pixi package. -# -# Normally a number of fields would be set here, like the name, version, etc. -# However, since all these fields are already defined in the [project] section -# at the top of this file they are not required. -[tool.pixi.package] +[project.scripts] +rich_example = "rich_example:main" # The build-system section defines the build system that will be used to turn # the source code of this package into a conda package. Similarly to the above @@ -62,7 +41,6 @@ test = ["pytest>=8.3.3,<9"] # The `build-backend` key also functions as a dependency declaration. At least # a version specifier must be added. build-backend = { name = "pixi-build-python", version = "*" } - # These are the conda channels that are used to resolve the dependencies of the # build backend package. channels = [ @@ -70,9 +48,17 @@ channels = [ "https://prefix.dev/conda-forge", ] -# To be able to install this pyproject we need to install the dependencies of -# the python build-system defined above. Note that different from the -# pyproject build-system this refers to a conda package instead of a pypi -# package. -[tool.pixi.host-dependencies] -hatchling = "==1.26.3" + +[tool.pixi.tasks] +test = "rich_example" + +[tool.pixi.dependencies] +rich = ">=13.9.4,<14" +rich_example = { path = "." } + +# This section marks the project as a pixi package. +# +# Normally a number of fields would be set here, like the name, version, etc. +# However, since all these fields are already defined in the [project] section +# at the top of this file they are not required. +[tool.pixi.package] diff --git a/examples/rich_example/src/rich_example/__init__.py b/examples/rich_example/src/rich_example/__init__.py new file mode 100644 index 000000000..be2121f01 --- /dev/null +++ b/examples/rich_example/src/rich_example/__init__.py @@ -0,0 +1,18 @@ +from rich.console import Console +from rich.table import Table + + +def main() -> None: + console = Console() + + table = Table(title="Simple Rich Example") + + table.add_column("Name", justify="right", style="cyan", no_wrap=True) + table.add_column("Age", style="magenta") + table.add_column("City", justify="right", style="green") + + table.add_row("John Doe", "30", "New York") + table.add_row("Jane Smith", "25", "Los Angeles") + table.add_row("Tim de Jager", "35", "Utrecht") + + console.print(table) diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index d2a533d6f..e6ada61fb 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -8,12 +8,15 @@ def test_build_conda_package(pixi: Path, examples_dir: Path, tmp_pixi_workspace: Path) -> None: """ - This one tries to build the example flask hello world project + This one tries to build the rich example project """ - pyproject = examples_dir / "flask-hello-world-pyproject" - shutil.copytree(pyproject, tmp_pixi_workspace / "pyproject") + pyproject = examples_dir / "rich_example" + target_dir = tmp_pixi_workspace / "pyproject" + shutil.copytree(pyproject, target_dir) + shutil.rmtree(target_dir.joinpath(".pixi"), ignore_errors=True) + + manifest_path = target_dir / "pyproject.toml" - manifest_path = tmp_pixi_workspace / "pyproject" / "pyproject.toml" # Add a boltons package to it verify_cli_command( [ diff --git a/tests/scripts/test-examples.sh b/tests/scripts/test-examples.sh index a04f5f4ee..81ee4c3d0 100644 --- a/tests/scripts/test-examples.sh +++ b/tests/scripts/test-examples.sh @@ -1,3 +1,4 @@ +#!/bin/bash # Run from the root of the project using `bash tests/test_examples.sh` set -e echo "Running test_examples.sh" @@ -17,5 +18,5 @@ echo "Running the solve-groups example:" pixi run -v --manifest-path examples/solve-groups/pixi.toml -e min-py38 test pixi run -v --manifest-path examples/solve-groups/pixi.toml -e max-py310 test -echo "Running the flask-hello-world-pyproject example:" -pixi run -v --manifest-path examples/flask-hello-world-pyproject/pyproject.toml test +echo "Running the rich example:" +pixi run -v --manifest-path examples/rich_example/pyproject.toml test From 06dd411a822def520b198b871f7d89a0c98e5ef3 Mon Sep 17 00:00:00 2001 From: "ZhengYu, Xu" Date: Thu, 5 Dec 2024 15:57:31 +0800 Subject: [PATCH 13/16] fix: forgot to configure `allow_insecure_host` when resolve_pypi (#2622) I'm sorry I missed this point in #2521 @_@ --- src/lock_file/resolve/pypi.rs | 1 + tests/integration_rust/pypi_tests.rs | 45 +++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/lock_file/resolve/pypi.rs b/src/lock_file/resolve/pypi.rs index 3fb15d52f..a4bb972f1 100644 --- a/src/lock_file/resolve/pypi.rs +++ b/src/lock_file/resolve/pypi.rs @@ -285,6 +285,7 @@ pub async fn resolve_pypi( let registry_client = Arc::new( RegistryClientBuilder::new(context.cache.clone()) .client(context.client.clone()) + .allow_insecure_host(context.allow_insecure_host.clone()) .index_urls(index_locations.index_urls()) .index_strategy(index_strategy) .markers(&marker_environment) diff --git a/tests/integration_rust/pypi_tests.rs b/tests/integration_rust/pypi_tests.rs index a55990bf0..b5b68a866 100644 --- a/tests/integration_rust/pypi_tests.rs +++ b/tests/integration_rust/pypi_tests.rs @@ -1,10 +1,11 @@ -use std::path::Path; +use std::{io::Write, path::Path}; use rattler_conda_types::Platform; use typed_path::Utf8TypedPath; use url::Url; use crate::common::{LockFileExt, PixiControl}; +use std::fs::File; #[tokio::test] #[cfg_attr(not(feature = "slow_integration_tests"), ignore)] @@ -244,3 +245,45 @@ async fn pin_torch() { .path() .contains("/whl/cu124")); } + +#[tokio::test] +#[cfg_attr(not(feature = "slow_integration_tests"), ignore)] +async fn test_allow_insecure_host() { + let pixi = PixiControl::from_manifest(&format!( + r#" + [project] + name = "pypi-extra-index-url" + platforms = ["{platform}"] + channels = ["https://prefix.dev/conda-forge"] + + [dependencies] + python = "~=3.12.0" + + [pypi-dependencies] + sh = "*" + + [pypi-options] + extra-index-urls = ["https://expired.badssl.com/"]"#, + platform = Platform::current(), + )) + .unwrap(); + // will occur ssl error + assert!( + pixi.update_lock_file().await.is_err(), + "should occur ssl error" + ); + + let config_path = pixi.project().unwrap().pixi_dir().join("config.toml"); + fs_err::create_dir_all(config_path.parent().unwrap()).unwrap(); + let mut file = File::create(config_path).unwrap(); + file.write_all( + r#" + detached-environments = false + + [pypi-config] + allow-insecure-host = ["expired.badssl.com"]"# + .as_bytes(), + ) + .unwrap(); + pixi.update_lock_file().await.unwrap(); +} From 804c31e8a729ac19269a77b7662fcfdb80407ea4 Mon Sep 17 00:00:00 2001 From: Jermiah Joseph <44614774+jjjermiah@users.noreply.github.com> Date: Thu, 5 Dec 2024 04:08:58 -0500 Subject: [PATCH 14/16] feat: add detailed json output for task list (#2608) --- crates/pixi_manifest/src/task.rs | 16 +++++ src/cli/task.rs | 116 +++++++++++++++++++++++++++++++ src/project/environment.rs | 20 ++++++ 3 files changed, 152 insertions(+) diff --git a/crates/pixi_manifest/src/task.rs b/crates/pixi_manifest/src/task.rs index 2101d6b6f..d038f4574 100644 --- a/crates/pixi_manifest/src/task.rs +++ b/crates/pixi_manifest/src/task.rs @@ -158,6 +158,22 @@ impl Task { Task::Alias(_) => false, } } + + /// Returns the inputs of the task. + pub fn inputs(&self) -> Option<&[String]> { + match self { + Task::Execute(exe) => exe.inputs.as_deref(), + _ => None, + } + } + + /// Returns the outputs of the task. + pub fn outputs(&self) -> Option<&[String]> { + match self { + Task::Execute(exe) => exe.outputs.as_deref(), + _ => None, + } + } } /// A command script executes a single command from the environment diff --git a/src/cli/task.rs b/src/cli/task.rs index ad6923553..68f38c010 100644 --- a/src/cli/task.rs +++ b/src/cli/task.rs @@ -10,6 +10,8 @@ use pixi_manifest::task::{quote, Alias, CmdArgs, Execute, Task, TaskName}; use pixi_manifest::EnvironmentName; use pixi_manifest::FeatureName; use rattler_conda_types::Platform; +use serde::Serialize; +use serde_with::serde_as; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::error::Error; use std::io; @@ -135,6 +137,11 @@ pub struct ListArgs { /// If not specified, the default environment is used. #[arg(long, short)] pub environment: Option, + + /// List as json instead of a tree + /// If not specified, the default environment is used. + #[arg(long)] + pub json: bool, } impl From for Task { @@ -368,6 +375,11 @@ pub fn execute(args: Args) -> miette::Result<()> { ); } Operation::List(args) => { + if args.json { + print_tasks_json(&project); + return Ok(()); + } + let explicit_environment = args .environment .map(|n| EnvironmentName::from_str(n.as_str())) @@ -439,3 +451,107 @@ pub fn execute(args: Args) -> miette::Result<()> { Project::warn_on_discovered_from_env(args.project_config.manifest_path.as_deref()); Ok(()) } + +fn print_tasks_json(project: &Project) { + let env_feature_task_map: Vec = build_env_feature_task_map(project); + + let json_string = + serde_json::to_string_pretty(&env_feature_task_map).expect("Failed to serialize tasks"); + println!("{}", json_string); +} + +fn build_env_feature_task_map(project: &Project) -> Vec { + project + .environments() + .iter() + .sorted_by_key(|env| env.name().to_string()) + .filter_map(|env: &Environment<'_>| { + if verify_current_platform_has_required_virtual_packages(env).is_err() { + return None; + } + Some(EnvTasks::from(env)) + }) + .collect() +} + +#[derive(Serialize, Debug)] +struct EnvTasks { + environment: String, + features: Vec, +} + +impl From<&Environment<'_>> for EnvTasks { + fn from(env: &Environment) -> Self { + Self { + environment: env.name().to_string(), + features: env + .feature_tasks() + .iter() + .map(|(feature_name, task_map)| { + SerializableFeature::from((*feature_name, task_map)) + }) + .collect(), + } + } +} + +#[derive(Serialize, Debug)] +struct SerializableFeature { + name: String, + tasks: Vec, +} + +#[derive(Serialize, Debug)] +struct SerializableTask { + name: String, + #[serde(flatten)] + info: TaskInfo, +} + +impl From<(&FeatureName, &HashMap<&TaskName, &Task>)> for SerializableFeature { + fn from((feature_name, task_map): (&FeatureName, &HashMap<&TaskName, &Task>)) -> Self { + Self { + name: feature_name.to_string(), + tasks: task_map + .iter() + .map(|(task_name, task)| SerializableTask { + name: task_name.to_string(), + info: TaskInfo::from(*task), + }) + .collect(), + } + } +} + +/// Collection of task properties for displaying in the UI. +#[serde_as] +#[derive(Serialize, Debug)] +pub struct TaskInfo { + cmd: Option, + description: Option, + depends_on: Vec, + cwd: Option, + env: Option>, + clean_env: bool, + inputs: Option>, + outputs: Option>, +} + +impl From<&Task> for TaskInfo { + fn from(task: &Task) -> Self { + TaskInfo { + cmd: task.as_single_command().map(|cmd| cmd.to_string()), + description: task.description().map(|desc| desc.to_string()), + depends_on: task.depends_on().to_vec(), + cwd: task.working_directory().map(PathBuf::from), + env: task.env().cloned(), + clean_env: task.clean_env(), + inputs: task + .inputs() + .map(|inputs| inputs.iter().map(String::from).collect()), + outputs: task + .outputs() + .map(|outputs| outputs.iter().map(String::from).collect()), + } + } +} diff --git a/src/project/environment.rs b/src/project/environment.rs index 3b78db4f2..a55d54d82 100644 --- a/src/project/environment.rs +++ b/src/project/environment.rs @@ -227,6 +227,26 @@ impl<'p> Environment<'p> { } } + /// Returns a map of all the features and their tasks for this environment. + /// + /// Resolves for the best platform target. + pub(crate) fn feature_tasks( + &self, + ) -> HashMap<&'p FeatureName, HashMap<&'p TaskName, &'p Task>> { + self.features() + .map(|feature| { + ( + &feature.name, + feature + .targets + .resolve(Some(self.best_platform())) + .flat_map(|target| target.tasks.iter()) + .collect::>(), + ) + }) + .collect() + } + /// Returns the system requirements for this environment. /// /// The system requirements of the environment are the union of the system From 2a1e115ebd86ecd99928c1003b59a6546a386f51 Mon Sep 17 00:00:00 2001 From: Tim de Jager Date: Thu, 5 Dec 2024 11:34:54 +0100 Subject: [PATCH 15/16] fix: attempt to fix flaky pypi CI for linux (#2651) --- src/install_pypi/plan/test/harness.rs | 6 ++++ src/install_pypi/plan/test/mod.rs | 44 +++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/install_pypi/plan/test/harness.rs b/src/install_pypi/plan/test/harness.rs index e44180a61..b64ee84d5 100644 --- a/src/install_pypi/plan/test/harness.rs +++ b/src/install_pypi/plan/test/harness.rs @@ -190,6 +190,11 @@ impl MockedSitePackages { } } + #[allow(dead_code)] + pub fn base_dir(&self) -> &Path { + self.fake_site_packages.path() + } + /// Create INSTALLER and METADATA files for the installed dist /// these are checked for the installer and requires python fn create_file_backing( @@ -516,6 +521,7 @@ pub fn fake_pyproject_toml( // Set the modification time if it is provided if let Some(modification_time) = modification_time { pyproject_toml.set_modified(modification_time).unwrap(); + pyproject_toml.sync_all().unwrap(); } (temp_dir, pyproject_toml) } diff --git a/src/install_pypi/plan/test/mod.rs b/src/install_pypi/plan/test/mod.rs index a6b48d43e..9c022ffd4 100644 --- a/src/install_pypi/plan/test/mod.rs +++ b/src/install_pypi/plan/test/mod.rs @@ -320,8 +320,7 @@ fn test_local_source_newer_than_local_metadata() { .unwrap(); pyproject.sync_all().unwrap(); - // pyproject.toml file is older than the cache, all else is the same - // so we do not expect a re-installation + // We expect a reinstall, because the pyproject.toml file is newer than the cache let plan = harness::install_planner(); let install_plan = plan .plan(&site_packages, NoCache, &required.to_borrowed()) @@ -332,6 +331,47 @@ fn test_local_source_newer_than_local_metadata() { ); } +#[test] +fn test_local_source_older_than_local_metadata() { + let (fake, pyproject) = harness::fake_pyproject_toml(Some( + std::time::SystemTime::now() - std::time::Duration::from_secs(60 * 60 * 24), + )); + let site_packages = MockedSitePackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + false, + // Set the metadata mtime to now explicitly + InstalledDistOptions::default().with_metadata_mtime(std::time::SystemTime::now()), + ); + // Requires following package + let required = RequiredPackages::new().add_directory( + "aiofiles", + "0.6.0", + fake.path().to_path_buf(), + false, + ); + + let dist_info = site_packages + .base_dir() + .join(format!("{}-{}.dist-info", "aiofiles", "0.6.0")) + .join("METADATA"); + // Sanity check that these timestamps are different + assert_ne!( + pyproject.metadata().unwrap().modified().unwrap(), + dist_info.metadata().unwrap().modified().unwrap() + ); + + // Install plan should not reinstall anything + let plan = harness::install_planner(); + let install_plan = plan + .plan(&site_packages, NoCache, &required.to_borrowed()) + .expect("should install"); + assert_eq!(install_plan.reinstalls.len(), 0); + assert_eq!(install_plan.local.len(), 0); + assert_eq!(install_plan.remote.len(), 0); +} + /// When we have an editable package installed and we require a non-editable package /// we should reinstall the non-editable package #[test] From 1795629a69142485834e6b1ec64401d9e175323e Mon Sep 17 00:00:00 2001 From: Ruben Arts Date: Thu, 5 Dec 2024 17:06:15 +0100 Subject: [PATCH 16/16] chore: bump `uv` and `rattler` to the latest versions (#2652) Co-authored-by: Tim de Jager --- Cargo.lock | 1498 ++++++++++------- Cargo.toml | 93 +- ...quirement__tests__deserialize_failing.snap | 3 +- .../pixi_uv_conversions/src/requirements.rs | 2 + src/install_pypi/mod.rs | 15 +- src/lock_file/resolve/pypi.rs | 31 +- .../resolve/uv_resolution_context.rs | 7 +- tests/integration_python/test_main_cli.py | 6 +- 8 files changed, 956 insertions(+), 699 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf830e380..9e0ca9de0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,9 +58,9 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -79,9 +79,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -94,49 +94,49 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -187,9 +187,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" dependencies = [ "bzip2", "flate2", @@ -211,7 +211,7 @@ checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.1", + "fastrand", "futures-lite", "slab", ] @@ -226,7 +226,7 @@ dependencies = [ "cfg-if", "pin-project", "rustix", - "thiserror", + "thiserror 1.0.69", "tokio", "windows-sys 0.52.0", ] @@ -244,9 +244,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", "cfg-if", @@ -274,15 +274,15 @@ dependencies = [ [[package]] name = "async-once-cell" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9338790e78aa95a416786ec8389546c4b6a1dfc3dc36071ed9518a9413a542eb" +checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" [[package]] name = "async-process" -version = "2.2.4" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ "async-channel", "async-io", @@ -295,7 +295,6 @@ dependencies = [ "futures-lite", "rustix", "tracing", - "windows-sys 0.59.0", ] [[package]] @@ -311,9 +310,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ "async-io", "async-lock", @@ -324,7 +323,7 @@ dependencies = [ "rustix", "signal-hook-registry", "slab", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -346,9 +345,9 @@ dependencies = [ [[package]] name = "async_http_range_reader" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4015e7130cf870da1c64a9c7ba474f4b3772a530edbeb05f8358bc9a02f8e505" +checksum = "2b537c00269e3f943e06f5d7cabf8ccd281b800fd0c7f111dd82f77154334197" dependencies = [ "bisection", "futures", @@ -357,7 +356,7 @@ dependencies = [ "memmap2 0.9.5", "reqwest", "reqwest-middleware", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -367,13 +366,13 @@ dependencies = [ [[package]] name = "async_zip" version = "0.0.17" -source = "git+https://github.com/charliermarsh/rs-async-zip?rev=011b24604fa7bc223daaad7712c0694bac8f0a87#011b24604fa7bc223daaad7712c0694bac8f0a87" +source = "git+https://github.com/charliermarsh/rs-async-zip?rev=c909fda63fcafe4af496a07bfda28a5aae97e58d#c909fda63fcafe4af496a07bfda28a5aae97e58d" dependencies = [ "async-compression", "crc32fast", "futures-lite", "pin-project", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", ] @@ -432,7 +431,7 @@ dependencies = [ name = "barrier_cell" version = "0.1.0" dependencies = [ - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -529,18 +528,18 @@ dependencies = [ [[package]] name = "boxcar" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba19c552ee63cb6646b75e1166d1bdb8a6d34a6d19e319dec88c8adadff2db3" +checksum = "7f839cdf7e2d3198ac6ca003fd8ebc61715755f41c1cad15ff13df67531e00ed" [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "serde", ] @@ -608,9 +607,9 @@ dependencies = [ [[package]] name = "cacache" -version = "13.0.0" +version = "13.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61ff12b19d89c752c213316b87fdb4a587f073d219b893cc56974b8c9f39bf7" +checksum = "5c5063741c7b2e260bbede781cf4679632dd90e2718e99f7715e46824b65670b" dependencies = [ "digest", "either", @@ -627,7 +626,7 @@ dependencies = [ "sha2", "ssri", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "walkdir", @@ -650,12 +649,12 @@ dependencies = [ [[package]] name = "cargo-util" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6dd67a24439ca5260a08128b6cbf4b0f4453497a2f60508163ab9d5b534b122" +checksum = "0b15bbe49616ee353fadadf6de5a24136f3fe8fdbd5eb0894be9f8a42c905674" dependencies = [ "anyhow", - "core-foundation 0.9.4", + "core-foundation 0.10.0", "filetime", "hex", "ignore", @@ -682,9 +681,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.30" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" dependencies = [ "jobserver", "libc", @@ -746,9 +745,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" dependencies = [ "clap_builder", "clap_derive", @@ -756,9 +755,9 @@ dependencies = [ [[package]] name = "clap-verbosity-flag" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d19864d6b68464c59f7162c9914a0b569ddc2926b4a2d71afe62a9738eff53" +checksum = "34c77f67047557f62582784fd7482884697731b2932c7d37ced54bce2312e1e2" dependencies = [ "clap", "log", @@ -766,31 +765,31 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", - "terminal_size 0.4.0", + "terminal_size 0.4.1", ] [[package]] name = "clap_complete" -version = "4.5.12" +version = "4.5.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8670053e87c316345e384ca1f3eba3006fc6355ed8b8a1140d104e109e3df34" +checksum = "d9647a559c112175f17cf724dc72d3645680a883c58481332779192b0d8e7a01" dependencies = [ "clap", ] [[package]] name = "clap_complete_nushell" -version = "4.5.3" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe32110e006bccf720f8c9af3fee1ba7db290c724eab61544e1d3295be3a40e" +checksum = "315902e790cc6e5ddd20cbd313c1d0d49db77f191e149f96397230fb82a17677" dependencies = [ "clap", "clap_complete", @@ -810,15 +809,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "combine" @@ -906,9 +905,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -968,9 +967,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", @@ -1093,7 +1092,7 @@ dependencies = [ "monch", "os_pipe", "path-dedot", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", ] @@ -1110,9 +1109,9 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", @@ -1134,7 +1133,7 @@ dependencies = [ "console", "shell-words", "tempfile", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -1149,15 +1148,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "directories" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" -dependencies = [ - "dirs-sys", -] - [[package]] name = "dirs" version = "5.0.1" @@ -1225,9 +1215,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1249,11 +1239,11 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enum-as-inner" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn", @@ -1310,12 +1300,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1342,9 +1332,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener", "pin-project-lite", @@ -1352,9 +1342,9 @@ dependencies = [ [[package]] name = "fake" -version = "2.9.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c25829bde82205da46e1823b2259db6273379f626fc211f126f65654a2669be" +checksum = "2d391ba4af7f1d93f01fcf7b2f29e2bc9348e109dfdbf4dcbdc51dfa38dab0b6" dependencies = [ "deunicode", "rand", @@ -1369,18 +1359,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fd-lock" @@ -1395,12 +1376,13 @@ dependencies = [ [[package]] name = "file_url" -version = "0.1.7" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2789b7b3e160530d89d1e126aff9811c3421bb77ebb9b62ffa3abbeba69f12d" dependencies = [ "itertools 0.13.0", "percent-encoding", - "thiserror", + "thiserror 1.0.69", "typed-path", "url", ] @@ -1425,9 +1407,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1435,9 +1417,9 @@ dependencies = [ [[package]] name = "float-cmp" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" dependencies = [ "num-traits", ] @@ -1448,6 +1430,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1504,9 +1492,9 @@ dependencies = [ [[package]] name = "fs4" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc91b3da7f1a7968b00f9f65a4971252f6a927d3cb9eec05d91cbeaff678f9a" +checksum = "e871a4cfa68bb224863b53149d973df1ac8d1ed2fa1d1bfc37ac1bb65dd37207" dependencies = [ "fs-err 2.11.0", "rustix", @@ -1585,11 +1573,11 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.1.1", + "fastrand", "futures-core", "futures-io", "parking", @@ -1694,14 +1682,14 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -1731,7 +1719,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -1775,9 +1763,9 @@ dependencies = [ [[package]] name = "google-cloud-auth" -version = "0.17.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357160f51a60ec3e32169ad687f4abe0ee1e90c73b449aa5d11256c4f1cf2ff6" +checksum = "e57a13fbacc5e9c41ded3ad8d0373175a6b7a6ad430d99e89d314ac121b7ab06" dependencies = [ "async-trait", "base64 0.21.7", @@ -1788,7 +1776,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "tracing", @@ -1802,7 +1790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f945a208886a13d07636f38fb978da371d0abc3e34bad338124b9f8c135a8f" dependencies = [ "reqwest", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -1817,9 +1805,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -1827,7 +1815,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -1862,9 +1850,14 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -1937,9 +1930,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1971,9 +1964,9 @@ dependencies = [ [[package]] name = "http-cache" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ffb12b95bb2a369fe47ca8924016c72c2fa0e6059ba98bd1516f558696c5a8" +checksum = "33b65cd1687caf2c7fff496741a2f264c26f54e6d6cec03dac8f276fa4e5430e" dependencies = [ "async-trait", "bincode", @@ -1987,9 +1980,9 @@ dependencies = [ [[package]] name = "http-cache-reqwest" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be3e27c4e2e510571cbcc601407b639667146aa9a4e818d5cc1d97c8b4b27d61" +checksum = "735586904a5ce0c13877c57cb4eb8195eb7c11ec1ffd64d4db053fb8559ca62e" dependencies = [ "anyhow", "async-trait", @@ -2066,9 +2059,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", @@ -2096,7 +2089,7 @@ dependencies = [ "hyper-util", "log", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2122,9 +2115,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -2162,6 +2155,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2170,25 +2281,36 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] name = "ignore" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" dependencies = [ "crossbeam-deque", "globset", "log", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "same-file", "walkdir", "winapi-util", @@ -2207,26 +2329,26 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] [[package]] name = "indicatif" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" dependencies = [ "console", - "instant", "number_prefix", "portable-atomic", - "unicode-width 0.1.14", + "unicode-width 0.2.0", + "web-time", ] [[package]] @@ -2247,9 +2369,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.39.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810ae6042d48e2c9e9215043563a58a80b877bc863228a74cf10c49d4620a6f5" +checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" dependencies = [ "console", "globset", @@ -2287,9 +2409,9 @@ checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" [[package]] name = "is_executable" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8" +checksum = "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2" dependencies = [ "winapi", ] @@ -2329,15 +2451,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jiff" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d9d414fc817d3e3d62b2598616733f76c4cc74fbac96069674739b881295c8" +checksum = "db69f08d4fb10524cacdb074c10b296299d71274ddbc830a8ee65666867002e9" dependencies = [ "jiff-tzdb-platform", "serde", @@ -2369,7 +2491,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -2390,10 +2512,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2406,7 +2529,7 @@ dependencies = [ "jsonptr", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2435,9 +2558,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d80eccbd47a7b9f1e67663fd846928e941cb49c65236e297dd11c9ea3c5e3387" +checksum = "548125b159ba1314104f5bb5f38519e03a41862786aa3925cf349aae9cdd546e" dependencies = [ "base64 0.22.1", "futures-channel", @@ -2450,7 +2573,7 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-rustls", "tokio-util", @@ -2460,9 +2583,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2709a32915d816a6e8f625bf72cf74523ebe5d8829f895d6b041b1d3137818" +checksum = "f2882f6f8acb9fdaec7cefc4fd607119a9bd709831df7d7672a1d3b644628280" dependencies = [ "async-trait", "bytes", @@ -2476,7 +2599,7 @@ dependencies = [ "rustc-hash", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -2485,9 +2608,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc54db939002b030e794fbfc9d5a925aa2854889c5a2f0352b0bffa54681707e" +checksum = "b3638bc4617f96675973253b3a45006933bde93c2fd8a6170b33c777cc389e5b" dependencies = [ "async-trait", "base64 0.22.1", @@ -2501,7 +2624,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tower", "tracing", @@ -2510,21 +2633,21 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca331cd7b3fe95b33432825c2d4c9f5a43963e207fdc01ae67f9fd80ab0930f" +checksum = "a178c60086f24cc35bb82f57c651d0d25d99c4742b4d335de04e97fa1f08a8a1" dependencies = [ "http", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "jsonrpsee-wasm-client" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c603d97578071dc44d79d3cfaf0775437638fd5adc33c6b622dfe4fa2ec812d" +checksum = "1a01cd500915d24ab28ca17527e23901ef1be6d659a2322451e1045532516c25" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -2533,9 +2656,9 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755ca3da1c67671f1fae01cd1a47f41dfb2233a8f19a643e587ab0a663942044" +checksum = "0fe322e0896d0955a3ebdd5bf813571c53fea29edd713bc315b76620b327e86d" dependencies = [ "http", "jsonrpsee-client-transport", @@ -2580,7 +2703,7 @@ dependencies = [ "log", "secret-service", "security-framework 2.11.1", - "security-framework 3.0.0", + "security-framework 3.0.1", "windows-sys 0.59.0", "zbus", ] @@ -2632,9 +2755,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libdbus-sys" @@ -2647,9 +2770,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -2657,9 +2780,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" @@ -2669,7 +2792,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.5.3", + "redox_syscall 0.5.7", ] [[package]] @@ -2684,6 +2807,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -2788,7 +2917,7 @@ checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" dependencies = [ "miette-derive 5.10.0", "once_cell", - "thiserror", + "thiserror 1.0.69", "unicode-width 0.1.14", ] @@ -2809,7 +2938,7 @@ dependencies = [ "supports-unicode", "terminal_size 0.3.0", "textwrap", - "thiserror", + "thiserror 1.0.69", "unicode-width 0.1.14", ] @@ -2853,9 +2982,9 @@ dependencies = [ [[package]] name = "minijinja" -version = "2.1.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4bf71af278c578cbcc91d0b1ff092910208bc86f7b3750364642bd424e3dcd3" +checksum = "2c37e1b517d1dcd0e51dc36c4567b9d5a29262b3ec8da6cb5d35e27a8fb529b5" dependencies = [ "serde", ] @@ -2877,11 +3006,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -3108,9 +3236,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.67" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3280,7 +3408,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -3308,9 +3436,9 @@ checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pem" @@ -3324,14 +3452,15 @@ dependencies = [ [[package]] name = "pep440_rs" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0922a442c78611fa8c5ed6065d2d898a820cf12fa90604217fdb2d01675efec7" +checksum = "31095ca1f396e3de32745f42b20deef7bc09077f918b085307e8eab6ddd8fb9c" dependencies = [ + "once_cell", "serde", "unicode-width 0.2.0", "unscanny", - "version-ranges 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version-ranges 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3341,7 +3470,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c2feee999fa547bacab06a4881bacc74688858b92fa8ef1e206c748b0a76048" dependencies = [ "boxcar", - "indexmap 2.6.0", + "indexmap 2.7.0", "itertools 0.13.0", "once_cell", "pep440_rs", @@ -3349,11 +3478,11 @@ dependencies = [ "rustc-hash", "serde", "smallvec", - "thiserror", + "thiserror 1.0.69", "unicode-width 0.2.0", "url", "urlencoding", - "version-ranges 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version-ranges 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3369,7 +3498,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -3418,18 +3547,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", @@ -3455,7 +3584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.1", + "fastrand", "futures-io", ] @@ -3492,7 +3621,7 @@ dependencies = [ "human_bytes", "humantime", "ignore", - "indexmap 2.6.0", + "indexmap 2.7.0", "indicatif", "insta", "is_executable", @@ -3545,7 +3674,7 @@ dependencies = [ "tabwriter", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "toml_edit", @@ -3573,7 +3702,7 @@ dependencies = [ "uv-resolver", "uv-types", "xxhash-rust", - "zip 2.2.0", + "zip 2.2.1", "zstd", ] @@ -3611,7 +3740,7 @@ dependencies = [ "serde_yaml", "sha1", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -3662,7 +3791,7 @@ version = "0.1.0" dependencies = [ "console", "lazy_static", - "rattler_cache 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "rattler_cache", "url", ] @@ -3685,7 +3814,7 @@ dependencies = [ "rattler_digest", "rstest", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "wax", ] @@ -3700,7 +3829,7 @@ dependencies = [ "fancy_display", "fs-err 2.11.0", "glob", - "indexmap 2.6.0", + "indexmap 2.7.0", "insta", "itertools 0.13.0", "miette 7.2.0", @@ -3723,7 +3852,7 @@ dependencies = [ "spdx", "strsim", "tempfile", - "thiserror", + "thiserror 1.0.69", "toml_edit", "tracing", "url", @@ -3757,7 +3886,7 @@ dependencies = [ "rattler_digest", "rattler_lock", "serde", - "thiserror", + "thiserror 1.0.69", "typed-path", "url", ] @@ -3776,7 +3905,7 @@ dependencies = [ "serde-untagged", "serde_json", "serde_with", - "thiserror", + "thiserror 1.0.69", "toml_edit", "typed-path", "url", @@ -3804,7 +3933,7 @@ dependencies = [ "serde_json", "serde_yaml", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", "tracing-subscriber", "url", @@ -3820,7 +3949,7 @@ dependencies = [ "pixi_manifest", "rattler_lock", "serde_json", - "thiserror", + "thiserror 1.0.69", "url", "uv-configuration", "uv-distribution-filename", @@ -3848,9 +3977,9 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "platform-info" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5ff316b9c4642feda973c18f0decd6c8b0919d4722566f6e4337cce0dd88217" +checksum = "91077ffd05d058d70d79eefcd7d7f6aac34980860a7519960f7913b6563a8c3a" dependencies = [ "libc", "winapi", @@ -3863,7 +3992,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", - "indexmap 2.6.0", + "indexmap 2.7.0", "quick-xml", "serde", "time", @@ -3871,9 +4000,9 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -3895,9 +4024,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "powerfmt" @@ -3922,7 +4051,7 @@ checksum = "714c75db297bc88a63783ffc6ab9f830698a6705aa0201416931759ef4c8183d" dependencies = [ "autocfg", "equivalent", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -3936,9 +4065,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -4002,14 +4131,14 @@ dependencies = [ [[package]] name = "pubgrub" version = "0.2.1" -source = "git+https://github.com/astral-sh/pubgrub?rev=95e1390399cdddee986b658be19587eb1fdb2d79#95e1390399cdddee986b658be19587eb1fdb2d79" +source = "git+https://github.com/astral-sh/pubgrub?rev=57832d0588fbb7aab824813481104761dc1c7740#57832d0588fbb7aab824813481104761dc1c7740" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "priority-queue", "rustc-hash", - "thiserror", - "version-ranges 0.1.0 (git+https://github.com/astral-sh/pubgrub?rev=95e1390399cdddee986b658be19587eb1fdb2d79)", + "thiserror 2.0.4", + "version-ranges 0.1.1 (git+https://github.com/astral-sh/pubgrub?rev=57832d0588fbb7aab824813481104761dc1c7740)", ] [[package]] @@ -4023,7 +4152,7 @@ dependencies = [ "phf", "serde", "smartstring", - "thiserror", + "thiserror 1.0.69", "unicase", ] @@ -4045,7 +4174,7 @@ dependencies = [ "rattler_digest", "reqwest", "reqwest-middleware", - "reqwest-retry 0.5.0", + "reqwest-retry", "serde", "serde_json", "tokio", @@ -4070,11 +4199,11 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "643af57c3f36ba90a8b53e972727d8092f7408a9ebfbaf4c3d2c17b07c58d835" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "pep440_rs", "pep508_rs", "serde", - "thiserror", + "thiserror 1.0.69", "toml", ] @@ -4089,9 +4218,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -4100,34 +4229,38 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror", + "thiserror 2.0.4", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", "rustc-hash", "rustls", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.4", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -4197,8 +4330,9 @@ dependencies = [ [[package]] name = "rattler" -version = "0.28.3" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238dd1b6ca1f2e622e438092e6523a37c6b018e25b236406a6aa182d13885b39" dependencies = [ "anyhow", "clap", @@ -4208,14 +4342,14 @@ dependencies = [ "fs-err 3.0.0", "futures", "humantime", - "indexmap 2.6.0", + "indexmap 2.7.0", "indicatif", "itertools 0.13.0", "memchr", "memmap2 0.9.5", "once_cell", "parking_lot 0.12.3", - "rattler_cache 0.2.11 (git+https://github.com/conda/rattler?branch=main)", + "rattler_cache", "rattler_conda_types", "rattler_digest", "rattler_networking", @@ -4225,10 +4359,10 @@ dependencies = [ "regex", "reqwest", "reqwest-middleware", - "simple_spawn_blocking 1.0.0 (git+https://github.com/conda/rattler?branch=main)", + "simple_spawn_blocking", "smallvec", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "url", @@ -4237,41 +4371,15 @@ dependencies = [ [[package]] name = "rattler_cache" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465972d151a672bc000b64c19a67c4c3b4ffeb11bd433eaf4dfe4c9aa04d748a" -dependencies = [ - "anyhow", - "dashmap", - "digest", - "dirs", - "fs4", - "futures", - "fxhash", - "itertools 0.13.0", - "parking_lot 0.12.3", - "rattler_conda_types", - "rattler_digest", - "rattler_networking", - "rattler_package_streaming", - "reqwest", - "reqwest-middleware", - "simple_spawn_blocking 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "rattler_cache" -version = "0.2.11" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +checksum = "63a90b8eb4a8406619d0685a18d0f55ffae762399258ca5eb422c55ba1fe7282" dependencies = [ "anyhow", "dashmap", "digest", "dirs", + "fs-err 3.0.0", "fs4", "futures", "fxhash", @@ -4283,8 +4391,8 @@ dependencies = [ "rattler_package_streaming", "reqwest", "reqwest-middleware", - "simple_spawn_blocking 1.0.0 (git+https://github.com/conda/rattler?branch=main)", - "thiserror", + "simple_spawn_blocking", + "thiserror 1.0.69", "tokio", "tracing", "url", @@ -4292,8 +4400,9 @@ dependencies = [ [[package]] name = "rattler_conda_types" -version = "0.29.2" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa6e2010c1a639982d9c22766598159dbeda9b5701ab01a863c66e55520c1ba1" dependencies = [ "chrono", "dirs", @@ -4301,7 +4410,7 @@ dependencies = [ "fxhash", "glob", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "itertools 0.13.0", "lazy-regex", "nom", @@ -4319,7 +4428,7 @@ dependencies = [ "simd-json", "smallvec", "strum", - "thiserror", + "thiserror 1.0.69", "tracing", "typed-path", "url", @@ -4328,7 +4437,8 @@ dependencies = [ [[package]] name = "rattler_digest" version = "1.0.3" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a97526971dd357657ea4c88f6d39b31b2875c87dfe9fd12aac305fec6c0f60" dependencies = [ "blake2", "digest", @@ -4343,13 +4453,14 @@ dependencies = [ [[package]] name = "rattler_lock" -version = "0.22.31" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.22.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8bddb02b5eb7bbf245438f1b5eb7feb44c0186bf7d8750b51c4cdf046e0dcff" dependencies = [ "chrono", "file_url", "fxhash", - "indexmap 2.6.0", + "indexmap 2.7.0", "itertools 0.13.0", "pep440_rs", "pep508_rs", @@ -4360,7 +4471,7 @@ dependencies = [ "serde_repr", "serde_with", "serde_yaml", - "thiserror", + "thiserror 1.0.69", "typed-path", "url", ] @@ -4368,7 +4479,8 @@ dependencies = [ [[package]] name = "rattler_macros" version = "1.0.3" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19eadf6fea87bd67d9d4c372caa3c2bed33cd91cdc235ce86210d7bc513ae0a4" dependencies = [ "quote", "syn", @@ -4376,8 +4488,9 @@ dependencies = [ [[package]] name = "rattler_networking" -version = "0.21.6" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.21.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40f5ad1da789b5bbe9585b4d255f2df82c676a951e2f002a76bf9fa7389c4962" dependencies = [ "anyhow", "async-trait", @@ -4394,21 +4507,23 @@ dependencies = [ "netrc-rs", "reqwest", "reqwest-middleware", - "retry-policies 0.4.0", + "retry-policies", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tracing", "url", ] [[package]] name = "rattler_package_streaming" -version = "0.22.14" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.22.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b881c9f633407c171a62809e754315e09d273edcf4e9217d2cc4b102721e65c" dependencies = [ "bzip2", "chrono", + "fs-err 3.0.0", "futures-util", "num_cpus", "rattler_conda_types", @@ -4420,19 +4535,20 @@ dependencies = [ "serde_json", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "tracing", "url", - "zip 2.2.0", + "zip 2.2.1", "zstd", ] [[package]] name = "rattler_redaction" -version = "0.1.3" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575cd5c830c5c2d25412531c5a3d307a0ca66ddccc466baaa5219cfa9e90c60e" dependencies = [ "reqwest", "reqwest-middleware", @@ -4441,8 +4557,9 @@ dependencies = [ [[package]] name = "rattler_repodata_gateway" -version = "0.21.23" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.21.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "315d710364bd4ca46ed37fbb06f50d3e4774f5b7775fb77f1f232d35632fa149" dependencies = [ "anyhow", "async-compression", @@ -4470,7 +4587,7 @@ dependencies = [ "ouroboros", "parking_lot 0.12.3", "pin-project-lite", - "rattler_cache 0.2.11 (git+https://github.com/conda/rattler?branch=main)", + "rattler_cache", "rattler_conda_types", "rattler_digest", "rattler_networking", @@ -4481,10 +4598,10 @@ dependencies = [ "serde", "serde_json", "serde_with", - "simple_spawn_blocking 1.0.0 (git+https://github.com/conda/rattler?branch=main)", + "simple_spawn_blocking", "superslice", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "tracing", @@ -4495,26 +4612,28 @@ dependencies = [ [[package]] name = "rattler_shell" -version = "0.22.7" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "0.22.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "070b851b93cd8973a6e9377c06323aca1d8faeeeb5b59f80f3cd1e2c8a7684bf" dependencies = [ "enum_dispatch", "fs-err 3.0.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "itertools 0.13.0", "rattler_conda_types", "serde_json", "shlex", "sysinfo", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", ] [[package]] name = "rattler_solve" -version = "1.2.3" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "948f7a8d90cfe3cd48637724d2112a82928cdedb1f17027ce1019927cc8ad977" dependencies = [ "chrono", "futures", @@ -4524,15 +4643,16 @@ dependencies = [ "resolvo", "serde", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", "url", ] [[package]] name = "rattler_virtual_packages" -version = "1.1.10" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7567e46d8ad302bbc3c5d657843c957d481a2c6b7c45397d95e0cd4b8ae47a17" dependencies = [ "archspec", "libloading", @@ -4542,7 +4662,7 @@ dependencies = [ "rattler_conda_types", "regex", "serde", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -4586,22 +4706,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4626,9 +4746,9 @@ dependencies = [ [[package]] name = "reflink-copy" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31414597d1cd7fdd2422798b7652a6329dda0fe0219e6335a13d5bcaa9aeb6" +checksum = "17400ed684c3a0615932f00c271ae3eea13e47056a1455821995122348ab6438" dependencies = [ "cfg-if", "rustix", @@ -4643,7 +4763,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -4658,9 +4778,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -4726,7 +4846,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pemfile", "rustls-pki-types", "serde", @@ -4751,27 +4871,27 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.3.3" -source = "git+https://github.com/TrueLayer/reqwest-middleware?rev=d95ec5a99fcc9a4339e1850d40378bbfe55ab121#d95ec5a99fcc9a4339e1850d40378bbfe55ab121" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1ccd3b55e711f91a9885a2fa6fbbb2e39db1776420b062efc058c6410f7e5e3" dependencies = [ "anyhow", "async-trait", "http", "reqwest", "serde", - "thiserror", + "thiserror 1.0.69", "tower-service", ] [[package]] name = "reqwest-retry" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f342894422862af74c50e1e9601cf0931accc9c6981e5eb413c46603b616b5" +checksum = "29c73e4195a6bfbcb174b790d9b3407ab90646976c55de58a6515da25d851178" dependencies = [ "anyhow", "async-trait", - "chrono", "futures", "getrandom", "http", @@ -4779,61 +4899,30 @@ dependencies = [ "parking_lot 0.11.2", "reqwest", "reqwest-middleware", - "retry-policies 0.3.0", + "retry-policies", + "thiserror 1.0.69", "tokio", "tracing", "wasm-timer", ] [[package]] -name = "reqwest-retry" -version = "0.7.1" -source = "git+https://github.com/TrueLayer/reqwest-middleware?rev=d95ec5a99fcc9a4339e1850d40378bbfe55ab121#d95ec5a99fcc9a4339e1850d40378bbfe55ab121" -dependencies = [ - "anyhow", - "async-trait", - "futures", - "getrandom", - "http", - "hyper", - "parking_lot 0.11.2", - "reqwest", - "reqwest-middleware", - "retry-policies 0.4.0", - "thiserror", - "tokio", - "tracing", - "wasm-timer", -] - -[[package]] -name = "resolvo" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fdd3aa47ae0816ce4ec203eba1330e7c96a6760cbfbee5f1d2ca6e768b50f7" +name = "resolvo" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fdd3aa47ae0816ce4ec203eba1330e7c96a6760cbfbee5f1d2ca6e768b50f7" dependencies = [ "ahash", "bitvec", "elsa", "event-listener", "futures", - "indexmap 2.6.0", + "indexmap 2.7.0", "itertools 0.13.0", "petgraph", "tracing", ] -[[package]] -name = "retry-policies" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "493b4243e32d6eedd29f9a398896e35c6943a123b55eec97dcaee98310d25810" -dependencies = [ - "anyhow", - "chrono", - "rand", -] - [[package]] name = "retry-policies" version = "0.4.0" @@ -4860,14 +4949,14 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395027076c569819ea6035ee62e664f5e03d74e281744f55261dd1afd939212b" +checksum = "b11a153aec4a6ab60795f8ebe2923c597b16b05bb1504377451e705ef1a45323" dependencies = [ "bytecheck", "bytes", - "hashbrown 0.14.5", - "indexmap 2.6.0", + "hashbrown 0.15.2", + "indexmap 2.7.0", "munge", "ptr_meta", "rancor", @@ -4879,9 +4968,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cb82b74b4810f07e460852c32f522e979787691b0b7b7439fe473e49d49b2f" +checksum = "beb382a4d9f53bd5c0be86b10d8179c3f8a14c30bf774ff77096ed6581e35981" dependencies = [ "proc-macro2", "quote", @@ -4890,9 +4979,9 @@ dependencies = [ [[package]] name = "rlimit" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3560f70f30a0f16d11d01ed078a07740fe6b489667abc7c7b029155d9f21c3d8" +checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" dependencies = [ "libc", ] @@ -4955,7 +5044,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e98097f62769f92dbf95fb51f71c0a68ec18a4ee2e70e0d3e4f47ac005d63e9" dependencies = [ "shellexpand", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4966,24 +5055,24 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -4994,9 +5083,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.14" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "log", "once_cell", @@ -5022,15 +5111,14 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework 2.11.1", + "security-framework 3.0.1", ] [[package]] @@ -5047,6 +5135,9 @@ name = "rustls-pki-types" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-platform-verifier" @@ -5109,11 +5200,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5208,9 +5299,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d0283c0a4a22a0f1b0e4edca251aa20b92fc96eaa09b84bec052f9415e9d71" +checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" dependencies = [ "bitflags 2.6.0", "core-foundation 0.10.0", @@ -5221,9 +5312,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -5231,13 +5322,13 @@ dependencies = [ [[package]] name = "self-replace" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7828a58998685d8bf5a3c5e7a3379a5867289c20828c3ee436280b44b598515" +checksum = "03ec815b5eab420ab893f63393878d89c90fdd94c0bcc44c07abb8ad95552fb7" dependencies = [ - "fastrand 1.9.0", + "fastrand", "tempfile", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5254,9 +5345,9 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -5284,9 +5375,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", @@ -5315,11 +5406,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -5368,7 +5459,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -5394,7 +5485,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -5499,9 +5590,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "simd-json" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1df0290e9bfe79ddd5ff8798ca887cd107b75353d2957efe9777296e17f26b5" +checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" dependencies = [ "getrandom", "halfbrown", @@ -5532,7 +5623,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -5545,14 +5636,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "simple_spawn_blocking" -version = "1.0.0" -source = "git+https://github.com/conda/rattler?branch=main#32eefc87ef0f1bc5bcc0bb65183b97e71808f54c" -dependencies = [ - "tokio", -] - [[package]] name = "siphasher" version = "0.3.11" @@ -5596,9 +5679,9 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5606,9 +5689,9 @@ dependencies = [ [[package]] name = "soketto" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" dependencies = [ "base64 0.22.1", "bytes", @@ -5621,9 +5704,9 @@ dependencies = [ [[package]] name = "spdx" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47317bbaf63785b53861e1ae2d11b80d6b624211d42cb20efcd210ee6f8a14bc" +checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2" dependencies = [ "smallvec", ] @@ -5647,7 +5730,7 @@ dependencies = [ "serde", "sha-1", "sha2", - "thiserror", + "thiserror 1.0.69", "xxhash-rust", ] @@ -5705,18 +5788,18 @@ checksum = "ab16ced94dbd8a46c82fd81e3ed9a8727dac2977ea869d217bcc4ea1f122e81f" [[package]] name = "supports-color" -version = "3.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9829b314621dfc575df4e409e79f9d6a66a3bd707ab73f23cb4aa3a854ac854f" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" dependencies = [ "is_ci", ] [[package]] name = "supports-hyperlinks" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0a1e5168041f5f3ff68ff7d95dcb9c8749df29f6e7e89ada40dd4c9de404ee" +checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" [[package]] name = "supports-unicode" @@ -5726,9 +5809,9 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.86" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -5737,13 +5820,24 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sys-info" version = "0.9.1" @@ -5764,15 +5858,15 @@ dependencies = [ "byteorder", "enum-as-inner", "libc", - "thiserror", + "thiserror 1.0.69", "walkdir", ] [[package]] name = "sysinfo" -version = "0.32.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ae3f4f7d64646c46c4cae4e3f01d1c5d255c7406fdd7c7f999a94e488791" +checksum = "4c33cd241af0f2e9e3b5c32163b873b29956890b5342e6745b917ce9d490f4af" dependencies = [ "core-foundation-sys", "libc", @@ -5820,9 +5914,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -5837,12 +5931,12 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5860,9 +5954,9 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f599bd7ca042cfdf8f4512b277c02ba102247820f9d9d4a9f521f496751a6ef" +checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" dependencies = [ "rustix", "windows-sys 0.59.0", @@ -5881,18 +5975,38 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.4", ] [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" dependencies = [ "proc-macro2", "quote", @@ -5911,9 +6025,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -5932,14 +6046,24 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -5958,13 +6082,13 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tl" version = "0.7.8" -source = "git+https://github.com/charliermarsh/tl.git?rev=6e25b2ee2513d75385101a8ff9f591ef51f314ec#6e25b2ee2513d75385101a8ff9f591ef51f314ec" +source = "git+https://github.com/astral-sh/tl.git?rev=6e25b2ee2513d75385101a8ff9f591ef51f314ec#6e25b2ee2513d75385101a8ff9f591ef51f314ec" [[package]] name = "tokio" -version = "1.41.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -6018,7 +6142,7 @@ checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" dependencies = [ "either", "futures-util", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -6036,9 +6160,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -6075,7 +6199,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -6111,9 +6235,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -6123,9 +6247,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", @@ -6134,9 +6258,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -6155,9 +6279,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -6208,24 +6332,15 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.17" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-linebreak" @@ -6233,15 +6348,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-width" version = "0.1.14" @@ -6280,9 +6386,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -6296,12 +6402,24 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -6321,7 +6439,7 @@ dependencies = [ [[package]] name = "uv-auth" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "async-trait", @@ -6343,11 +6461,11 @@ dependencies = [ [[package]] name = "uv-build-frontend" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anstream", "anyhow", - "fs-err 2.11.0", + "fs-err 3.0.0", "indoc", "itertools 0.13.0", "owo-colors", @@ -6356,7 +6474,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror", + "thiserror 2.0.4", "tokio", "toml_edit", "tracing", @@ -6376,9 +6494,9 @@ dependencies = [ [[package]] name = "uv-cache" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "fs-err 2.11.0", + "fs-err 3.0.0", "nanoid", "rmp-serde", "rustc-hash", @@ -6400,12 +6518,12 @@ dependencies = [ [[package]] name = "uv-cache-info" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "fs-err 2.11.0", + "fs-err 3.0.0", "globwalk", "serde", - "thiserror", + "thiserror 2.0.4", "toml", "tracing", ] @@ -6413,7 +6531,7 @@ dependencies = [ [[package]] name = "uv-cache-key" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "hex", "seahash", @@ -6423,14 +6541,14 @@ dependencies = [ [[package]] name = "uv-client" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "async-trait", "async_http_range_reader", "async_zip", "bytecheck", - "fs-err 2.11.0", + "fs-err 3.0.0", "futures", "html-escape", "http", @@ -6438,13 +6556,13 @@ dependencies = [ "jiff", "reqwest", "reqwest-middleware", - "reqwest-retry 0.7.1", + "reqwest-retry", "rkyv", "rmp-serde", "serde", "serde_json", "sys-info", - "thiserror", + "thiserror 2.0.4", "tl", "tokio", "tokio-util", @@ -6472,15 +6590,16 @@ dependencies = [ [[package]] name = "uv-configuration" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "either", - "fs-err 2.11.0", + "fs-err 3.0.0", + "rayon", "rustc-hash", "serde", "serde-untagged", "serde_json", - "thiserror", + "thiserror 2.0.4", "tracing", "url", "uv-auth", @@ -6498,7 +6617,7 @@ dependencies = [ [[package]] name = "uv-console" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "console", "ctrlc", @@ -6507,10 +6626,8 @@ dependencies = [ [[package]] name = "uv-dirs" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "directories", - "dirs-sys", "etcetera", "uv-static", ] @@ -6518,7 +6635,7 @@ dependencies = [ [[package]] name = "uv-dispatch" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "futures", @@ -6543,11 +6660,11 @@ dependencies = [ [[package]] name = "uv-distribution" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "either", - "fs-err 2.11.0", + "fs-err 3.0.0", "futures", "nanoid", "owo-colors", @@ -6557,7 +6674,7 @@ dependencies = [ "rustc-hash", "serde", "tempfile", - "thiserror", + "thiserror 2.0.4", "tokio", "tokio-util", "tracing", @@ -6588,11 +6705,11 @@ dependencies = [ [[package]] name = "uv-distribution-filename" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "rkyv", "serde", - "thiserror", + "thiserror 2.0.4", "url", "uv-normalize", "uv-pep440", @@ -6602,18 +6719,19 @@ dependencies = [ [[package]] name = "uv-distribution-types" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "bitflags 2.6.0", - "fs-err 2.11.0", + "fs-err 3.0.0", "itertools 0.13.0", "jiff", + "petgraph", "rkyv", "rustc-hash", "serde", "serde_json", - "thiserror", + "thiserror 2.0.4", "tracing", "url", "urlencoding", @@ -6628,16 +6746,17 @@ dependencies = [ "uv-pep508", "uv-platform-tags", "uv-pypi-types", + "version-ranges 0.1.1 (git+https://github.com/astral-sh/pubgrub?rev=57832d0588fbb7aab824813481104761dc1c7740)", ] [[package]] name = "uv-extract" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "async-compression", "async_zip", - "fs-err 2.11.0", + "fs-err 3.0.0", "futures", "krata-tokio-tar", "md-5", @@ -6645,10 +6764,11 @@ dependencies = [ "reqwest", "rustc-hash", "sha2", - "thiserror", + "thiserror 2.0.4", "tokio", "tokio-util", "tracing", + "uv-configuration", "uv-distribution-filename", "uv-pypi-types", "xz2", @@ -6658,14 +6778,14 @@ dependencies = [ [[package]] name = "uv-fs" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "backoff", "cachedir", "dunce", "either", "encoding_rs_io", - "fs-err 2.11.0", + "fs-err 3.0.0", "fs2", "junction", "path-slash", @@ -6682,16 +6802,16 @@ dependencies = [ [[package]] name = "uv-git" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "cargo-util", "dashmap", - "fs-err 2.11.0", + "fs-err 3.0.0", "reqwest", "reqwest-middleware", "serde", - "thiserror", + "thiserror 2.0.4", "tokio", "tracing", "url", @@ -6705,23 +6825,25 @@ dependencies = [ [[package]] name = "uv-install-wheel" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "configparser", "csv", "data-encoding", - "fs-err 2.11.0", + "fs-err 3.0.0", "mailparse", "pathdiff", "platform-info", "reflink-copy", "regex", "rustc-hash", + "same-file", + "self-replace", "serde", "serde_json", "sha2", "tempfile", - "thiserror", + "thiserror 2.0.4", "tracing", "uv-cache-info", "uv-distribution-filename", @@ -6730,6 +6852,7 @@ dependencies = [ "uv-pep440", "uv-platform-tags", "uv-pypi-types", + "uv-shell", "uv-trampoline-builder", "uv-warnings", "walkdir", @@ -6739,17 +6862,17 @@ dependencies = [ [[package]] name = "uv-installer" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "async-channel", - "fs-err 2.11.0", + "fs-err 3.0.0", "futures", "rayon", "rustc-hash", "same-file", "tempfile", - "thiserror", + "thiserror 2.0.4", "tokio", "tracing", "url", @@ -6759,7 +6882,6 @@ dependencies = [ "uv-configuration", "uv-distribution", "uv-distribution-types", - "uv-extract", "uv-fs", "uv-install-wheel", "uv-normalize", @@ -6777,7 +6899,7 @@ dependencies = [ [[package]] name = "uv-macros" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "proc-macro2", "quote", @@ -6788,12 +6910,12 @@ dependencies = [ [[package]] name = "uv-metadata" version = "0.1.0" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "async_zip", - "fs-err 2.11.0", + "fs-err 3.0.0", "futures", - "thiserror", + "thiserror 2.0.4", "tokio", "tokio-util", "uv-distribution-filename", @@ -6805,16 +6927,17 @@ dependencies = [ [[package]] name = "uv-normalize" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "rkyv", + "schemars", "serde", ] [[package]] name = "uv-once-map" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "dashmap", "futures", @@ -6824,7 +6947,7 @@ dependencies = [ [[package]] name = "uv-options-metadata" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "serde", ] @@ -6832,62 +6955,64 @@ dependencies = [ [[package]] name = "uv-pep440" version = "0.7.0" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "rkyv", "serde", "tracing", "unicode-width 0.1.14", "unscanny", - "version-ranges 0.1.0 (git+https://github.com/astral-sh/pubgrub?rev=95e1390399cdddee986b658be19587eb1fdb2d79)", + "version-ranges 0.1.1 (git+https://github.com/astral-sh/pubgrub?rev=57832d0588fbb7aab824813481104761dc1c7740)", ] [[package]] name = "uv-pep508" version = "0.6.0" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "boxcar", - "indexmap 2.6.0", + "indexmap 2.7.0", "itertools 0.13.0", "regex", "rustc-hash", "schemars", "serde", "smallvec", - "thiserror", + "thiserror 2.0.4", "unicode-width 0.1.14", "url", "uv-fs", "uv-normalize", "uv-pep440", - "version-ranges 0.1.0 (git+https://github.com/astral-sh/pubgrub?rev=95e1390399cdddee986b658be19587eb1fdb2d79)", + "version-ranges 0.1.1 (git+https://github.com/astral-sh/pubgrub?rev=57832d0588fbb7aab824813481104761dc1c7740)", ] [[package]] name = "uv-platform-tags" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "rustc-hash", "serde", - "thiserror", + "thiserror 2.0.4", ] [[package]] name = "uv-pypi-types" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "indexmap 2.6.0", + "hashbrown 0.15.2", + "indexmap 2.7.0", "itertools 0.13.0", "jiff", "mailparse", "regex", "rkyv", + "schemars", "serde", "serde-untagged", - "thiserror", + "thiserror 2.0.4", "toml", "toml_edit", "tracing", @@ -6903,11 +7028,11 @@ dependencies = [ [[package]] name = "uv-python" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "configparser", - "fs-err 2.11.0", + "fs-err 3.0.0", "futures", "goblin", "itertools 0.13.0", @@ -6916,13 +7041,14 @@ dependencies = [ "regex", "reqwest", "reqwest-middleware", + "reqwest-retry", "rmp-serde", "same-file", "serde", "serde_json", "target-lexicon", "tempfile", - "thiserror", + "thiserror 2.0.4", "tokio", "tokio-util", "tracing", @@ -6953,16 +7079,16 @@ dependencies = [ [[package]] name = "uv-requirements" version = "0.1.0" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "configparser", "console", - "fs-err 2.11.0", + "fs-err 3.0.0", "futures", "rustc-hash", "serde", - "thiserror", + "thiserror 2.0.4", "toml", "tracing", "url", @@ -6988,13 +7114,13 @@ dependencies = [ [[package]] name = "uv-requirements-txt" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "fs-err 2.11.0", + "fs-err 3.0.0", "regex", "reqwest", "reqwest-middleware", - "thiserror", + "thiserror 2.0.4", "tracing", "unscanny", "url", @@ -7005,20 +7131,20 @@ dependencies = [ "uv-normalize", "uv-pep508", "uv-pypi-types", - "uv-warnings", ] [[package]] name = "uv-resolver" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "clap", "dashmap", "either", "futures", - "indexmap 2.6.0", + "hashbrown 0.15.2", + "indexmap 2.7.0", "itertools 0.13.0", "jiff", "owo-colors", @@ -7029,7 +7155,7 @@ dependencies = [ "same-file", "serde", "textwrap", - "thiserror", + "thiserror 2.0.4", "tokio", "tokio-stream", "toml", @@ -7059,12 +7185,26 @@ dependencies = [ "uv-workspace", ] +[[package]] +name = "uv-shell" +version = "0.0.1" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" +dependencies = [ + "anyhow", + "home", + "same-file", + "tracing", + "uv-fs", + "uv-static", + "winreg", +] + [[package]] name = "uv-state" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "fs-err 2.11.0", + "fs-err 3.0.0", "tempfile", "uv-dirs", ] @@ -7072,7 +7212,7 @@ dependencies = [ [[package]] name = "uv-static" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "uv-macros", ] @@ -7080,10 +7220,10 @@ dependencies = [ [[package]] name = "uv-trampoline-builder" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "fs-err 2.11.0", - "thiserror", + "fs-err 3.0.0", + "thiserror 2.0.4", "uv-fs", "zip 0.6.6", ] @@ -7091,11 +7231,11 @@ dependencies = [ [[package]] name = "uv-types" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anyhow", "rustc-hash", - "thiserror", + "thiserror 2.0.4", "url", "uv-cache", "uv-configuration", @@ -7111,30 +7251,31 @@ dependencies = [ [[package]] name = "uv-version" -version = "0.4.30" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +version = "0.5.6" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" [[package]] name = "uv-virtualenv" version = "0.0.4" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "fs-err 2.11.0", + "fs-err 3.0.0", "itertools 0.13.0", "pathdiff", - "thiserror", + "thiserror 2.0.4", "tracing", "uv-fs", "uv-platform-tags", "uv-pypi-types", "uv-python", + "uv-shell", "uv-version", ] [[package]] name = "uv-warnings" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ "anstream", "owo-colors", @@ -7144,16 +7285,16 @@ dependencies = [ [[package]] name = "uv-workspace" version = "0.0.1" -source = "git+https://github.com/astral-sh/uv?tag=0.4.30#61ed2a236ade13703fd6cd3271e2c4d627398f38" +source = "git+https://github.com/astral-sh/uv?tag=0.5.6#b70c4f30eeb47c15fbabd54173f952877d5cfc43" dependencies = [ - "fs-err 2.11.0", + "fs-err 3.0.0", "glob", "itertools 0.13.0", "owo-colors", "rustc-hash", "same-file", "serde", - "thiserror", + "thiserror 2.0.4", "tokio", "toml", "toml_edit", @@ -7181,9 +7322,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-trait" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcaa56177466248ba59d693a048c0959ddb67f1151b963f904306312548cf392" +checksum = "9170e001f458781e92711d2ad666110f153e4e50bfd5cbd02db6547625714187" dependencies = [ "float-cmp", "halfbrown", @@ -7199,17 +7340,17 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version-ranges" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284649eba55872c1253f3f6ec15f22303a784e60684babd01d01e4c6ebb85b91" +checksum = "f8d079415ceb2be83fc355adbadafe401307d5c309c7e6ade6638e6f9f42f42d" dependencies = [ "smallvec", ] [[package]] name = "version-ranges" -version = "0.1.0" -source = "git+https://github.com/astral-sh/pubgrub?rev=95e1390399cdddee986b658be19587eb1fdb2d79#95e1390399cdddee986b658be19587eb1fdb2d79" +version = "0.1.1" +source = "git+https://github.com/astral-sh/pubgrub?rev=57832d0588fbb7aab824813481104761dc1c7740#57832d0588fbb7aab824813481104761dc1c7740" dependencies = [ "smallvec", ] @@ -7247,19 +7388,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" dependencies = [ "bumpalo", "log", @@ -7272,21 +7414,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7294,9 +7437,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" dependencies = [ "proc-macro2", "quote", @@ -7307,15 +7450,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -7350,15 +7493,25 @@ dependencies = [ "nom", "pori", "regex", - "thiserror", + "thiserror 1.0.69", "walkdir", ] [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -7366,9 +7519,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.5" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -7743,6 +7896,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "winsafe" version = "0.0.19" @@ -7755,6 +7918,18 @@ version = "0.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d6ad6cbd9c6e5144971e326303f0e453b61d82e4f72067fccf23106bccd8437" +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -7806,6 +7981,30 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zbus" version = "4.4.0" @@ -7889,12 +8088,55 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zip" version = "0.6.6" @@ -7909,18 +8151,18 @@ dependencies = [ [[package]] name = "zip" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" +checksum = "99d52293fc86ea7cf13971b3bb81eb21683636e7ae24c729cdaf1b7c4157a352" dependencies = [ "arbitrary", "crc32fast", "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.6.0", + "indexmap 2.7.0", "memchr", - "thiserror", + "thiserror 2.0.4", "time", "zopfli", ] diff --git a/Cargo.toml b/Cargo.toml index 2d736e847..bd8f64ba8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ fs-err = { version = "2.11.0" } fs_extra = "1.3.0" futures = "0.3.30" http = "1.1.0" -http-cache-reqwest = "0.14.0" +http-cache-reqwest = "0.15.0" human_bytes = "0.4.3" humantime = "2.1.0" ignore = "0.4.22" @@ -65,8 +65,8 @@ percent-encoding = "2.3.1" pyproject-toml = "0.13.4" regex = "1.10.4" reqwest = { version = "0.12.9", default-features = false } -reqwest-middleware = "0.3.0" -reqwest-retry = "0.5.0" +reqwest-middleware = "0.4" +reqwest-retry = "0.7.0" rlimit = "0.10.1" rstest = "0.19.0" self-replace = "1.3.7" @@ -84,7 +84,7 @@ spdx = "0.10.4" strsim = "0.11.1" tabwriter = "1.4.0" tar = "0.4.40" -tempfile = "3.10.1" +tempfile = "3.14.0" thiserror = "1.0.58" tokio = "1.37.0" tokio-stream = "0.1.16" @@ -93,48 +93,48 @@ toml_edit = "0.22.11" tracing = "0.1.40" tracing-subscriber = "0.3.18" typed-path = "0.9.2" -uv-distribution-filename = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-distribution-types = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-install-wheel = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-pep440 = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-pep508 = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-platform-tags = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-pypi-types = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } +uv-distribution-filename = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-distribution-types = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-install-wheel = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-pep440 = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-pep508 = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-platform-tags = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-pypi-types = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } uv-requirements-txt = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } wax = "0.6.0" which = "6.0.3" # Rattler crates -file_url = "0.1.4" -rattler = { version = "0.28.1", default-features = false } -rattler_cache = { version = "0.2.9", default-features = false } -rattler_conda_types = { version = "0.29.1", default-features = false } +file_url = "0.2.0" +rattler = { version = "0.28.5", default-features = false } +rattler_cache = { version = "0.2.13", default-features = false } +rattler_conda_types = { version = "0.29.3", default-features = false } rattler_digest = { version = "1.0.3", default-features = false } -rattler_lock = { version = "0.22.30", default-features = false } -rattler_networking = { version = "0.21.5", default-features = false, features = [ +rattler_lock = { version = "0.22.32", default-features = false } +rattler_networking = { version = "0.21.8", default-features = false, features = [ "google-cloud-auth", ] } -rattler_repodata_gateway = { version = "0.21.21", default-features = false } -rattler_shell = { version = "0.22.6", default-features = false } -rattler_solve = { version = "1.2.2", default-features = false } -rattler_virtual_packages = { version = "1.1.9", default-features = false } +rattler_repodata_gateway = { version = "0.21.25", default-features = false } +rattler_shell = { version = "0.22.8", default-features = false } +rattler_solve = { version = "1.2.4", default-features = false } +rattler_virtual_packages = { version = "1.1.11", default-features = false } # Bumping this to a higher version breaks the Windows path handling. url = "2.5.2" -uv-auth = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-cache = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-client = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-configuration = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-dispatch = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-distribution = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-git = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-installer = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-normalize = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-python = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-requirements = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-resolver = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } -uv-types = { git = "https://github.com/astral-sh/uv", tag = "0.4.30" } +uv-auth = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-cache = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-client = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-configuration = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-dispatch = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-distribution = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-git = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-installer = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-normalize = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-python = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-requirements = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-resolver = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } +uv-types = { git = "https://github.com/astral-sh/uv", tag = "0.5.6" } winapi = { version = "0.3.9", default-features = false } xxhash-rust = "0.8.10" zip = { version = "2.2.0", default-features = false } @@ -347,20 +347,17 @@ tokio = { workspace = true, features = ["rt"] } [patch.crates-io] -reqwest-middleware = { git = "https://github.com/TrueLayer/reqwest-middleware", rev = "d95ec5a99fcc9a4339e1850d40378bbfe55ab121" } -reqwest-retry = { git = "https://github.com/TrueLayer/reqwest-middleware", rev = "d95ec5a99fcc9a4339e1850d40378bbfe55ab121" } - -file_url = { git = "https://github.com/conda/rattler", branch = "main" } -rattler = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_conda_types = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_digest = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_lock = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_networking = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_package_streaming = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_repodata_gateway = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_shell = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_solve = { git = "https://github.com/conda/rattler", branch = "main" } -rattler_virtual_packages = { git = "https://github.com/conda/rattler", branch = "main" } +#file_url = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_conda_types = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_digest = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_lock = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_networking = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_package_streaming = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_repodata_gateway = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_shell = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_solve = { git = "https://github.com/conda/rattler", branch = "main" } +#rattler_virtual_packages = { git = "https://github.com/conda/rattler", branch = "main" } # Config for 'dist' [workspace.metadata.dist] diff --git a/crates/pixi_manifest/src/pypi/snapshots/pixi_manifest__pypi__pypi_requirement__tests__deserialize_failing.snap b/crates/pixi_manifest/src/pypi/snapshots/pixi_manifest__pypi__pypi_requirement__tests__deserialize_failing.snap index fff924ca7..f23755575 100644 --- a/crates/pixi_manifest/src/pypi/snapshots/pixi_manifest__pypi__pypi_requirement__tests__deserialize_failing.snap +++ b/crates/pixi_manifest/src/pypi/snapshots/pixi_manifest__pypi__pypi_requirement__tests__deserialize_failing.snap @@ -1,6 +1,7 @@ --- source: crates/pixi_manifest/src/pypi/pypi_requirement.rs expression: snapshot +snapshot_kind: text --- - input: ver: 1.2.3 @@ -43,7 +44,7 @@ expression: snapshot - input: git: "ssh://github.com:conda-forge/21cmfast-feedstock" result: - error: "ERROR: invalid value: string \"ssh://github.com:conda-forge/21cmfast-feedstock\", expected invalid port number" + error: "ERROR: invalid port number: \"ssh://github.com:conda-forge/21cmfast-feedstock\"" - input: branch: main tag: v1 diff --git a/crates/pixi_uv_conversions/src/requirements.rs b/crates/pixi_uv_conversions/src/requirements.rs index f2ba973a6..afb6b9836 100644 --- a/crates/pixi_uv_conversions/src/requirements.rs +++ b/crates/pixi_uv_conversions/src/requirements.rs @@ -87,6 +87,7 @@ pub fn as_uv_req( RequirementSource::Registry { specifier: to_version_specificers(version)?, index: index.clone(), + conflict: None, } } PyPiRequirement::Git { @@ -176,6 +177,7 @@ pub fn as_uv_req( PyPiRequirement::RawVersion(version) => RequirementSource::Registry { specifier: to_version_specificers(version)?, index: None, + conflict: None, }, }; diff --git a/src/install_pypi/mod.rs b/src/install_pypi/mod.rs index 284e7c59d..50db588c8 100644 --- a/src/install_pypi/mod.rs +++ b/src/install_pypi/mod.rs @@ -16,7 +16,7 @@ use utils::elapsed; use uv_auth::store_credentials_from_url; use uv_client::{Connectivity, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ConfigSettings, Constraints, IndexStrategy, LowerBound}; -use uv_dispatch::BuildDispatch; +use uv_dispatch::{BuildDispatch, SharedState}; use uv_distribution::{DistributionDatabase, RegistryWheelIndex}; use uv_distribution_types::{DependencyMetadata, IndexLocations, Name}; use uv_git::GitResolver; @@ -122,6 +122,14 @@ pub async fn update_python_distributions( let dep_metadata = DependencyMetadata::default(); let constraints = Constraints::default(); + + let shared_state = SharedState::new( + git_resolver, + in_memory_index, + uv_context.in_flight.clone(), + uv_context.capabilities.clone(), + ); + let build_dispatch = BuildDispatch::new( ®istry_client, &uv_context.cache, @@ -130,10 +138,7 @@ pub async fn update_python_distributions( &index_locations, &flat_index, &dep_metadata, - &in_memory_index, - &git_resolver, - &uv_context.capabilities, - &uv_context.in_flight, + shared_state, IndexStrategy::default(), &config_settings, build_isolation, diff --git a/src/lock_file/resolve/pypi.rs b/src/lock_file/resolve/pypi.rs index a4bb972f1..0aa69bb4f 100644 --- a/src/lock_file/resolve/pypi.rs +++ b/src/lock_file/resolve/pypi.rs @@ -32,7 +32,7 @@ use typed_path::Utf8TypedPathBuf; use url::Url; use uv_client::{Connectivity, FlatIndexClient, RegistryClient, RegistryClientBuilder}; use uv_configuration::{ConfigSettings, Constraints, IndexStrategy, LowerBound, Overrides}; -use uv_dispatch::BuildDispatch; +use uv_dispatch::{BuildDispatch, SharedState}; use uv_distribution::DistributionDatabase; use uv_distribution_types::{ BuiltDist, DependencyMetadata, Diagnostic, Dist, FileLocation, HashPolicy, IndexCapabilities, @@ -40,7 +40,7 @@ use uv_distribution_types::{ }; use uv_git::GitResolver; use uv_install_wheel::linker::LinkMode; -use uv_pypi_types::{HashAlgorithm, HashDigest, RequirementSource}; +use uv_pypi_types::{Conflicts, HashAlgorithm, HashDigest, RequirementSource}; use uv_python::{Interpreter, PythonEnvironment}; use uv_requirements::LookaheadResolver; use uv_resolver::{ @@ -337,6 +337,14 @@ pub async fn resolve_pypi( ..Options::default() }; let git_resolver = GitResolver::default(); + + let shared_state = SharedState::new( + git_resolver.clone(), + build_dispatch_in_memory_index, + context.in_flight.clone(), + context.capabilities.clone(), + ); + let build_dispatch = BuildDispatch::new( ®istry_client, &context.cache, @@ -346,10 +354,7 @@ pub async fn resolve_pypi( &flat_index, &dependency_metadata, // TODO: could use this later to add static metadata - &build_dispatch_in_memory_index, - &git_resolver, - &context.capabilities, - &context.in_flight, + shared_state, IndexStrategy::default(), &config_settings, build_isolation, @@ -377,6 +382,7 @@ pub async fn resolve_pypi( let source = RequirementSource::Registry { specifier: specifier.into(), index: None, + conflict: None, }; Ok::<_, ConversionError>(uv_pypi_types::Requirement { @@ -479,6 +485,7 @@ pub async fn resolve_pypi( &context.hash_strategy, resolver_env, &PythonRequirement::from_marker_environment(&marker_environment, requires_python.clone()), + Conflicts::default(), &resolver_in_memory_index, &git_resolver, &context.capabilities, @@ -647,11 +654,14 @@ async fn lock_pypi_packages<'a>( let pypi_package_data = match dist { // Ignore installed distributions - ResolvedDist::Installed(_) => { + ResolvedDist::Installed { .. } => { continue; } - ResolvedDist::Installable(Dist::Built(dist)) => { + ResolvedDist::Installable { + dist: Dist::Built(dist), + .. + } => { let (location, hash) = match &dist { BuiltDist::Registry(dist) => { let best_wheel = dist.best_wheel(); @@ -710,7 +720,10 @@ async fn lock_pypi_packages<'a>( hash, } } - ResolvedDist::Installable(Dist::Source(source)) => { + ResolvedDist::Installable { + dist: Dist::Source(source), + .. + } => { // Handle new hash stuff let hash = source .file() diff --git a/src/lock_file/resolve/uv_resolution_context.rs b/src/lock_file/resolve/uv_resolution_context.rs index 7155ae19c..bf749fa72 100644 --- a/src/lock_file/resolve/uv_resolution_context.rs +++ b/src/lock_file/resolve/uv_resolution_context.rs @@ -1,5 +1,3 @@ -use std::sync::Arc; - use miette::{Context, IntoDiagnostic}; use uv_cache::Cache; use uv_configuration::{BuildOptions, Concurrency, SourceStrategy, TrustedHost}; @@ -15,7 +13,7 @@ use pixi_uv_conversions::{to_uv_trusted_host, ConversionError}; #[derive(Clone)] pub struct UvResolutionContext { pub cache: Cache, - pub in_flight: Arc, + pub in_flight: InFlight, pub build_options: BuildOptions, pub hash_strategy: HashStrategy, pub client: reqwest::Client, @@ -48,7 +46,6 @@ impl UvResolutionContext { } }; - let in_flight = Arc::new(InFlight::default()); let allow_insecure_host = project .config() .pypi_config @@ -66,7 +63,7 @@ impl UvResolutionContext { .context("failed to parse trusted host")?; Ok(Self { cache, - in_flight, + in_flight: InFlight::default(), hash_strategy: HashStrategy::None, client: project.client().clone(), build_options: BuildOptions::default(), diff --git a/tests/integration_python/test_main_cli.py b/tests/integration_python/test_main_cli.py index 682fd7f20..b11bf983d 100644 --- a/tests/integration_python/test_main_cli.py +++ b/tests/integration_python/test_main_cli.py @@ -155,17 +155,17 @@ def test_project_commands(pixi: Path, tmp_pixi_workspace: Path) -> None: verify_cli_command( [pixi, "project", "--manifest-path", manifest_path, "version", "major"], ExitCode.SUCCESS, - stderr_contains="2.2.3", + stderr_contains="2.0.0", ) verify_cli_command( [pixi, "project", "--manifest-path", manifest_path, "version", "minor"], ExitCode.SUCCESS, - stderr_contains="2.3.3", + stderr_contains="2.1.0", ) verify_cli_command( [pixi, "project", "--manifest-path", manifest_path, "version", "patch"], ExitCode.SUCCESS, - stderr_contains="2.3.4", + stderr_contains="2.1.1", )