From 0feef415a1609fc0e472ec004366e5a1c9cc6b95 Mon Sep 17 00:00:00 2001 From: EtaLoop <146718995+EtaLoop@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:33:36 +0200 Subject: [PATCH 1/6] Allow overriding albedo color on `Asset3D` (#7458) ### What The idea is to reproduce behavior of `Mesh3D` regarding color modification on `Asset3D` : - add `albedo_factor` - add `vertex_colors` as in `Mesh3D` In order to overwrite white default texture of `Asset3D` loaded from stl and obj (gltf already have albedo_factor in file). See: #5253 ![Screenshot from 2024-09-18 16-05-54](https://github.com/user-attachments/assets/3f9f396e-1549-4e88-a933-f6143bddf734) ### Checklist * [x] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md) * [x] I've included a screenshot or gif (if applicable) * [x] I have tested the web demo (if applicable): * Using examples from latest `main` build: [rerun.io/viewer](https://rerun.io/viewer/pr/7458?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) * Using full set of examples from `nightly` build: [rerun.io/viewer](https://rerun.io/viewer/pr/7458?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) * [x] The PR title and labels are set such as to maximize their usefulness for the next release's CHANGELOG * [x] If applicable, add a new check to the [release checklist](https://github.com/rerun-io/rerun/blob/main/tests/python/release_checklist)! * [x] If have noted any breaking changes to the log API in `CHANGELOG.md` and the migration guide - [PR Build Summary](https://build.rerun.io/pr/7458) - [Recent benchmark results](https://build.rerun.io/graphs/crates.html) - [Wasm size tracking](https://build.rerun.io/graphs/sizes.html) To run all checks from `main`, comment on the PR with `@rerun-bot full-check`. --------- Co-authored-by: Keyvan Goddard Co-authored-by: Andreas Reich --- .../definitions/rerun/archetypes/asset3d.fbs | 8 +++ .../store/re_types/src/archetypes/asset3d.rs | 58 ++++++++++++++--- .../re_types/src/archetypes/asset3d_ext.rs | 1 + crates/store/re_types/tests/types/asset3d.rs | 6 +- crates/viewer/re_renderer/src/importer/stl.rs | 2 +- .../re_space_view_spatial/src/mesh_cache.rs | 4 +- .../re_space_view_spatial/src/mesh_loader.rs | 27 ++++++-- .../src/visualizers/assets3d.rs | 65 ++++++++++++------- crates/viewer/re_viewer/src/reflection/mod.rs | 4 ++ .../reference/types/archetypes/asset3d.md | 2 + .../types/components/albedo_factor.md | 1 + rerun_cpp/src/rerun/archetypes/asset3d.cpp | 7 +- rerun_cpp/src/rerun/archetypes/asset3d.hpp | 17 +++++ .../rerun_sdk/rerun/archetypes/asset3d.py | 13 ++++ .../rerun_sdk/rerun/archetypes/asset3d_ext.py | 6 +- 15 files changed, 178 insertions(+), 43 deletions(-) diff --git a/crates/store/re_types/definitions/rerun/archetypes/asset3d.fbs b/crates/store/re_types/definitions/rerun/archetypes/asset3d.fbs index 2018e21dcdfa..b0625fbf2ff6 100644 --- a/crates/store/re_types/definitions/rerun/archetypes/asset3d.fbs +++ b/crates/store/re_types/definitions/rerun/archetypes/asset3d.fbs @@ -33,4 +33,12 @@ table Asset3D ( /// If omitted, the viewer will try to guess from the data blob. /// If it cannot guess, it won't be able to render the asset. media_type: rerun.components.MediaType ("attr.rerun.component_recommended", nullable, order: 2000); + + // --- Optional --- + + /// A color multiplier applied to the whole asset. + /// + /// For mesh who already have `albedo_factor` in materials, + /// it will be overwritten by actual `albedo_factor` of [archetypes.Asset3D] (if specified). + albedo_factor: rerun.components.AlbedoFactor ("attr.rerun.component_optional", nullable, order: 3100); } diff --git a/crates/store/re_types/src/archetypes/asset3d.rs b/crates/store/re_types/src/archetypes/asset3d.rs index ab48155cc121..5983dff798c7 100644 --- a/crates/store/re_types/src/archetypes/asset3d.rs +++ b/crates/store/re_types/src/archetypes/asset3d.rs @@ -70,17 +70,27 @@ pub struct Asset3D { /// If omitted, the viewer will try to guess from the data blob. /// If it cannot guess, it won't be able to render the asset. pub media_type: Option, + + /// A color multiplier applied to the whole asset. + /// + /// For mesh who already have `albedo_factor` in materials, + /// it will be overwritten by actual `albedo_factor` of [`archetypes::Asset3D`][crate::archetypes::Asset3D] (if specified). + pub albedo_factor: Option, } impl ::re_types_core::SizeBytes for Asset3D { #[inline] fn heap_size_bytes(&self) -> u64 { - self.blob.heap_size_bytes() + self.media_type.heap_size_bytes() + self.blob.heap_size_bytes() + + self.media_type.heap_size_bytes() + + self.albedo_factor.heap_size_bytes() } #[inline] fn is_pod() -> bool { - ::is_pod() && >::is_pod() + ::is_pod() + && >::is_pod() + && >::is_pod() } } @@ -95,21 +105,22 @@ static RECOMMENDED_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 2usize]> = ] }); -static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 0usize]> = - once_cell::sync::Lazy::new(|| []); +static OPTIONAL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 1usize]> = + once_cell::sync::Lazy::new(|| ["rerun.components.AlbedoFactor".into()]); -static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 3usize]> = +static ALL_COMPONENTS: once_cell::sync::Lazy<[ComponentName; 4usize]> = once_cell::sync::Lazy::new(|| { [ "rerun.components.Blob".into(), "rerun.components.MediaType".into(), "rerun.components.Asset3DIndicator".into(), + "rerun.components.AlbedoFactor".into(), ] }); impl Asset3D { - /// The total number of components in the archetype: 1 required, 2 recommended, 0 optional - pub const NUM_COMPONENTS: usize = 3usize; + /// The total number of components in the archetype: 1 required, 2 recommended, 1 optional + pub const NUM_COMPONENTS: usize = 4usize; } /// Indicator component for the [`Asset3D`] [`::re_types_core::Archetype`] @@ -186,7 +197,21 @@ impl ::re_types_core::Archetype for Asset3D { } else { None }; - Ok(Self { blob, media_type }) + let albedo_factor = if let Some(array) = arrays_by_name.get("rerun.components.AlbedoFactor") + { + ::from_arrow_opt(&**array) + .with_context("rerun.archetypes.Asset3D#albedo_factor")? + .into_iter() + .next() + .flatten() + } else { + None + }; + Ok(Self { + blob, + media_type, + albedo_factor, + }) } } @@ -200,6 +225,9 @@ impl ::re_types_core::AsComponents for Asset3D { self.media_type .as_ref() .map(|comp| (comp as &dyn ComponentBatch).into()), + self.albedo_factor + .as_ref() + .map(|comp| (comp as &dyn ComponentBatch).into()), ] .into_iter() .flatten() @@ -216,6 +244,7 @@ impl Asset3D { Self { blob: blob.into(), media_type: None, + albedo_factor: None, } } @@ -234,4 +263,17 @@ impl Asset3D { self.media_type = Some(media_type.into()); self } + + /// A color multiplier applied to the whole asset. + /// + /// For mesh who already have `albedo_factor` in materials, + /// it will be overwritten by actual `albedo_factor` of [`archetypes::Asset3D`][crate::archetypes::Asset3D] (if specified). + #[inline] + pub fn with_albedo_factor( + mut self, + albedo_factor: impl Into, + ) -> Self { + self.albedo_factor = Some(albedo_factor.into()); + self + } } diff --git a/crates/store/re_types/src/archetypes/asset3d_ext.rs b/crates/store/re_types/src/archetypes/asset3d_ext.rs index 78fd8a78f998..985ecfcb738f 100644 --- a/crates/store/re_types/src/archetypes/asset3d_ext.rs +++ b/crates/store/re_types/src/archetypes/asset3d_ext.rs @@ -36,6 +36,7 @@ impl Asset3D { Self { blob: contents.into(), media_type, + albedo_factor: None, } } } diff --git a/crates/store/re_types/tests/types/asset3d.rs b/crates/store/re_types/tests/types/asset3d.rs index 415ea3b81ea5..bfc4e64e8f38 100644 --- a/crates/store/re_types/tests/types/asset3d.rs +++ b/crates/store/re_types/tests/types/asset3d.rs @@ -1,7 +1,7 @@ use re_types::{ archetypes::Asset3D, components::{Blob, MediaType}, - datatypes::Utf8, + datatypes::{Rgba32, Utf8}, Archetype as _, AsComponents as _, }; @@ -12,9 +12,11 @@ fn roundtrip() { let expected = Asset3D { blob: Blob(BYTES.to_vec().into()), media_type: Some(MediaType(Utf8(MediaType::GLTF.into()))), + albedo_factor: Some(Rgba32::from_unmultiplied_rgba(0xEE, 0x11, 0x22, 0x33).into()), }; - let arch = Asset3D::from_file_contents(BYTES.to_vec(), Some(MediaType::gltf())); + let arch = Asset3D::from_file_contents(BYTES.to_vec(), Some(MediaType::gltf())) + .with_albedo_factor(0xEE112233); similar_asserts::assert_eq!(expected, arch); // let expected_extensions: HashMap<_, _> = [ diff --git a/crates/viewer/re_renderer/src/importer/stl.rs b/crates/viewer/re_renderer/src/importer/stl.rs index 51cd42c4f669..57d0b714c9d6 100644 --- a/crates/viewer/re_renderer/src/importer/stl.rs +++ b/crates/viewer/re_renderer/src/importer/stl.rs @@ -31,7 +31,7 @@ pub fn load_stl_from_buffer( let num_vertices = triangles.len() * 3; let material = mesh::Material { - label: "default material".into(), + label: name.clone().into(), index_range: 0..num_vertices as u32, albedo: ctx.texture_manager_2d.white_texture_unorm_handle().clone(), albedo_factor: crate::Rgba::WHITE, diff --git a/crates/viewer/re_space_view_spatial/src/mesh_cache.rs b/crates/viewer/re_space_view_spatial/src/mesh_cache.rs index 3aeb3d10d957..0baafbc4bb4d 100644 --- a/crates/viewer/re_space_view_spatial/src/mesh_cache.rs +++ b/crates/viewer/re_space_view_spatial/src/mesh_cache.rs @@ -36,7 +36,9 @@ pub struct MeshCache(HashMap /// Either a [`re_types::archetypes::Asset3D`] or [`re_types::archetypes::Mesh3D`] to be cached. #[derive(Debug, Clone, Copy)] pub enum AnyMesh<'a> { - Asset(&'a re_types::archetypes::Asset3D), + Asset { + asset: &'a re_types::archetypes::Asset3D, + }, Mesh { mesh: &'a re_types::archetypes::Mesh3D, diff --git a/crates/viewer/re_space_view_spatial/src/mesh_loader.rs b/crates/viewer/re_space_view_spatial/src/mesh_loader.rs index 39ac2757ca87..737ca00317ff 100644 --- a/crates/viewer/re_space_view_spatial/src/mesh_loader.rs +++ b/crates/viewer/re_space_view_spatial/src/mesh_loader.rs @@ -3,7 +3,7 @@ use re_chunk_store::RowId; use re_renderer::{mesh::GpuMesh, RenderContext, Rgba32Unmul}; use re_types::{ archetypes::{Asset3D, Mesh3D}, - components::MediaType, + components::{AlbedoFactor, MediaType}, }; use re_viewer_context::{gpu_bridge::texture_creation_desc_from_color_image, ImageInfo}; @@ -27,7 +27,7 @@ impl LoadedMesh { ) -> anyhow::Result { // TODO(emilk): load CpuMesh in background thread. match mesh { - AnyMesh::Asset(asset3d) => Self::load_asset3d(name, asset3d, render_ctx), + AnyMesh::Asset { asset } => Ok(Self::load_asset3d(name, asset, render_ctx)?), AnyMesh::Mesh { mesh, texture_key } => { Ok(Self::load_mesh3d(name, mesh, texture_key, render_ctx)?) } @@ -39,10 +39,11 @@ impl LoadedMesh { media_type: &MediaType, bytes: &[u8], render_ctx: &RenderContext, + albedo_factor: &Option, ) -> anyhow::Result { re_tracing::profile_function!(); - let cpu_model = match media_type.as_str() { + let mut cpu_model = match media_type.as_str() { MediaType::GLTF | MediaType::GLB => { re_renderer::importer::gltf::load_gltf_from_buffer(&name, bytes, render_ctx)? } @@ -51,6 +52,12 @@ impl LoadedMesh { _ => anyhow::bail!("{media_type} files are not supported"), }; + // Overwriting albedo_factor of CpuMesh in specified in the Asset3D + cpu_model.instances.iter().for_each(|instance| { + cpu_model.meshes[instance.mesh].materials[0].albedo_factor = + albedo_factor.map_or(re_renderer::Rgba::WHITE, |c| c.0.into()); + }); + let bbox = cpu_model.calculate_bounding_box(); let mesh_instances = cpu_model.into_gpu_meshes(render_ctx)?; @@ -68,11 +75,21 @@ impl LoadedMesh { ) -> anyhow::Result { re_tracing::profile_function!(); - let Asset3D { blob, media_type } = asset3d; + let Asset3D { + blob, + media_type, + albedo_factor, + } = asset3d; let media_type = MediaType::or_guess_from_data(media_type.clone(), blob.as_slice()) .ok_or_else(|| anyhow::anyhow!("couldn't guess media type"))?; - let slf = Self::load_asset3d_parts(name, &media_type, blob.as_slice(), render_ctx)?; + let slf = Self::load_asset3d_parts( + name, + &media_type, + blob.as_slice(), + render_ctx, + albedo_factor, + )?; Ok(slf) } diff --git a/crates/viewer/re_space_view_spatial/src/visualizers/assets3d.rs b/crates/viewer/re_space_view_spatial/src/visualizers/assets3d.rs index a80a38d8e112..50c72a4c07a1 100644 --- a/crates/viewer/re_space_view_spatial/src/visualizers/assets3d.rs +++ b/crates/viewer/re_space_view_spatial/src/visualizers/assets3d.rs @@ -4,7 +4,7 @@ use re_renderer::renderer::GpuMeshInstance; use re_renderer::RenderContext; use re_types::{ archetypes::Asset3D, - components::{Blob, MediaType}, + components::{AlbedoFactor, Blob, MediaType}, ArrowBuffer, ArrowString, Loggable as _, }; use re_viewer_context::{ @@ -32,32 +32,29 @@ impl Default for Asset3DVisualizer { } } -struct Asset3DComponentData { +struct Asset3DComponentData<'a> { index: (TimeInt, RowId), + query_result_hash: Hash64, blob: ArrowBuffer, media_type: Option, + albedo_factor: Option<&'a AlbedoFactor>, } // NOTE: Do not put profile scopes in these methods. They are called for all entities and all // timestamps within a time range -- it's _a lot_. impl Asset3DVisualizer { - fn process_data( + fn process_data<'a>( &mut self, ctx: &QueryContext<'_>, render_ctx: &RenderContext, instances: &mut Vec, ent_context: &SpatialSceneEntityContext<'_>, - data: impl Iterator, + data: impl Iterator>, ) { let entity_path = ctx.target_entity_path; for data in data { - let mesh = Asset3D { - blob: data.blob.clone().into(), - media_type: data.media_type.clone().map(Into::into), - }; - let primary_row_id = data.index.1; let picking_instance_hash = re_entity_db::InstancePathHash::entity_all(entity_path); let outline_mask_ids = ent_context.highlight.index_outline_mask(Instance::ALL); @@ -65,15 +62,22 @@ impl Asset3DVisualizer { // TODO(#5974): this is subtly wrong, the key should actually be a hash of everything that got // cached, which includes the media type… let mesh = ctx.viewer_ctx.cache.entry(|c: &mut MeshCache| { + let key = MeshCacheKey { + versioned_instance_path_hash: picking_instance_hash.versioned(primary_row_id), + query_result_hash: data.query_result_hash, + media_type: data.media_type.clone().map(Into::into), + }; + c.entry( &entity_path.to_string(), - MeshCacheKey { - versioned_instance_path_hash: picking_instance_hash - .versioned(primary_row_id), - query_result_hash: Hash64::ZERO, - media_type: data.media_type.clone().map(Into::into), + key.clone(), + AnyMesh::Asset { + asset: &Asset3D { + blob: data.blob.clone().into(), + media_type: data.media_type.clone().map(Into::into), + albedo_factor: data.albedo_factor.copied(), + }, }, - AnyMesh::Asset(&mesh), render_ctx, ) }); @@ -154,16 +158,29 @@ impl VisualizerSystem for Asset3DVisualizer { let timeline = ctx.query.timeline(); let all_blobs_indexed = iter_buffer::(&all_blob_chunks, timeline, Blob::name()); let all_media_types = results.iter_as(timeline, MediaType::name()); + let all_albedo_factors = results.iter_as(timeline, AlbedoFactor::name()); + + let query_result_hash = results.query_result_hash(); - let data = re_query::range_zip_1x1(all_blobs_indexed, all_media_types.string()) - .filter_map(|(index, blobs, media_types)| { - blobs.first().map(|blob| Asset3DComponentData { - index, - blob: blob.clone(), - media_type: media_types - .and_then(|media_types| media_types.first().cloned()), - }) - }); + let data = re_query::range_zip_1x2( + all_blobs_indexed, + all_media_types.string(), + all_albedo_factors.primitive::(), + ) + .filter_map(|(index, blobs, media_types, albedo_factors)| { + blobs.first().map(|blob| Asset3DComponentData { + index, + query_result_hash, + blob: blob.clone(), + media_type: media_types + .and_then(|media_types| media_types.first().cloned()), + albedo_factor: albedo_factors + .map_or(&[] as &[AlbedoFactor], |albedo_factors| { + bytemuck::cast_slice(albedo_factors) + }) + .first(), + }) + }); self.process_data(ctx, render_ctx, &mut instances, spatial_ctx, data); diff --git a/crates/viewer/re_viewer/src/reflection/mod.rs b/crates/viewer/re_viewer/src/reflection/mod.rs index 563b56f5f1de..245825156a81 100644 --- a/crates/viewer/re_viewer/src/reflection/mod.rs +++ b/crates/viewer/re_viewer/src/reflection/mod.rs @@ -808,6 +808,10 @@ fn generate_archetype_reflection() -> ArchetypeReflectionMap { "rerun.components.MediaType".into(), display_name : "Media type", docstring_md : "The Media Type of the asset.\n\nSupported values:\n* `model/gltf-binary`\n* `model/gltf+json`\n* `model/obj` (.mtl material files are not supported yet, references are silently ignored)\n* `model/stl`\n\nIf omitted, the viewer will try to guess from the data blob.\nIf it cannot guess, it won't be able to render the asset.", + is_required : false, }, ArchetypeFieldReflection { component_name : + "rerun.components.AlbedoFactor".into(), display_name : + "Albedo factor", docstring_md : + "A color multiplier applied to the whole asset.\n\nFor mesh who already have `albedo_factor` in materials,\nit will be overwritten by actual `albedo_factor` of [`archetypes.Asset3D`](https://rerun.io/docs/reference/types/archetypes/asset3d) (if specified).", is_required : false, }, ], }, diff --git a/docs/content/reference/types/archetypes/asset3d.md b/docs/content/reference/types/archetypes/asset3d.md index 145fb8cfa15d..ed8b246601db 100644 --- a/docs/content/reference/types/archetypes/asset3d.md +++ b/docs/content/reference/types/archetypes/asset3d.md @@ -16,6 +16,8 @@ an instance of the mesh will be drawn for each transform. **Recommended**: [`MediaType`](../components/media_type.md) +**Optional**: [`AlbedoFactor`](../components/albedo_factor.md) + ## Shown in * [Spatial3DView](../views/spatial3d_view.md) * [Spatial2DView](../views/spatial2d_view.md) (if logged above active projection) diff --git a/docs/content/reference/types/components/albedo_factor.md b/docs/content/reference/types/components/albedo_factor.md index 179ee779f786..ff8200054a4f 100644 --- a/docs/content/reference/types/components/albedo_factor.md +++ b/docs/content/reference/types/components/albedo_factor.md @@ -17,4 +17,5 @@ A color multiplier, usually applied to a whole entity, e.g. a mesh. ## Used by +* [`Asset3D`](../archetypes/asset3d.md) * [`Mesh3D`](../archetypes/mesh3d.md) diff --git a/rerun_cpp/src/rerun/archetypes/asset3d.cpp b/rerun_cpp/src/rerun/archetypes/asset3d.cpp index 4466eb0eb17b..99f9341f8359 100644 --- a/rerun_cpp/src/rerun/archetypes/asset3d.cpp +++ b/rerun_cpp/src/rerun/archetypes/asset3d.cpp @@ -14,7 +14,7 @@ namespace rerun { ) { using namespace archetypes; std::vector cells; - cells.reserve(3); + cells.reserve(4); { auto result = ComponentBatch::from_loggable(archetype.blob); @@ -26,6 +26,11 @@ namespace rerun { RR_RETURN_NOT_OK(result.error); cells.push_back(std::move(result.value)); } + if (archetype.albedo_factor.has_value()) { + auto result = ComponentBatch::from_loggable(archetype.albedo_factor.value()); + RR_RETURN_NOT_OK(result.error); + cells.push_back(std::move(result.value)); + } { auto indicator = Asset3D::IndicatorComponent(); auto result = ComponentBatch::from_loggable(indicator); diff --git a/rerun_cpp/src/rerun/archetypes/asset3d.hpp b/rerun_cpp/src/rerun/archetypes/asset3d.hpp index 812cf71eacb9..05ee83b58192 100644 --- a/rerun_cpp/src/rerun/archetypes/asset3d.hpp +++ b/rerun_cpp/src/rerun/archetypes/asset3d.hpp @@ -6,6 +6,7 @@ #include "../collection.hpp" #include "../compiler_utils.hpp" #include "../component_batch.hpp" +#include "../components/albedo_factor.hpp" #include "../components/blob.hpp" #include "../components/media_type.hpp" #include "../indicator_component.hpp" @@ -66,6 +67,12 @@ namespace rerun::archetypes { /// If it cannot guess, it won't be able to render the asset. std::optional media_type; + /// A color multiplier applied to the whole asset. + /// + /// For mesh who already have `albedo_factor` in materials, + /// it will be overwritten by actual `albedo_factor` of `archetypes::Asset3D` (if specified). + std::optional albedo_factor; + public: static constexpr const char IndicatorComponentName[] = "rerun.components.Asset3DIndicator"; @@ -118,6 +125,16 @@ namespace rerun::archetypes { // See: https://github.com/rerun-io/rerun/issues/4027 RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) } + + /// A color multiplier applied to the whole asset. + /// + /// For mesh who already have `albedo_factor` in materials, + /// it will be overwritten by actual `albedo_factor` of `archetypes::Asset3D` (if specified). + Asset3D with_albedo_factor(rerun::components::AlbedoFactor _albedo_factor) && { + albedo_factor = std::move(_albedo_factor); + // See: https://github.com/rerun-io/rerun/issues/4027 + RR_WITH_MAYBE_UNINITIALIZED_DISABLED(return std::move(*this);) + } }; } // namespace rerun::archetypes diff --git a/rerun_py/rerun_sdk/rerun/archetypes/asset3d.py b/rerun_py/rerun_sdk/rerun/archetypes/asset3d.py index 834a7cb2b4ed..2f0d74c87bcc 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/asset3d.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/asset3d.py @@ -62,6 +62,7 @@ def __attrs_clear__(self) -> None: self.__attrs_init__( blob=None, # type: ignore[arg-type] media_type=None, # type: ignore[arg-type] + albedo_factor=None, # type: ignore[arg-type] ) @classmethod @@ -97,5 +98,17 @@ def _clear(cls) -> Asset3D: # # (Docstring intentionally commented out to hide this field from the docs) + albedo_factor: components.AlbedoFactorBatch | None = field( + metadata={"component": "optional"}, + default=None, + converter=components.AlbedoFactorBatch._optional, # type: ignore[misc] + ) + # A color multiplier applied to the whole asset. + # + # For mesh who already have `albedo_factor` in materials, + # it will be overwritten by actual `albedo_factor` of [`archetypes.Asset3D`][rerun.archetypes.Asset3D] (if specified). + # + # (Docstring intentionally commented out to hide this field from the docs) + __str__ = Archetype.__str__ __repr__ = Archetype.__repr__ # type: ignore[assignment] diff --git a/rerun_py/rerun_sdk/rerun/archetypes/asset3d_ext.py b/rerun_py/rerun_sdk/rerun/archetypes/asset3d_ext.py index 390aeb25e719..9499c6dd6f04 100644 --- a/rerun_py/rerun_sdk/rerun/archetypes/asset3d_ext.py +++ b/rerun_py/rerun_sdk/rerun/archetypes/asset3d_ext.py @@ -16,6 +16,7 @@ def __init__( path: str | pathlib.Path | None = None, contents: datatypes.BlobLike | None = None, media_type: datatypes.Utf8Like | None = None, + albedo_factor: datatypes.Rgba32Like | None = None, ): """ Create a new instance of the Asset3D archetype. @@ -43,6 +44,9 @@ def __init__( or the viewer will try to guess from the contents (magic header). If the media type cannot be guessed, the viewer won't be able to render the asset. + albedo_factor: + Optional color multiplier for the whole mesh + """ from ..components import MediaType @@ -58,7 +62,7 @@ def __init__( if media_type is None: media_type = MediaType.guess_from_path(path) - self.__attrs_init__(blob=blob, media_type=media_type) + self.__attrs_init__(blob=blob, media_type=media_type, albedo_factor=albedo_factor) return self.__attrs_clear__() From 66e148a4ad7ad985271701afd376a8d19915979d Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Thu, 24 Oct 2024 12:16:13 +0200 Subject: [PATCH 2/6] Link checker now runs with reported failures if a markdown changes or on nightly channel (#7888) ### What * Fixes https://github.com/rerun-io/rerun/issues/7887 ### Checklist * [x] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md) * [x] I've included a screenshot or gif (if applicable) * [x] I have tested the web demo (if applicable): * Using examples from latest `main` build: [rerun.io/viewer](https://rerun.io/viewer/pr/7888?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) * Using full set of examples from `nightly` build: [rerun.io/viewer](https://rerun.io/viewer/pr/7888?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) * [x] The PR title and labels are set such as to maximize their usefulness for the next release's CHANGELOG * [x] If applicable, add a new check to the [release checklist](https://github.com/rerun-io/rerun/blob/main/tests/python/release_checklist)! * [x] If have noted any breaking changes to the log API in `CHANGELOG.md` and the migration guide - [PR Build Summary](https://build.rerun.io/pr/7888) - [Recent benchmark results](https://build.rerun.io/graphs/crates.html) - [Wasm size tracking](https://build.rerun.io/graphs/sizes.html) To run all checks from `main`, comment on the PR with `@rerun-bot full-check`. --- .github/workflows/reusable_checks.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable_checks.yml b/.github/workflows/reusable_checks.yml index dd93bfa57c51..530c1b73712e 100644 --- a/.github/workflows/reusable_checks.yml +++ b/.github/workflows/reusable_checks.yml @@ -161,8 +161,25 @@ jobs: # --------------------------------------------------------------------------- + markdown-paths-filter: + runs-on: ubuntu-latest + outputs: + md_changes: ${{ steps.filter.outputs.md_changes }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || '' }} + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + md_changes: + - '**/*.md' + link-checker: name: Check links + needs: markdown-paths-filter + if: inputs.CHANNEL == 'nightly' || needs.markdown-paths-filter.outputs.md_changes == 'true' runs-on: ubuntu-latest # do not fail entire workflow (e.g. nightly) if this is the only failing check continue-on-error: true @@ -174,7 +191,7 @@ jobs: id: lychee uses: lycheeverse/lychee-action@v1.10.0 with: - fail: ${{ inputs.CHANNEL == 'nightly' }} + fail: true lycheeVersion: "0.15.1" # When given a directory, lychee checks only markdown, html and text files, everything else we have to glob in manually. # Pass --verbose, so that all considered links are printed, making it easier to debug. From 02fc1142a910cb3f095aeb8c0b4fd99a2658ca6d Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Thu, 24 Oct 2024 13:08:24 +0200 Subject: [PATCH 3/6] Fix incorrect `download_test_assets.py` on nightly ci (#7891) * [x] correct --- .github/workflows/reusable_checks_rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable_checks_rust.yml b/.github/workflows/reusable_checks_rust.yml index 42c0fcef87c5..ad161f314444 100644 --- a/.github/workflows/reusable_checks_rust.yml +++ b/.github/workflows/reusable_checks_rust.yml @@ -106,7 +106,7 @@ jobs: pixi-version: v0.25.0 - name: Download test assets - run: pixi run python ./scripts/ci/download_test_assets.py + run: pixi run python ./tests/assets/download_test_assets.py - name: pixi run cargo test --all-targets --all-features run: pixi run cargo test --all-targets --all-features From 853f1b170db1bc0fe87a36e97481bd36f63f2daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= Date: Thu, 24 Oct 2024 13:11:43 +0200 Subject: [PATCH 4/6] Fix video load bench (#7890) ### What I followed the example of other benches but forgot to copy the `[lib] bench = false` setting ### Checklist * [x] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md) * [x] I've included a screenshot or gif (if applicable) * [x] I have tested the web demo (if applicable): * Using examples from latest `main` build: [rerun.io/viewer](https://rerun.io/viewer/pr/7890?manifest_url=https://app.rerun.io/version/main/examples_manifest.json) * Using full set of examples from `nightly` build: [rerun.io/viewer](https://rerun.io/viewer/pr/7890?manifest_url=https://app.rerun.io/version/nightly/examples_manifest.json) * [x] The PR title and labels are set such as to maximize their usefulness for the next release's CHANGELOG * [x] If applicable, add a new check to the [release checklist](https://github.com/rerun-io/rerun/blob/main/tests/python/release_checklist)! * [x] If have noted any breaking changes to the log API in `CHANGELOG.md` and the migration guide - [PR Build Summary](https://build.rerun.io/pr/7890) - [Recent benchmark results](https://build.rerun.io/graphs/crates.html) - [Wasm size tracking](https://build.rerun.io/graphs/sizes.html) To run all checks from `main`, comment on the PR with `@rerun-bot full-check`. --- crates/store/re_video/Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/store/re_video/Cargo.toml b/crates/store/re_video/Cargo.toml index c65854fc3d2f..4d84f4380f16 100644 --- a/crates/store/re_video/Cargo.toml +++ b/crates/store/re_video/Cargo.toml @@ -72,6 +72,8 @@ cfg_aliases.workspace = true [[example]] name = "frames" +[lib] +bench = false [[bench]] name = "video_load_bench" From 91e981abfb07bf8a70ae747dead796f55b34d57b Mon Sep 17 00:00:00 2001 From: Clement Rey Date: Thu, 24 Oct 2024 13:33:17 +0200 Subject: [PATCH 5/6] Implement support for in-place drag-n-drop (#7880) It is pretty tricky to get right (unsurprisingly) -- `StoreId`s and `RecordingId`s and `SetStoreInfo`s are all pretty finicky constructs and a lot can go wrong when loading arbitrarily things in place. But it works pretty nicely overall! https://github.com/user-attachments/assets/43f4e647-317a-47b5-a570-bee70716a2de * Fixes https://github.com/rerun-io/rerun/issues/5350 --- crates/store/re_data_loader/src/lib.rs | 35 +----- crates/store/re_data_loader/src/load_file.rs | 100 +++++++++--------- .../re_data_loader/src/loader_archetype.rs | 9 +- .../re_data_loader/src/loader_external.rs | 6 +- crates/store/re_data_loader/src/loader_rrd.rs | 5 +- .../store/re_data_source/src/data_source.rs | 23 ++-- crates/store/re_log_types/src/lib.rs | 61 ++++++++++- crates/viewer/re_viewer/src/app.rs | 60 ++++++++--- .../re_viewer/src/viewer_analytics/event.rs | 4 +- examples/rust/custom_data_loader/src/main.rs | 18 ++-- 10 files changed, 207 insertions(+), 114 deletions(-) diff --git a/crates/store/re_data_loader/src/lib.rs b/crates/store/re_data_loader/src/lib.rs index 42639efd00f7..73c987d01848 100644 --- a/crates/store/re_data_loader/src/lib.rs +++ b/crates/store/re_data_loader/src/lib.rs @@ -53,8 +53,6 @@ pub struct DataLoaderSettings { pub application_id: Option, /// The [`re_log_types::ApplicationId`] that is currently opened in the viewer, if any. - // - // TODO(#5350): actually support this pub opened_application_id: Option, /// The recommended [`re_log_types::StoreId`] to log the data to, based on the surrounding context. @@ -64,8 +62,6 @@ pub struct DataLoaderSettings { pub store_id: re_log_types::StoreId, /// The [`re_log_types::StoreId`] that is currently opened in the viewer, if any. - // - // TODO(#5350): actually support this pub opened_store_id: Option, /// What should the logged entity paths be prefixed with? @@ -318,39 +314,18 @@ impl DataLoaderError { /// most convenient for them, whether it is raw components, arrow chunks or even /// full-on [`LogMsg`]s. pub enum LoadedData { - Chunk(Chunk), - ArrowMsg(ArrowMsg), + Chunk(re_log_types::StoreId, Chunk), + ArrowMsg(re_log_types::StoreId, ArrowMsg), LogMsg(LogMsg), } -impl From for LoadedData { - #[inline] - fn from(value: Chunk) -> Self { - Self::Chunk(value) - } -} - -impl From for LoadedData { - #[inline] - fn from(value: ArrowMsg) -> Self { - Self::ArrowMsg(value) - } -} - -impl From for LoadedData { - #[inline] - fn from(value: LogMsg) -> Self { - Self::LogMsg(value) - } -} - impl LoadedData { /// Pack the data into a [`LogMsg`]. - pub fn into_log_msg(self, store_id: &re_log_types::StoreId) -> ChunkResult { + pub fn into_log_msg(self) -> ChunkResult { match self { - Self::Chunk(chunk) => Ok(LogMsg::ArrowMsg(store_id.clone(), chunk.to_arrow_msg()?)), + Self::Chunk(store_id, chunk) => Ok(LogMsg::ArrowMsg(store_id, chunk.to_arrow_msg()?)), - Self::ArrowMsg(msg) => Ok(LogMsg::ArrowMsg(store_id.clone(), msg)), + Self::ArrowMsg(store_id, msg) => Ok(LogMsg::ArrowMsg(store_id, msg)), Self::LogMsg(msg) => Ok(msg), } diff --git a/crates/store/re_data_loader/src/load_file.rs b/crates/store/re_data_loader/src/load_file.rs index f5a9c6d19bab..3ed813a002f3 100644 --- a/crates/store/re_data_loader/src/load_file.rs +++ b/crates/store/re_data_loader/src/load_file.rs @@ -1,9 +1,10 @@ use std::borrow::Cow; +use ahash::{HashMap, HashMapExt}; use re_log_types::{FileSource, LogMsg}; use re_smart_channel::Sender; -use crate::{extension, DataLoaderError, LoadedData}; +use crate::{DataLoaderError, LoadedData}; // --- @@ -36,16 +37,7 @@ pub fn load_from_path( let rx = load(settings, path, None)?; - // TODO(cmc): should we always unconditionally set store info though? - // If we reach this point, then at least one compatible `DataLoader` has been found. - let store_info = prepare_store_info(&settings.store_id, file_source, path); - if let Some(store_info) = store_info { - if tx.send(store_info).is_err() { - return Ok(()); // other end has hung up. - } - } - - send(&settings.store_id, rx, tx); + send(settings.clone(), file_source, path.to_owned(), rx, tx); Ok(()) } @@ -72,16 +64,7 @@ pub fn load_from_file_contents( let data = load(settings, filepath, Some(contents))?; - // TODO(cmc): should we always unconditionally set store info though? - // If we reach this point, then at least one compatible `DataLoader` has been found. - let store_info = prepare_store_info(&settings.store_id, file_source, filepath); - if let Some(store_info) = store_info { - if tx.send(store_info).is_err() { - return Ok(()); // other end has hung up. - } - } - - send(&settings.store_id, data, tx); + send(settings.clone(), file_source, filepath.to_owned(), data, tx); Ok(()) } @@ -93,7 +76,7 @@ pub(crate) fn prepare_store_info( store_id: &re_log_types::StoreId, file_source: FileSource, path: &std::path::Path, -) -> Option { +) -> LogMsg { re_tracing::profile_function!(path.display().to_string()); use re_log_types::SetStoreInfo; @@ -101,27 +84,17 @@ pub(crate) fn prepare_store_info( let app_id = re_log_types::ApplicationId(path.display().to_string()); let store_source = re_log_types::StoreSource::File { file_source }; - let ext = extension(path); - let is_rrd = crate::SUPPORTED_RERUN_EXTENSIONS.contains(&ext.as_str()); - - (!is_rrd).then(|| { - LogMsg::SetStoreInfo(SetStoreInfo { - row_id: *re_chunk::RowId::new(), - info: re_log_types::StoreInfo { - application_id: app_id.clone(), - store_id: store_id.clone(), - cloned_from: None, - is_official_example: false, - started: re_log_types::Time::now(), - store_source, - // NOTE: If this is a natively supported file, it will go through one of the - // builtin dataloaders, i.e. the local version. - // Otherwise, it will go through an arbitrary external loader, at which point we - // have no certainty what the version is. - store_version: crate::is_supported_file_extension(ext.as_str()) - .then_some(re_build_info::CrateVersion::LOCAL), - }, - }) + LogMsg::SetStoreInfo(SetStoreInfo { + row_id: *re_chunk::RowId::new(), + info: re_log_types::StoreInfo { + application_id: app_id.clone(), + store_id: store_id.clone(), + cloned_from: None, + is_official_example: false, + started: re_log_types::Time::now(), + store_source, + store_version: Some(re_build_info::CrateVersion::LOCAL), + }, }) } @@ -288,15 +261,18 @@ pub(crate) fn load( /// /// Runs asynchronously from another thread on native, synchronously on wasm. pub(crate) fn send( - store_id: &re_log_types::StoreId, + settings: crate::DataLoaderSettings, + file_source: FileSource, + path: std::path::PathBuf, rx_loader: std::sync::mpsc::Receiver, tx: &Sender, ) { spawn({ re_tracing::profile_function!(); + let mut store_info_tracker: HashMap = HashMap::new(); + let tx = tx.clone(); - let store_id = store_id.clone(); move || { // ## Ignoring channel errors // @@ -304,16 +280,44 @@ pub(crate) fn send( // poll the channel in any case so as to make sure that the data producer // doesn't get stuck. for data in rx_loader { - let msg = match data.into_log_msg(&store_id) { - Ok(msg) => msg, + let msg = match data.into_log_msg() { + Ok(msg) => { + let store_info = match &msg { + LogMsg::SetStoreInfo(set_store_info) => { + Some((set_store_info.info.store_id.clone(), true)) + } + LogMsg::ArrowMsg(store_id, _arrow_msg) => { + Some((store_id.clone(), false)) + } + LogMsg::BlueprintActivationCommand(_) => None, + }; + + if let Some((store_id, store_info_created)) = store_info { + *store_info_tracker.entry(store_id).or_default() |= store_info_created; + } + + msg + } Err(err) => { - re_log::error!(%err, %store_id, "Couldn't serialize component data"); + re_log::error!(%err, "Couldn't serialize component data"); continue; } }; tx.send(msg).ok(); } + for (store_id, store_info_already_created) in store_info_tracker { + let is_a_preexisting_recording = + Some(&store_id) == settings.opened_store_id.as_ref(); + + if store_info_already_created || is_a_preexisting_recording { + continue; + } + + let store_info = prepare_store_info(&store_id, file_source.clone(), &path); + tx.send(store_info).ok(); + } + tx.quit(None).ok(); } }); diff --git a/crates/store/re_data_loader/src/loader_archetype.rs b/crates/store/re_data_loader/src/loader_archetype.rs index 7cf9b9b251ce..39dfecd12231 100644 --- a/crates/store/re_data_loader/src/loader_archetype.rs +++ b/crates/store/re_data_loader/src/loader_archetype.rs @@ -50,7 +50,7 @@ impl DataLoader for ArchetypeLoader { fn load_from_file_contents( &self, - _settings: &crate::DataLoaderSettings, + settings: &crate::DataLoaderSettings, filepath: std::path::PathBuf, contents: std::borrow::Cow<'_, [u8]>, tx: std::sync::mpsc::Sender, @@ -133,8 +133,13 @@ impl DataLoader for ArchetypeLoader { )?); } + let store_id = settings + .opened_store_id + .clone() + .unwrap_or_else(|| settings.store_id.clone()); for row in rows { - if tx.send(row.into()).is_err() { + let data = LoadedData::Chunk(store_id.clone(), row); + if tx.send(data).is_err() { break; // The other end has decided to hang up, not our problem. } } diff --git a/crates/store/re_data_loader/src/loader_external.rs b/crates/store/re_data_loader/src/loader_external.rs index b1647e49280e..539876ba55d5 100644 --- a/crates/store/re_data_loader/src/loader_external.rs +++ b/crates/store/re_data_loader/src/loader_external.rs @@ -6,6 +6,8 @@ use std::{ use ahash::HashMap; use once_cell::sync::Lazy; +use crate::LoadedData; + // --- /// To register a new external data loader, simply add an executable in your $PATH whose name @@ -318,7 +320,9 @@ fn decode_and_stream( continue; } }; - if tx.send(msg.into()).is_err() { + + let data = LoadedData::LogMsg(msg); + if tx.send(data).is_err() { break; // The other end has decided to hang up, not our problem. } } diff --git a/crates/store/re_data_loader/src/loader_rrd.rs b/crates/store/re_data_loader/src/loader_rrd.rs index 6742e4703e89..46dee5f2b158 100644 --- a/crates/store/re_data_loader/src/loader_rrd.rs +++ b/crates/store/re_data_loader/src/loader_rrd.rs @@ -4,6 +4,8 @@ use re_log_encoding::decoder::Decoder; use crossbeam::channel::Receiver; use re_log_types::{ApplicationId, StoreId}; +use crate::LoadedData; + // --- /// Loads data from any `rrd` file or in-memory contents. @@ -193,7 +195,8 @@ fn decode_and_stream( msg }; - if tx.send(msg.into()).is_err() { + let data = LoadedData::LogMsg(msg); + if tx.send(data).is_err() { break; // The other end has decided to hang up, not our problem. } } diff --git a/crates/store/re_data_source/src/data_source.rs b/crates/store/re_data_source/src/data_source.rs index f1931e65c8bd..4642262ec21b 100644 --- a/crates/store/re_data_source/src/data_source.rs +++ b/crates/store/re_data_source/src/data_source.rs @@ -164,7 +164,11 @@ impl DataSource { // or not. let shared_store_id = re_log_types::StoreId::random(re_log_types::StoreKind::Recording); - let settings = re_data_loader::DataLoaderSettings::recommended(shared_store_id); + let settings = re_data_loader::DataLoaderSettings { + opened_application_id: file_source.recommended_application_id().cloned(), + opened_store_id: file_source.recommended_recording_id().cloned(), + ..re_data_loader::DataLoaderSettings::recommended(shared_store_id) + }; re_data_loader::load_from_path(&settings, file_source, &path, &tx) .with_context(|| format!("{path:?}"))?; @@ -188,7 +192,11 @@ impl DataSource { // or not. let shared_store_id = re_log_types::StoreId::random(re_log_types::StoreKind::Recording); - let settings = re_data_loader::DataLoaderSettings::recommended(shared_store_id); + let settings = re_data_loader::DataLoaderSettings { + opened_application_id: file_source.recommended_application_id().cloned(), + opened_store_id: file_source.recommended_recording_id().cloned(), + ..re_data_loader::DataLoaderSettings::recommended(shared_store_id) + }; re_data_loader::load_from_file_contents( &settings, file_source, @@ -248,12 +256,15 @@ fn test_data_source_from_uri() { ]; let ws = ["ws://foo.zip", "wss://foo.zip", "127.0.0.1"]; - let file_source = FileSource::DragAndDrop; + let file_source = FileSource::DragAndDrop { + recommended_application_id: None, + recommended_recording_id: None, + }; for uri in file { assert!( matches!( - DataSource::from_uri(file_source, uri.to_owned()), + DataSource::from_uri(file_source.clone(), uri.to_owned()), DataSource::FilePath { .. } ), "Expected {uri:?} to be categorized as FilePath" @@ -263,7 +274,7 @@ fn test_data_source_from_uri() { for uri in http { assert!( matches!( - DataSource::from_uri(file_source, uri.to_owned()), + DataSource::from_uri(file_source.clone(), uri.to_owned()), DataSource::RrdHttpUrl { .. } ), "Expected {uri:?} to be categorized as RrdHttpUrl" @@ -273,7 +284,7 @@ fn test_data_source_from_uri() { for uri in ws { assert!( matches!( - DataSource::from_uri(file_source, uri.to_owned()), + DataSource::from_uri(file_source.clone(), uri.to_owned()), DataSource::WebSocketAddr(_) ), "Expected {uri:?} to be categorized as WebSocketAddr" diff --git a/crates/store/re_log_types/src/lib.rs b/crates/store/re_log_types/src/lib.rs index 291b2dcd0665..2a0abd433d5c 100644 --- a/crates/store/re_log_types/src/lib.rs +++ b/crates/store/re_log_types/src/lib.rs @@ -405,15 +405,66 @@ impl std::fmt::Display for PythonVersion { } } -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub enum FileSource { Cli, - DragAndDrop, - FileDialog, + + DragAndDrop { + /// The [`ApplicationId`] that the viewer heuristically recommends should be used when loading + /// this data source, based on the surrounding context. + recommended_application_id: Option, + + /// The [`StoreId`] that the viewer heuristically recommends should be used when loading + /// this data source, based on the surrounding context. + recommended_recording_id: Option, + }, + + FileDialog { + /// The [`ApplicationId`] that the viewer heuristically recommends should be used when loading + /// this data source, based on the surrounding context. + recommended_application_id: Option, + + /// The [`StoreId`] that the viewer heuristically recommends should be used when loading + /// this data source, based on the surrounding context. + recommended_recording_id: Option, + }, + Sdk, } +impl FileSource { + #[inline] + pub fn recommended_application_id(&self) -> Option<&ApplicationId> { + match self { + Self::FileDialog { + recommended_application_id, + .. + } + | Self::DragAndDrop { + recommended_application_id, + .. + } => recommended_application_id.as_ref(), + Self::Cli | Self::Sdk => None, + } + } + + #[inline] + pub fn recommended_recording_id(&self) -> Option<&StoreId> { + match self { + Self::FileDialog { + recommended_recording_id, + .. + } + | Self::DragAndDrop { + recommended_recording_id, + .. + } => recommended_recording_id.as_ref(), + Self::Cli | Self::Sdk => None, + } + } +} + /// The source of a recording or blueprint. #[derive(Clone, Debug, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] @@ -456,8 +507,8 @@ impl std::fmt::Display for StoreSource { Self::RustSdk { rustc_version, .. } => write!(f, "Rust SDK (rustc {rustc_version})"), Self::File { file_source, .. } => match file_source { FileSource::Cli => write!(f, "File via CLI"), - FileSource::DragAndDrop => write!(f, "File via drag-and-drop"), - FileSource::FileDialog => write!(f, "File via file dialog"), + FileSource::DragAndDrop { .. } => write!(f, "File via drag-and-drop"), + FileSource::FileDialog { .. } => write!(f, "File via file dialog"), FileSource::Sdk => write!(f, "File via SDK"), }, Self::Viewer => write!(f, "Viewer-generated"), diff --git a/crates/viewer/re_viewer/src/app.rs b/crates/viewer/re_viewer/src/app.rs index 8bec98fa0df5..571f26c1dcc8 100644 --- a/crates/viewer/re_viewer/src/app.rs +++ b/crates/viewer/re_viewer/src/app.rs @@ -591,7 +591,10 @@ impl App { for file_path in open_file_dialog_native() { self.command_sender .send_system(SystemCommand::LoadDataSource(DataSource::FilePath( - FileSource::FileDialog, + FileSource::FileDialog { + recommended_application_id: None, + recommended_recording_id: None, + }, file_path, ))); } @@ -1286,32 +1289,60 @@ impl App { .and_then(|store_hub| store_hub.active_recording()) } - fn handle_dropping_files(&mut self, egui_ctx: &egui::Context) { + // NOTE: Relying on `self` is dangerous, as this is called during a time where some internal + // fields may have been temporarily `take()`n out. Keep this a static method. + fn handle_dropping_files( + egui_ctx: &egui::Context, + store_ctx: Option<&StoreContext<'_>>, + command_sender: &CommandSender, + ) { preview_files_being_dropped(egui_ctx); let dropped_files = egui_ctx.input_mut(|i| std::mem::take(&mut i.raw.dropped_files)); + if dropped_files.is_empty() { + return; + } + + let active_application_id = store_ctx + .and_then(|ctx| { + ctx.hub + .active_app() + // Don't redirect data to the welcome screen. + .filter(|&app_id| app_id != &StoreHub::welcome_screen_app_id()) + }) + .cloned(); + let active_recording_id = store_ctx + .and_then(|ctx| ctx.hub.active_recording_id()) + .cloned(); + for file in dropped_files { if let Some(bytes) = file.bytes { // This is what we get on Web. - self.command_sender - .send_system(SystemCommand::LoadDataSource(DataSource::FileContents( - FileSource::DragAndDrop, + command_sender.send_system(SystemCommand::LoadDataSource( + DataSource::FileContents( + FileSource::DragAndDrop { + recommended_application_id: active_application_id.clone(), + recommended_recording_id: active_recording_id.clone(), + }, FileContents { name: file.name.clone(), bytes: bytes.clone(), }, - ))); + ), + )); continue; } #[cfg(not(target_arch = "wasm32"))] if let Some(path) = file.path { - self.command_sender - .send_system(SystemCommand::LoadDataSource(DataSource::FilePath( - FileSource::DragAndDrop, - path, - ))); + command_sender.send_system(SystemCommand::LoadDataSource(DataSource::FilePath( + FileSource::DragAndDrop { + recommended_application_id: active_application_id.clone(), + recommended_recording_id: active_recording_id.clone(), + }, + path, + ))); } } } @@ -1560,7 +1591,10 @@ impl eframe::App for App { for file in files { self.command_sender .send_system(SystemCommand::LoadDataSource(DataSource::FileContents( - FileSource::FileDialog, + FileSource::FileDialog { + recommended_application_id: None, + recommended_recording_id: None, + }, file.clone(), ))); } @@ -1674,7 +1708,7 @@ impl eframe::App for App { self.command_sender.send_ui(cmd); } - self.handle_dropping_files(egui_ctx); + Self::handle_dropping_files(egui_ctx, store_context.as_ref(), &self.command_sender); // Run pending commands last (so we don't have to wait for a repaint before they are run): self.run_pending_ui_commands(egui_ctx, &app_blueprint, store_context.as_ref()); diff --git a/crates/viewer/re_viewer/src/viewer_analytics/event.rs b/crates/viewer/re_viewer/src/viewer_analytics/event.rs index cc5104b844c6..0d909b532b05 100644 --- a/crates/viewer/re_viewer/src/viewer_analytics/event.rs +++ b/crates/viewer/re_viewer/src/viewer_analytics/event.rs @@ -75,8 +75,8 @@ pub fn open_recording( S::RustSdk { .. } => "rust_sdk".to_owned(), S::File { file_source } => match file_source { re_log_types::FileSource::Cli => "file_cli".to_owned(), - re_log_types::FileSource::DragAndDrop => "file_drag_and_drop".to_owned(), - re_log_types::FileSource::FileDialog => "file_dialog".to_owned(), + re_log_types::FileSource::DragAndDrop { .. } => "file_drag_and_drop".to_owned(), + re_log_types::FileSource::FileDialog { .. } => "file_dialog".to_owned(), re_log_types::FileSource::Sdk => "file_sdk".to_owned(), }, S::Viewer => "viewer".to_owned(), diff --git a/examples/rust/custom_data_loader/src/main.rs b/examples/rust/custom_data_loader/src/main.rs index 1faed5d57e64..0811feab4203 100644 --- a/examples/rust/custom_data_loader/src/main.rs +++ b/examples/rust/custom_data_loader/src/main.rs @@ -9,7 +9,7 @@ use rerun::{ external::{anyhow, re_build_info, re_data_loader, re_log}, log::{Chunk, RowId}, - EntityPath, TimePoint, + EntityPath, LoadedData, TimePoint, }; fn main() -> anyhow::Result { @@ -34,7 +34,7 @@ impl re_data_loader::DataLoader for HashLoader { fn load_from_path( &self, - _settings: &rerun::external::re_data_loader::DataLoaderSettings, + settings: &rerun::external::re_data_loader::DataLoaderSettings, path: std::path::PathBuf, tx: std::sync::mpsc::Sender, ) -> Result<(), re_data_loader::DataLoaderError> { @@ -42,21 +42,22 @@ impl re_data_loader::DataLoader for HashLoader { if path.is_dir() { return Err(re_data_loader::DataLoaderError::Incompatible(path)); // simply not interested } - hash_and_log(&tx, &path, &contents) + hash_and_log(settings, &tx, &path, &contents) } fn load_from_file_contents( &self, - _settings: &rerun::external::re_data_loader::DataLoaderSettings, + settings: &rerun::external::re_data_loader::DataLoaderSettings, filepath: std::path::PathBuf, contents: std::borrow::Cow<'_, [u8]>, tx: std::sync::mpsc::Sender, ) -> Result<(), re_data_loader::DataLoaderError> { - hash_and_log(&tx, &filepath, &contents) + hash_and_log(settings, &tx, &filepath, &contents) } } fn hash_and_log( + settings: &rerun::external::re_data_loader::DataLoaderSettings, tx: &std::sync::mpsc::Sender, filepath: &std::path::Path, contents: &[u8], @@ -76,7 +77,12 @@ fn hash_and_log( .with_archetype(RowId::new(), TimePoint::default(), &doc) .build()?; - tx.send(chunk.into()).ok(); + let store_id = settings + .opened_store_id + .clone() + .unwrap_or_else(|| settings.store_id.clone()); + let data = LoadedData::Chunk(store_id, chunk); + tx.send(data).ok(); Ok(()) } From 64a27eee30ede5edd764d809e651aa8dbf5a244e Mon Sep 17 00:00:00 2001 From: Clement Rey Date: Thu, 24 Oct 2024 13:36:09 +0200 Subject: [PATCH 6/6] Docs: static data (#7856) Title. * Fixes #7845 --- docs/content/concepts/static.md | 97 +++ docs/content/concepts/timelines.md | 3 + docs/snippets/CMakeLists.txt | 1 + .../all/concepts/static/log_static.cpp | 1 + .../all/concepts/static/log_static.py | 1 + .../all/concepts/static/log_static.rs | 1 + .../all/concepts/static/log_static_10x.py | 2 + .../all/concepts/static/log_temporal_10x.py | 3 + .../all/concepts/static/send_static.cpp | 1 + .../all/concepts/static/send_static.py | 1 + .../all/concepts/static/send_static.rs | 1 + docs/snippets/snippets.toml | 20 + pixi.lock | 598 +++++++++--------- rerun_py/pyproject.toml | 3 + scripts/lint.py | 4 + 15 files changed, 438 insertions(+), 299 deletions(-) create mode 100644 docs/content/concepts/static.md create mode 100644 docs/snippets/all/concepts/static/log_static.cpp create mode 100644 docs/snippets/all/concepts/static/log_static.py create mode 100644 docs/snippets/all/concepts/static/log_static.rs create mode 100644 docs/snippets/all/concepts/static/log_static_10x.py create mode 100644 docs/snippets/all/concepts/static/log_temporal_10x.py create mode 100644 docs/snippets/all/concepts/static/send_static.cpp create mode 100644 docs/snippets/all/concepts/static/send_static.py create mode 100644 docs/snippets/all/concepts/static/send_static.rs diff --git a/docs/content/concepts/static.md b/docs/content/concepts/static.md new file mode 100644 index 000000000000..1fa1b2624cf4 --- /dev/null +++ b/docs/content/concepts/static.md @@ -0,0 +1,97 @@ +--- +title: Static data +order: 450 +--- + + +The Rerun SDK allows you to store data as _static_. Static data belongs to all timelines (existing ones, and ones not yet created) and shadows any temporal data of the same type on the same entity. + +That is, any time you log static data to an entity path, all past, present and future temporal data on that same entity path and component is _semantically_ discarded in favor of the static one (which doesn't necessarily mean that it is _physically_ discarded, more on that below). + + +## How to store static data? + +Internally, all data in Rerun is stored as chunks of columns. Specifically, each chunk holds zero or more time columns (the indices), and zero or more component columns (the data). +Static data is data that lives in a chunk whose set of time columns is the empty set. + +The easiest way to create such chunks is by using the `log` family of methods, which exposes a `static` flag where appropriate: + +snippet: concepts/static/log_static + +The same can be achieved using the `send_columns` API by simply leaving the time column set empty: + +snippet: concepts/static/send_static + +(Using `send_columns` that way is rarely useful in practice, but is just a logical continuation of the data model.) + + +## When should I use static data? + +There are two broad categories of situations where you'd want to use static data: scene setting and memory savings. + + +### Scene setting + +Often, you'll want to store data that isn't part of normal data capture, but sets the scene for how it should be shown. +For instance, if you are logging cars on a street, perhaps you want to always show a street mesh as part of the scenery, and for that it makes sense for that data to be static. + +snippet: concepts/static/log_static + +The alternative would be to log that data at the beginning of every relevant timeline, which can be very problematic as the set of timelines might not even be known before runtime. + +Similarly, [coordinate systems](spaces-and-transforms.md) or [annotation context](annotation-context.md) are typically stored as static. + + +### Memory savings + +When you store _temporal_ data in Rerun, it is always appended to the existing dataset: there is no such thing as overwriting temporal data. The dataset only grows, it never shrinks. +To compensate for that, the Rerun viewer has a [garbage collection mechanism](../howto/limit-ram) that will drop the oldest data from the store when memory becomes scarce. + +For example, the following snippet stores 10 images at index `4` on the `frame` [timeline](timelines.md): + +snippet: concepts/static/log_temporal_10x + +All these images are actually stored, and all of them can be visualized in the viewer independently, even though they share the same index. + +Contrary to temporal data, static data is **never** garbage collected… but it can actually be overwritten! +_Semantically_, only a single piece of static data can exist at a given time for a specific component on a specific entity. + +In the following snippet, only the data from latest log call (in execution order) will be inspectable in the viewer: + +snippet: concepts/static/log_static_10x + +In practice, the Rerun datastore will rely on these semantics to physically drop the superfluous static data where possible, therefore drastically reducing memory costs. See ["Understanding storage costs"](#understanding-storage-costs) for more information. + + +## Understanding storage costs + +In ["Memory savings"](#memory-savings), we mentioned that the following snippet _semantically_ stores a single image: + +snippet: concepts/static/log_static_10x + +How these semantics actually translate to physical storage depends on the context. + + +### In recordings + +Rerun recordings (`.rrd` files) are just streams of binary messages: they have no semantics whatsoever, therefore they don't know what static means and can't do anything about it. + +If you were to log the snippet above to a file (using e.g. `rr.save()`), you'd find that the recording does in fact contains your 10 images. + +If you wanted the recording file itself to only contain a single static value, you would need to either: +* Stream the data to the viewer, and then save the recording directly out of the viewer using `Menu > Save recording` (or the equivalent palette command). +* Manually recompact your recording using the [Rerun CLI](../reference/cli#rerun-rrd-compact) so that the data overwrite semantics can get appropriately applied, e.g.: `rerun rrd compact -o compacted.rrd myrecording.rrd`. + + +### In the viewer + +The data store that backs the Rerun viewer natively understands these temporal/garbage-collected vs. static/overwritten semantics. + +If you were to log the snippet above directly to the Rerun viewer (using e.g. `rr.connect()`), you'd notice that the viewer's memory usage stays constant: the data is automatically being overwritten as new updates come in. +For data where you don't need to keep track of historical values, this effectively to logs its new values indefinitely. + +In the following example, you can see our [face tracking example]() indefinitely tracking my face while maintaining constant memory usage by logging all data as static: + + diff --git a/docs/content/concepts/timelines.md b/docs/content/concepts/timelines.md index 93b14c677344..200ef7fd4da8 100644 --- a/docs/content/concepts/timelines.md +++ b/docs/content/concepts/timelines.md @@ -49,7 +49,10 @@ An _event_ refer to an instance of logging one or more component batches to one The [`rr.log()`](https://ref.rerun.io/docs/python/stable/common/logging_functions/#rerun.log) function has a `static=False` default argument. If `static=True` is used instead, the data logged becomes *static*. Static data belongs to all timelines (existing ones, and ones not yet created) and shadows any temporal data of the same type on the same entity. + This is useful for data that isn't part of normal data capture, but sets the scene for how it should be shown. For instance, if you are logging cars on a street, perhaps you want to always show a street mesh as part of the scenery, and for that it makes sense for that data to be static. Similarly, [coordinate systems](spaces-and-transforms.md) or [annotation context](annotation-context.md) are typically static. + +You can read more about static data in the [dedicated section](static.md). diff --git a/docs/snippets/CMakeLists.txt b/docs/snippets/CMakeLists.txt index 3f67e9018bee..3f304fe1c1a7 100644 --- a/docs/snippets/CMakeLists.txt +++ b/docs/snippets/CMakeLists.txt @@ -4,6 +4,7 @@ cmake_minimum_required(VERSION 3.16...3.27) file(GLOB_RECURSE sources_list true ${CMAKE_CURRENT_SOURCE_DIR}/all/*.cpp) # Not complete examples: +list(FILTER sources_list EXCLUDE REGEX .*/concepts/static/*) list(FILTER sources_list EXCLUDE REGEX .*/tutorials/custom-recording-id.*) list(FILTER sources_list EXCLUDE REGEX .*/tutorials/log_line.*) list(FILTER sources_list EXCLUDE REGEX .*/tutorials/log-file.*) diff --git a/docs/snippets/all/concepts/static/log_static.cpp b/docs/snippets/all/concepts/static/log_static.cpp new file mode 100644 index 000000000000..131a8054897f --- /dev/null +++ b/docs/snippets/all/concepts/static/log_static.cpp @@ -0,0 +1 @@ +rec.log_static("skybox", generate_skybox_mesh()); diff --git a/docs/snippets/all/concepts/static/log_static.py b/docs/snippets/all/concepts/static/log_static.py new file mode 100644 index 000000000000..c53f61765ede --- /dev/null +++ b/docs/snippets/all/concepts/static/log_static.py @@ -0,0 +1 @@ +rr.log("skybox", static=True, generate_skybox_mesh()) diff --git a/docs/snippets/all/concepts/static/log_static.rs b/docs/snippets/all/concepts/static/log_static.rs new file mode 100644 index 000000000000..65db87a5dd46 --- /dev/null +++ b/docs/snippets/all/concepts/static/log_static.rs @@ -0,0 +1 @@ +rec.log_static("skybox", &generate_skybox_mesh())?; diff --git a/docs/snippets/all/concepts/static/log_static_10x.py b/docs/snippets/all/concepts/static/log_static_10x.py new file mode 100644 index 000000000000..8cf1c80478d2 --- /dev/null +++ b/docs/snippets/all/concepts/static/log_static_10x.py @@ -0,0 +1,2 @@ +for _ in range(10): + rr.log("camera/image", static=True, camera.save_current_frame()) diff --git a/docs/snippets/all/concepts/static/log_temporal_10x.py b/docs/snippets/all/concepts/static/log_temporal_10x.py new file mode 100644 index 000000000000..780c8c1717a4 --- /dev/null +++ b/docs/snippets/all/concepts/static/log_temporal_10x.py @@ -0,0 +1,3 @@ +rr.set_time_sequence("frame", 4) +for _ in range(10): + rr.log("camera/image", camera.save_current_frame()) diff --git a/docs/snippets/all/concepts/static/send_static.cpp b/docs/snippets/all/concepts/static/send_static.cpp new file mode 100644 index 000000000000..7a1a75f33e1d --- /dev/null +++ b/docs/snippets/all/concepts/static/send_static.cpp @@ -0,0 +1 @@ +rec.send_columns("skybox", {}, generate_skybox_mesh()); diff --git a/docs/snippets/all/concepts/static/send_static.py b/docs/snippets/all/concepts/static/send_static.py new file mode 100644 index 000000000000..befc7c9a6de5 --- /dev/null +++ b/docs/snippets/all/concepts/static/send_static.py @@ -0,0 +1 @@ +rr.send_columns("skybox", times=[], components=generate_skybox_mesh()) diff --git a/docs/snippets/all/concepts/static/send_static.rs b/docs/snippets/all/concepts/static/send_static.rs new file mode 100644 index 000000000000..652d60dd9cac --- /dev/null +++ b/docs/snippets/all/concepts/static/send_static.rs @@ -0,0 +1 @@ +rec.send_columns("skybox", std::iter::empty(), generate_skybox_mesh())?; diff --git a/docs/snippets/snippets.toml b/docs/snippets/snippets.toml index a877b9623605..a58f5eb3031c 100644 --- a/docs/snippets/snippets.toml +++ b/docs/snippets/snippets.toml @@ -5,6 +5,26 @@ # You should only ever use this if the test isn't implemented and cannot yet be implemented # for one or more specific SDKs. [opt_out.run] +"concepts/static/log_static" = [ # pseudo-code + "py", + "cpp", + "rust", +] +"concepts/static/log_temporal_10x" = [ # pseudo-code + "py", + "cpp", + "rust", +] +"concepts/static/send_static" = [ # pseudo-code + "py", + "cpp", + "rust", +] +"concepts/static/log_static_10x" = [ # pseudo-code + "py", + "cpp", + "rust", +] "concepts/viscomp-base" = [ "cpp", # Blueprint API doesn't exist for C++/Rust "rust", # Blueprint API doesn't exist for C++/Rust diff --git a/pixi.lock b/pixi.lock index 027ae6c48e4e..9a2efa0e0616 100644 --- a/pixi.lock +++ b/pixi.lock @@ -12997,8 +12997,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl - sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 + url: https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -13010,8 +13010,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae + url: https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl + sha256: e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93 requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -13023,8 +13023,8 @@ packages: - kind: pypi name: argon2-cffi-bindings version: 21.2.0 - url: https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d + url: https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae requires_dist: - cffi>=1.0.1 - pytest ; extra == 'dev' @@ -14687,8 +14687,8 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad + url: https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl + sha256: 3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 @@ -14706,8 +14706,8 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl - sha256: 4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392 + url: https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 @@ -14725,8 +14725,8 @@ packages: - kind: pypi name: black version: 24.10.0 - url: https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl - sha256: 3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d + url: https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl + sha256: 4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392 requires_dist: - click>=8.0.0 - mypy-extensions>=0.4.3 @@ -15339,8 +15339,8 @@ packages: - kind: pypi name: cffi version: 1.17.1 - url: https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d + url: https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 requires_dist: - pycparser requires_python: '>=3.8' @@ -15363,24 +15363,24 @@ packages: - kind: pypi name: cffi version: 1.17.1 - url: https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 + url: https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl + sha256: a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: cffi version: 1.17.1 - url: https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl - sha256: a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 + url: https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d requires_dist: - pycparser requires_python: '>=3.8' - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc + url: https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer @@ -15397,14 +15397,14 @@ packages: - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c + url: https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 requires_python: '>=3.7.0' - kind: pypi name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 + url: https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc requires_python: '>=3.7.0' - kind: conda name: clang @@ -16339,8 +16339,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad + url: https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66 requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16364,8 +16364,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d + url: https://files.pythonhosted.org/packages/b3/1f/9375917786cb39270b0ee6634536c0e22abf225825602688990d8f5c6c19/contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16389,8 +16389,8 @@ packages: - kind: pypi name: contourpy version: 1.3.0 - url: https://files.pythonhosted.org/packages/e1/5d/3056c167fa4486900dfbd7e26a2fdc2338dc58eee36d490a0ed3ddda5ded/contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66 + url: https://files.pythonhosted.org/packages/03/33/003065374f38894cdf1040cef474ad0546368eea7e3a51d48b8a423961f8/contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d requires_dist: - numpy>=1.23 - furo ; extra == 'docs' @@ -16480,8 +16480,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/26/f8/a81170a816679fca9ccd907b801992acfc03c33f952440421c921af2cc57/cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl - sha256: ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c + url: https://files.pythonhosted.org/packages/a2/8f/6c52b1f9d650863e8f67edbe062c04f1c8455579eaace1593d8fe469319a/cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl + sha256: bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -16564,8 +16564,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/a2/8f/6c52b1f9d650863e8f67edbe062c04f1c8455579eaace1593d8fe469319a/cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl - sha256: bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b + url: https://files.pythonhosted.org/packages/52/1b/49ebc2b59e9126f1f378ae910e98704d54a3f48b78e2d6d6c8cfe6fbe06f/cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl + sha256: 1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -16592,8 +16592,8 @@ packages: - kind: pypi name: cryptography version: 38.0.4 - url: https://files.pythonhosted.org/packages/52/1b/49ebc2b59e9126f1f378ae910e98704d54a3f48b78e2d6d6c8cfe6fbe06f/cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl - sha256: 1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb + url: https://files.pythonhosted.org/packages/26/f8/a81170a816679fca9ccd907b801992acfc03c33f952440421c921af2cc57/cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl + sha256: ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c requires_dist: - cffi>=1.12 - sphinx!=1.8.0,!=3.1.0,!=3.1.1,>=1.6.5 ; extra == 'docs' @@ -17907,8 +17907,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/aa/2c/8b5d82fe2d9c7f260fb73121418f5e07d4e38c329ea3886a5b0e55586113/fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl - sha256: 5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20 + url: https://files.pythonhosted.org/packages/45/4b/8a32f56a13e78256192f77d6b65583c43538c7955f5420887bb574b91ddf/fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -17944,8 +17944,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/96/13/748b7f7239893ff0796de11074b0ad8aa4c3da2d9f4d79a128b0b16147f3/fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07 + url: https://files.pythonhosted.org/packages/aa/2c/8b5d82fe2d9c7f260fb73121418f5e07d4e38c329ea3886a5b0e55586113/fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl + sha256: 5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -17981,8 +17981,8 @@ packages: - kind: pypi name: fonttools version: 4.54.1 - url: https://files.pythonhosted.org/packages/45/4b/8a32f56a13e78256192f77d6b65583c43538c7955f5420887bb574b91ddf/fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7 + url: https://files.pythonhosted.org/packages/96/13/748b7f7239893ff0796de11074b0ad8aa4c3da2d9f4d79a128b0b16147f3/fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07 requires_dist: - fs<3,>=2.2.0 ; extra == 'all' - lxml>=4.0 ; extra == 'all' @@ -18249,20 +18249,20 @@ packages: - kind: pypi name: freetype-py version: 2.5.1 - url: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl - sha256: d01ded2557694f06aa0413f3400c0c0b2b5ebcaabeef7aaf3d756be44f51e90b + url: https://files.pythonhosted.org/packages/a2/93/280ad06dc944e40789b0a641492321a2792db82edda485369cbc59d14366/freetype_py-2.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 5d2f6b3d68496797da23204b3b9c4e77e67559c80390fc0dc8b3f454ae1cd819 requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.5.1 - url: https://files.pythonhosted.org/packages/b6/36/853cad240ec63e21a37a512ee19c896b655ce1772d803a3dd80fccfe63fe/freetype_py-2.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl - sha256: 289b443547e03a4f85302e3ac91376838e0d11636050166662a4f75e3087ed0b + url: https://files.pythonhosted.org/packages/38/a8/258dd138ebe60c79cd8cfaa6d021599208a33f0175a5e29b01f60c9ab2c7/freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl + sha256: d01ded2557694f06aa0413f3400c0c0b2b5ebcaabeef7aaf3d756be44f51e90b requires_python: '>=3.7' - kind: pypi name: freetype-py version: 2.5.1 - url: https://files.pythonhosted.org/packages/a2/93/280ad06dc944e40789b0a641492321a2792db82edda485369cbc59d14366/freetype_py-2.5.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 5d2f6b3d68496797da23204b3b9c4e77e67559c80390fc0dc8b3f454ae1cd819 + url: https://files.pythonhosted.org/packages/b6/36/853cad240ec63e21a37a512ee19c896b655ce1772d803a3dd80fccfe63fe/freetype_py-2.5.1-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl + sha256: 289b443547e03a4f85302e3ac91376838e0d11636050166662a4f75e3087ed0b requires_python: '>=3.7' - kind: pypi name: freetype-py @@ -18995,8 +18995,8 @@ packages: - kind: pypi name: google-crc32c version: 1.6.0 - url: https://files.pythonhosted.org/packages/67/1e/4870896fc81ec77b1b5ebae7fdd680d5a4d40e19a4b6d724032f996ca77a/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 51c4f54dd8c6dfeb58d1df5e4f7f97df8abf17a36626a217f169893d1d7f3e9f + url: https://files.pythonhosted.org/packages/3e/6d/33ca50cbdeec09c31bb5dac277c90994edee975662a4c890bda7ffac90ef/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a9e4b426c3702f3cd23b933436487eb34e01e00327fac20c9aebb68ccf34117d requires_dist: - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' @@ -19022,8 +19022,8 @@ packages: - kind: pypi name: google-crc32c version: 1.6.0 - url: https://files.pythonhosted.org/packages/3e/6d/33ca50cbdeec09c31bb5dac277c90994edee975662a4c890bda7ffac90ef/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a9e4b426c3702f3cd23b933436487eb34e01e00327fac20c9aebb68ccf34117d + url: https://files.pythonhosted.org/packages/67/1e/4870896fc81ec77b1b5ebae7fdd680d5a4d40e19a4b6d724032f996ca77a/google_crc32c-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 51c4f54dd8c6dfeb58d1df5e4f7f97df8abf17a36626a217f169893d1d7f3e9f requires_dist: - importlib-resources>=1.3 ; python_version < '3.9' and os_name == 'nt' - pytest ; extra == 'testing' @@ -20973,20 +20973,20 @@ packages: - kind: pypi name: kiwisolver version: 1.4.7 - url: https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95 + url: https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02 requires_python: '>=3.8' - kind: pypi name: kiwisolver version: 1.4.7 - url: https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18 + url: https://files.pythonhosted.org/packages/e5/20/8c75caed8f2462d63c7fd65e16c832b8f76cda331ac9e615e914ee80bac9/kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95 requires_python: '>=3.8' - kind: pypi name: kiwisolver version: 1.4.7 - url: https://files.pythonhosted.org/packages/b8/01/946852b13057a162a8c32c4c8d2e9ed79f0bb5d86569a40c0b5fb103e373/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02 + url: https://files.pythonhosted.org/packages/a7/4b/2db7af3ed3af7c35f388d5f53c28e155cd402a55432d800c543dc6deb731/kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18 requires_python: '>=3.8' - kind: pypi name: kiwisolver @@ -29009,20 +29009,20 @@ packages: - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98 + url: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2 requires_python: '>=3.9' - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749 + url: https://files.pythonhosted.org/packages/95/8c/de3276d773ab6ce3ad676df5fab5aac19696b2956319d65d7dd88fb10f19/llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98 requires_python: '>=3.9' - kind: pypi name: llvmlite version: 0.43.0 - url: https://files.pythonhosted.org/packages/2f/b2/4429433eb2dc8379e2cb582502dca074c23837f8fd009907f78a24de4c25/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2 + url: https://files.pythonhosted.org/packages/6b/99/5d00a7d671b1ba1751fc9f19d3b36f3300774c6eebe2bcdb5f6191763eb4/llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749 requires_python: '>=3.9' - kind: pypi name: llvmlite @@ -29047,8 +29047,8 @@ packages: - kind: pypi name: lxml version: 5.3.0 - url: https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18 + url: https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: 69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -29059,8 +29059,8 @@ packages: - kind: pypi name: lxml version: 5.3.0 - url: https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654 + url: https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -29071,8 +29071,8 @@ packages: - kind: pypi name: lxml version: 5.3.0 - url: https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: 69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16 + url: https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654 requires_dist: - cssselect>=0.7 ; extra == 'cssselect' - html5lib ; extra == 'html5' @@ -29314,12 +29314,6 @@ packages: - pytest-cov ; extra == 'testing' - pytest-regressions ; extra == 'testing' requires_python: '>=3.8' -- kind: pypi - name: markupsafe - version: 3.0.1 - url: https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl - sha256: 26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad - requires_python: '>=3.9' - kind: pypi name: markupsafe version: 3.0.1 @@ -29332,6 +29326,12 @@ packages: url: https://files.pythonhosted.org/packages/ae/1d/7d5ec8bcfd9c2db235d720fa51d818b7e2abc45250ce5f53dd6cb60409ca/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b requires_python: '>=3.9' +- kind: pypi + name: markupsafe + version: 3.0.1 + url: https://files.pythonhosted.org/packages/fc/b5/20cb1d714596acb553c810009c8004c809823947da63e13c19a7decfcb6c/MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl + sha256: 9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf + requires_python: '>=3.9' - kind: pypi name: markupsafe version: 3.0.1 @@ -29341,8 +29341,8 @@ packages: - kind: pypi name: markupsafe version: 3.0.1 - url: https://files.pythonhosted.org/packages/fc/b5/20cb1d714596acb553c810009c8004c809823947da63e13c19a7decfcb6c/MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl - sha256: 9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf + url: https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl + sha256: 26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad requires_python: '>=3.9' - kind: conda name: markupsafe @@ -29474,8 +29474,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/77/c2/f9d7fe80a8fcce9bb128d1381c6fe41a8d286d7e18395e273002e8e0fa34/matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl - sha256: d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772 + url: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -29496,8 +29496,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 + url: https://files.pythonhosted.org/packages/77/c2/f9d7fe80a8fcce9bb128d1381c6fe41a8d286d7e18395e273002e8e0fa34/matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl + sha256: d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -29518,8 +29518,8 @@ packages: - kind: pypi name: matplotlib version: 3.9.2 - url: https://files.pythonhosted.org/packages/e6/9a/5991972a560db3ab621312a7ca5efec339ae2122f25901c0846865c4b72f/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f + url: https://files.pythonhosted.org/packages/01/75/6c7ce560e95714a10fcbb3367d1304975a1a3e620f72af28921b796403f3/matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 requires_dist: - contourpy>=1.0.1 - cycler>=0.10 @@ -30080,24 +30080,24 @@ packages: - kind: pypi name: multidict version: 6.1.0 - url: https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156 + url: https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb requires_dist: - typing-extensions>=4.1.0 ; python_version < '3.11' requires_python: '>=3.8' - kind: pypi name: multidict version: 6.1.0 - url: https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb + url: https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351 requires_dist: - typing-extensions>=4.1.0 ; python_version < '3.11' requires_python: '>=3.8' - kind: pypi name: multidict version: 6.1.0 - url: https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351 + url: https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl + sha256: 82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926 requires_dist: - typing-extensions>=4.1.0 ; python_version < '3.11' requires_python: '>=3.8' @@ -30112,8 +30112,8 @@ packages: - kind: pypi name: multidict version: 6.1.0 - url: https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl - sha256: 82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926 + url: https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156 requires_dist: - typing-extensions>=4.1.0 ; python_version < '3.11' requires_python: '>=3.8' @@ -31018,8 +31018,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8 + url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31027,8 +31027,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 + url: https://files.pythonhosted.org/packages/98/ad/df18d492a8f00d29a30db307904b9b296e37507034eedb523876f3a2e13e/numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31036,8 +31036,8 @@ packages: - kind: pypi name: numba version: 0.60.0 - url: https://files.pythonhosted.org/packages/f9/4c/8889ac94c0b33dca80bed11564b8c6d9ea14d7f094e674c58e5c5b05859b/numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - sha256: 5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 + url: https://files.pythonhosted.org/packages/57/03/2b4245b05b71c0cee667e6a0b51606dfa7f4157c9093d71c6b208385a611/numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + sha256: 4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 requires_dist: - llvmlite<0.44,>=0.43.0.dev0 - numpy<2.1,>=1.22 @@ -31445,8 +31445,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl - sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 + url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -31462,8 +31462,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/b0/e0/8f5d065ebb2e5941d289c5f653f944318f9e418bc5167bc6a346ab5e0f6a/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: a261223db41f6e512d76deaf21c8fcfb4fbbcbc2de62ca7f74a05f2c9ee489ef + url: https://files.pythonhosted.org/packages/09/94/d077c4c976c2d7a88812fd55396e92edae0e0c708689dbd8c8f508920e47/opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl + sha256: dea80d4db73b8acccf9e16b5744bf3654f47b22745074263f0a6c10de26c5ef5 requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -31479,8 +31479,8 @@ packages: - kind: pypi name: opencv-contrib-python version: 4.10.0.84 - url: https://files.pythonhosted.org/packages/f8/76/f76fe74b864f3cfa737173ca12e8890aad8369e980006fb8a0b6cd14c6c7/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 040575b69e4f3aa761676bace4e3d1b8485fbfaf77ef77b266ab6bda5a3b5e9b + url: https://files.pythonhosted.org/packages/b0/e0/8f5d065ebb2e5941d289c5f653f944318f9e418bc5167bc6a346ab5e0f6a/opencv_contrib_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: a261223db41f6e512d76deaf21c8fcfb4fbbcbc2de62ca7f74a05f2c9ee489ef requires_dist: - numpy>=1.13.3 ; python_version < '3.7' - numpy>=1.21.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64' @@ -31976,8 +31976,8 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039 + url: https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + sha256: cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698 requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -32068,8 +32068,8 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc + url: https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039 requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -32160,8 +32160,8 @@ packages: - kind: pypi name: pandas version: 2.2.3 - url: https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - sha256: cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698 + url: https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc requires_dist: - numpy>=1.22.4 ; python_version < '3.11' - numpy>=1.23.2 ; python_version == '3.11' @@ -32581,8 +32581,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629 + url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32653,8 +32653,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/79/53/3a7277ae95bfe86b8b4db0ed1d08c4924aa2dfbfe51b8fe0e310b160a9c6/Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd + url: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32677,8 +32677,8 @@ packages: - kind: pypi name: pillow version: 10.0.0 - url: https://files.pythonhosted.org/packages/7a/54/f6a14d95cba8ff082c550d836c9e5c23f1641d2ac291c23efe0494219b8c/Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl - sha256: 9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485 + url: https://files.pythonhosted.org/packages/16/89/818fa238e37a47a29bb8495ca2cafdd514599a89f19ada7916348a74b5f9/Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32701,8 +32701,8 @@ packages: - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/f0/eb/f7e21b113dd48a9c97d364e0915b3988c6a0b6207652f5a92372871b7aa4/pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl - sha256: 1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc + url: https://files.pythonhosted.org/packages/25/b3/2b54a1d541accebe6bd8b1358b34ceb2c509f51cb7dcda8687362490da5b/pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32728,8 +32728,8 @@ packages: - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/25/b3/2b54a1d541accebe6bd8b1358b34ceb2c509f51cb7dcda8687362490da5b/pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a + url: https://files.pythonhosted.org/packages/39/63/b3fc299528d7df1f678b0666002b37affe6b8751225c3d9c12cf530e73ed/pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: 45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32755,8 +32755,8 @@ packages: - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/39/63/b3fc299528d7df1f678b0666002b37affe6b8751225c3d9c12cf530e73ed/pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: 45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa + url: https://files.pythonhosted.org/packages/dc/83/1470c220a4ff06cd75fc609068f6605e567ea51df70557555c2ab6516b2c/pillow-11.0.0-cp311-cp311-win_amd64.whl + sha256: 52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291 requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -32809,8 +32809,8 @@ packages: - kind: pypi name: pillow version: 11.0.0 - url: https://files.pythonhosted.org/packages/dc/83/1470c220a4ff06cd75fc609068f6605e567ea51df70557555c2ab6516b2c/pillow-11.0.0-cp311-cp311-win_amd64.whl - sha256: 52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291 + url: https://files.pythonhosted.org/packages/f0/eb/f7e21b113dd48a9c97d364e0915b3988c6a0b6207652f5a92372871b7aa4/pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl + sha256: 1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc requires_dist: - furo ; extra == 'docs' - olefile ; extra == 'docs' @@ -33185,8 +33185,8 @@ packages: - kind: pypi name: protobuf version: 5.28.2 - url: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl - sha256: 5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f + url: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl + sha256: 35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f requires_python: '>=3.8' - kind: pypi name: protobuf @@ -33203,14 +33203,14 @@ packages: - kind: pypi name: protobuf version: 5.28.2 - url: https://files.pythonhosted.org/packages/e6/23/ed718dc18e6a561445ece1e7a17d2dda0c634ad9cf663102b47f10005d8f/protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl - sha256: 35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f + url: https://files.pythonhosted.org/packages/23/08/a1ce0415a115c2b703bfa798f06f0e43ca91dbe29d6180bf86a9287b15e2/protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl + sha256: 5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f requires_python: '>=3.8' - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl - sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 + url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 requires_dist: - ipaddress ; python_version < '3.0' and extra == 'test' - mock ; python_version < '3.0' and extra == 'test' @@ -33221,8 +33221,8 @@ packages: - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/7c/06/63872a64c312a24fb9b4af123ee7007a306617da63ff13bcc1432386ead7/psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl - sha256: ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 + url: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd requires_dist: - ipaddress ; python_version < '3.0' and extra == 'test' - mock ; python_version < '3.0' and extra == 'test' @@ -33233,8 +33233,8 @@ packages: - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/19/74/f59e7e0d392bc1070e9a70e2f9190d652487ac115bb16e2eff6b22ad1d24/psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd + url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl + sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 requires_dist: - ipaddress ; python_version < '3.0' and extra == 'test' - mock ; python_version < '3.0' and extra == 'test' @@ -33257,8 +33257,8 @@ packages: - kind: pypi name: psutil version: 6.0.0 - url: https://files.pythonhosted.org/packages/73/44/561092313ae925f3acfaace6f9ddc4f6a9c748704317bad9c8c8f8a36a79/psutil-6.0.0-cp37-abi3-win_amd64.whl - sha256: 33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 + url: https://files.pythonhosted.org/packages/0b/37/f8da2fbd29690b3557cca414c1949f92162981920699cd62095a984983bf/psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl + sha256: c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 requires_dist: - ipaddress ; python_version < '3.0' and extra == 'test' - mock ; python_version < '3.0' and extra == 'test' @@ -33369,8 +33369,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 24e69ea57ee39e3677298f38a18828af87cdc0bf0aa64685d44259e608bae3ec + url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl + sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -33443,8 +33443,8 @@ packages: - kind: pypi name: psygnal version: 0.11.1 - url: https://files.pythonhosted.org/packages/68/76/d5c5bf5a932ec2dcdc4a23565815a1cc5fd96b03b26ff3f647cdff5ea62c/psygnal-0.11.1-py3-none-any.whl - sha256: 04255fe28828060a80320f8fda937c47bc0c21ca14f55a13eb7c494b165ea395 + url: https://files.pythonhosted.org/packages/84/6f/868f1d7d22c76b96e0c8a75f8eb196deaff83916ad2da7bd78d1d0f6a5df/psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 24e69ea57ee39e3677298f38a18828af87cdc0bf0aa64685d44259e608bae3ec requires_dist: - ipython ; extra == 'dev' - mypy ; extra == 'dev' @@ -33738,8 +33738,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/8d/8e/ce2e9b2146de422f6638333c01903140e9ada244a2a477918a368306c64c/pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3 + url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl + sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33751,8 +33751,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl - sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 + url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33764,8 +33764,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl - sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 + url: https://files.pythonhosted.org/packages/8d/8e/ce2e9b2146de422f6638333c01903140e9ada244a2a477918a368306c64c/pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33777,8 +33777,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/30/d1/63a7c248432c71c7d3ee803e706590a0b81ce1a8d2b2ae49677774b813bb/pyarrow-17.0.0-cp311-cp311-win_amd64.whl - sha256: a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03 + url: https://files.pythonhosted.org/packages/f9/46/ce89f87c2936f5bb9d879473b9663ce7a4b1f4359acc2f0eb39865eaa1af/pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl + sha256: 1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33790,8 +33790,8 @@ packages: - kind: pypi name: pyarrow version: 17.0.0 - url: https://files.pythonhosted.org/packages/4c/21/9ca93b84b92ef927814cb7ba37f0774a484c849d58f0b692b16af8eebcfb/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4 + url: https://files.pythonhosted.org/packages/d8/81/69b6606093363f55a2a574c018901c40952d4e902e670656d18213c71ad7/pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl + sha256: dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420 requires_dist: - numpy>=1.16.6 - pytest ; extra == 'test' @@ -33986,8 +33986,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl - sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd + url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc requires_dist: - matplotlib>=2.1.0 - numpy @@ -33995,8 +33995,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/8b/d4/7279d072c0255d07c541326f6058effb1b08190f49695bf2c22aae666878/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 5968a1e5421719af9eb7ccee4c540bfb18b1fc95d30d9a48571d0aaeb159a1ae + url: https://files.pythonhosted.org/packages/6b/56/9eedccfd1cfdaf6553d527bed0b2b5572550567a5786a8beb098027a3e5e/pycocotools-2.0.8-cp311-cp311-macosx_10_9_universal2.whl + sha256: 92bf788e6936fc52b57ccaaa78ecdaeac81872eebbfc45b6fe16ae18b85709bd requires_dist: - matplotlib>=2.1.0 - numpy @@ -34004,8 +34004,8 @@ packages: - kind: pypi name: pycocotools version: 2.0.8 - url: https://files.pythonhosted.org/packages/d5/9c/09cd808743338db170915deb35fa020b792d583238afe55f27c011f91c3c/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 6a07f57f991e379959c0f4a1b9ea35d875876433b7f45c6d8fe6b718e58834bc + url: https://files.pythonhosted.org/packages/8b/d4/7279d072c0255d07c541326f6058effb1b08190f49695bf2c22aae666878/pycocotools-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 5968a1e5421719af9eb7ccee4c540bfb18b1fc95d30d9a48571d0aaeb159a1ae requires_dist: - matplotlib>=2.1.0 - numpy @@ -34109,8 +34109,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl - sha256: 0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d + url: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl + sha256: 52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -34145,8 +34145,8 @@ packages: - kind: pypi name: pynacl version: 1.5.0 - url: https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl - sha256: 52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 + url: https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl + sha256: 0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d requires_dist: - cffi>=1.4.1 - sphinx>=1.6.5 ; extra == 'docs' @@ -34552,32 +34552,32 @@ packages: - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl - sha256: 1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee + url: https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 requires_python: '>=3.8' - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 + url: https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl + sha256: 1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee requires_python: '>=3.8' - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c + url: https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 requires_python: '>=3.8' - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 + url: https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl + sha256: e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 requires_python: '>=3.8' - kind: pypi name: pyyaml version: 6.0.2 - url: https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl - sha256: e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 + url: https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c requires_python: '>=3.8' - kind: pypi name: pyyaml-env-tag @@ -34590,24 +34590,24 @@ packages: - kind: pypi name: pyzmq version: 26.2.0 - url: https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl - sha256: 8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218 + url: https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' - kind: pypi name: pyzmq version: 26.2.0 - url: https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl - sha256: 689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e + url: https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl + sha256: 8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218 requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' - kind: pypi name: pyzmq version: 26.2.0 - url: https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef + url: https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl + sha256: 689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e requires_dist: - cffi ; implementation_name == 'pypy' requires_python: '>=3.7' @@ -34926,32 +34926,32 @@ packages: - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl - sha256: 64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad + url: https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50 + url: https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl + sha256: 64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad requires_python: '>=3.8' - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679 + url: https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50 requires_python: '>=3.8' - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268 + url: https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl + sha256: 313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf requires_python: '>=3.8' - kind: pypi name: regex version: 2024.9.11 - url: https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl - sha256: 313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf + url: https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679 requires_python: '>=3.8' - kind: pypi name: requests @@ -34992,8 +34992,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl - sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 + url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl + sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35006,8 +35006,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl - sha256: ad55807abafb01e527846742e087819aac8e103f1ec15aadc563a4038bb44e1d + url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl + sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35020,8 +35020,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl - sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 + url: https://files.pythonhosted.org/packages/87/0a/b5fe1ffea700eeaa8d28817a92ad3cb4a7d56dc4af45de76ea412cfc5cd5/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_aarch64.whl + sha256: ad55807abafb01e527846742e087819aac8e103f1ec15aadc563a4038bb44e1d requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35034,8 +35034,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/8c/28/92423fe9673b738c180fb5b6b8ea4203fe4b02c1d20b06b7fae79d11cc24/rerun_sdk-0.17.0-cp38-abi3-win_amd64.whl - sha256: 34e5595a326cbdddfebdf00b08e877358c564fce74cc8c6d617fc89ef3a6aa70 + url: https://files.pythonhosted.org/packages/b7/c5/d47ba7b774bc563aa3c07ba500dd304ea24b31fe438e10ea9ad5e10ffe17/rerun_sdk-0.17.0-cp38-abi3-macosx_11_0_arm64.whl + sha256: 8b0a8a6feab3f8e679801d158216a71d88a81480021587719330f50d083c4d26 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35048,8 +35048,8 @@ packages: - kind: pypi name: rerun-sdk version: 0.17.0 - url: https://files.pythonhosted.org/packages/30/5f/ce02381b9d7e1e14f60c421c76dce12b7d823690181784780b30266017b1/rerun_sdk-0.17.0-cp38-abi3-macosx_10_12_x86_64.whl - sha256: abd34f746eada83b8bb0bc50007183151981d7ccf18306f3d42165819a3f6fcb + url: https://files.pythonhosted.org/packages/d9/74/6c1ff0c8dbe6da09ceb5ea838a72382fa3131ef6bb9377a30003299743fa/rerun_sdk-0.17.0-cp38-abi3-manylinux_2_31_x86_64.whl + sha256: 9d41f1f475270b1e0d50ddb8cb62e0d828988f0c371ac8457af25c8be5aa1dc0 requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35063,7 +35063,7 @@ packages: name: rerun-sdk version: 0.20.0a1+dev path: rerun_py - sha256: cc86779292d57abdc17ec32f2fa27854701a1c7542baa883898814d11ada0352 + sha256: eb5f7980a383fbf90ac89432b7a8b244b996ba65520ee25a53f541ecf243236b requires_dist: - attrs>=23.1.0 - numpy>=1.23,<2 @@ -35175,32 +35175,32 @@ packages: - kind: pypi name: rpds-py version: 0.20.0 - url: https://files.pythonhosted.org/packages/0e/6a/2c9fdcc6d235ac0d61ec4fd9981184689c3e682abd05e3caa49bccb9c298/rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl - sha256: 220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318 + url: https://files.pythonhosted.org/packages/ab/2a/191374c52d7be0b056cc2a04d718d2244c152f915d4a8d2db2aacc526189/rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl + sha256: ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489 requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.20.0 - url: https://files.pythonhosted.org/packages/a7/e8/85835077b782555d6b3416874b702ea6ebd7db1f145283c9252968670dd5/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209 + url: https://files.pythonhosted.org/packages/0e/6a/2c9fdcc6d235ac0d61ec4fd9981184689c3e682abd05e3caa49bccb9c298/rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl + sha256: 220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318 requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.20.0 - url: https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db + url: https://files.pythonhosted.org/packages/a7/e8/85835077b782555d6b3416874b702ea6ebd7db1f145283c9252968670dd5/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209 requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.20.0 - url: https://files.pythonhosted.org/packages/ab/2a/191374c52d7be0b056cc2a04d718d2244c152f915d4a8d2db2aacc526189/rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl - sha256: ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489 + url: https://files.pythonhosted.org/packages/cc/ec/77d0674f9af4872919f3738018558dd9d37ad3f7ad792d062eadd4af7cba/rpds_py-0.20.0-cp311-none-win_amd64.whl + sha256: c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c requires_python: '>=3.8' - kind: pypi name: rpds-py version: 0.20.0 - url: https://files.pythonhosted.org/packages/cc/ec/77d0674f9af4872919f3738018558dd9d37ad3f7ad792d062eadd4af7cba/rpds_py-0.20.0-cp311-none-win_amd64.whl - sha256: c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c + url: https://files.pythonhosted.org/packages/d2/b2/725487d29633f64ef8f9cbf4729111a0b61702c8f8e94db1653930f52cce/rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db requires_python: '>=3.8' - kind: pypi name: rrt-star @@ -35355,8 +35355,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/9a/a5/25bcf75e373412daf1fd88045ab3aa8140a0d804ef0e70712c4f2c5b94d8/safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 21f848d7aebd5954f92538552d6d75f7c1b4500f51664078b5b49720d180e47c + url: https://files.pythonhosted.org/packages/39/83/c4a7ce01d626e46ea2b45887f2e59b16441408031e2ce2f9fe01860c6946/safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 09dedf7c2fda934ee68143202acff6e9e8eb0ddeeb4cfc24182bef999efa9f42 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35395,8 +35395,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/e6/ee/69e498a892f208bd1da4104d4b9be887f8611bf4942144718b6738482250/safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: a6c19feda32b931cae0acd42748a670bdf56bee6476a046af20181ad3fee4090 + url: https://files.pythonhosted.org/packages/9a/a5/25bcf75e373412daf1fd88045ab3aa8140a0d804ef0e70712c4f2c5b94d8/safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 21f848d7aebd5954f92538552d6d75f7c1b4500f51664078b5b49720d180e47c requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35435,8 +35435,8 @@ packages: - kind: pypi name: safetensors version: 0.4.5 - url: https://files.pythonhosted.org/packages/39/83/c4a7ce01d626e46ea2b45887f2e59b16441408031e2ce2f9fe01860c6946/safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 09dedf7c2fda934ee68143202acff6e9e8eb0ddeeb4cfc24182bef999efa9f42 + url: https://files.pythonhosted.org/packages/e6/ee/69e498a892f208bd1da4104d4b9be887f8611bf4942144718b6738482250/safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: a6c19feda32b931cae0acd42748a670bdf56bee6476a046af20181ad3fee4090 requires_dist: - numpy>=1.21.6 ; extra == 'numpy' - safetensors[numpy] ; extra == 'torch' @@ -35555,8 +35555,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/90/e3/564beb0c78bf83018a146dfcdc959c99c10a0d136480b932a350c852adbc/scikit_image-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 272909e02a59cea3ed4aa03739bb88df2625daa809f633f40b5053cf09241831 + url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35622,8 +35622,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/ad/96/138484302b8ec9a69cdf65e8d4ab47a640a3b1a8ea3c437e1da3e1a5a6b8/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fa27b3a0dbad807b966b8db2d78da734cb812ca4787f7fbb143764800ce2fa9c + url: https://files.pythonhosted.org/packages/90/e3/564beb0c78bf83018a146dfcdc959c99c10a0d136480b932a350c852adbc/scikit_image-0.24.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 272909e02a59cea3ed4aa03739bb88df2625daa809f633f40b5053cf09241831 requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35689,8 +35689,8 @@ packages: - kind: pypi name: scikit-image version: 0.24.0 - url: https://files.pythonhosted.org/packages/b8/2e/3a949995f8fc2a65b15a4964373e26c5601cb2ea68f36b115571663e7a38/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 59c98cc695005faf2b79904e4663796c977af22586ddf1b12d6af2fa22842dc2 + url: https://files.pythonhosted.org/packages/ad/96/138484302b8ec9a69cdf65e8d4ab47a640a3b1a8ea3c437e1da3e1a5a6b8/scikit_image-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fa27b3a0dbad807b966b8db2d78da734cb812ca4787f7fbb143764800ce2fa9c requires_dist: - numpy>=1.23 - scipy>=1.9 @@ -35890,8 +35890,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.2 - url: https://files.pythonhosted.org/packages/ff/91/609961972f694cb9520c4c3d201e377a26583e1eb83bc5a334c893729214/scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445 + url: https://files.pythonhosted.org/packages/4c/75/62e49f8a62bf3c60b0e64d0fce540578ee4f0e752765beb2e1dc7c6d6098/scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -35952,8 +35952,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.2 - url: https://files.pythonhosted.org/packages/49/21/3723de321531c9745e40f1badafd821e029d346155b6c79704e0b7197552/scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1 + url: https://files.pythonhosted.org/packages/ff/91/609961972f694cb9520c4c3d201e377a26583e1eb83bc5a334c893729214/scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -36014,8 +36014,8 @@ packages: - kind: pypi name: scikit-learn version: 1.5.2 - url: https://files.pythonhosted.org/packages/4c/75/62e49f8a62bf3c60b0e64d0fce540578ee4f0e752765beb2e1dc7c6d6098/scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675 + url: https://files.pythonhosted.org/packages/49/21/3723de321531c9745e40f1badafd821e029d346155b6c79704e0b7197552/scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1 requires_dist: - numpy>=1.19.5 - scipy>=1.6.0 @@ -36200,8 +36200,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl - sha256: 2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675 + url: https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36242,8 +36242,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2 + url: https://files.pythonhosted.org/packages/b2/ab/070ccfabe870d9f105b04aee1e2860520460ef7ca0213172abfe871463b9/scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl + sha256: 2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36284,8 +36284,8 @@ packages: - kind: pypi name: scipy version: 1.14.1 - url: https://files.pythonhosted.org/packages/c2/4b/b44bee3c2ddc316b0159b3d87a3d467ef8d7edfd525e6f7364a62cd87d90/scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37 + url: https://files.pythonhosted.org/packages/93/6b/701776d4bd6bdd9b629c387b5140f006185bd8ddea16788a44434376b98f/scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2 requires_dist: - numpy<2.3,>=1.23.5 - pytest ; extra == 'test' @@ -36554,8 +36554,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/37/15/269d8e1f7f658a37e61f7028683c546f520e4e7cedba1e32c77ff9d3a3c7/shapely-2.0.6-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 5aeb0f51a9db176da9a30cb2f4329b6fbd1e26d359012bb0ac3d3c7781667a9e + url: https://files.pythonhosted.org/packages/6e/5a/d019f69449329dcd517355444fdb9ddd58bec5e080b8bdba007e8e4c546d/shapely-2.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: f32c23d2f43d54029f986479f7c1f6e09c6b3a19353a3833c2ffb226fb63a855 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36569,8 +36569,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/25/aa/53f145e5a610a49af9ac49f2f1be1ec8659ebd5c393d66ac94e57c83b00e/shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: b3dc9fb0eb56498912025f5eb352b5126f04801ed0e8bdbd867d21bdbfd7cbd0 + url: https://files.pythonhosted.org/packages/37/15/269d8e1f7f658a37e61f7028683c546f520e4e7cedba1e32c77ff9d3a3c7/shapely-2.0.6-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 5aeb0f51a9db176da9a30cb2f4329b6fbd1e26d359012bb0ac3d3c7781667a9e requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36584,8 +36584,8 @@ packages: - kind: pypi name: shapely version: 2.0.6 - url: https://files.pythonhosted.org/packages/6e/5a/d019f69449329dcd517355444fdb9ddd58bec5e080b8bdba007e8e4c546d/shapely-2.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: f32c23d2f43d54029f986479f7c1f6e09c6b3a19353a3833c2ffb226fb63a855 + url: https://files.pythonhosted.org/packages/25/aa/53f145e5a610a49af9ac49f2f1be1ec8659ebd5c393d66ac94e57c83b00e/shapely-2.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: b3dc9fb0eb56498912025f5eb352b5126f04801ed0e8bdbd867d21bdbfd7cbd0 requires_dist: - numpy<3,>=1.14 - numpydoc==1.1.* ; extra == 'docs' @@ -36686,20 +36686,20 @@ packages: - kind: pypi name: simplejson version: 3.19.3 - url: https://files.pythonhosted.org/packages/ac/ae/a06523928af3a6783e2638cd4f6035c3e32de1c1063d563d9060c8d2f1ad/simplejson-3.19.3-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 934a50a614fb831614db5dbfba35127ee277624dda4d15895c957d2f5d48610c + url: https://files.pythonhosted.org/packages/ab/4d/15718f20cb0e3875b8af9597d6bb3bfbcf1383834b82b6385ee9ac0b72a9/simplejson-3.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 5d9e8f836688a8fabe6a6b41b334aa550a6823f7b4ac3d3712fc0ad8655be9a8 requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.3 - url: https://files.pythonhosted.org/packages/b7/d4/850948bcbcfe0b4a6c69dfde10e245d3a1ea45252f16a1e2308a3b06b1da/simplejson-3.19.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: c4f614581b61a26fbbba232a1391f6cee82bc26f2abbb6a0b44a9bba25c56a1c + url: https://files.pythonhosted.org/packages/ac/ae/a06523928af3a6783e2638cd4f6035c3e32de1c1063d563d9060c8d2f1ad/simplejson-3.19.3-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 934a50a614fb831614db5dbfba35127ee277624dda4d15895c957d2f5d48610c requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson version: 3.19.3 - url: https://files.pythonhosted.org/packages/ab/4d/15718f20cb0e3875b8af9597d6bb3bfbcf1383834b82b6385ee9ac0b72a9/simplejson-3.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 5d9e8f836688a8fabe6a6b41b334aa550a6823f7b4ac3d3712fc0ad8655be9a8 + url: https://files.pythonhosted.org/packages/b7/d4/850948bcbcfe0b4a6c69dfde10e245d3a1ea45252f16a1e2308a3b06b1da/simplejson-3.19.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: c4f614581b61a26fbbba232a1391f6cee82bc26f2abbb6a0b44a9bba25c56a1c requires_python: '>=2.5,!=3.0.*,!=3.1.*,!=3.2.*' - kind: pypi name: simplejson @@ -37414,8 +37414,8 @@ packages: - kind: pypi name: tokenizers version: 0.20.1 - url: https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl - sha256: 4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15 + url: https://files.pythonhosted.org/packages/2d/ca/f3a294ed89f2a1b900fba072ef4cb5331d4f156e2d5ea2d34f60160ef5bd/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 929c8f3afa16a5130a81ab5079c589226273ec618949cce79b46d96e59a84f61 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -37432,8 +37432,8 @@ packages: - kind: pypi name: tokenizers version: 0.20.1 - url: https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4 + url: https://files.pythonhosted.org/packages/61/9a/be5f00cd37ad4fab0e5d1dbf31404a66ac2c1c33973beda9fc8e248a37ab/tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl + sha256: 4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -37450,8 +37450,8 @@ packages: - kind: pypi name: tokenizers version: 0.20.1 - url: https://files.pythonhosted.org/packages/2d/ca/f3a294ed89f2a1b900fba072ef4cb5331d4f156e2d5ea2d34f60160ef5bd/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 929c8f3afa16a5130a81ab5079c589226273ec618949cce79b46d96e59a84f61 + url: https://files.pythonhosted.org/packages/09/6c/1b573998fe3f0e18ac5d434e43966de2d225d6837f099ce0df7df4274c87/tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4 requires_dist: - huggingface-hub>=0.16.4,<1.0 - pytest ; extra == 'testing' @@ -37544,8 +37544,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl - sha256: ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb + url: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl + sha256: 49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1 requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37571,8 +37571,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl - sha256: 95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059 + url: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl + sha256: f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37598,8 +37598,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl - sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf + url: https://files.pythonhosted.org/packages/3f/14/e105b8ef6d324e789c1589e95cb0ab63f3e07c2216d68b1178b7c21b7d2a/torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl + sha256: 95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059 requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37625,8 +37625,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/5c/01/5ab75f138bf32d7a69df61e4997e24eccad87cc009f5fb7e2a31af8a4036/torch-2.2.2-cp311-cp311-win_amd64.whl - sha256: f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c + url: https://files.pythonhosted.org/packages/02/af/81abea3d73fddfde26afd1ce52a4ddfa389cd2b684c89d6c4d0d5d8d0dfa/torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl + sha256: 32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37652,8 +37652,8 @@ packages: - kind: pypi name: torch version: 2.2.2 - url: https://files.pythonhosted.org/packages/96/23/18b9c16c18a77755e7f15173821c7100f11e6b3b7717bea8d729bdeb92c0/torch-2.2.2-cp311-none-macosx_11_0_arm64.whl - sha256: 49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1 + url: https://files.pythonhosted.org/packages/c3/33/d7a6123231bd4d04c7005dde8507235772f3bc4622a25f3a88c016415d49/torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl + sha256: ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb requires_dist: - filelock - typing-extensions>=4.8.0 @@ -37679,8 +37679,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl - sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 + url: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl + sha256: 833fd2e4216ced924c8aca0525733fe727f9a1af66dfad7c5be7257e97c39678 requires_dist: - numpy - torch==2.2.2 @@ -37690,8 +37690,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl - sha256: 3bbc24b7713e8f22766992562547d8b4b10001208d372fe599255af84bfd1a69 + url: https://files.pythonhosted.org/packages/46/95/179dd1bf8fd6bd689f0907f4baed557d2b12d2cf3d7ed1a8ecefe0a63d83/torchvision-0.17.2-cp311-cp311-macosx_10_13_x86_64.whl + sha256: 9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54 requires_dist: - numpy - torch==2.2.2 @@ -37701,8 +37701,8 @@ packages: - kind: pypi name: torchvision version: 0.17.2 - url: https://files.pythonhosted.org/packages/56/8d/a153903bfd610450258ee7ac5d292d6b8f382aec14f49404845d8ba6207d/torchvision-0.17.2-cp311-cp311-manylinux2014_aarch64.whl - sha256: 833fd2e4216ced924c8aca0525733fe727f9a1af66dfad7c5be7257e97c39678 + url: https://files.pythonhosted.org/packages/68/49/5e1c771294407bb25e6dbcf169aef5cffefcddf27b0176125a9b0af06a1e/torchvision-0.17.2-cp311-cp311-manylinux1_x86_64.whl + sha256: 3bbc24b7713e8f22766992562547d8b4b10001208d372fe599255af84bfd1a69 requires_dist: - numpy - torch==2.2.2 @@ -37734,20 +37734,20 @@ packages: - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl - sha256: 6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 + url: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 + url: https://files.pythonhosted.org/packages/2e/0f/721e113a2fac2f1d7d124b3279a1da4c77622e104084f56119875019ffab/tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl + sha256: 6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 requires_python: '>=3.8' - kind: pypi name: tornado version: 6.4.1 - url: https://files.pythonhosted.org/packages/13/cf/786b8f1e6fe1c7c675e79657448178ad65e41c1c9765ef82e7f6f765c4c5/tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 + url: https://files.pythonhosted.org/packages/22/d4/54f9d12668b58336bd30defe0307e6c61589a3e687b05c366f804b7faaf0/tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 requires_python: '>=3.8' - kind: pypi name: tornado @@ -38544,8 +38544,8 @@ packages: - kind: pypi name: uv version: 0.4.23 - url: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 23269724349a1831881319e5f2854a5b8260f444ecb2528ac44ffe039a091ac4 + url: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl + sha256: cbb9754f18d0796337a1756e628f0faa74c215ffb139a35bf490ab07fa626ca8 requires_python: '>=3.8' - kind: pypi name: uv @@ -38562,14 +38562,14 @@ packages: - kind: pypi name: uv version: 0.4.23 - url: https://files.pythonhosted.org/packages/d1/8d/10a5a3391225d3284cf4a9bcd3b7db3f769c8378e2e3c53d2a1034f280b6/uv-0.4.23-py3-none-manylinux_2_28_aarch64.whl - sha256: cbb9754f18d0796337a1756e628f0faa74c215ffb139a35bf490ab07fa626ca8 + url: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl + sha256: 1663219972c92cdd2a24ab0437284c4fcaac483814e3399e1cafa231c47b0c46 requires_python: '>=3.8' - kind: pypi name: uv version: 0.4.23 - url: https://files.pythonhosted.org/packages/9e/83/e821ccb4b10f12ea7278ee245e483818d53e0202ac3d074cc73934b7dbfc/uv-0.4.23-py3-none-macosx_10_12_x86_64.whl - sha256: 1663219972c92cdd2a24ab0437284c4fcaac483814e3399e1cafa231c47b0c46 + url: https://files.pythonhosted.org/packages/a9/f1/3c473a2ff3fd8e09e0a2777c6f665133b68c65ea4378e15d0b4d70204496/uv-0.4.23-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 23269724349a1831881319e5f2854a5b8260f444ecb2528ac44ffe039a091ac4 requires_python: '>=3.8' - kind: conda name: vc @@ -38700,40 +38700,40 @@ packages: - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/d5/3f/41b5d77c10f450b79921c17b7d0b416616048867bfe63acaa072a619a0cb/watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl - sha256: d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e + url: https://files.pythonhosted.org/packages/96/2b/b84e35d49e8b0bad77e5d086fc1e2c6c833bbfe74d53144cfe8b26117eff/watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/a0/58/edec25190b6403caf4426dd418234f2358a106634b7d6aa4aec6939b104f/watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl - sha256: 0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7 + url: https://files.pythonhosted.org/packages/d5/3f/41b5d77c10f450b79921c17b7d0b416616048867bfe63acaa072a619a0cb/watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl + sha256: d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/60/33/7cb71c9df9a77b6927ee5f48d25e1de5562ce0fa7e0c56dcf2b0472e64a2/watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl - sha256: dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91 + url: https://files.pythonhosted.org/packages/a0/58/edec25190b6403caf4426dd418234f2358a106634b7d6aa4aec6939b104f/watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl + sha256: 0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/96/2b/b84e35d49e8b0bad77e5d086fc1e2c6c833bbfe74d53144cfe8b26117eff/watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490 + url: https://files.pythonhosted.org/packages/91/b4/2b5b59358dadfa2c8676322f955b6c22cde4937602f40490e2f7403e548e/watchdog-5.0.3-py3-none-win_amd64.whl + sha256: f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' - kind: pypi name: watchdog version: 5.0.3 - url: https://files.pythonhosted.org/packages/91/b4/2b5b59358dadfa2c8676322f955b6c22cde4937602f40490e2f7403e548e/watchdog-5.0.3-py3-none-win_amd64.whl - sha256: f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9 + url: https://files.pythonhosted.org/packages/60/33/7cb71c9df9a77b6927ee5f48d25e1de5562ce0fa7e0c56dcf2b0472e64a2/watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl + sha256: dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91 requires_dist: - pyyaml>=3.10 ; extra == 'watchmedo' requires_python: '>=3.9' @@ -38837,8 +38837,8 @@ packages: - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 + url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 requires_python: '>=3.6' - kind: pypi name: wrapt @@ -38855,14 +38855,14 @@ packages: - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 + url: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09 requires_python: '>=3.6' - kind: pypi name: wrapt version: 1.16.0 - url: https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09 + url: https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 requires_python: '>=3.6' - kind: conda name: x264 @@ -39949,8 +39949,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca + url: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + sha256: 983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -39976,8 +39976,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - sha256: 983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a + url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl + sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' @@ -39985,8 +39985,8 @@ packages: - kind: pypi name: zstandard version: 0.23.0 - url: https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl - sha256: 34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e + url: https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca requires_dist: - cffi>=1.11 ; platform_python_implementation == 'PyPy' - cffi>=1.11 ; extra == 'cffi' diff --git a/rerun_py/pyproject.toml b/rerun_py/pyproject.toml index 558947365f12..ed653856b52a 100644 --- a/rerun_py/pyproject.toml +++ b/rerun_py/pyproject.toml @@ -69,6 +69,9 @@ extend-exclude = [ # TODO(#4047): incomplete example snippet "docs/snippets/all/tutorials/timelines_example.py", + # Intentionally incomplete snippets + "docs/snippets/all/concepts/static", + # generated "examples/python/objectron/objectron/proto/objectron/proto.py", diff --git a/scripts/lint.py b/scripts/lint.py index 504b015a6c5e..678f34d8ff0e 100755 --- a/scripts/lint.py +++ b/scripts/lint.py @@ -791,6 +791,10 @@ def is_acronym_or_pascal_case(s: str) -> bool: if word == "": continue + if word == "I": + new_words.append(word) + continue + if is_emoji(word): new_words.append(word) continue