From b84172ede9ee56bcb349948ba1f6534ad7940085 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Tue, 7 Jan 2025 18:45:16 +0800 Subject: [PATCH 01/14] docs: Polish docs for Operator, Reader and Writer (#5516) --- core/src/types/operator/operator.rs | 1246 +++++++++++++----- core/src/types/operator/operator_futures.rs | 1258 +++++++++++++++++-- 2 files changed, 2073 insertions(+), 431 deletions(-) diff --git a/core/src/types/operator/operator.rs b/core/src/types/operator/operator.rs index de4fffe66822..11485cb57cbd 100644 --- a/core/src/types/operator/operator.rs +++ b/core/src/types/operator/operator.rs @@ -29,30 +29,81 @@ use crate::raw::*; use crate::types::delete::Deleter; use crate::*; -/// Operator is the entry for all public async APIs. +/// The `Operator` serves as the entry point for all public asynchronous APIs. /// -/// Developer should manipulate the data from storage service through Operator only by right. +/// For more details about the `Operator`, refer to the [`concepts`][crate::docs::concepts] section. /// -/// We will usually do some general checks and data transformations in this layer, -/// like normalizing path from input, checking whether the path refers to one file or one directory, -/// and so on. +/// ## Build /// -/// Read [`concepts`][crate::docs::concepts] for more about [`Operator`]. +/// Users can initialize an `Operator` through the following methods: /// -/// # Examples +/// - [`Operator::new`]: Creates an operator using a [`services`] builder, such as [`services::S3`]. +/// - [`Operator::from_config`]: Creates an operator using a [`services`] configuration, such as [`services::S3Config`]. +/// - [`Operator::from_iter`]: Creates an operator from an iterator of configuration key-value pairs. /// -/// Read more backend init examples in [`services`] +/// ``` +/// # use anyhow::Result; +/// use opendal::services::Memory; +/// use opendal::Operator; +/// async fn test() -> Result<()> { +/// // Build an `Operator` to start operating the storage. +/// let _: Operator = Operator::new(Memory::default())?.finish(); +/// +/// Ok(()) +/// } +/// ``` +/// +/// ## Layer +/// +/// After the operator is built, users can add the layers they need on top of it. +/// +/// OpenDAL offers various layers for users to choose from, such as `RetryLayer`, `LoggingLayer`, and more. Visit [`layers`] for further details. /// /// ``` /// # use anyhow::Result; -/// use opendal::services::Fs; +/// use opendal::layers::RetryLayer; +/// use opendal::services::Memory; /// use opendal::Operator; /// async fn test() -> Result<()> { -/// // Create fs backend builder. -/// let mut builder = Fs::default().root("/tmp"); +/// let op: Operator = Operator::new(Memory::default())?.finish(); /// -/// // Build an `Operator` to start operating the storage. -/// let _: Operator = Operator::new(builder)?.finish(); +/// // OpenDAL will retry failed operations now. +/// let op = op.layer(RetryLayer::default()); +/// +/// Ok(()) +/// } +/// ``` +/// +/// ## Operate +/// +/// After the operator is built and the layers are added, users can start operating the storage. +/// +/// The operator is `Send`, `Sync`, and `Clone`. It has no internal state, and all APIs only take +/// a `&self` reference, making it safe to share the operator across threads. +/// +/// Operator provides a consistent API pattern for data operations. For reading operations, it exposes: +/// +/// - [`Operator::read`]: Basic operation that reads entire content into memory +/// - [`Operator::read_with`]: Enhanced read operation with additional options (range, if_match, if_none_match) +/// - [`Operator::reader`]: Creates a lazy reader for on-demand data streaming +/// - [`Operator::reader_with`]: Creates a configurable reader with conditional options (if_match, if_none_match) +/// +/// The [`Reader`] created by [`Operator`] supports custom read control methods and can be converted +/// into `futures::AsyncRead` for broader ecosystem compatibility. +/// +/// ``` +/// # use anyhow::Result; +/// use opendal::layers::RetryLayer; +/// use opendal::services::Memory; +/// use opendal::Operator; +/// async fn test() -> Result<()> { +/// let op: Operator = Operator::new(Memory::default())?.finish(); +/// +/// // OpenDAL will retry failed operations now. +/// let op = op.layer(RetryLayer::default()); +/// +/// // Read all data into memory. +/// let data = op.read("path/to/file").await?; /// /// Ok(()) /// } @@ -209,7 +260,7 @@ impl Operator { /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] /// will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// @@ -228,7 +279,7 @@ impl Operator { /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] /// will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// @@ -246,7 +297,7 @@ impl Operator { /// /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// @@ -437,7 +488,7 @@ impl Operator { /// /// # Examples /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::TryStreamExt; @@ -471,11 +522,10 @@ impl Operator { /// If we have a file with size `n`. /// /// - `..` means read bytes in range `[0, n)` of file. - /// - `0..1024` means read bytes in range `[0, 1024)` of file + /// - `0..1024` and `..1024` means read bytes in range `[0, 1024)` of file /// - `1024..` means read bytes in range `[1024, n)` of file - /// - `..1024` means read bytes in range `(n - 1024, n)` of file /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::TryStreamExt; @@ -485,6 +535,61 @@ impl Operator { /// # } /// ``` /// + /// ## `concurrent` + /// + /// Set `concurrent` for the reader. + /// + /// OpenDAL by default to write file without concurrent. This is not efficient for cases when users + /// read large chunks of data. By setting `concurrent`, opendal will read files concurrently + /// on support storage services. + /// + /// By setting `concurrent`, opendal will fetch chunks concurrently with + /// the given chunk size. + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op.read_with("path/to/file").concurrent(8).await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `chunk` + /// + /// OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs. + /// + /// This following example will make opendal read data in 4MiB chunks: + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op.read_with("path/to/file").chunk(4 * 1024 * 1024).await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `version` + /// + /// Set `version` for this `read` request. + /// + /// This feature can be used to retrieve the data of a specified version of the given path. + /// + /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// + /// # async fn test(op: Operator, version: &str) -> Result<()> { + /// let mut bs = op.read_with("path/to/file").version(version).await?; + /// # Ok(()) + /// # } + /// ``` + /// /// ## `if_match` /// /// Set `if_match` for this `read` request. @@ -494,7 +599,7 @@ impl Operator { /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] /// will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// # async fn test(op: Operator, etag: &str) -> Result<()> { @@ -512,7 +617,7 @@ impl Operator { /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] /// will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// # async fn test(op: Operator, etag: &str) -> Result<()> { @@ -521,57 +626,42 @@ impl Operator { /// # } /// ``` /// - /// ## `concurrent` + /// ## `if_modified_since` /// - /// Set `concurrent` for the reader. + /// Set `if_modified_since` for this `read` request. /// - /// OpenDAL by default to write file without concurrent. This is not efficient for cases when users - /// read large chunks of data. By setting `concurrent`, opendal will read files concurrently - /// on support storage services. + /// This feature can be used to check if the file has been modified since the given timestamp. /// - /// By setting `concurrent`, opendal will fetch chunks concurrently with - /// the given chunk size. + /// If file exists and it hasn't been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. /// - /// ```no_run - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use opendal::Scheme; - /// # async fn test(op: Operator) -> Result<()> { - /// let r = op.read_with("path/to/file").concurrent(8).await?; - /// # Ok(()) - /// # } /// ``` - /// - /// ## `chunk` - /// - /// OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs. - /// - /// This following example will make opendal read data in 4MiB chunks: - /// - /// ```no_run /// # use opendal::Result; - /// # use opendal::Operator; - /// # use opendal::Scheme; - /// # async fn test(op: Operator) -> Result<()> { - /// let r = op.read_with("path/to/file").chunk(4 * 1024 * 1024).await?; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut metadata = op.read_with("path/to/file").if_modified_since(time).await?; /// # Ok(()) /// # } /// ``` /// - /// ## `version` + /// ## `if_unmodified_since` /// - /// Set `version` for this `read` request. + /// Set `if_unmodified_since` for this `read` request. /// - /// This feature can be used to retrieve the data of a specified version of the given path. + /// This feature can be used to check if the file hasn't been modified since the given timestamp. /// - /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. + /// If file exists and it has been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; - /// # use opendal::Operator; - /// - /// # async fn test(op: Operator, version: &str) -> Result<()> { - /// let mut bs = op.read_with("path/to/file").version(version).await?; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut metadata = op.read_with("path/to/file").if_unmodified_since(time).await?; /// # Ok(()) /// # } /// ``` @@ -580,7 +670,7 @@ impl Operator { /// /// Read the whole path into a bytes. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::TryStreamExt; @@ -630,7 +720,7 @@ impl Operator { /// /// # Examples /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::TryStreamExt; @@ -666,7 +756,7 @@ impl Operator { /// By setting `concurrent``, opendal will fetch chunks concurrently with /// the give chunk size. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use opendal::Scheme; @@ -682,7 +772,36 @@ impl Operator { /// /// This following example will make opendal read data in 4MiB chunks: /// - /// ```no_run + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op + /// .reader_with("path/to/file") + /// .chunk(4 * 1024 * 1024) + /// .await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `gap` + /// + /// Controls the optimization strategy for range reads in [`Reader::fetch`]. + /// + /// When performing range reads, if the gap between two requested ranges is smaller than + /// the configured `gap` size, OpenDAL will merge these ranges into a single read request + /// and discard the unrequested data in between. This helps reduce the number of API calls + /// to remote storage services. + /// + /// This optimization is particularly useful when performing multiple small range reads + /// that are close to each other, as it reduces the overhead of multiple network requests + /// at the cost of transferring some additional data. + /// + /// In this example, if two requested ranges are separated by less than 1MiB, + /// they will be merged into a single read request: + /// + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use opendal::Scheme; @@ -690,6 +809,7 @@ impl Operator { /// let r = op /// .reader_with("path/to/file") /// .chunk(4 * 1024 * 1024) + /// .gap(1024 * 1024) // 1MiB gap /// .await?; /// # Ok(()) /// # } @@ -703,19 +823,95 @@ impl Operator { /// /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// /// # async fn test(op: Operator, version: &str) -> Result<()> { - /// let mut bs = op.reader_with("path/to/file").version(version).await?; + /// let mut r = op.reader_with("path/to/file").version(version).await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_match` + /// + /// Set `if-match` for this `read` request. + /// + /// This feature can be used to check if the file's `ETag` matches the given `ETag`. + /// + /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// # async fn test(op: Operator, etag: &str) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_match(etag).await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_none_match` + /// + /// Set `if-none-match` for this `read` request. + /// + /// This feature can be used to check if the file's `ETag` doesn't match the given `ETag`. + /// + /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// # async fn test(op: Operator, etag: &str) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_none_match(etag).await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_modified_since` + /// + /// Set `if-modified-since` for this `read` request. + /// + /// This feature can be used to check if the file has been modified since the given timestamp. + /// + /// If file exists and it hasn't been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_modified_since(time).await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_unmodified_since` + /// + /// Set `if-unmodified-since` for this `read` request. + /// + /// This feature can be used to check if the file hasn't been modified since the given timestamp. + /// + /// If file exists and it has been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_unmodified_since(time).await?; /// # Ok(()) /// # } /// ``` /// /// # Examples /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use opendal::Scheme; @@ -772,7 +968,7 @@ impl Operator { /// /// # Examples /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::StreamExt; @@ -800,7 +996,7 @@ impl Operator { /// /// # Examples /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// @@ -857,7 +1053,7 @@ impl Operator { /// /// # Examples /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// @@ -935,7 +1131,7 @@ impl Operator { /// /// # Examples /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// use bytes::Bytes; @@ -952,7 +1148,527 @@ impl Operator { self.writer_with(path).await } - /// Create a writer for streaming data to the given path with more options. + /// Create a writer for streaming data to the given path with more options. + /// + /// # Usages + /// + /// ## `append` + /// + /// Sets append mode for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_can_append`] before using this feature. + /// + /// ### Behavior + /// + /// - By default, write operations overwrite existing files + /// - When append is set to true: + /// - New data will be appended to the end of existing file + /// - If file doesn't exist, it will be created + /// - If not supported, will return an error + /// + /// This operation allows adding data to existing files instead of overwriting them. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op.writer_with("path/to/file").append(true).await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `chunk` + /// + /// Sets chunk size for buffered writes. + /// + /// ### Capability + /// + /// Check [`Capability::write_multi_min_size`] and [`Capability::write_multi_max_size`] for size limits. + /// + /// ### Behavior + /// + /// - By default, OpenDAL sets optimal chunk size based on service capabilities + /// - When chunk size is set: + /// - Data will be buffered until reaching chunk size + /// - One API call will be made per chunk + /// - Last chunk may be smaller than chunk size + /// - Important considerations: + /// - Some services require minimum chunk sizes (e.g. S3's EntityTooSmall error) + /// - Smaller chunks increase API calls and costs + /// - Larger chunks increase memory usage, but improve performance and reduce costs + /// + /// ### Performance Impact + /// + /// Setting appropriate chunk size can: + /// - Reduce number of API calls + /// - Improve overall throughput + /// - Lower operation costs + /// - Better utilize network bandwidth + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Set 8MiB chunk size - data will be sent in one API call at close + /// let mut w = op + /// .writer_with("path/to/file") + /// .chunk(8 * 1024 * 1024) + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// # `concurrent` + /// + /// Sets concurrent write operations for this writer. + /// + /// ## Behavior + /// + /// - By default, OpenDAL writes files sequentially + /// - When concurrent is set: + /// - Multiple write operations can execute in parallel + /// - Write operations return immediately without waiting if tasks space are available + /// - Close operation ensures all writes complete in order + /// - Memory usage increases with concurrency level + /// - If not supported, falls back to sequential writes + /// + /// This feature significantly improves performance when: + /// - Writing large files + /// - Network latency is high + /// - Storage service supports concurrent uploads like multipart uploads + /// + /// ## Performance Impact + /// + /// Setting appropriate concurrency can: + /// - Increase write throughput + /// - Reduce total write time + /// - Better utilize available bandwidth + /// - Trade memory for performance + /// + /// ## Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Enable concurrent writes with 8 parallel operations + /// let mut w = op.writer_with("path/to/file").concurrent(8).await?; + /// + /// // First write starts immediately + /// w.write(vec![0; 4096]).await?; + /// + /// // Second write runs concurrently with first + /// w.write(vec![1; 4096]).await?; + /// + /// // Ensures all writes complete successfully and in order + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `cache_control` + /// + /// Sets Cache-Control header for this write operation. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_cache_control`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Cache-Control as system metadata on the target file + /// - The value should follow HTTP Cache-Control header format + /// - If not supported, the value will be ignored + /// + /// This operation allows controlling caching behavior for the written content. + /// + /// ### Use Cases + /// + /// - Setting browser cache duration + /// - Configuring CDN behavior + /// - Optimizing content delivery + /// - Managing cache invalidation + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Cache content for 7 days (604800 seconds) + /// let mut w = op + /// .writer_with("path/to/file") + /// .cache_control("max-age=604800") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ### References + /// + /// - [MDN Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) + /// - [RFC 7234 Section 5.2](https://tools.ietf.org/html/rfc7234#section-5.2) + /// + /// ## `content_type` + /// + /// Sets `Content-Type` header for this write operation. + /// + /// ## Capability + /// + /// Check [`Capability::write_with_content_type`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Type as system metadata on the target file + /// - The value should follow MIME type format (e.g. "text/plain", "image/jpeg") + /// - If not supported, the value will be ignored + /// + /// This operation allows specifying the media type of the content being written. + /// + /// ## Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Set content type for plain text file + /// let mut w = op + /// .writer_with("path/to/file") + /// .content_type("text/plain") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `content_disposition` + /// + /// Sets Content-Disposition header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_content_disposition`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Disposition as system metadata on the target file + /// - The value should follow HTTP Content-Disposition header format + /// - Common values include: + /// - `inline` - Content displayed within browser + /// - `attachment` - Content downloaded as file + /// - `attachment; filename="example.jpg"` - Downloaded with specified filename + /// - If not supported, the value will be ignored + /// + /// This operation allows controlling how the content should be displayed or downloaded. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .content_disposition("attachment; filename=\"filename.jpg\"") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `content_encoding` + /// + /// Sets Content-Encoding header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_content_encoding`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Encoding as system metadata on the target file + /// - The value should follow HTTP Content-Encoding header format + /// - Common values include: + /// - `gzip` - Content encoded using gzip compression + /// - `deflate` - Content encoded using deflate compression + /// - `br` - Content encoded using Brotli compression + /// - `identity` - No encoding applied (default value) + /// - If not supported, the value will be ignored + /// + /// This operation allows specifying the encoding applied to the content being written. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .content_encoding("gzip") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_match` + /// + /// Sets If-Match header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_match`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target's ETag matches the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches any existing resource + /// - If not supported, the value will be ignored + /// + /// This operation provides conditional write functionality based on ETag matching, + /// helping prevent unintended overwrites in concurrent scenarios. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .if_match("\"686897696a7c876b7e\"") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_none_match` + /// + /// Sets If-None-Match header for this write request. + /// + /// Note: Certain services, like `s3`, support `if_not_exists` but not `if_none_match`. + /// Use `if_not_exists` if you only want to check whether a file exists. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_none_match`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target's ETag does not match the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches if the resource does not exist + /// - If not supported, the value will be ignored + /// + /// This operation provides conditional write functionality based on ETag non-matching, + /// useful for preventing overwriting existing resources or ensuring unique writes. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .if_none_match("\"686897696a7c876b7e\"") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_not_exists` + /// + /// Sets the condition that write operation will succeed only if target does not exist. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_not_exists`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target path does not exist + /// - Equivalent to setting `if_none_match("*")` if available + /// - Will return error if target already exists + /// - If not supported, the value will be ignored + /// + /// This operation provides a way to ensure write operations only create new resources + /// without overwriting existing ones, useful for implementing "create if not exists" logic. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .if_not_exists(true) + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `user_metadata` + /// + /// Sets user metadata for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_user_metadata`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the user metadata will be attached to the object during write + /// - Accepts key-value pairs where both key and value are strings + /// - Keys are case-insensitive in most services + /// - Services may have limitations for user metadata, for example: + /// - Key length is typically limited (e.g., 1024 bytes) + /// - Value length is typically limited (e.g., 4096 bytes) + /// - Total metadata size might be limited + /// - Some characters might be forbidden in keys + /// - If not supported, the metadata will be ignored + /// + /// User metadata provides a way to attach custom metadata to objects during write operations. + /// This metadata can be retrieved later when reading the object. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .user_metadata([ + /// ("language".to_string(), "rust".to_string()), + /// ("author".to_string(), "OpenDAL".to_string()), + /// ]) + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + pub fn writer_with(&self, path: &str) -> FutureWriter>> { + let path = normalize_path(path); + + OperatorFuture::new( + self.inner().clone(), + path, + ( + OpWrite::default().merge_executor(self.default_executor.clone()), + OpWriter::default(), + ), + |inner, path, (args, options)| async move { + if !validate_path(&path, EntryMode::FILE) { + return Err( + Error::new(ErrorKind::IsADirectory, "write path is a directory") + .with_operation("Operator::writer") + .with_context("service", inner.info().scheme().into_static()) + .with_context("path", &path), + ); + } + + let context = WriteContext::new(inner, path, args, options); + let w = Writer::new(context).await?; + Ok(w) + }, + ) + } + + /// Write data with extra options. + /// + /// # Notes + /// + /// ## Streaming Write + /// + /// This method performs a single bulk write operation for all bytes. For finer-grained + /// memory control or lazy writing, consider using [`Operator::writer_with`] instead. + /// + /// ## Multipart Uploads + /// + /// OpenDAL handles multipart uploads through the [`Writer`] abstraction, managing all + /// the upload details automatically. You can customize the upload behavior by configuring + /// `chunk` size and `concurrent` operations via [`Operator::writer_with`]. /// /// # Usages /// @@ -976,7 +1692,7 @@ impl Operator { /// /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::StreamExt; @@ -984,10 +1700,7 @@ impl Operator { /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op.writer_with("path/to/file").append(true).await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; + /// let _ = op.write_with("path/to/file", vec![0; 4096]).append(true).await?; /// # Ok(()) /// # } /// ``` @@ -1022,7 +1735,7 @@ impl Operator { /// /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::StreamExt; @@ -1031,13 +1744,10 @@ impl Operator { /// /// # async fn test(op: Operator) -> Result<()> { /// // Set 8MiB chunk size - data will be sent in one API call at close - /// let mut w = op - /// .writer_with("path/to/file") + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) /// .chunk(8 * 1024 * 1024) /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; /// # Ok(()) /// # } /// ``` @@ -1071,7 +1781,7 @@ impl Operator { /// /// ## Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::StreamExt; @@ -1079,17 +1789,8 @@ impl Operator { /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// // Enable concurrent writes with 8 parallel operations - /// let mut w = op.writer_with("path/to/file").concurrent(8).await?; - /// - /// // First write starts immediately - /// w.write(vec![0; 4096]).await?; - /// - /// // Second write runs concurrently with first - /// w.write(vec![1; 4096]).await?; - /// - /// // Ensures all writes complete successfully and in order - /// w.close().await?; + /// // Enable concurrent writes with 8 parallel operations at 128B chunk. + /// let _ = op.write_with("path/to/file", vec![0; 4096]).chunk(128).concurrent(8).await?; /// # Ok(()) /// # } /// ``` @@ -1100,10 +1801,6 @@ impl Operator { /// /// ### Capability /// - /// Sets `Cache-Control` header for this write request. - /// - /// ### Capability - /// /// Check [`Capability::write_with_cache_control`] before using this feature. /// /// ### Behavior @@ -1123,7 +1820,7 @@ impl Operator { /// /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::StreamExt; @@ -1132,13 +1829,10 @@ impl Operator { /// /// # async fn test(op: Operator) -> Result<()> { /// // Cache content for 7 days (604800 seconds) - /// let mut w = op - /// .writer_with("path/to/file") + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) /// .cache_control("max-age=604800") /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; /// # Ok(()) /// # } /// ``` @@ -1166,20 +1860,17 @@ impl Operator { /// /// ## Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { /// // Set content type for plain text file - /// let mut w = op - /// .writer_with("path/to/file") + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) /// .content_type("text/plain") /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; /// # Ok(()) /// # } /// ``` @@ -1214,320 +1905,211 @@ impl Operator { /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op - /// .writer_with("path/to/file") + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) /// .content_disposition("attachment; filename=\"filename.jpg\"") /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; /// # Ok(()) /// # } /// ``` - pub fn writer_with(&self, path: &str) -> FutureWriter>> { - let path = normalize_path(path); - - OperatorFuture::new( - self.inner().clone(), - path, - ( - OpWrite::default().merge_executor(self.default_executor.clone()), - OpWriter::default(), - ), - |inner, path, (args, options)| async move { - if !validate_path(&path, EntryMode::FILE) { - return Err( - Error::new(ErrorKind::IsADirectory, "write path is a directory") - .with_operation("Operator::writer") - .with_context("service", inner.info().scheme().into_static()) - .with_context("path", &path), - ); - } - - let context = WriteContext::new(inner, path, args, options); - let w = Writer::new(context).await?; - Ok(w) - }, - ) - } - - /// Write data with extra options. - /// - /// # Notes - /// - /// ## Streaming Write - /// - /// This method performs a single bulk write operation for all bytes. For finer-grained - /// memory control or lazy writing, consider using [`Operator::writer_with`] instead. - /// - /// ## Multipart Uploads - /// - /// OpenDAL handles multipart uploads through the [`Writer`] abstraction, managing all - /// the upload details automatically. You can customize the upload behavior by configuring - /// `chunk` size and `concurrent` operations via [`Operator::writer_with`]. - /// - /// # Usages /// - /// ## `append` + /// ## `content_encoding` /// - /// Sets `append` mode for this write request. + /// Sets Content-Encoding header for this write request. /// /// ### Capability /// - /// Check [`Capability::write_with_append`] before using this feature. + /// Check [`Capability::write_with_content_encoding`] before using this feature. /// /// ### Behavior /// - /// - If append is true, data will be appended to the end of existing file - /// - If append is false (default), existing file will be overwritten + /// - If supported, sets Content-Encoding as system metadata on the target file + /// - The value should follow HTTP Content-Encoding header format + /// - Common values include: + /// - `gzip` - Content encoded using gzip compression + /// - `deflate` - Content encoded using deflate compression + /// - `br` - Content encoded using Brotli compression + /// - `identity` - No encoding applied (default value) + /// - If not supported, the value will be ignored /// - /// This operation allows appending data to existing files instead of overwriting them. + /// This operation allows specifying the encoding applied to the content being written. /// /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); - /// let _ = op.write_with("path/to/file", bs).append(true).await?; + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .content_encoding("gzip") + /// .await?; /// # Ok(()) /// # } /// ``` /// - /// ## `cache_control` + /// ## `if_match` /// - /// Sets `Cache-Control` header for this write request. + /// Sets If-Match header for this write request. /// /// ### Capability /// - /// Check [`Capability::write_with_cache_control`] before using this feature. + /// Check [`Capability::write_with_if_match`] before using this feature. /// /// ### Behavior /// - /// - If supported, sets Cache-Control as system metadata on the target file - /// - The value should follow HTTP Cache-Control header format + /// - If supported, the write operation will only succeed if the target's ETag matches the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches any existing resource /// - If not supported, the value will be ignored /// - /// This operation allows controlling caching behavior for the written content. - /// - /// ## Use Cases - /// - /// - Setting browser cache duration - /// - Configuring CDN behavior - /// - Optimizing content delivery - /// - Managing cache invalidation + /// This operation provides conditional write functionality based on ETag matching, + /// helping prevent unintended overwrites in concurrent scenarios. /// /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); /// let _ = op - /// .write_with("path/to/file", bs) - /// .cache_control("max-age=604800") + /// .write_with("path/to/file", vec![0; 4096]) + /// .if_match("\"686897696a7c876b7e\"") /// .await?; /// # Ok(()) /// # } /// ``` /// - /// ## `content_type` + /// ## `if_none_match` /// - /// Sets Content-Type header for this write request. + /// Sets If-None-Match header for this write request. + /// + /// Note: Certain services, like `s3`, support `if_not_exists` but not `if_none_match`. + /// Use `if_not_exists` if you only want to check whether a file exists. /// /// ### Capability /// - /// Check [`Capability::write_with_content_type`] before using this feature. + /// Check [`Capability::write_with_if_none_match`] before using this feature. /// /// ### Behavior /// - /// - If supported, sets Content-Type as system metadata on the target file - /// - The value should follow MIME type format (e.g. "text/plain", "image/jpeg") + /// - If supported, the write operation will only succeed if the target's ETag does not match the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches if the resource does not exist /// - If not supported, the value will be ignored /// - /// This operation allows specifying the media type of the content being written. + /// This operation provides conditional write functionality based on ETag non-matching, + /// useful for preventing overwriting existing resources or ensuring unique writes. /// /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); /// let _ = op - /// .write_with("path/to/file", bs) - /// .content_type("text/plain") + /// .write_with("path/to/file", vec![0; 4096]) + /// .if_none_match("\"686897696a7c876b7e\"") /// .await?; /// # Ok(()) /// # } /// ``` /// - /// ## `content_disposition` + /// ## `if_not_exists` /// - /// Sets Content-Disposition header for this write request. + /// Sets the condition that write operation will succeed only if target does not exist. /// /// ### Capability /// - /// Check [`Capability::write_with_content_disposition`] before using this feature. + /// Check [`Capability::write_with_if_not_exists`] before using this feature. /// /// ### Behavior /// - /// - If supported, sets Content-Disposition as system metadata on the target file - /// - The value should follow HTTP Content-Disposition header format - /// - Common values include: - /// - `inline` - Content displayed within browser - /// - `attachment` - Content downloaded as file - /// - `attachment; filename="example.jpg"` - Downloaded with specified filename + /// - If supported, the write operation will only succeed if the target path does not exist + /// - Equivalent to setting `if_none_match("*")` if available + /// - Will return error if target already exists /// - If not supported, the value will be ignored /// - /// This operation allows controlling how the content should be displayed or downloaded. + /// This operation provides a way to ensure write operations only create new resources + /// without overwriting existing ones, useful for implementing "create if not exists" logic. /// /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); /// let _ = op - /// .write_with("path/to/file", bs) - /// .content_disposition("attachment; filename=\"filename.jpg\"") + /// .write_with("path/to/file", vec![0; 4096]) + /// .if_not_exists(true) /// .await?; /// # Ok(()) /// # } /// ``` /// - /// ## `content_encoding` + /// ## `user_metadata` /// - /// Sets Content-Encoding header for this write request. + /// Sets user metadata for this write request. /// /// ### Capability /// - /// Check [`Capability::write_with_content_encoding`] before using this feature. + /// Check [`Capability::write_with_user_metadata`] before using this feature. /// /// ### Behavior /// - /// - If supported, sets Content-Encoding as system metadata on the target file - /// - The value should follow HTTP Content-Encoding header format - /// - If not supported, the value will be ignored + /// - If supported, the user metadata will be attached to the object during write + /// - Accepts key-value pairs where both key and value are strings + /// - Keys are case-insensitive in most services + /// - Services may have limitations for user metadata, for example: + /// - Key length is typically limited (e.g., 1024 bytes) + /// - Value length is typically limited (e.g., 4096 bytes) + /// - Total metadata size might be limited + /// - Some characters might be forbidden in keys + /// - If not supported, the metadata will be ignored /// - /// This operation allows specifying the content encoding for the written content. + /// User metadata provides a way to attach custom metadata to objects during write operations. + /// This metadata can be retrieved later when reading the object. /// - /// ## Example + /// ### Example /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; /// use bytes::Bytes; + /// /// # async fn test(op: Operator) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); /// let _ = op - /// .write_with("path/to/file", bs) - /// .content_encoding("br") + /// .write_with("path/to/file", vec![0; 4096]) + /// .user_metadata([ + /// ("language".to_string(), "rust".to_string()), + /// ("author".to_string(), "OpenDAL".to_string()), + /// ]) /// .await?; /// # Ok(()) /// # } /// ``` - /// - /// ## `if_none_match` - /// - /// Sets an `if none match` condition with specified ETag for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_none_match`] before using this feature. - /// - /// ### Behavior - /// - /// - If the target file's ETag equals the specified one, returns [`ErrorKind::ConditionNotMatch`] - /// - If the target file's ETag differs from the specified one, proceeds with the write operation - /// - /// This operation will succeed when the target's ETag is different from the specified one, - /// providing a way for concurrency control. - /// - /// ### Example - /// - /// ```no_run - /// # use opendal::{ErrorKind, Result}; - /// use opendal::Operator; - /// # async fn test(op: Operator, etag: &str) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); - /// let res = op.write_with("path/to/file", bs).if_none_match(etag).await; - /// assert!(res.is_err()); - /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ConditionNotMatch); - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_not_exists` - /// - /// Sets an `if not exists` condition for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_not_exists`] before using this feature. - /// - /// ### Behavior - /// - /// - If the target file exists, returns [`ErrorKind::ConditionNotMatch`] - /// - If the target file doesn't exist, proceeds with the write operation - /// - /// This operation provides atomic file creation that is concurrency-safe. - /// Only one write operation will succeed while others will fail. - /// - /// ### Example - /// - /// ```no_run - /// # use opendal::{ErrorKind, Result}; - /// use opendal::Operator; - /// # async fn test(op: Operator, etag: &str) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); - /// let res = op.write_with("path/to/file", bs).if_not_exists(true).await; - /// assert!(res.is_err()); - /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ConditionNotMatch); - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_match` - /// - /// Sets an `if match` condition with specified ETag for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_match`] before using this feature. - /// - /// ### Behavior - /// - /// - If the target file's ETag matches the specified one, proceeds with the write operation - /// - If the target file's ETag does not match the specified one, returns [`ErrorKind::ConditionNotMatch`] - /// - /// This operation will succeed when the target's ETag matches the specified one, - /// providing a way for conditional writes. - /// - /// ### Example - /// - /// ```no_run - /// # use opendal::{ErrorKind, Result}; - /// use opendal::Operator; - /// # async fn test(op: Operator, incorrect_etag: &str) -> Result<()> { - /// let bs = b"hello, world!".to_vec(); - /// let res = op.write_with("path/to/file", bs).if_match(incorrect_etag).await; - /// assert!(res.is_err()); - /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ConditionNotMatch); - /// # Ok(()) - /// # } - /// ``` pub fn write_with( &self, path: &str, @@ -1600,7 +2182,7 @@ impl Operator { /// /// If the version doesn't exist, OpenDAL will not return errors. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// @@ -1849,7 +2431,7 @@ impl Operator { /// /// This example will list all entries under the dir `path/to/dir/`. /// - /// ```no_run + /// ``` /// # use anyhow::Result; /// use opendal::EntryMode; /// use opendal::Operator; @@ -1878,7 +2460,7 @@ impl Operator { /// `path/to/prefix/`, `path/to/prefix_1` and so on. If you do want to list a dir, please /// make sure the path is end with `/`. /// - /// ```no_run + /// ``` /// # use anyhow::Result; /// use opendal::EntryMode; /// use opendal::Operator; @@ -1925,7 +2507,7 @@ impl Operator { /// /// The following example will resume the list operation from the `breakpoint`. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// # async fn test(op: Operator) -> Result<()> { @@ -1944,7 +2526,7 @@ impl Operator { /// If `recursive` is set to `true`, we will list all entries recursively. If not, we'll only /// list the entries in the specified dir. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// # async fn test(op: Operator) -> Result<()> { @@ -1960,7 +2542,7 @@ impl Operator { /// if `version` is enabled, all file versions will be returned; otherwise, /// only the current files will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # async fn test(op: Operator) -> Result<()> { @@ -1975,7 +2557,7 @@ impl Operator { /// /// This example will list all entries under the dir `path/to/dir/` /// - /// ```no_run + /// ``` /// # use anyhow::Result; /// use opendal::EntryMode; /// use opendal::Operator; @@ -2000,7 +2582,7 @@ impl Operator { /// /// This example will list all entries starts with prefix `path/to/prefix` /// - /// ```no_run + /// ``` /// # use anyhow::Result; /// use opendal::EntryMode; /// use opendal::Operator; @@ -2050,7 +2632,7 @@ impl Operator { /// /// # Examples /// - /// ```no_run + /// ``` /// # use anyhow::Result; /// # use futures::io; /// use futures::TryStreamExt; @@ -2091,7 +2673,7 @@ impl Operator { /// /// The following example will resume the list operation from the `breakpoint`. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// # async fn test(op: Operator) -> Result<()> { @@ -2110,7 +2692,7 @@ impl Operator { /// If `recursive` is set to `true`, we will list all entries recursively. If not, we'll only /// list the entries in the specified dir. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// use opendal::Operator; /// # async fn test(op: Operator) -> Result<()> { @@ -2126,7 +2708,7 @@ impl Operator { /// if `version` is enabled, all file versions will be returned; otherwise, /// only the current files will be returned. /// - /// ```no_run + /// ``` /// # use opendal::Result; /// # use opendal::Operator; /// # async fn test(op: Operator) -> Result<()> { @@ -2139,7 +2721,7 @@ impl Operator { /// /// ## List all files recursively /// - /// ```no_run + /// ``` /// # use anyhow::Result; /// use futures::TryStreamExt; /// use opendal::EntryMode; @@ -2178,7 +2760,7 @@ impl Operator { /// /// # Example /// - /// ```no_run + /// ``` /// use anyhow::Result; /// use futures::io; /// use opendal::Operator; @@ -2207,7 +2789,7 @@ impl Operator { /// /// # Example /// - /// ```no_run + /// ``` /// use anyhow::Result; /// use futures::io; /// use opendal::Operator; @@ -2249,7 +2831,7 @@ impl Operator { /// /// # Example /// - /// ```no_run + /// ``` /// use anyhow::Result; /// use futures::io; /// use opendal::Operator; @@ -2287,7 +2869,7 @@ impl Operator { /// /// Override the [`content-disposition`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) header returned by storage services. /// - /// ```no_run + /// ``` /// use std::time::Duration; /// /// use anyhow::Result; @@ -2306,7 +2888,7 @@ impl Operator { /// /// Override the [`cache-control`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) header returned by storage services. /// - /// ```no_run + /// ``` /// use std::time::Duration; /// /// use anyhow::Result; @@ -2325,7 +2907,7 @@ impl Operator { /// /// Override the [`content-type`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) header returned by storage services. /// - /// ```no_run + /// ``` /// use std::time::Duration; /// /// use anyhow::Result; @@ -2370,7 +2952,7 @@ impl Operator { /// /// # Example /// - /// ```no_run + /// ``` /// use std::time::Duration; /// /// use anyhow::Result; @@ -2405,7 +2987,7 @@ impl Operator { /// /// Set the [`content-type`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) header returned by storage services. /// - /// ```no_run + /// ``` /// use std::time::Duration; /// /// use anyhow::Result; @@ -2429,7 +3011,7 @@ impl Operator { /// /// Set the [`content-disposition`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) header returned by storage services. /// - /// ```no_run + /// ``` /// use std::time::Duration; /// /// use anyhow::Result; @@ -2453,7 +3035,7 @@ impl Operator { /// /// Set the [`cache-control`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) header returned by storage services. /// - /// ```no_run + /// ``` /// use std::time::Duration; /// /// use anyhow::Result; diff --git a/core/src/types/operator/operator_futures.rs b/core/src/types/operator/operator_futures.rs index 5d4ee97a372c..bbfa02657db7 100644 --- a/core/src/types/operator/operator_futures.rs +++ b/core/src/types/operator/operator_futures.rs @@ -202,49 +202,170 @@ impl>> FuturePresignWrite { pub type FutureRead = OperatorFuture<(OpRead, OpReader), Buffer, F>; impl>> FutureRead { - /// Set the If-Match for this operation. - pub fn if_match(self, v: &str) -> Self { - self.map(|(args, op_reader)| (args.with_if_match(v), op_reader)) + /// Set the executor for this operation. + pub fn executor(self, executor: Executor) -> Self { + self.map(|(args, op_reader)| (args.with_executor(executor), op_reader)) } - /// Set the If-None-Match for this operation. - pub fn if_none_match(self, v: &str) -> Self { - self.map(|(args, op_reader)| (args.with_if_none_match(v), op_reader)) + /// Set `range` for this `read` request. + /// + /// If we have a file with size `n`. + /// + /// - `..` means read bytes in range `[0, n)` of file. + /// - `0..1024` and `..1024` means read bytes in range `[0, 1024)` of file + /// - `1024..` means read bytes in range `[1024, n)` of file + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::TryStreamExt; + /// # async fn test(op: Operator) -> Result<()> { + /// let bs = op.read_with("path/to/file").range(0..1024).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn range(self, range: impl RangeBounds) -> Self { + self.map(|(args, op_reader)| (args.with_range(range.into()), op_reader)) } - /// Set the If-Modified-Since for this operation. - pub fn if_modified_since(self, v: DateTime) -> Self { - self.map(|(args, op_reader)| (args.with_if_modified_since(v), op_reader)) + /// Set `concurrent` for the reader. + /// + /// OpenDAL by default to write file without concurrent. This is not efficient for cases when users + /// read large chunks of data. By setting `concurrent`, opendal will read files concurrently + /// on support storage services. + /// + /// By setting `concurrent`, opendal will fetch chunks concurrently with + /// the given chunk size. + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op.read_with("path/to/file").concurrent(8).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn concurrent(self, concurrent: usize) -> Self { + self.map(|(args, op_reader)| (args, op_reader.with_concurrent(concurrent))) } - /// Set the If-Unmodified-Since for this operation. - pub fn if_unmodified_since(self, v: DateTime) -> Self { - self.map(|(args, op_reader)| (args.with_if_unmodified_since(v), op_reader)) + /// OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs. + /// + /// This following example will make opendal read data in 4MiB chunks: + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op.read_with("path/to/file").chunk(4 * 1024 * 1024).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn chunk(self, chunk_size: usize) -> Self { + self.map(|(args, op_reader)| (args, op_reader.with_chunk(chunk_size))) } - /// Set the version for this operation. + /// Set `version` for this `read` request. + /// + /// This feature can be used to retrieve the data of a specified version of the given path. + /// + /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// + /// # async fn test(op: Operator, version: &str) -> Result<()> { + /// let mut bs = op.read_with("path/to/file").version(version).await?; + /// # Ok(()) + /// # } + /// ``` pub fn version(self, v: &str) -> Self { self.map(|(args, op_reader)| (args.with_version(v), op_reader)) } - /// Set the executor for this operation. - pub fn executor(self, executor: Executor) -> Self { - self.map(|(args, op_reader)| (args.with_executor(executor), op_reader)) + /// Set `if_match` for this `read` request. + /// + /// This feature can be used to check if the file's `ETag` matches the given `ETag`. + /// + /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// # async fn test(op: Operator, etag: &str) -> Result<()> { + /// let mut metadata = op.read_with("path/to/file").if_match(etag).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_match(self, v: &str) -> Self { + self.map(|(args, op_reader)| (args.with_if_match(v), op_reader)) } - /// Set the range header for this operation. - pub fn range(self, range: impl RangeBounds) -> Self { - self.map(|(args, op_reader)| (args.with_range(range.into()), op_reader)) + /// Set `if_none_match` for this `read` request. + /// + /// This feature can be used to check if the file's `ETag` doesn't match the given `ETag`. + /// + /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// # async fn test(op: Operator, etag: &str) -> Result<()> { + /// let mut metadata = op.read_with("path/to/file").if_none_match(etag).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_none_match(self, v: &str) -> Self { + self.map(|(args, op_reader)| (args.with_if_none_match(v), op_reader)) } - /// Set the concurrent read task amount. - pub fn concurrent(self, concurrent: usize) -> Self { - self.map(|(args, op_reader)| (args, op_reader.with_concurrent(concurrent))) + /// ## `if_modified_since` + /// + /// Set `if_modified_since` for this `read` request. + /// + /// This feature can be used to check if the file has been modified since the given timestamp. + /// + /// If file exists and it hasn't been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut metadata = op.read_with("path/to/file").if_modified_since(time).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_modified_since(self, v: DateTime) -> Self { + self.map(|(args, op_reader)| (args.with_if_modified_since(v), op_reader)) } - /// Set the chunk size for this operation. - pub fn chunk(self, chunk_size: usize) -> Self { - self.map(|(args, op_reader)| (args, op_reader.with_chunk(chunk_size))) + /// Set `if_unmodified_since` for this `read` request. + /// + /// This feature can be used to check if the file hasn't been modified since the given timestamp. + /// + /// If file exists and it has been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut metadata = op.read_with("path/to/file").if_unmodified_since(time).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_unmodified_since(self, v: DateTime) -> Self { + self.map(|(args, op_reader)| (args.with_if_unmodified_since(v), op_reader)) } } @@ -258,45 +379,177 @@ impl>> FutureRead { pub type FutureReader = OperatorFuture<(OpRead, OpReader), Reader, F>; impl>> FutureReader { - /// Set the If-Match for this operation. - pub fn if_match(self, etag: &str) -> Self { - self.map(|(op_read, op_reader)| (op_read.with_if_match(etag), op_reader)) - } - - /// Set the If-None-Match for this operation. - pub fn if_none_match(self, etag: &str) -> Self { - self.map(|(op_read, op_reader)| (op_read.with_if_none_match(etag), op_reader)) - } - - /// Set the If-Modified-Since for this operation. - pub fn if_modified_since(self, v: DateTime) -> Self { - self.map(|(op_read, op_reader)| (op_read.with_if_modified_since(v), op_reader)) - } - - /// Set the If-Unmodified-Since for this operation. - pub fn if_unmodified_since(self, v: DateTime) -> Self { - self.map(|(op_read, op_reader)| (op_read.with_if_unmodified_since(v), op_reader)) - } - - /// Set the version for this operation. + /// Set `version` for this `reader`. + /// + /// This feature can be used to retrieve the data of a specified version of the given path. + /// + /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// + /// # async fn test(op: Operator, version: &str) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").version(version).await?; + /// # Ok(()) + /// # } + /// ``` pub fn version(self, v: &str) -> Self { self.map(|(op_read, op_reader)| (op_read.with_version(v), op_reader)) } - /// Set the concurrent read task amount. + /// Set `concurrent` for the reader. + /// + /// OpenDAL by default to write file without concurrent. This is not efficient for cases when users + /// read large chunks of data. By setting `concurrent`, opendal will reading files concurrently + /// on support storage services. + /// + /// By setting `concurrent``, opendal will fetch chunks concurrently with + /// the give chunk size. + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op.reader_with("path/to/file").concurrent(8).await?; + /// # Ok(()) + /// # } + /// ``` pub fn concurrent(self, concurrent: usize) -> Self { self.map(|(op_read, op_reader)| (op_read, op_reader.with_concurrent(concurrent))) } - /// Set the chunk size for this reader. + /// OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs. + /// + /// This following example will make opendal read data in 4MiB chunks: + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op + /// .reader_with("path/to/file") + /// .chunk(4 * 1024 * 1024) + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn chunk(self, chunk_size: usize) -> Self { self.map(|(op_read, op_reader)| (op_read, op_reader.with_chunk(chunk_size))) } - /// Set the gap size for this reader. + /// Controls the optimization strategy for range reads in [`Reader::fetch`]. + /// + /// When performing range reads, if the gap between two requested ranges is smaller than + /// the configured `gap` size, OpenDAL will merge these ranges into a single read request + /// and discard the unrequested data in between. This helps reduce the number of API calls + /// to remote storage services. + /// + /// This optimization is particularly useful when performing multiple small range reads + /// that are close to each other, as it reduces the overhead of multiple network requests + /// at the cost of transferring some additional data. + /// + /// In this example, if two requested ranges are separated by less than 1MiB, + /// they will be merged into a single read request: + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use opendal::Scheme; + /// # async fn test(op: Operator) -> Result<()> { + /// let r = op + /// .reader_with("path/to/file") + /// .chunk(4 * 1024 * 1024) + /// .gap(1024 * 1024) // 1MiB gap + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn gap(self, gap_size: usize) -> Self { self.map(|(op_read, op_reader)| (op_read, op_reader.with_gap(gap_size))) } + + /// Set `if-match` for this `read` request. + /// + /// This feature can be used to check if the file's `ETag` matches the given `ETag`. + /// + /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// # async fn test(op: Operator, etag: &str) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_match(etag).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_match(self, etag: &str) -> Self { + self.map(|(op_read, op_reader)| (op_read.with_if_match(etag), op_reader)) + } + + /// Set `if-none-match` for this `read` request. + /// + /// This feature can be used to check if the file's `ETag` doesn't match the given `ETag`. + /// + /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// # async fn test(op: Operator, etag: &str) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_none_match(etag).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_none_match(self, etag: &str) -> Self { + self.map(|(op_read, op_reader)| (op_read.with_if_none_match(etag), op_reader)) + } + + /// Set `if-modified-since` for this `read` request. + /// + /// This feature can be used to check if the file has been modified since the given timestamp. + /// + /// If file exists and it hasn't been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_modified_since(time).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_modified_since(self, v: DateTime) -> Self { + self.map(|(op_read, op_reader)| (op_read.with_if_modified_since(v), op_reader)) + } + + /// Set `if-unmodified-since` for this `read` request. + /// + /// This feature can be used to check if the file hasn't been modified since the given timestamp. + /// + /// If file exists and it has been modified since the specified time, an error with kind + /// [`ErrorKind::ConditionNotMatch`] will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::DateTime; + /// use chrono::Utc; + /// # async fn test(op: Operator, time: DateTime) -> Result<()> { + /// let mut r = op.reader_with("path/to/file").if_unmodified_since(time).await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_unmodified_since(self, v: DateTime) -> Self { + self.map(|(op_read, op_reader)| (op_read.with_if_unmodified_since(v), op_reader)) + } } /// Future that generated by [`Operator::write_with`]. @@ -305,80 +558,458 @@ impl>> FutureReader { pub type FutureWrite = OperatorFuture<(OpWrite, OpWriter, Buffer), (), F>; impl>> FutureWrite { - /// Set the append mode of op. + /// Set the executor for this operation. + pub fn executor(self, executor: Executor) -> Self { + self.map(|(args, options, bs)| (args.with_executor(executor), options, bs)) + } + + /// Sets append mode for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_can_append`] before using this feature. + /// + /// ### Behavior + /// + /// - By default, write operations overwrite existing files + /// - When append is set to true: + /// - New data will be appended to the end of existing file + /// - If file doesn't exist, it will be created + /// - If not supported, will return an error /// - /// If the append mode is set, the data will be appended to the end of the file. + /// This operation allows adding data to existing files instead of overwriting them. /// - /// # Notes + /// ### Example /// - /// Service could return `Unsupported` if the underlying storage does not support append. + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let _ = op.write_with("path/to/file", vec![0; 4096]).append(true).await?; + /// # Ok(()) + /// # } + /// ``` pub fn append(self, v: bool) -> Self { self.map(|(args, options, bs)| (args.with_append(v), options, bs)) } - /// Set the buffer size of op. + /// Sets chunk size for buffered writes. + /// + /// ### Capability + /// + /// Check [`Capability::write_multi_min_size`] and [`Capability::write_multi_max_size`] for size limits. + /// + /// ### Behavior + /// + /// - By default, OpenDAL sets optimal chunk size based on service capabilities + /// - When chunk size is set: + /// - Data will be buffered until reaching chunk size + /// - One API call will be made per chunk + /// - Last chunk may be smaller than chunk size + /// - Important considerations: + /// - Some services require minimum chunk sizes (e.g. S3's EntityTooSmall error) + /// - Smaller chunks increase API calls and costs + /// - Larger chunks increase memory usage, but improve performance and reduce costs /// - /// If buffer size is set, the data will be buffered by the underlying writer. + /// ### Performance Impact /// - /// ## NOTE + /// Setting appropriate chunk size can: + /// - Reduce number of API calls + /// - Improve overall throughput + /// - Lower operation costs + /// - Better utilize network bandwidth /// - /// Service could have their own minimum buffer size while perform write operations like - /// multipart uploads. So the buffer size may be larger than the given buffer size. + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Set 8MiB chunk size - data will be sent in one API call at close + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .chunk(8 * 1024 * 1024) + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn chunk(self, v: usize) -> Self { self.map(|(args, options, bs)| (args, options.with_chunk(v), bs)) } - /// Set the maximum concurrent write task amount. + /// Sets concurrent write operations for this writer. + /// + /// ## Behavior + /// + /// - By default, OpenDAL writes files sequentially + /// - When concurrent is set: + /// - Multiple write operations can execute in parallel + /// - Write operations return immediately without waiting if tasks space are available + /// - Close operation ensures all writes complete in order + /// - Memory usage increases with concurrency level + /// - If not supported, falls back to sequential writes + /// + /// This feature significantly improves performance when: + /// - Writing large files + /// - Network latency is high + /// - Storage service supports concurrent uploads like multipart uploads + /// + /// ## Performance Impact + /// + /// Setting appropriate concurrency can: + /// - Increase write throughput + /// - Reduce total write time + /// - Better utilize available bandwidth + /// - Trade memory for performance + /// + /// ## Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Enable concurrent writes with 8 parallel operations at 128B chunk. + /// let _ = op.write_with("path/to/file", vec![0; 4096]).chunk(128).concurrent(8).await?; + /// # Ok(()) + /// # } + /// ``` pub fn concurrent(self, v: usize) -> Self { self.map(|(args, options, bs)| (args.with_concurrent(v), options, bs)) } - /// Set the content type of option + /// Sets Cache-Control header for this write operation. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_cache_control`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Cache-Control as system metadata on the target file + /// - The value should follow HTTP Cache-Control header format + /// - If not supported, the value will be ignored + /// + /// This operation allows controlling caching behavior for the written content. + /// + /// ### Use Cases + /// + /// - Setting browser cache duration + /// - Configuring CDN behavior + /// - Optimizing content delivery + /// - Managing cache invalidation + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Cache content for 7 days (604800 seconds) + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .cache_control("max-age=604800") + /// .await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ### References + /// + /// - [MDN Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) + /// - [RFC 7234 Section 5.2](https://tools.ietf.org/html/rfc7234#section-5.2) pub fn cache_control(self, v: &str) -> Self { self.map(|(args, options, bs)| (args.with_cache_control(v), options, bs)) } - /// Set the content type of option + /// Sets `Content-Type` header for this write operation. + /// + /// ## Capability + /// + /// Check [`Capability::write_with_content_type`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Type as system metadata on the target file + /// - The value should follow MIME type format (e.g. "text/plain", "image/jpeg") + /// - If not supported, the value will be ignored + /// + /// This operation allows specifying the media type of the content being written. + /// + /// ## Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Set content type for plain text file + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .content_type("text/plain") + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn content_type(self, v: &str) -> Self { self.map(|(args, options, bs)| (args.with_content_type(v), options, bs)) } - /// Set the content disposition of option + /// ## `content_disposition` + /// + /// Sets Content-Disposition header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_content_disposition`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Disposition as system metadata on the target file + /// - The value should follow HTTP Content-Disposition header format + /// - Common values include: + /// - `inline` - Content displayed within browser + /// - `attachment` - Content downloaded as file + /// - `attachment; filename="example.jpg"` - Downloaded with specified filename + /// - If not supported, the value will be ignored + /// + /// This operation allows controlling how the content should be displayed or downloaded. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .content_disposition("attachment; filename=\"filename.jpg\"") + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn content_disposition(self, v: &str) -> Self { self.map(|(args, options, bs)| (args.with_content_disposition(v), options, bs)) } - /// Set the content encoding of option + /// Sets Content-Encoding header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_content_encoding`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Encoding as system metadata on the target file + /// - The value should follow HTTP Content-Encoding header format + /// - Common values include: + /// - `gzip` - Content encoded using gzip compression + /// - `deflate` - Content encoded using deflate compression + /// - `br` - Content encoded using Brotli compression + /// - `identity` - No encoding applied (default value) + /// - If not supported, the value will be ignored + /// + /// This operation allows specifying the encoding applied to the content being written. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .content_encoding("gzip") + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn content_encoding(self, v: &str) -> Self { self.map(|(args, options, bs)| (args.with_content_encoding(v), options, bs)) } - /// Set the executor for this operation. - pub fn executor(self, executor: Executor) -> Self { - self.map(|(args, options, bs)| (args.with_executor(executor), options, bs)) - } - - /// Set the If-Match for this operation. + /// Sets If-Match header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_match`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target's ETag matches the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches any existing resource + /// - If not supported, the value will be ignored + /// + /// This operation provides conditional write functionality based on ETag matching, + /// helping prevent unintended overwrites in concurrent scenarios. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .if_match("\"686897696a7c876b7e\"") + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn if_match(self, s: &str) -> Self { self.map(|(args, options, bs)| (args.with_if_match(s), options, bs)) } - /// Set the If-None-Match for this operation. + /// Sets If-None-Match header for this write request. + /// + /// Note: Certain services, like `s3`, support `if_not_exists` but not `if_none_match`. + /// Use `if_not_exists` if you only want to check whether a file exists. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_none_match`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target's ETag does not match the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches if the resource does not exist + /// - If not supported, the value will be ignored + /// + /// This operation provides conditional write functionality based on ETag non-matching, + /// useful for preventing overwriting existing resources or ensuring unique writes. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .if_none_match("\"686897696a7c876b7e\"") + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn if_none_match(self, s: &str) -> Self { self.map(|(args, options, bs)| (args.with_if_none_match(s), options, bs)) } - /// Set the If-Not-Exist for this operation. + /// Sets the condition that write operation will succeed only if target does not exist. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_not_exists`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target path does not exist + /// - Will return error if target already exists + /// - If not supported, the value will be ignored + /// + /// This operation provides a way to ensure write operations only create new resources + /// without overwriting existing ones, useful for implementing "create if not exists" logic. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .if_not_exists(true) + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn if_not_exists(self, b: bool) -> Self { self.map(|(args, options, bs)| (args.with_if_not_exists(b), options, bs)) } - /// Set the user defined metadata of the op + /// Sets user metadata for this write request. + /// + /// ### Capability /// - /// ## Notes + /// Check [`Capability::write_with_user_metadata`] before using this feature. /// - /// we don't need to include the user defined metadata prefix in the key - /// every service will handle it internally + /// ### Behavior + /// + /// - If supported, the user metadata will be attached to the object during write + /// - Accepts key-value pairs where both key and value are strings + /// - Keys are case-insensitive in most services + /// - Services may have limitations for user metadata, for example: + /// - Key length is typically limited (e.g., 1024 bytes) + /// - Value length is typically limited (e.g., 4096 bytes) + /// - Total metadata size might be limited + /// - Some characters might be forbidden in keys + /// - If not supported, the metadata will be ignored + /// + /// User metadata provides a way to attach custom metadata to objects during write operations. + /// This metadata can be retrieved later when reading the object. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let _ = op + /// .write_with("path/to/file", vec![0; 4096]) + /// .user_metadata([ + /// ("language".to_string(), "rust".to_string()), + /// ("author".to_string(), "OpenDAL".to_string()), + /// ]) + /// .await?; + /// # Ok(()) + /// # } + /// ``` pub fn user_metadata(self, data: impl IntoIterator) -> Self { self.map(|(args, options, bs)| { ( @@ -396,67 +1027,496 @@ impl>> FutureWrite { pub type FutureWriter = OperatorFuture<(OpWrite, OpWriter), Writer, F>; impl>> FutureWriter { - /// Set the append mode of op. + /// Set the executor for this operation. + pub fn executor(self, executor: Executor) -> Self { + self.map(|(args, options)| (args.with_executor(executor), options)) + } + + /// Sets append mode for this write request. /// - /// If the append mode is set, the data will be appended to the end of the file. + /// ### Capability /// - /// ## Notes + /// Check [`Capability::write_can_append`] before using this feature. /// - /// Service could return `Unsupported` if the underlying storage does not support append. + /// ### Behavior + /// + /// - By default, write operations overwrite existing files + /// - When append is set to true: + /// - New data will be appended to the end of existing file + /// - If file doesn't exist, it will be created + /// - If not supported, will return an error + /// + /// This operation allows adding data to existing files instead of overwriting them. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op.writer_with("path/to/file").append(true).await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` pub fn append(self, v: bool) -> Self { self.map(|(args, options)| (args.with_append(v), options)) } - /// Set the chunk size of op. + /// Sets chunk size for buffered writes. /// - /// If chunk size is set, the data will be chunked by the underlying writer. + /// ### Capability /// - /// ## NOTE + /// Check [`Capability::write_multi_min_size`] and [`Capability::write_multi_max_size`] for size limits. /// - /// Service could have their own limitation for chunk size. It's possible that chunk size - /// is not equal to the given chunk size. + /// ### Behavior /// - /// For example: + /// - By default, OpenDAL sets optimal chunk size based on service capabilities + /// - When chunk size is set: + /// - Data will be buffered until reaching chunk size + /// - One API call will be made per chunk + /// - Last chunk may be smaller than chunk size + /// - Important considerations: + /// - Some services require minimum chunk sizes (e.g. S3's EntityTooSmall error) + /// - Smaller chunks increase API calls and costs + /// - Larger chunks increase memory usage, but improve performance and reduce costs /// - /// - AWS S3 requires the part size to be in [5MiB, 5GiB]. - /// - GCS requires the part size to be aligned with 256 KiB. + /// ### Performance Impact /// - /// The services will alter the chunk size to meet their requirements. + /// Setting appropriate chunk size can: + /// - Reduce number of API calls + /// - Improve overall throughput + /// - Lower operation costs + /// - Better utilize network bandwidth + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Set 8MiB chunk size - data will be sent in one API call at close + /// let mut w = op + /// .writer_with("path/to/file") + /// .chunk(8 * 1024 * 1024) + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` pub fn chunk(self, v: usize) -> Self { self.map(|(args, options)| (args, options.with_chunk(v))) } - /// Set the maximum concurrent write task amount. + /// Sets concurrent write operations for this writer. + /// + /// ## Behavior + /// + /// - By default, OpenDAL writes files sequentially + /// - When concurrent is set: + /// - Multiple write operations can execute in parallel + /// - Write operations return immediately without waiting if tasks space are available + /// - Close operation ensures all writes complete in order + /// - Memory usage increases with concurrency level + /// - If not supported, falls back to sequential writes + /// + /// This feature significantly improves performance when: + /// - Writing large files + /// - Network latency is high + /// - Storage service supports concurrent uploads like multipart uploads + /// + /// ## Performance Impact + /// + /// Setting appropriate concurrency can: + /// - Increase write throughput + /// - Reduce total write time + /// - Better utilize available bandwidth + /// - Trade memory for performance + /// + /// ## Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Enable concurrent writes with 8 parallel operations + /// let mut w = op.writer_with("path/to/file").concurrent(8).await?; + /// + /// // First write starts immediately + /// w.write(vec![0; 4096]).await?; + /// + /// // Second write runs concurrently with first + /// w.write(vec![1; 4096]).await?; + /// + /// // Ensures all writes complete successfully and in order + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` pub fn concurrent(self, v: usize) -> Self { self.map(|(args, options)| (args.with_concurrent(v), options)) } - /// Set the content type of option + /// Sets Cache-Control header for this write operation. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_cache_control`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Cache-Control as system metadata on the target file + /// - The value should follow HTTP Cache-Control header format + /// - If not supported, the value will be ignored + /// + /// This operation allows controlling caching behavior for the written content. + /// + /// ### Use Cases + /// + /// - Setting browser cache duration + /// - Configuring CDN behavior + /// - Optimizing content delivery + /// - Managing cache invalidation + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Cache content for 7 days (604800 seconds) + /// let mut w = op + /// .writer_with("path/to/file") + /// .cache_control("max-age=604800") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ### References + /// + /// - [MDN Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) + /// - [RFC 7234 Section 5.2](https://tools.ietf.org/html/rfc7234#section-5.2) pub fn cache_control(self, v: &str) -> Self { self.map(|(args, options)| (args.with_cache_control(v), options)) } - /// Set the content type of option + /// Sets `Content-Type` header for this write operation. + /// + /// ## Capability + /// + /// Check [`Capability::write_with_content_type`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Type as system metadata on the target file + /// - The value should follow MIME type format (e.g. "text/plain", "image/jpeg") + /// - If not supported, the value will be ignored + /// + /// This operation allows specifying the media type of the content being written. + /// + /// ## Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// // Set content type for plain text file + /// let mut w = op + /// .writer_with("path/to/file") + /// .content_type("text/plain") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` pub fn content_type(self, v: &str) -> Self { self.map(|(args, options)| (args.with_content_type(v), options)) } - /// Set the content disposition of option + /// ## `content_disposition` + /// + /// Sets Content-Disposition header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_content_disposition`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Disposition as system metadata on the target file + /// - The value should follow HTTP Content-Disposition header format + /// - Common values include: + /// - `inline` - Content displayed within browser + /// - `attachment` - Content downloaded as file + /// - `attachment; filename="example.jpg"` - Downloaded with specified filename + /// - If not supported, the value will be ignored + /// + /// This operation allows controlling how the content should be displayed or downloaded. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .content_disposition("attachment; filename=\"filename.jpg\"") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` pub fn content_disposition(self, v: &str) -> Self { self.map(|(args, options)| (args.with_content_disposition(v), options)) } - /// Set the executor for this operation. - pub fn executor(self, executor: Executor) -> Self { - self.map(|(args, options)| (args.with_executor(executor), options)) + /// Sets Content-Encoding header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_content_encoding`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, sets Content-Encoding as system metadata on the target file + /// - The value should follow HTTP Content-Encoding header format + /// - Common values include: + /// - `gzip` - Content encoded using gzip compression + /// - `deflate` - Content encoded using deflate compression + /// - `br` - Content encoded using Brotli compression + /// - `identity` - No encoding applied (default value) + /// - If not supported, the value will be ignored + /// + /// This operation allows specifying the encoding applied to the content being written. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .content_encoding("gzip") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + pub fn content_encoding(self, v: &str) -> Self { + self.map(|(args, options)| (args.with_content_encoding(v), options)) } - /// Set the user defined metadata of the op + /// Sets If-Match header for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_match`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target's ETag matches the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches any existing resource + /// - If not supported, the value will be ignored + /// + /// This operation provides conditional write functionality based on ETag matching, + /// helping prevent unintended overwrites in concurrent scenarios. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .if_match("\"686897696a7c876b7e\"") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_match(self, s: &str) -> Self { + self.map(|(args, options)| (args.with_if_match(s), options)) + } + + /// Sets If-None-Match header for this write request. + /// + /// Note: Certain services, like `s3`, support `if_not_exists` but not `if_none_match`. + /// Use `if_not_exists` if you only want to check whether a file exists. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_none_match`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target's ETag does not match the specified value + /// - The value should be a valid ETag string + /// - Common values include: + /// - A specific ETag value like `"686897696a7c876b7e"` + /// - `*` - Matches if the resource does not exist + /// - If not supported, the value will be ignored + /// + /// This operation provides conditional write functionality based on ETag non-matching, + /// useful for preventing overwriting existing resources or ensuring unique writes. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .if_none_match("\"686897696a7c876b7e\"") + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_none_match(self, s: &str) -> Self { + self.map(|(args, options)| (args.with_if_none_match(s), options)) + } + + /// Sets the condition that write operation will succeed only if target does not exist. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_if_not_exists`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the write operation will only succeed if the target path does not exist + /// - Will return error if target already exists + /// - If not supported, the value will be ignored + /// + /// This operation provides a way to ensure write operations only create new resources + /// without overwriting existing ones, useful for implementing "create if not exists" logic. + /// + /// ### Example + /// + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .if_not_exists(true) + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.write(vec![1; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` + pub fn if_not_exists(self, b: bool) -> Self { + self.map(|(args, options)| (args.with_if_not_exists(b), options)) + } + + /// Sets user metadata for this write request. + /// + /// ### Capability + /// + /// Check [`Capability::write_with_user_metadata`] before using this feature. + /// + /// ### Behavior + /// + /// - If supported, the user metadata will be attached to the object during write + /// - Accepts key-value pairs where both key and value are strings + /// - Keys are case-insensitive in most services + /// - Services may have limitations for user metadata, for example: + /// - Key length is typically limited (e.g., 1024 bytes) + /// - Value length is typically limited (e.g., 4096 bytes) + /// - Total metadata size might be limited + /// - Some characters might be forbidden in keys + /// - If not supported, the metadata will be ignored + /// + /// User metadata provides a way to attach custom metadata to objects during write operations. + /// This metadata can be retrieved later when reading the object. + /// + /// ### Example /// - /// ## Notes + /// ``` + /// # use opendal::Result; + /// # use opendal::Operator; + /// # use futures::StreamExt; + /// # use futures::SinkExt; + /// use bytes::Bytes; /// - /// we don't need to include the user defined metadata prefix in the key. - /// every service will handle it internally + /// # async fn test(op: Operator) -> Result<()> { + /// let mut w = op + /// .writer_with("path/to/file") + /// .user_metadata([ + /// ("content-type".to_string(), "text/plain".to_string()), + /// ("author".to_string(), "OpenDAL".to_string()), + /// ]) + /// .await?; + /// w.write(vec![0; 4096]).await?; + /// w.close().await?; + /// # Ok(()) + /// # } + /// ``` pub fn user_metadata(self, data: impl IntoIterator) -> Self { self.map(|(args, options)| (args.with_user_metadata(HashMap::from_iter(data)), options)) } From 4fe235ad7d94ab2a826886a0bb0306446e1c8112 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Tue, 7 Jan 2025 19:30:02 +0800 Subject: [PATCH 02/14] docs: Reorganize docs for xxx_with for better reading (#5517) --- core/src/types/operator/operator.rs | 1315 ++----------------- core/src/types/operator/operator_futures.rs | 4 +- 2 files changed, 86 insertions(+), 1233 deletions(-) diff --git a/core/src/types/operator/operator.rs b/core/src/types/operator/operator.rs index 11485cb57cbd..085e15c7bf05 100644 --- a/core/src/types/operator/operator.rs +++ b/core/src/types/operator/operator.rs @@ -515,156 +515,16 @@ impl Operator { /// /// # Options /// - /// ## `range` + /// Visit [`FutureRead`] for all available options. /// - /// Set `range` for this `read` request. - /// - /// If we have a file with size `n`. - /// - /// - `..` means read bytes in range `[0, n)` of file. - /// - `0..1024` and `..1024` means read bytes in range `[0, 1024)` of file - /// - `1024..` means read bytes in range `[1024, n)` of file - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::TryStreamExt; - /// # async fn test(op: Operator) -> Result<()> { - /// let bs = op.read_with("path/to/file").range(0..1024).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `concurrent` - /// - /// Set `concurrent` for the reader. - /// - /// OpenDAL by default to write file without concurrent. This is not efficient for cases when users - /// read large chunks of data. By setting `concurrent`, opendal will read files concurrently - /// on support storage services. - /// - /// By setting `concurrent`, opendal will fetch chunks concurrently with - /// the given chunk size. - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use opendal::Scheme; - /// # async fn test(op: Operator) -> Result<()> { - /// let r = op.read_with("path/to/file").concurrent(8).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `chunk` - /// - /// OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs. - /// - /// This following example will make opendal read data in 4MiB chunks: - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use opendal::Scheme; - /// # async fn test(op: Operator) -> Result<()> { - /// let r = op.read_with("path/to/file").chunk(4 * 1024 * 1024).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `version` - /// - /// Set `version` for this `read` request. - /// - /// This feature can be used to retrieve the data of a specified version of the given path. - /// - /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// - /// # async fn test(op: Operator, version: &str) -> Result<()> { - /// let mut bs = op.read_with("path/to/file").version(version).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_match` - /// - /// Set `if_match` for this `read` request. - /// - /// This feature can be used to check if the file's `ETag` matches the given `ETag`. - /// - /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] - /// will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// # async fn test(op: Operator, etag: &str) -> Result<()> { - /// let mut metadata = op.read_with("path/to/file").if_match(etag).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_none_match` - /// - /// Set `if_none_match` for this `read` request. - /// - /// This feature can be used to check if the file's `ETag` doesn't match the given `ETag`. - /// - /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] - /// will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// # async fn test(op: Operator, etag: &str) -> Result<()> { - /// let mut metadata = op.read_with("path/to/file").if_none_match(etag).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_modified_since` - /// - /// Set `if_modified_since` for this `read` request. - /// - /// This feature can be used to check if the file has been modified since the given timestamp. - /// - /// If file exists and it hasn't been modified since the specified time, an error with kind - /// [`ErrorKind::ConditionNotMatch`] will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// use chrono::DateTime; - /// use chrono::Utc; - /// # async fn test(op: Operator, time: DateTime) -> Result<()> { - /// let mut metadata = op.read_with("path/to/file").if_modified_since(time).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_unmodified_since` - /// - /// Set `if_unmodified_since` for this `read` request. - /// - /// This feature can be used to check if the file hasn't been modified since the given timestamp. - /// - /// If file exists and it has been modified since the specified time, an error with kind - /// [`ErrorKind::ConditionNotMatch`] will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// use chrono::DateTime; - /// use chrono::Utc; - /// # async fn test(op: Operator, time: DateTime) -> Result<()> { - /// let mut metadata = op.read_with("path/to/file").if_unmodified_since(time).await?; - /// # Ok(()) - /// # } - /// ``` + /// - [`range`](./operator_futures/type.FutureRead.html#method.version): Set `range` for the read. + /// - [`concurrent`](./operator_futures/type.FutureRead.html#method.concurrent): Set `concurrent` for the read. + /// - [`chunk`](./operator_futures/type.FutureRead.html#method.chunk): Set `chunk` for the read. + /// - [`version`](./operator_futures/type.FutureRead.html#method.version): Set `version` for the read. + /// - [`if_match`](./operator_futures/type.FutureRead.html#method.if_match): Set `if-match` for the read. + /// - [`if_none_match`](./operator_futures/type.FutureRead.html#method.if_none_match): Set `if-none-match` for the read. + /// - [`if_modified_since`](./operator_futures/type.FutureRead.html#method.if_modified_since): Set `if-modified-since` for the read. + /// - [`if_unmodified_since`](./operator_futures/type.FutureRead.html#method.if_unmodified_since): Set `if-unmodified-since` for the read. /// /// # Examples /// @@ -745,169 +605,16 @@ impl Operator { /// /// # Options /// - /// ## `concurrent` - /// - /// Set `concurrent` for the reader. - /// - /// OpenDAL by default to write file without concurrent. This is not efficient for cases when users - /// read large chunks of data. By setting `concurrent`, opendal will reading files concurrently - /// on support storage services. - /// - /// By setting `concurrent``, opendal will fetch chunks concurrently with - /// the give chunk size. - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use opendal::Scheme; - /// # async fn test(op: Operator) -> Result<()> { - /// let r = op.reader_with("path/to/file").concurrent(8).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `chunk` - /// - /// OpenDAL will use services' preferred chunk size by default. Users can set chunk based on their own needs. - /// - /// This following example will make opendal read data in 4MiB chunks: - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use opendal::Scheme; - /// # async fn test(op: Operator) -> Result<()> { - /// let r = op - /// .reader_with("path/to/file") - /// .chunk(4 * 1024 * 1024) - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `gap` - /// - /// Controls the optimization strategy for range reads in [`Reader::fetch`]. - /// - /// When performing range reads, if the gap between two requested ranges is smaller than - /// the configured `gap` size, OpenDAL will merge these ranges into a single read request - /// and discard the unrequested data in between. This helps reduce the number of API calls - /// to remote storage services. - /// - /// This optimization is particularly useful when performing multiple small range reads - /// that are close to each other, as it reduces the overhead of multiple network requests - /// at the cost of transferring some additional data. - /// - /// In this example, if two requested ranges are separated by less than 1MiB, - /// they will be merged into a single read request: - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use opendal::Scheme; - /// # async fn test(op: Operator) -> Result<()> { - /// let r = op - /// .reader_with("path/to/file") - /// .chunk(4 * 1024 * 1024) - /// .gap(1024 * 1024) // 1MiB gap - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `version` - /// - /// Set `version` for this `reader`. - /// - /// This feature can be used to retrieve the data of a specified version of the given path. - /// - /// If the version doesn't exist, an error with kind [`ErrorKind::NotFound`] will be returned. - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// - /// # async fn test(op: Operator, version: &str) -> Result<()> { - /// let mut r = op.reader_with("path/to/file").version(version).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_match` - /// - /// Set `if-match` for this `read` request. - /// - /// This feature can be used to check if the file's `ETag` matches the given `ETag`. - /// - /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] - /// will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// # async fn test(op: Operator, etag: &str) -> Result<()> { - /// let mut r = op.reader_with("path/to/file").if_match(etag).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_none_match` - /// - /// Set `if-none-match` for this `read` request. - /// - /// This feature can be used to check if the file's `ETag` doesn't match the given `ETag`. - /// - /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] - /// will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// # async fn test(op: Operator, etag: &str) -> Result<()> { - /// let mut r = op.reader_with("path/to/file").if_none_match(etag).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_modified_since` - /// - /// Set `if-modified-since` for this `read` request. - /// - /// This feature can be used to check if the file has been modified since the given timestamp. - /// - /// If file exists and it hasn't been modified since the specified time, an error with kind - /// [`ErrorKind::ConditionNotMatch`] will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// use chrono::DateTime; - /// use chrono::Utc; - /// # async fn test(op: Operator, time: DateTime) -> Result<()> { - /// let mut r = op.reader_with("path/to/file").if_modified_since(time).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_unmodified_since` + /// Visit [`FutureReader`] for all available options. /// - /// Set `if-unmodified-since` for this `read` request. - /// - /// This feature can be used to check if the file hasn't been modified since the given timestamp. - /// - /// If file exists and it has been modified since the specified time, an error with kind - /// [`ErrorKind::ConditionNotMatch`] will be returned. - /// - /// ``` - /// # use opendal::Result; - /// use opendal::Operator; - /// use chrono::DateTime; - /// use chrono::Utc; - /// # async fn test(op: Operator, time: DateTime) -> Result<()> { - /// let mut r = op.reader_with("path/to/file").if_unmodified_since(time).await?; - /// # Ok(()) - /// # } - /// ``` + /// - [`version`](./operator_futures/type.FutureReader.html#method.version): Set `version` for the reader. + /// - [`concurrent`](./operator_futures/type.FutureReader.html#method.concurrent): Set `concurrent` for the reader. + /// - [`chunk`](./operator_futures/type.FutureReader.html#method.chunk): Set `chunk` for the reader. + /// - [`gap`](./operator_futures/type.FutureReader.html#method.gap): Set `gap` for the reader. + /// - [`if_match`](./operator_futures/type.FutureReader.html#method.if_match): Set `if-match` for the reader. + /// - [`if_none_match`](./operator_futures/type.FutureReader.html#method.if_none_match): Set `if-none-match` for the reader. + /// - [`if_modified_since`](./operator_futures/type.FutureReader.html#method.if_modified_since): Set `if-modified-since` for the reader. + /// - [`if_unmodified_since`](./operator_futures/type.FutureReader.html#method.if_unmodified_since): Set `if-unmodified-since` for the reader. /// /// # Examples /// @@ -1150,966 +857,112 @@ impl Operator { /// Create a writer for streaming data to the given path with more options. /// - /// # Usages - /// - /// ## `append` - /// - /// Sets append mode for this write request. - /// - /// ### Capability + /// ## Options /// - /// Check [`Capability::write_can_append`] before using this feature. + /// Visit [`FutureWriter`] for all available options. /// - /// ### Behavior + /// - [`append`](./operator_futures/type.FutureWriter.html#method.append): Sets append mode for this write request. + /// - [`chunk`](./operator_futures/type.FutureWriter.html#method.chunk): Sets chunk size for buffered writes. + /// - [`concurrent`](./operator_futures/type.FutureWriter.html#method.concurrent): Sets concurrent write operations for this writer. + /// - [`cache_control`](./operator_futures/type.FutureWriter.html#method.cache_control): Sets cache control for this write request. + /// - [`content_type`](./operator_futures/type.FutureWriter.html#method.content_type): Sets content type for this write request. + /// - [`content_disposition`](./operator_futures/type.FutureWriter.html#method.content_disposition): Sets content disposition for this write request. + /// - [`content_encoding`](./operator_futures/type.FutureWriter.html#method.content_encoding): Sets content encoding for this write request. + /// - [`if_match`](./operator_futures/type.FutureWriter.html#method.if_match): Sets if-match for this write request. + /// - [`if_none_match`](./operator_futures/type.FutureWriter.html#method.if_none_match): Sets if-none-match for this write request. + /// - [`if_not_exist`](./operator_futures/type.FutureWriter.html#method.if_not_exist): Sets if-not-exist for this write request. + /// - [`user_metadata`](./operator_futures/type.FutureWriter.html#method.user_metadata): Sets user metadata for this write request. /// - /// - By default, write operations overwrite existing files - /// - When append is set to true: - /// - New data will be appended to the end of existing file - /// - If file doesn't exist, it will be created - /// - If not supported, will return an error - /// - /// This operation allows adding data to existing files instead of overwriting them. - /// - /// ### Example + /// ## Examples /// /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op.writer_with("path/to/file").append(true).await?; + /// let mut w = op.writer_with("path/to/file") + /// .chunk(4*1024*1024) + /// .concurrent(8) + /// .await?; /// w.write(vec![0; 4096]).await?; /// w.write(vec![1; 4096]).await?; /// w.close().await?; /// # Ok(()) /// # } /// ``` + pub fn writer_with(&self, path: &str) -> FutureWriter>> { + let path = normalize_path(path); + + OperatorFuture::new( + self.inner().clone(), + path, + ( + OpWrite::default().merge_executor(self.default_executor.clone()), + OpWriter::default(), + ), + |inner, path, (args, options)| async move { + if !validate_path(&path, EntryMode::FILE) { + return Err( + Error::new(ErrorKind::IsADirectory, "write path is a directory") + .with_operation("Operator::writer") + .with_context("service", inner.info().scheme().into_static()) + .with_context("path", &path), + ); + } + + let context = WriteContext::new(inner, path, args, options); + let w = Writer::new(context).await?; + Ok(w) + }, + ) + } + + /// Write data with extra options. /// - /// ## `chunk` - /// - /// Sets chunk size for buffered writes. - /// - /// ### Capability + /// # Notes /// - /// Check [`Capability::write_multi_min_size`] and [`Capability::write_multi_max_size`] for size limits. + /// ## Streaming Write /// - /// ### Behavior + /// This method performs a single bulk write operation for all bytes. For finer-grained + /// memory control or lazy writing, consider using [`Operator::writer_with`] instead. /// - /// - By default, OpenDAL sets optimal chunk size based on service capabilities - /// - When chunk size is set: - /// - Data will be buffered until reaching chunk size - /// - One API call will be made per chunk - /// - Last chunk may be smaller than chunk size - /// - Important considerations: - /// - Some services require minimum chunk sizes (e.g. S3's EntityTooSmall error) - /// - Smaller chunks increase API calls and costs - /// - Larger chunks increase memory usage, but improve performance and reduce costs - /// - /// ### Performance Impact - /// - /// Setting appropriate chunk size can: - /// - Reduce number of API calls - /// - Improve overall throughput - /// - Lower operation costs - /// - Better utilize network bandwidth - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Set 8MiB chunk size - data will be sent in one API call at close - /// let mut w = op - /// .writer_with("path/to/file") - /// .chunk(8 * 1024 * 1024) - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// # `concurrent` - /// - /// Sets concurrent write operations for this writer. - /// - /// ## Behavior - /// - /// - By default, OpenDAL writes files sequentially - /// - When concurrent is set: - /// - Multiple write operations can execute in parallel - /// - Write operations return immediately without waiting if tasks space are available - /// - Close operation ensures all writes complete in order - /// - Memory usage increases with concurrency level - /// - If not supported, falls back to sequential writes - /// - /// This feature significantly improves performance when: - /// - Writing large files - /// - Network latency is high - /// - Storage service supports concurrent uploads like multipart uploads - /// - /// ## Performance Impact - /// - /// Setting appropriate concurrency can: - /// - Increase write throughput - /// - Reduce total write time - /// - Better utilize available bandwidth - /// - Trade memory for performance - /// - /// ## Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Enable concurrent writes with 8 parallel operations - /// let mut w = op.writer_with("path/to/file").concurrent(8).await?; - /// - /// // First write starts immediately - /// w.write(vec![0; 4096]).await?; - /// - /// // Second write runs concurrently with first - /// w.write(vec![1; 4096]).await?; - /// - /// // Ensures all writes complete successfully and in order - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `cache_control` - /// - /// Sets Cache-Control header for this write operation. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_cache_control`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Cache-Control as system metadata on the target file - /// - The value should follow HTTP Cache-Control header format - /// - If not supported, the value will be ignored - /// - /// This operation allows controlling caching behavior for the written content. - /// - /// ### Use Cases - /// - /// - Setting browser cache duration - /// - Configuring CDN behavior - /// - Optimizing content delivery - /// - Managing cache invalidation - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Cache content for 7 days (604800 seconds) - /// let mut w = op - /// .writer_with("path/to/file") - /// .cache_control("max-age=604800") - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ### References - /// - /// - [MDN Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) - /// - [RFC 7234 Section 5.2](https://tools.ietf.org/html/rfc7234#section-5.2) - /// - /// ## `content_type` - /// - /// Sets `Content-Type` header for this write operation. - /// - /// ## Capability - /// - /// Check [`Capability::write_with_content_type`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Content-Type as system metadata on the target file - /// - The value should follow MIME type format (e.g. "text/plain", "image/jpeg") - /// - If not supported, the value will be ignored - /// - /// This operation allows specifying the media type of the content being written. - /// - /// ## Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Set content type for plain text file - /// let mut w = op - /// .writer_with("path/to/file") - /// .content_type("text/plain") - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `content_disposition` - /// - /// Sets Content-Disposition header for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_content_disposition`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Content-Disposition as system metadata on the target file - /// - The value should follow HTTP Content-Disposition header format - /// - Common values include: - /// - `inline` - Content displayed within browser - /// - `attachment` - Content downloaded as file - /// - `attachment; filename="example.jpg"` - Downloaded with specified filename - /// - If not supported, the value will be ignored - /// - /// This operation allows controlling how the content should be displayed or downloaded. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op - /// .writer_with("path/to/file") - /// .content_disposition("attachment; filename=\"filename.jpg\"") - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `content_encoding` - /// - /// Sets Content-Encoding header for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_content_encoding`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Content-Encoding as system metadata on the target file - /// - The value should follow HTTP Content-Encoding header format - /// - Common values include: - /// - `gzip` - Content encoded using gzip compression - /// - `deflate` - Content encoded using deflate compression - /// - `br` - Content encoded using Brotli compression - /// - `identity` - No encoding applied (default value) - /// - If not supported, the value will be ignored - /// - /// This operation allows specifying the encoding applied to the content being written. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op - /// .writer_with("path/to/file") - /// .content_encoding("gzip") - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_match` - /// - /// Sets If-Match header for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_match`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, the write operation will only succeed if the target's ETag matches the specified value - /// - The value should be a valid ETag string - /// - Common values include: - /// - A specific ETag value like `"686897696a7c876b7e"` - /// - `*` - Matches any existing resource - /// - If not supported, the value will be ignored - /// - /// This operation provides conditional write functionality based on ETag matching, - /// helping prevent unintended overwrites in concurrent scenarios. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op - /// .writer_with("path/to/file") - /// .if_match("\"686897696a7c876b7e\"") - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_none_match` - /// - /// Sets If-None-Match header for this write request. - /// - /// Note: Certain services, like `s3`, support `if_not_exists` but not `if_none_match`. - /// Use `if_not_exists` if you only want to check whether a file exists. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_none_match`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, the write operation will only succeed if the target's ETag does not match the specified value - /// - The value should be a valid ETag string - /// - Common values include: - /// - A specific ETag value like `"686897696a7c876b7e"` - /// - `*` - Matches if the resource does not exist - /// - If not supported, the value will be ignored - /// - /// This operation provides conditional write functionality based on ETag non-matching, - /// useful for preventing overwriting existing resources or ensuring unique writes. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op - /// .writer_with("path/to/file") - /// .if_none_match("\"686897696a7c876b7e\"") - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_not_exists` - /// - /// Sets the condition that write operation will succeed only if target does not exist. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_not_exists`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, the write operation will only succeed if the target path does not exist - /// - Equivalent to setting `if_none_match("*")` if available - /// - Will return error if target already exists - /// - If not supported, the value will be ignored - /// - /// This operation provides a way to ensure write operations only create new resources - /// without overwriting existing ones, useful for implementing "create if not exists" logic. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op - /// .writer_with("path/to/file") - /// .if_not_exists(true) - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.write(vec![1; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `user_metadata` - /// - /// Sets user metadata for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_user_metadata`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, the user metadata will be attached to the object during write - /// - Accepts key-value pairs where both key and value are strings - /// - Keys are case-insensitive in most services - /// - Services may have limitations for user metadata, for example: - /// - Key length is typically limited (e.g., 1024 bytes) - /// - Value length is typically limited (e.g., 4096 bytes) - /// - Total metadata size might be limited - /// - Some characters might be forbidden in keys - /// - If not supported, the metadata will be ignored - /// - /// User metadata provides a way to attach custom metadata to objects during write operations. - /// This metadata can be retrieved later when reading the object. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let mut w = op - /// .writer_with("path/to/file") - /// .user_metadata([ - /// ("language".to_string(), "rust".to_string()), - /// ("author".to_string(), "OpenDAL".to_string()), - /// ]) - /// .await?; - /// w.write(vec![0; 4096]).await?; - /// w.close().await?; - /// # Ok(()) - /// # } - /// ``` - pub fn writer_with(&self, path: &str) -> FutureWriter>> { - let path = normalize_path(path); - - OperatorFuture::new( - self.inner().clone(), - path, - ( - OpWrite::default().merge_executor(self.default_executor.clone()), - OpWriter::default(), - ), - |inner, path, (args, options)| async move { - if !validate_path(&path, EntryMode::FILE) { - return Err( - Error::new(ErrorKind::IsADirectory, "write path is a directory") - .with_operation("Operator::writer") - .with_context("service", inner.info().scheme().into_static()) - .with_context("path", &path), - ); - } - - let context = WriteContext::new(inner, path, args, options); - let w = Writer::new(context).await?; - Ok(w) - }, - ) - } - - /// Write data with extra options. - /// - /// # Notes - /// - /// ## Streaming Write - /// - /// This method performs a single bulk write operation for all bytes. For finer-grained - /// memory control or lazy writing, consider using [`Operator::writer_with`] instead. - /// - /// ## Multipart Uploads + /// ## Multipart Uploads /// /// OpenDAL handles multipart uploads through the [`Writer`] abstraction, managing all /// the upload details automatically. You can customize the upload behavior by configuring /// `chunk` size and `concurrent` operations via [`Operator::writer_with`]. /// - /// # Usages - /// - /// ## `append` - /// - /// Sets append mode for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_can_append`] before using this feature. - /// - /// ### Behavior - /// - /// - By default, write operations overwrite existing files - /// - When append is set to true: - /// - New data will be appended to the end of existing file - /// - If file doesn't exist, it will be created - /// - If not supported, will return an error - /// - /// This operation allows adding data to existing files instead of overwriting them. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let _ = op.write_with("path/to/file", vec![0; 4096]).append(true).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `chunk` - /// - /// Sets chunk size for buffered writes. - /// - /// ### Capability - /// - /// Check [`Capability::write_multi_min_size`] and [`Capability::write_multi_max_size`] for size limits. - /// - /// ### Behavior - /// - /// - By default, OpenDAL sets optimal chunk size based on service capabilities - /// - When chunk size is set: - /// - Data will be buffered until reaching chunk size - /// - One API call will be made per chunk - /// - Last chunk may be smaller than chunk size - /// - Important considerations: - /// - Some services require minimum chunk sizes (e.g. S3's EntityTooSmall error) - /// - Smaller chunks increase API calls and costs - /// - Larger chunks increase memory usage, but improve performance and reduce costs - /// - /// ### Performance Impact - /// - /// Setting appropriate chunk size can: - /// - Reduce number of API calls - /// - Improve overall throughput - /// - Lower operation costs - /// - Better utilize network bandwidth - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Set 8MiB chunk size - data will be sent in one API call at close - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .chunk(8 * 1024 * 1024) - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// # `concurrent` - /// - /// Sets concurrent write operations for this writer. - /// - /// ## Behavior - /// - /// - By default, OpenDAL writes files sequentially - /// - When concurrent is set: - /// - Multiple write operations can execute in parallel - /// - Write operations return immediately without waiting if tasks space are available - /// - Close operation ensures all writes complete in order - /// - Memory usage increases with concurrency level - /// - If not supported, falls back to sequential writes - /// - /// This feature significantly improves performance when: - /// - Writing large files - /// - Network latency is high - /// - Storage service supports concurrent uploads like multipart uploads - /// - /// ## Performance Impact - /// - /// Setting appropriate concurrency can: - /// - Increase write throughput - /// - Reduce total write time - /// - Better utilize available bandwidth - /// - Trade memory for performance - /// - /// ## Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Enable concurrent writes with 8 parallel operations at 128B chunk. - /// let _ = op.write_with("path/to/file", vec![0; 4096]).chunk(128).concurrent(8).await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `cache_control` - /// - /// Sets Cache-Control header for this write operation. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_cache_control`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Cache-Control as system metadata on the target file - /// - The value should follow HTTP Cache-Control header format - /// - If not supported, the value will be ignored - /// - /// This operation allows controlling caching behavior for the written content. - /// - /// ### Use Cases - /// - /// - Setting browser cache duration - /// - Configuring CDN behavior - /// - Optimizing content delivery - /// - Managing cache invalidation - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Cache content for 7 days (604800 seconds) - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .cache_control("max-age=604800") - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ### References - /// - /// - [MDN Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) - /// - [RFC 7234 Section 5.2](https://tools.ietf.org/html/rfc7234#section-5.2) - /// - /// ## `content_type` - /// - /// Sets `Content-Type` header for this write operation. - /// - /// ## Capability - /// - /// Check [`Capability::write_with_content_type`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Content-Type as system metadata on the target file - /// - The value should follow MIME type format (e.g. "text/plain", "image/jpeg") - /// - If not supported, the value will be ignored - /// - /// This operation allows specifying the media type of the content being written. - /// - /// ## Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// // Set content type for plain text file - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .content_type("text/plain") - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `content_disposition` - /// - /// Sets Content-Disposition header for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_content_disposition`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Content-Disposition as system metadata on the target file - /// - The value should follow HTTP Content-Disposition header format - /// - Common values include: - /// - `inline` - Content displayed within browser - /// - `attachment` - Content downloaded as file - /// - `attachment; filename="example.jpg"` - Downloaded with specified filename - /// - If not supported, the value will be ignored - /// - /// This operation allows controlling how the content should be displayed or downloaded. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .content_disposition("attachment; filename=\"filename.jpg\"") - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `content_encoding` - /// - /// Sets Content-Encoding header for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_content_encoding`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, sets Content-Encoding as system metadata on the target file - /// - The value should follow HTTP Content-Encoding header format - /// - Common values include: - /// - `gzip` - Content encoded using gzip compression - /// - `deflate` - Content encoded using deflate compression - /// - `br` - Content encoded using Brotli compression - /// - `identity` - No encoding applied (default value) - /// - If not supported, the value will be ignored - /// - /// This operation allows specifying the encoding applied to the content being written. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .content_encoding("gzip") - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_match` - /// - /// Sets If-Match header for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_match`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, the write operation will only succeed if the target's ETag matches the specified value - /// - The value should be a valid ETag string - /// - Common values include: - /// - A specific ETag value like `"686897696a7c876b7e"` - /// - `*` - Matches any existing resource - /// - If not supported, the value will be ignored - /// - /// This operation provides conditional write functionality based on ETag matching, - /// helping prevent unintended overwrites in concurrent scenarios. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .if_match("\"686897696a7c876b7e\"") - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_none_match` - /// - /// Sets If-None-Match header for this write request. - /// - /// Note: Certain services, like `s3`, support `if_not_exists` but not `if_none_match`. - /// Use `if_not_exists` if you only want to check whether a file exists. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_none_match`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, the write operation will only succeed if the target's ETag does not match the specified value - /// - The value should be a valid ETag string - /// - Common values include: - /// - A specific ETag value like `"686897696a7c876b7e"` - /// - `*` - Matches if the resource does not exist - /// - If not supported, the value will be ignored - /// - /// This operation provides conditional write functionality based on ETag non-matching, - /// useful for preventing overwriting existing resources or ensuring unique writes. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .if_none_match("\"686897696a7c876b7e\"") - /// .await?; - /// # Ok(()) - /// # } - /// ``` - /// - /// ## `if_not_exists` - /// - /// Sets the condition that write operation will succeed only if target does not exist. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_if_not_exists`] before using this feature. - /// - /// ### Behavior + /// # Options /// - /// - If supported, the write operation will only succeed if the target path does not exist - /// - Equivalent to setting `if_none_match("*")` if available - /// - Will return error if target already exists - /// - If not supported, the value will be ignored + /// Visit [`FutureWrite`] for all available options. /// - /// This operation provides a way to ensure write operations only create new resources - /// without overwriting existing ones, useful for implementing "create if not exists" logic. + /// - [`append`](./operator_futures/type.FutureWrite.html#method.append): Sets append mode for this write request. + /// - [`chunk`](./operator_futures/type.FutureWrite.html#method.chunk): Sets chunk size for buffered writes. + /// - [`concurrent`](./operator_futures/type.FutureWrite.html#method.concurrent): Sets concurrent write operations for this writer. + /// - [`cache_control`](./operator_futures/type.FutureWrite.html#method.cache_control): Sets cache control for this write request. + /// - [`content_type`](./operator_futures/type.FutureWrite.html#method.content_type): Sets content type for this write request. + /// - [`content_disposition`](./operator_futures/type.FutureWrite.html#method.content_disposition): Sets content disposition for this write request. + /// - [`content_encoding`](./operator_futures/type.FutureWrite.html#method.content_encoding): Sets content encoding for this write request. + /// - [`if_match`](./operator_futures/type.FutureWrite.html#method.if_match): Sets if-match for this write request. + /// - [`if_none_match`](./operator_futures/type.FutureWrite.html#method.if_none_match): Sets if-none-match for this write request. + /// - [`if_not_exist`](./operator_futures/type.FutureWrite.html#method.if_not_exist): Sets if-not-exist for this write request. + /// - [`user_metadata`](./operator_futures/type.FutureWrite.html#method.user_metadata): Sets user metadata for this write request. /// - /// ### Example + /// # Examples /// /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; /// use bytes::Bytes; /// /// # async fn test(op: Operator) -> Result<()> { - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) + /// let _ = op.write_with("path/to/file", vec![0; 4096]) /// .if_not_exists(true) /// .await?; /// # Ok(()) /// # } /// ``` - /// - /// ## `user_metadata` - /// - /// Sets user metadata for this write request. - /// - /// ### Capability - /// - /// Check [`Capability::write_with_user_metadata`] before using this feature. - /// - /// ### Behavior - /// - /// - If supported, the user metadata will be attached to the object during write - /// - Accepts key-value pairs where both key and value are strings - /// - Keys are case-insensitive in most services - /// - Services may have limitations for user metadata, for example: - /// - Key length is typically limited (e.g., 1024 bytes) - /// - Value length is typically limited (e.g., 4096 bytes) - /// - Total metadata size might be limited - /// - Some characters might be forbidden in keys - /// - If not supported, the metadata will be ignored - /// - /// User metadata provides a way to attach custom metadata to objects during write operations. - /// This metadata can be retrieved later when reading the object. - /// - /// ### Example - /// - /// ``` - /// # use opendal::Result; - /// # use opendal::Operator; - /// # use futures::StreamExt; - /// # use futures::SinkExt; - /// use bytes::Bytes; - /// - /// # async fn test(op: Operator) -> Result<()> { - /// let _ = op - /// .write_with("path/to/file", vec![0; 4096]) - /// .user_metadata([ - /// ("language".to_string(), "rust".to_string()), - /// ("author".to_string(), "OpenDAL".to_string()), - /// ]) - /// .await?; - /// # Ok(()) - /// # } - /// ``` pub fn write_with( &self, path: &str, diff --git a/core/src/types/operator/operator_futures.rs b/core/src/types/operator/operator_futures.rs index bbfa02657db7..c847b53745e2 100644 --- a/core/src/types/operator/operator_futures.rs +++ b/core/src/types/operator/operator_futures.rs @@ -196,7 +196,7 @@ impl>> FuturePresignWrite { } } -/// Future that generated by [`Operator::read_with`] or [`Operator::reader_with`]. +/// Future that generated by [`Operator::read_with`]. /// /// Users can add more options by public functions provided by this struct. pub type FutureRead = OperatorFuture<(OpRead, OpReader), Buffer, F>; @@ -404,7 +404,7 @@ impl>> FutureReader { /// read large chunks of data. By setting `concurrent`, opendal will reading files concurrently /// on support storage services. /// - /// By setting `concurrent``, opendal will fetch chunks concurrently with + /// By setting `concurrent`, opendal will fetch chunks concurrently with /// the give chunk size. /// /// ``` From b21229774662437412da51c3bcdd583ab0cb39b9 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Tue, 7 Jan 2025 22:18:19 +0800 Subject: [PATCH 03/14] fix(services/s3): List with deleted should contain latest (#5518) --- core/src/services/s3/lister.rs | 44 ++++++++++++++++++------------- core/tests/behavior/async_list.rs | 11 +++++++- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/core/src/services/s3/lister.rs b/core/src/services/s3/lister.rs index dd4359499d2f..f280e10e40f0 100644 --- a/core/src/services/s3/lister.rs +++ b/core/src/services/s3/lister.rs @@ -222,28 +222,34 @@ impl oio::PageList for S3ObjectVersionsLister { ctx.entries.push_back(de); } - if self.args.versions() { - for version_object in output.version { - let mut path = build_rel_path(&self.core.root, &version_object.key); - if path.is_empty() { - path = "/".to_owned(); - } + for version_object in output.version { + // `list` must be additive, so we need to include the latest version object + // even if `versions` is not enabled. + // + // Here we skip all non-latest version objects if `versions` is not enabled. + if !(self.args.versions() || version_object.is_latest) { + continue; + } - let mut meta = Metadata::new(EntryMode::from_path(&path)); - meta.set_version(&version_object.version_id); - meta.set_is_current(version_object.is_latest); - meta.set_content_length(version_object.size); - meta.set_last_modified(parse_datetime_from_rfc3339( - version_object.last_modified.as_str(), - )?); - if let Some(etag) = version_object.etag { - meta.set_etag(&etag); - meta.set_content_md5(etag.trim_matches('"')); - } + let mut path = build_rel_path(&self.core.root, &version_object.key); + if path.is_empty() { + path = "/".to_owned(); + } - let entry = oio::Entry::new(&path, meta); - ctx.entries.push_back(entry); + let mut meta = Metadata::new(EntryMode::from_path(&path)); + meta.set_version(&version_object.version_id); + meta.set_is_current(version_object.is_latest); + meta.set_content_length(version_object.size); + meta.set_last_modified(parse_datetime_from_rfc3339( + version_object.last_modified.as_str(), + )?); + if let Some(etag) = version_object.etag { + meta.set_etag(&etag); + meta.set_content_md5(etag.trim_matches('"')); } + + let entry = oio::Entry::new(&path, meta); + ctx.entries.push_back(entry); } if self.args.deleted() { diff --git a/core/tests/behavior/async_list.rs b/core/tests/behavior/async_list.rs index 3e0822d8ab65..e59c07af79ff 100644 --- a/core/tests/behavior/async_list.rs +++ b/core/tests/behavior/async_list.rs @@ -610,10 +610,19 @@ pub async fn test_list_files_with_deleted(op: Operator) -> Result<()> { let file_name = TEST_FIXTURE.new_file_path(); let file_path = format!("{}{}", parent, file_name); op.write(file_path.as_str(), "1").await?; + + // List with deleted should include self too. + let ds = op.list_with(&file_path).deleted(true).await?; + assert_eq!( + ds.len(), + 1, + "list with deleted should contain current active file version" + ); + op.write(file_path.as_str(), "2").await?; op.delete(file_path.as_str()).await?; - // This file has been deleted + // This file has been deleted, list with deleted should contain its versions and delete marker. let mut ds = op.list_with(&file_path).deleted(true).await?; ds.retain(|de| de.path() == file_path && de.metadata().is_deleted()); From 1c287eb74202061282567f4b588e3e772c472990 Mon Sep 17 00:00:00 2001 From: messense Date: Wed, 8 Jan 2025 17:11:20 +0800 Subject: [PATCH 04/14] chore(ci): upgrade to manylinux_2_28 for aarch64 Python wheels (#5522) --- .github/workflows/release_python.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release_python.yml b/.github/workflows/release_python.yml index 99ea4b858754..33945298d3dc 100644 --- a/.github/workflows/release_python.yml +++ b/.github/workflows/release_python.yml @@ -59,11 +59,8 @@ jobs: - { os: windows-latest } - { os: macos-latest, target: "universal2-apple-darwin" } - { os: ubuntu-latest, target: "x86_64" } - - { os: ubuntu-latest, target: "aarch64" } + - { os: ubuntu-latest, target: "aarch64", manylinux: "manylinux_2_28" } - { os: ubuntu-latest, target: "armv7l" } - env: - # Workaround ring 0.17 build issue - CFLAGS_aarch64_unknown_linux_gnu: "-D__ARM_ARCH=8" steps: - uses: actions/checkout@v4 - name: Setup Rust toolchain @@ -75,7 +72,7 @@ jobs: command: build args: --release -o dist -i python3.11 --features=pyo3/extension-module,services-all,abi3 sccache: true - manylinux: auto + manylinux: ${{ matrix.manylinux || 'auto' }} - uses: PyO3/maturin-action@v1 with: working-directory: "bindings/python" @@ -83,7 +80,7 @@ jobs: command: build args: --release -o dist -i python3.10 --features=pyo3/extension-module,services-all sccache: true - manylinux: auto + manylinux: ${{ matrix.manylinux || 'auto' }} - name: Build free-threaded wheels # windows free-threading building doesn't work on windows # https://github.com/apache/opendal/pull/5449#issuecomment-2560469190 @@ -95,7 +92,7 @@ jobs: command: build args: --release -o dist -i python3.13t --features=pyo3/extension-module,services-all sccache: true - manylinux: auto + manylinux: ${{ matrix.manylinux || 'auto' }} - name: Upload wheels uses: actions/upload-artifact@v3 with: From dc32a6acfcbfce63c2cb2541bdfb9648523e4958 Mon Sep 17 00:00:00 2001 From: hoslo Date: Wed, 8 Jan 2025 17:36:22 +0800 Subject: [PATCH 05/14] feat(core): Implement list with deleted and versions for cos (#5514) Co-authored-by: Xuanwo --- .github/services/cos/cos/action.yml | 7 +- core/src/services/cos/backend.rs | 52 +++++++++-- core/src/services/cos/config.rs | 2 + core/src/services/cos/core.rs | 133 +++++++++++++++++++++++++- core/src/services/cos/delete.rs | 4 +- core/src/services/cos/lister.rs | 140 ++++++++++++++++++++++++++++ 6 files changed, 324 insertions(+), 14 deletions(-) diff --git a/.github/services/cos/cos/action.yml b/.github/services/cos/cos/action.yml index 6dc23ede7a1d..c310a6d14e15 100644 --- a/.github/services/cos/cos/action.yml +++ b/.github/services/cos/cos/action.yml @@ -16,7 +16,7 @@ # under the License. name: cos -description: 'Behavior test for COS. This service is sponsored by @datafuse_labs.' +description: "Behavior test for COS. This service is sponsored by @datafuse_labs." runs: using: "composite" @@ -30,3 +30,8 @@ runs: OPENDAL_COS_ENDPOINT: op://services/cos/endpoint OPENDAL_COS_SECRET_ID: op://services/cos/secret_id OPENDAL_COS_SECRET_KEY: op://services/cos/secret_key + + - name: Add extra settings + shell: bash + run: | + echo "OPENDAL_COS_ENABLE_VERSIONING=true" >> $GITHUB_ENV diff --git a/core/src/services/cos/backend.rs b/core/src/services/cos/backend.rs index 86d7e342ca36..4bbb658c8f48 100644 --- a/core/src/services/cos/backend.rs +++ b/core/src/services/cos/backend.rs @@ -29,9 +29,10 @@ use reqsign::TencentCosSigner; use super::core::*; use super::delete::CosDeleter; use super::error::parse_error; -use super::lister::CosLister; +use super::lister::{CosLister, CosListers, CosObjectVersionsLister}; use super::writer::CosWriter; use super::writer::CosWriters; +use crate::raw::oio::PageLister; use crate::raw::*; use crate::services::CosConfig; use crate::*; @@ -123,6 +124,13 @@ impl CosBuilder { self } + /// Set bucket versioning status for this backend + pub fn enable_versioning(mut self, enabled: bool) -> Self { + self.config.enable_versioning = enabled; + + self + } + /// Disable config load so that opendal will not load config from /// environment. /// @@ -215,6 +223,7 @@ impl Builder for CosBuilder { bucket: bucket.clone(), root, endpoint: format!("{}://{}.{}", &scheme, &bucket, &endpoint), + enable_versioning: self.config.enable_versioning, signer, loader: cred_loader, client, @@ -232,7 +241,7 @@ pub struct CosBackend { impl Access for CosBackend { type Reader = HttpBody; type Writer = CosWriters; - type Lister = oio::PageLister; + type Lister = CosListers; type Deleter = oio::OneShotDeleter; type BlockingReader = (); type BlockingWriter = (); @@ -253,15 +262,18 @@ impl Access for CosBackend { stat_has_content_type: true, stat_has_content_encoding: true, stat_has_content_range: true, + stat_with_version: self.core.enable_versioning, stat_has_etag: true, stat_has_content_md5: true, stat_has_last_modified: true, stat_has_content_disposition: true, + stat_has_version: true, read: true, read_with_if_match: true, read_with_if_none_match: true, + read_with_version: self.core.enable_versioning, write: true, write_can_empty: true, @@ -270,8 +282,8 @@ impl Access for CosBackend { write_with_content_type: true, write_with_cache_control: true, write_with_content_disposition: true, - // TODO: set this to false while version has been enabled. - write_with_if_not_exists: true, + // Cos doesn't support forbid overwrite while version has been enabled. + write_with_if_not_exists: !self.core.enable_versioning, // The min multipart size of COS is 1 MiB. // // ref: @@ -286,10 +298,13 @@ impl Access for CosBackend { }, delete: true, + delete_with_version: self.core.enable_versioning, copy: true, list: true, list_with_recursive: true, + list_with_versions: self.core.enable_versioning, + list_with_deleted: self.core.enable_versioning, list_has_content_length: true, presign: true, @@ -311,7 +326,16 @@ impl Access for CosBackend { let status = resp.status(); match status { - StatusCode::OK => parse_into_metadata(path, resp.headers()).map(RpStat::new), + StatusCode::OK => { + let headers = resp.headers(); + let mut meta = parse_into_metadata(path, headers)?; + + if let Some(v) = parse_header_to_str(headers, "x-cos-version-id")? { + meta.set_version(v); + } + + Ok(RpStat::new(meta)) + } _ => Err(parse_error(resp)), } } @@ -357,8 +381,22 @@ impl Access for CosBackend { } async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> { - let l = CosLister::new(self.core.clone(), path, args.recursive(), args.limit()); - Ok((RpList::default(), oio::PageLister::new(l))) + let l = if args.versions() || args.deleted() { + TwoWays::Two(PageLister::new(CosObjectVersionsLister::new( + self.core.clone(), + path, + args, + ))) + } else { + TwoWays::One(PageLister::new(CosLister::new( + self.core.clone(), + path, + args.recursive(), + args.limit(), + ))) + }; + + Ok((RpList::default(), l)) } async fn copy(&self, from: &str, to: &str, _args: OpCopy) -> Result { diff --git a/core/src/services/cos/config.rs b/core/src/services/cos/config.rs index 8c73f00ca8c1..87436a84b61f 100644 --- a/core/src/services/cos/config.rs +++ b/core/src/services/cos/config.rs @@ -35,6 +35,8 @@ pub struct CosConfig { pub secret_key: Option, /// Bucket of this backend. pub bucket: Option, + /// is bucket versioning enabled for this bucket + pub enable_versioning: bool, /// Disable config load so that opendal will not load config from pub disable_config_load: bool, } diff --git a/core/src/services/cos/core.rs b/core/src/services/cos/core.rs index 4d28b268895b..020b57babd19 100644 --- a/core/src/services/cos/core.rs +++ b/core/src/services/cos/core.rs @@ -17,6 +17,7 @@ use std::fmt::Debug; use std::fmt::Formatter; +use std::fmt::Write; use std::time::Duration; use bytes::Bytes; @@ -37,10 +38,15 @@ use serde::Serialize; use crate::raw::*; use crate::*; +pub mod constants { + pub const COS_QUERY_VERSION_ID: &str = "versionId"; +} + pub struct CosCore { pub bucket: String, pub root: String, pub endpoint: String, + pub enable_versioning: bool, pub signer: TencentCosSigner, pub loader: TencentCosCredentialLoader, @@ -125,7 +131,19 @@ impl CosCore { ) -> Result> { let p = build_abs_path(&self.root, path); - let url = format!("{}/{}", self.endpoint, percent_encode_path(&p)); + let mut url = format!("{}/{}", self.endpoint, percent_encode_path(&p)); + + let mut query_args = Vec::new(); + if let Some(version) = args.version() { + query_args.push(format!( + "{}={}", + constants::COS_QUERY_VERSION_ID, + percent_decode_path(version) + )) + } + if !query_args.is_empty() { + url.push_str(&format!("?{}", query_args.join("&"))); + } let mut req = Request::get(&url); @@ -200,7 +218,19 @@ impl CosCore { pub fn cos_head_object_request(&self, path: &str, args: &OpStat) -> Result> { let p = build_abs_path(&self.root, path); - let url = format!("{}/{}", self.endpoint, percent_encode_path(&p)); + let mut url = format!("{}/{}", self.endpoint, percent_encode_path(&p)); + + let mut query_args = Vec::new(); + if let Some(version) = args.version() { + query_args.push(format!( + "{}={}", + constants::COS_QUERY_VERSION_ID, + percent_decode_path(version) + )) + } + if !query_args.is_empty() { + url.push_str(&format!("?{}", query_args.join("&"))); + } let mut req = Request::head(&url); @@ -217,10 +247,22 @@ impl CosCore { Ok(req) } - pub async fn cos_delete_object(&self, path: &str) -> Result> { + pub async fn cos_delete_object(&self, path: &str, args: &OpDelete) -> Result> { let p = build_abs_path(&self.root, path); - let url = format!("{}/{}", self.endpoint, percent_encode_path(&p)); + let mut url = format!("{}/{}", self.endpoint, percent_encode_path(&p)); + + let mut query_args = Vec::new(); + if let Some(version) = args.version() { + query_args.push(format!( + "{}={}", + constants::COS_QUERY_VERSION_ID, + percent_decode_path(version) + )) + } + if !query_args.is_empty() { + url.push_str(&format!("?{}", query_args.join("&"))); + } let req = Request::delete(&url); @@ -434,6 +476,50 @@ impl CosCore { self.sign(&mut req).await?; self.send(req).await } + + pub async fn cos_list_object_versions( + &self, + prefix: &str, + delimiter: &str, + limit: Option, + key_marker: &str, + version_id_marker: &str, + ) -> Result> { + let p = build_abs_path(&self.root, prefix); + + let mut url = format!("{}?versions", self.endpoint); + if !p.is_empty() { + write!(url, "&prefix={}", percent_encode_path(p.as_str())) + .expect("write into string must succeed"); + } + if !delimiter.is_empty() { + write!(url, "&delimiter={}", delimiter).expect("write into string must succeed"); + } + + if let Some(limit) = limit { + write!(url, "&max-keys={}", limit).expect("write into string must succeed"); + } + if !key_marker.is_empty() { + write!(url, "&key-marker={}", percent_encode_path(key_marker)) + .expect("write into string must succeed"); + } + if !version_id_marker.is_empty() { + write!( + url, + "&version-id-marker={}", + percent_encode_path(version_id_marker) + ) + .expect("write into string must succeed"); + } + + let mut req = Request::get(&url) + .body(Buffer::new()) + .map_err(new_request_build_error)?; + + self.sign(&mut req).await?; + + self.send(req).await + } } /// Result of CreateMultipartUpload @@ -511,6 +597,45 @@ pub struct ListObjectsOutputContent { pub size: u64, } +#[derive(Default, Debug, Eq, PartialEq, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct OutputCommonPrefix { + pub prefix: String, +} + +/// Output of ListObjectVersions +#[derive(Default, Debug, Deserialize)] +#[serde(default, rename_all = "PascalCase")] +pub struct ListObjectVersionsOutput { + pub is_truncated: Option, + pub next_key_marker: Option, + pub next_version_id_marker: Option, + pub common_prefixes: Vec, + pub version: Vec, + pub delete_marker: Vec, +} + +#[derive(Default, Debug, Eq, PartialEq, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ListObjectVersionsOutputVersion { + pub key: String, + pub version_id: String, + pub is_latest: bool, + pub size: u64, + pub last_modified: String, + #[serde(rename = "ETag")] + pub etag: Option, +} + +#[derive(Default, Debug, Eq, PartialEq, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ListObjectVersionsOutputDeleteMarker { + pub key: String, + pub version_id: String, + pub is_latest: bool, + pub last_modified: String, +} + #[cfg(test)] mod tests { use bytes::Buf; diff --git a/core/src/services/cos/delete.rs b/core/src/services/cos/delete.rs index 17319ba91cd1..bd29f8521d95 100644 --- a/core/src/services/cos/delete.rs +++ b/core/src/services/cos/delete.rs @@ -33,8 +33,8 @@ impl CosDeleter { } impl oio::OneShotDelete for CosDeleter { - async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> { - let resp = self.core.cos_delete_object(&path).await?; + async fn delete_once(&self, path: String, args: OpDelete) -> Result<()> { + let resp = self.core.cos_delete_object(&path, &args).await?; let status = resp.status(); diff --git a/core/src/services/cos/lister.rs b/core/src/services/cos/lister.rs index 880544425008..465bf97bce31 100644 --- a/core/src/services/cos/lister.rs +++ b/core/src/services/cos/lister.rs @@ -22,11 +22,15 @@ use quick_xml::de; use super::core::*; use super::error::parse_error; +use crate::raw::oio::PageContext; use crate::raw::*; use crate::EntryMode; +use crate::Error; use crate::Metadata; use crate::Result; +pub type CosListers = TwoWays, oio::PageLister>; + pub struct CosLister { core: Arc, path: String, @@ -95,3 +99,139 @@ impl oio::PageList for CosLister { Ok(()) } } + +/// refer: https://cloud.tencent.com/document/product/436/35521 +pub struct CosObjectVersionsLister { + core: Arc, + + prefix: String, + args: OpList, + + delimiter: &'static str, + abs_start_after: Option, +} + +impl CosObjectVersionsLister { + pub fn new(core: Arc, path: &str, args: OpList) -> Self { + let delimiter = if args.recursive() { "" } else { "/" }; + let abs_start_after = args + .start_after() + .map(|start_after| build_abs_path(&core.root, start_after)); + + Self { + core, + prefix: path.to_string(), + args, + delimiter, + abs_start_after, + } + } +} + +impl oio::PageList for CosObjectVersionsLister { + async fn next_page(&self, ctx: &mut PageContext) -> Result<()> { + let markers = ctx.token.rsplit_once(" "); + let (key_marker, version_id_marker) = if let Some(data) = markers { + data + } else if let Some(start_after) = &self.abs_start_after { + (start_after.as_str(), "") + } else { + ("", "") + }; + + let resp = self + .core + .cos_list_object_versions( + &self.prefix, + self.delimiter, + self.args.limit(), + key_marker, + version_id_marker, + ) + .await?; + if resp.status() != http::StatusCode::OK { + return Err(parse_error(resp)); + } + + let body = resp.into_body(); + let output: ListObjectVersionsOutput = de::from_reader(body.reader()) + .map_err(new_xml_deserialize_error) + // Allow Cos list to retry on XML deserialization errors. + // + // This is because the Cos list API may return incomplete XML data under high load. + // We are confident that our XML decoding logic is correct. When this error occurs, + // we allow retries to obtain the correct data. + .map_err(Error::set_temporary)?; + + ctx.done = if let Some(is_truncated) = output.is_truncated { + !is_truncated + } else { + false + }; + ctx.token = format!( + "{} {}", + output.next_key_marker.unwrap_or_default(), + output.next_version_id_marker.unwrap_or_default() + ); + + for prefix in output.common_prefixes { + let de = oio::Entry::new( + &build_rel_path(&self.core.root, &prefix.prefix), + Metadata::new(EntryMode::DIR), + ); + ctx.entries.push_back(de); + } + + for version_object in output.version { + // `list` must be additive, so we need to include the latest version object + // even if `versions` is not enabled. + // + // Here we skip all non-latest version objects if `versions` is not enabled. + if !(self.args.versions() || version_object.is_latest) { + continue; + } + + let mut path = build_rel_path(&self.core.root, &version_object.key); + if path.is_empty() { + path = "/".to_owned(); + } + + let mut meta = Metadata::new(EntryMode::from_path(&path)); + meta.set_version(&version_object.version_id); + meta.set_is_current(version_object.is_latest); + meta.set_content_length(version_object.size); + meta.set_last_modified(parse_datetime_from_rfc3339( + version_object.last_modified.as_str(), + )?); + if let Some(etag) = version_object.etag { + meta.set_etag(&etag); + meta.set_content_md5(etag.trim_matches('"')); + } + + let entry = oio::Entry::new(&path, meta); + ctx.entries.push_back(entry); + } + + if self.args.deleted() { + for delete_marker in output.delete_marker { + let mut path = build_rel_path(&self.core.root, &delete_marker.key); + if path.is_empty() { + path = "/".to_owned(); + } + + let mut meta = Metadata::new(EntryMode::FILE); + meta.set_version(&delete_marker.version_id); + meta.set_is_deleted(true); + meta.set_is_current(delete_marker.is_latest); + meta.set_last_modified(parse_datetime_from_rfc3339( + delete_marker.last_modified.as_str(), + )?); + + let entry = oio::Entry::new(&path, meta); + ctx.entries.push_back(entry); + } + } + + Ok(()) + } +} From 90c64a19b12333fe4324358af6427b32b244b682 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Wed, 8 Jan 2025 21:28:12 +0800 Subject: [PATCH 06/14] Bump to version 0.51.1 Round 1 (#5523) --- CHANGELOG.md | 45 + bin/oay/Cargo.lock | 630 ++++-- bin/oay/Cargo.toml | 4 +- bin/oay/DEPENDENCIES.rust.tsv | 173 +- bin/ofs/Cargo.lock | 662 ++++-- bin/ofs/Cargo.toml | 4 +- bin/ofs/DEPENDENCIES.rust.tsv | 455 ++-- bin/oli/Cargo.lock | 117 +- bin/oli/Cargo.toml | 4 +- bin/oli/DEPENDENCIES.rust.tsv | 505 ++--- bindings/c/Cargo.toml | 2 +- bindings/c/DEPENDENCIES.rust.tsv | 452 ++-- bindings/cpp/Cargo.toml | 2 +- bindings/cpp/DEPENDENCIES.rust.tsv | 424 ++-- bindings/dotnet/Cargo.toml | 2 +- bindings/dotnet/DEPENDENCIES.rust.tsv | 401 ++-- bindings/haskell/Cargo.toml | 2 +- bindings/haskell/DEPENDENCIES.rust.tsv | 401 ++-- bindings/haskell/opendal.cabal | 2 +- bindings/java/Cargo.toml | 2 +- bindings/java/DEPENDENCIES.rust.tsv | 512 ++--- bindings/java/pom.xml | 2 +- bindings/lua/Cargo.toml | 2 +- bindings/lua/DEPENDENCIES.rust.tsv | 431 ++-- ...0-1.rockspec => opendal-0.1.13-1.rockspec} | 2 +- bindings/nodejs/Cargo.toml | 2 +- bindings/nodejs/DEPENDENCIES.rust.tsv | 431 ++-- bindings/nodejs/npm/darwin-arm64/package.json | 2 +- bindings/nodejs/npm/darwin-x64/package.json | 2 +- .../nodejs/npm/linux-arm64-gnu/package.json | 2 +- .../nodejs/npm/linux-arm64-musl/package.json | 2 +- .../nodejs/npm/linux-x64-gnu/package.json | 2 +- .../nodejs/npm/win32-arm64-msvc/package.json | 2 +- .../nodejs/npm/win32-x64-msvc/package.json | 2 +- bindings/nodejs/package.json | 2 +- bindings/ocaml/DEPENDENCIES.rust.tsv | 413 ++-- bindings/php/Cargo.toml | 2 +- bindings/php/DEPENDENCIES.rust.tsv | 184 +- bindings/python/Cargo.toml | 6 +- bindings/python/DEPENDENCIES.rust.tsv | 508 ++--- bindings/ruby/Cargo.toml | 2 +- bindings/ruby/DEPENDENCIES.rust.tsv | 447 ++-- core/Cargo.lock | 1828 +++++++++-------- core/Cargo.toml | 134 +- core/DEPENDENCIES.rust.tsv | 348 ++-- core/src/services/gdrive/core.rs | 2 +- .../cloud_filter/DEPENDENCIES.rust.tsv | 371 ++-- integrations/compat/DEPENDENCIES.rust.tsv | 12 +- integrations/dav-server/Cargo.toml | 2 +- integrations/dav-server/DEPENDENCIES.rust.tsv | 151 +- integrations/fuse3/Cargo.toml | 2 +- integrations/fuse3/DEPENDENCIES.rust.tsv | 140 +- integrations/object_store/Cargo.toml | 2 +- .../object_store/DEPENDENCIES.rust.tsv | 143 +- integrations/parquet/Cargo.toml | 2 +- integrations/parquet/DEPENDENCIES.rust.tsv | 166 +- integrations/unftp-sbe/Cargo.toml | 2 +- integrations/unftp-sbe/DEPENDENCIES.rust.tsv | 195 +- integrations/virtiofs/DEPENDENCIES.rust.tsv | 129 +- 59 files changed, 6016 insertions(+), 4862 deletions(-) rename bindings/lua/{opendal-0.1.10-1.rockspec => opendal-0.1.13-1.rockspec} (96%) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce48f5b4bf50..1f7540def6f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/). +## [v0.51.1] - 2025-01-08 + +### Added +* feat(bin/oli): implement oli bench by @tisonkun in https://github.com/apache/opendal/pull/5443 +* feat(dev): Add config parse and generate support by @Xuanwo in https://github.com/apache/opendal/pull/5454 +* feat(bindings/python): generate python operator constructor types by @trim21 in https://github.com/apache/opendal/pull/5457 +* feat(dev): Parse comments from config by @Xuanwo in https://github.com/apache/opendal/pull/5467 +* feat(services/core): Implement stat_has_* and list_has_* correctly for services by @geetanshjuneja in https://github.com/apache/opendal/pull/5472 +* feat: Add if-match & if-none-match support for reader by @XmchxUp in https://github.com/apache/opendal/pull/5492 +* feat(core): Add is_current to metadata by @Wenbin1002 in https://github.com/apache/opendal/pull/5493 +* feat(core): Implement list with deleted for s3 service by @Xuanwo in https://github.com/apache/opendal/pull/5498 +* feat: generate java configs by @tisonkun in https://github.com/apache/opendal/pull/5503 +* feat: Return hinted error for S3 wildcard if-none-match by @gruuya in https://github.com/apache/opendal/pull/5506 +* feat(core): implement if_modified_since and if_unmodified_since for read_with and reader_with by @meteorgan in https://github.com/apache/opendal/pull/5500 +* feat(core): Implement list with deleted and versions for cos by @hoslo in https://github.com/apache/opendal/pull/5514 +### Changed +* refactor: tidy up oli build by @tisonkun in https://github.com/apache/opendal/pull/5438 +* refactor(core): Deprecate OpList::version and add versions instead by @geetanshjuneja in https://github.com/apache/opendal/pull/5481 +* refactor(dev): use minijinja by @tisonkun in https://github.com/apache/opendal/pull/5494 +### Fixed +* fix: exception name in python by @trim21 in https://github.com/apache/opendal/pull/5453 +* fix rust warning in python binding by @trim21 in https://github.com/apache/opendal/pull/5459 +* fix: python binding kwargs parsing by @trim21 in https://github.com/apache/opendal/pull/5458 +* fix(bindings/python): add py.typed marker file by @trim21 in https://github.com/apache/opendal/pull/5464 +* fix(services/ghac): Fix stat_with_if_none_match been set in wrong by @Xuanwo in https://github.com/apache/opendal/pull/5477 +* fix(ci): Correctly upgrade upload-artifact to v4 by @Xuanwo in https://github.com/apache/opendal/pull/5484 +* fix(integration/object_store): object_store requires metadata in list by @Xuanwo in https://github.com/apache/opendal/pull/5501 +* fix(services/s3): List with deleted should contain latest by @Xuanwo in https://github.com/apache/opendal/pull/5518 +### Docs +* docs: Fix links to vision by @Xuanwo in https://github.com/apache/opendal/pull/5466 +* docs(golang): remove unused pkg by @fyqtian in https://github.com/apache/opendal/pull/5473 +* docs(core): Polish API docs for `Metadata` by @Xuanwo in https://github.com/apache/opendal/pull/5497 +* docs: Polish docs for Operator, Reader and Writer by @Xuanwo in https://github.com/apache/opendal/pull/5516 +* docs: Reorganize docs for xxx_with for better reading by @Xuanwo in https://github.com/apache/opendal/pull/5517 +### CI +* ci: disable windows free-thread build by @trim21 in https://github.com/apache/opendal/pull/5449 +* ci: Upgrade and fix typos by @Xuanwo in https://github.com/apache/opendal/pull/5468 +### Chore +* chore(dev): Try just instead of xtasks methods by @Xuanwo in https://github.com/apache/opendal/pull/5461 +* chore: pretty gen javadoc by @tisonkun in https://github.com/apache/opendal/pull/5508 +* chore(ci): upgrade to manylinux_2_28 for aarch64 Python wheels by @messense in https://github.com/apache/opendal/pull/5522 + ## [v0.51.0] - 2024-12-14 ### Added @@ -4174,6 +4216,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/). Hello, OpenDAL! +[v0.51.1]: https://github.com/apache/opendal/compare/v0.51.0...v0.51.1 +[v0.51.0]: https://github.com/apache/opendal/compare/v0.50.2...v0.51.0 +[v0.50.2]: https://github.com/apache/opendal/compare/v0.50.1...v0.50.2 [v0.50.1]: https://github.com/apache/opendal/compare/v0.50.0...v0.50.1 [v0.50.0]: https://github.com/apache/opendal/compare/v0.49.2...v0.50.0 [v0.49.2]: https://github.com/apache/opendal/compare/v0.49.1...v0.49.2 diff --git a/bin/oay/Cargo.lock b/bin/oay/Cargo.lock index cb8910ff8880..209ed77ef672 100644 --- a/bin/oay/Cargo.lock +++ b/bin/oay/Cargo.lock @@ -28,9 +28,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -49,15 +49,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", @@ -72,9 +72,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", @@ -96,9 +96,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", - "tower 0.5.1", + "tower 0.5.2", "tower-layer", "tower-service", "tracing", @@ -119,7 +119,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper", "tower-layer", "tower-service", "tracing", @@ -127,9 +127,9 @@ dependencies = [ [[package]] name = "backon" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4fa97bb310c33c811334143cf64c5bb2b7b3c06e453db6b095d7061eff8f113" +checksum = "ba5289ec98f68f28dd809fd601059e6aa908bb8f6108620930828283d4ee23d7" dependencies = [ "fastrand", "gloo-timers", @@ -192,15 +192,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "shlex", ] @@ -211,11 +211,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -233,9 +239,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -284,7 +290,7 @@ dependencies = [ [[package]] name = "dav-server-opendalfs" -version = "0.2.3" +version = "0.3.0" dependencies = [ "anyhow", "bytes", @@ -312,6 +318,17 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -320,9 +337,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fnv" @@ -332,9 +349,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "form_urlencoded" @@ -477,9 +494,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -510,12 +527,6 @@ dependencies = [ "http", ] -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "htmlescape" version = "0.3.1" @@ -524,9 +535,9 @@ checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -570,9 +581,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -590,9 +601,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http", @@ -608,9 +619,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -648,21 +659,150 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown", @@ -676,16 +816,17 @@ checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -697,9 +838,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -775,20 +922,19 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -821,7 +967,7 @@ dependencies = [ [[package]] name = "oay" -version = "0.41.14" +version = "0.41.15" dependencies = [ "anyhow", "axum", @@ -841,9 +987,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -856,7 +1002,7 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opendal" -version = "0.51.0" +version = "0.51.1" dependencies = [ "anyhow", "async-trait", @@ -916,18 +1062,18 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", @@ -936,9 +1082,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -963,9 +1109,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -982,9 +1128,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -1000,27 +1146,31 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", "rustc-hash", "rustls", + "rustls-pki-types", "slab", "thiserror", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -1030,9 +1180,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1069,22 +1219,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -1099,9 +1249,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1122,9 +1272,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -1150,10 +1300,11 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", "tokio-rustls", "tokio-util", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", @@ -1187,15 +1338,15 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "once_cell", "ring", @@ -1216,9 +1367,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -1233,9 +1387,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" @@ -1251,18 +1405,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -1271,9 +1425,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "itoa", "memchr", @@ -1355,9 +1509,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1369,6 +1523,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "subtle" version = "2.6.1" @@ -1377,9 +1537,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.81" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -1388,33 +1548,38 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] -name = "sync_wrapper" -version = "1.0.1" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "futures-core", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thiserror" -version = "1.0.64" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", @@ -1433,9 +1598,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -1454,19 +1619,29 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -1479,9 +1654,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -1506,20 +1681,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -1579,14 +1753,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -1607,9 +1781,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -1619,9 +1793,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", @@ -1630,9 +1804,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -1651,9 +1825,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -1681,30 +1855,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" - -[[package]] -name = "unicode-bidi" -version = "0.3.17" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "untrusted" @@ -1714,15 +1873,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" version = "1.11.0" @@ -1762,9 +1933,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -1773,13 +1944,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn", @@ -1788,21 +1958,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1810,9 +1981,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", @@ -1823,15 +1994,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -1842,9 +2013,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -1852,9 +2033,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -2004,18 +2185,30 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" dependencies = [ "memchr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "xml-rs" -version = "0.8.22" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" [[package]] name = "xmltree" @@ -2026,6 +2219,30 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -2047,8 +2264,51 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/bin/oay/Cargo.toml b/bin/oay/Cargo.toml index f076fda9b00d..f476aeef4d69 100644 --- a/bin/oay/Cargo.toml +++ b/bin/oay/Cargo.toml @@ -27,7 +27,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.41.14" +version = "0.41.15" [features] default = ["frontends-webdav", "frontends-s3"] @@ -44,7 +44,7 @@ anyhow = "1" axum = "0.7" chrono = "0.4.31" dav-server = { version = "0.7", optional = true } -dav-server-opendalfs = { version = "0.2.1", path = "../../integrations/dav-server", optional = true } +dav-server-opendalfs = { version = "0.3.0", path = "../../integrations/dav-server", optional = true } futures-util = { version = "0.3.29", optional = true } opendal = { version = "0.51.0", path = "../../core", features = [ "services-fs", diff --git a/bin/oay/DEPENDENCIES.rust.tsv b/bin/oay/DEPENDENCIES.rust.tsv index fa9d02181a2a..333a295d857c 100644 --- a/bin/oay/DEPENDENCIES.rust.tsv +++ b/bin/oay/DEPENDENCIES.rust.tsv @@ -1,37 +1,38 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X aho-corasick@1.1.3 X X -allocator-api2@0.2.18 X X +allocator-api2@0.2.21 X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.93 X X -async-trait@0.1.83 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X autocfg@1.4.0 X X -axum@0.7.7 X +axum@0.7.9 X axum-core@0.4.5 X -backon@1.2.0 X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.21.7 X X base64@0.22.1 X X bitflags@2.6.0 X X block-buffer@0.10.4 X X bumpalo@3.16.0 X X -bytes@1.7.2 X -cc@1.1.31 X X +bytes@1.9.0 X +cc@1.2.7 X X cfg-if@1.0.0 X X -chrono@0.4.38 X X +chrono@0.4.39 X X core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X +cpufeatures@0.2.16 X X crypto-common@0.1.6 X X dav-server@0.7.0 X -dav-server-opendalfs@0.2.3 X +dav-server-opendalfs@0.3.0 X deranged@0.3.11 X X digest@0.10.7 X X +displaydoc@0.2.5 X X equivalent@1.0.1 X X -fastrand@2.1.1 X X +fastrand@2.3.0 X X fnv@1.0.7 X X -foldhash@0.1.3 X +foldhash@0.1.4 X form_urlencoded@1.2.1 X X futures@0.3.31 X X futures-channel@0.3.31 X X @@ -46,28 +47,39 @@ generic-array@0.14.7 X getrandom@0.2.15 X X gimli@0.31.1 X X gloo-timers@0.3.0 X X -hashbrown@0.15.0 X X +hashbrown@0.15.2 X X headers@0.4.0 X headers-core@0.3.0 X -hermit-abi@0.3.9 X X htmlescape@0.3.1 X X X -http@1.1.0 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X httpdate@1.0.3 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.9 X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -indexmap@2.6.0 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +indexmap@2.7.0 X X ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X lazy_static@1.5.0 X X -libc@0.2.161 X X +libc@0.2.169 X X +litemap@0.7.4 X lock_api@0.4.12 X X log@0.4.22 X X lru@0.12.5 X @@ -77,46 +89,46 @@ md-5@0.10.6 X X memchr@2.7.4 X X mime@0.3.17 X X mime_guess@2.0.5 X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X nu-ansi-term@0.46.0 X num-conv@0.1.0 X X num-traits@0.2.19 X X -oay@0.41.14 X -object@0.36.5 X X +oay@0.41.15 X +object@0.36.7 X X once_cell@1.20.2 X X -opendal@0.51.0 X +opendal@0.51.1 X overload@0.1.1 X parking_lot@0.12.3 X X parking_lot_core@0.9.10 X X percent-encoding@2.3.1 X X -pin-project@1.1.6 X X -pin-project-internal@1.1.6 X X -pin-project-lite@0.2.14 X X +pin-project@1.1.8 X X +pin-project-internal@1.1.8 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X powerfmt@0.2.0 X X -proc-macro2@1.0.88 X X +proc-macro2@1.0.92 X X quick-xml@0.36.2 X -quote@1.0.37 X X -redox_syscall@0.5.7 X -regex@1.11.0 X X +quote@1.0.38 X X +redox_syscall@0.5.8 X +regex@1.11.1 X X regex-automata@0.1.10 X X -regex-automata@0.4.8 X X +regex-automata@0.4.9 X X regex-syntax@0.6.29 X X regex-syntax@0.8.5 X X -reqwest@0.12.8 X X +reqwest@0.12.12 X X ring@0.17.8 X rustc-demangle@0.1.24 X X -rustls@0.23.15 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X -rustversion@1.0.18 X X +rustversion@1.0.19 X X ryu@1.0.18 X X scopeguard@1.2.0 X X -serde@1.0.210 X X -serde_derive@1.0.210 X X -serde_json@1.0.132 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_path_to_error@0.1.16 X X serde_spanned@0.6.8 X X serde_urlencoded@0.7.1 X X @@ -125,56 +137,55 @@ sharded-slab@0.1.7 X shlex@1.3.0 X X slab@0.4.9 X smallvec@1.13.2 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X +stable_deref_trait@1.2.0 X X subtle@2.6.1 X -syn@2.0.81 X X -sync_wrapper@0.1.2 X -sync_wrapper@1.0.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X thread_local@1.1.8 X X -time@0.3.36 X X +time@0.3.37 X X time-core@0.1.2 X X -time-macros@0.2.18 X X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.40.0 X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X toml@0.8.19 X X toml_datetime@0.6.8 X X toml_edit@0.22.22 X X tower@0.4.13 X -tower@0.5.1 X +tower@0.5.2 X tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X tracing-log@0.2.0 X -tracing-subscriber@0.3.18 X +tracing-subscriber@0.3.19 X try-lock@0.2.5 X typenum@1.17.0 X X -unicase@2.8.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unicase@2.8.1 X X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -url@2.5.2 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X -valuable@0.1.0 X version_check@0.9.5 X X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.1 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X winapi@0.3.9 X X winapi-i686-pc-windows-gnu@0.4.0 X X winapi-x86_64-pc-windows-gnu@0.4.0 X X @@ -192,7 +203,15 @@ windows_i686_msvc@0.52.6 X X windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X -winnow@0.6.20 X -xml-rs@0.8.22 X +winnow@0.6.22 X +write16@1.0.0 X X +writeable@0.5.5 X +xml-rs@0.8.25 X xmltree@0.10.3 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bin/ofs/Cargo.lock b/bin/ofs/Cargo.lock index 3e85dc0bb5f0..4d719088cd15 100644 --- a/bin/ofs/Cargo.lock +++ b/bin/ofs/Cargo.lock @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -58,43 +58,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.90" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "async-notify" @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", @@ -126,9 +126,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backon" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4fa97bb310c33c811334143cf64c5bb2b7b3c06e453db6b095d7061eff8f113" +checksum = "ba5289ec98f68f28dd809fd601059e6aa908bb8f6108620930828283d4ee23d7" dependencies = [ "fastrand", "gloo-timers", @@ -194,15 +194,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "shlex", ] @@ -221,9 +221,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.21" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd" dependencies = [ "clap_builder", "clap_derive", @@ -245,9 +245,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd" dependencies = [ "anstream", "anstyle", @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck", "proc-macro2", @@ -269,9 +269,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cloud-filter" @@ -301,9 +301,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -348,9 +348,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -366,9 +366,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -407,6 +407,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dlv-list" version = "0.5.2" @@ -430,9 +441,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -440,9 +451,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "anstream", "anstyle", @@ -453,12 +464,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -474,9 +485,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flagset" @@ -522,7 +533,7 @@ dependencies = [ [[package]] name = "fuse3_opendal" -version = "0.0.10" +version = "0.0.11" dependencies = [ "bytes", "fuse3", @@ -676,12 +687,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hex" version = "0.4.3" @@ -699,18 +704,18 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -754,9 +759,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -773,9 +778,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http", @@ -791,9 +796,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -831,14 +836,143 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -855,16 +989,17 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -876,15 +1011,21 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "log" @@ -925,20 +1066,19 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", @@ -984,16 +1124,16 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "ofs" -version = "0.0.15" +version = "0.0.16" dependencies = [ "anyhow", "clap", @@ -1021,7 +1161,7 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opendal" -version = "0.51.0" +version = "0.51.1" dependencies = [ "anyhow", "async-trait", @@ -1073,9 +1213,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1100,9 +1240,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -1129,9 +1269,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -1147,27 +1287,31 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", "rustc-hash", "rustls", + "rustls-pki-types", "slab", "thiserror", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -1177,9 +1321,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1216,9 +1360,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1228,9 +1372,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1273,9 +1417,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64", "bytes", @@ -1305,6 +1449,7 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -1349,9 +1494,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc_version" @@ -1364,22 +1509,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "once_cell", "ring", @@ -1400,9 +1545,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -1432,24 +1580,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -1458,9 +1606,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "itoa", "memchr", @@ -1543,9 +1691,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1557,6 +1705,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.11.1" @@ -1571,9 +1725,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.81" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -1582,21 +1736,33 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tempfile" -version = "3.13.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys 0.59.0", @@ -1625,18 +1791,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", @@ -1645,9 +1811,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "num-conv", @@ -1665,9 +1831,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -1682,11 +1848,21 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -1699,9 +1875,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -1727,20 +1903,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -1749,6 +1924,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -1757,9 +1953,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -1768,9 +1964,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", @@ -1779,9 +1975,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -1815,26 +2011,11 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "untrusted" @@ -1844,15 +2025,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -1902,9 +2095,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -1913,13 +2106,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn", @@ -1928,21 +2120,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1950,9 +2143,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", @@ -1963,15 +2156,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -1982,9 +2175,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -1992,9 +2195,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -2198,6 +2401,42 @@ version = "0.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -2219,8 +2458,51 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/bin/ofs/Cargo.toml b/bin/ofs/Cargo.toml index 80f5800ca2de..c3dd99b850e5 100644 --- a/bin/ofs/Cargo.toml +++ b/bin/ofs/Cargo.toml @@ -20,7 +20,7 @@ categories = ["filesystem"] description = "OpenDAL File System" keywords = ["storage", "data", "s3", "fs", "azblob"] name = "ofs" -version = "0.0.15" +version = "0.0.16" authors = ["Apache OpenDAL "] edition = "2021" @@ -46,7 +46,7 @@ url = "2.5.0" [target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "macos"))'.dependencies] fuse3 = { version = "0.8.1", "features" = ["tokio-runtime", "unprivileged"] } -fuse3_opendal = { version = "0.0.10", path = "../../integrations/fuse3" } +fuse3_opendal = { version = "0.0.11", path = "../../integrations/fuse3" } libc = "0.2.154" nix = { version = "0.29.0", features = ["user"] } diff --git a/bin/ofs/DEPENDENCIES.rust.tsv b/bin/ofs/DEPENDENCIES.rust.tsv index adc8a4c7c8f9..6dc518227c13 100644 --- a/bin/ofs/DEPENDENCIES.rust.tsv +++ b/bin/ofs/DEPENDENCIES.rust.tsv @@ -1,220 +1,235 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aho-corasick@1.1.3 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anstream@0.6.15 X X -anstyle@1.0.8 X X -anstyle-parse@0.2.5 X X -anstyle-query@1.1.1 X X -anstyle-wincon@3.0.4 X X -anyhow@1.0.90 X X -async-notify@0.3.0 X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.22.1 X X -bincode@1.3.3 X -bitflags@2.6.0 X X -block-buffer@0.10.4 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.7.2 X -cc@1.1.31 X X -cfg-if@1.0.0 X X -cfg_aliases@0.2.1 X -chrono@0.4.38 X X -clap@4.5.21 X X -clap_builder@4.5.21 X X -clap_derive@4.5.18 X X -clap_lex@0.7.2 X X -cloud-filter@0.0.5 X -cloud_filter_opendal@0.0.4 X -colorchoice@1.0.2 X X -concurrent-queue@2.5.0 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crossbeam-utils@0.8.20 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -dotenvy@0.15.7 X -either@1.13.0 X X -env_filter@0.1.2 X X -env_logger@0.11.5 X X -errno@0.3.9 X X -event-listener@4.0.3 X X -fastrand@2.1.1 X X -flagset@0.4.6 X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -fuse3@0.8.1 X -fuse3_opendal@0.0.10 X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-executor@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -heck@0.5.0 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -humantime@2.1.0 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.9 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -ipnet@2.10.1 X X -is_terminal_polyfill@1.70.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -lazy_static@1.5.0 X X -libc@0.2.161 X X -linux-raw-sys@0.4.14 X X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -memoffset@0.9.1 X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -nix@0.29.0 X -nt-time@0.8.1 X X -num-conv@0.1.0 X X -num-traits@0.2.19 X X -object@0.36.5 X X -ofs@0.0.15 X -once_cell@1.20.2 X X -opendal@0.51.0 X -ordered-multimap@0.7.3 X -parking@2.2.1 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.14 X X -pin-utils@0.1.0 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.88 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -regex@1.11.0 X X -regex-automata@0.4.8 X X -regex-syntax@0.8.5 X X -reqsign@0.16.1 X -reqwest@0.12.8 X X -ring@0.17.8 X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustix@0.38.37 X X X -rustls@0.23.15 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -semver@1.0.23 X X -serde@1.0.210 X X -serde_derive@1.0.210 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -sharded-slab@0.1.7 X -shlex@1.3.0 X X -signal-hook-registry@1.4.2 X X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -strsim@0.11.1 X -subtle@2.6.1 X -syn@2.0.81 X X -sync_wrapper@1.0.1 X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.40.0 X -tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X -trait-make@0.1.0 X X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -utf8parse@0.2.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.1 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -which@6.0.3 X -widestring@1.1.0 X X -windows@0.58.0 X X -windows-core@0.52.0 X X -windows-core@0.58.0 X X -windows-implement@0.58.0 X X -windows-interface@0.58.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -winsafe@0.0.19 X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aho-corasick@1.1.3 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anstream@0.6.18 X X +anstyle@1.0.10 X X +anstyle-parse@0.2.6 X X +anstyle-query@1.1.2 X X +anstyle-wincon@3.0.6 X X +anyhow@1.0.95 X X +async-notify@0.3.0 X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.22.1 X X +bincode@1.3.3 X +bitflags@2.6.0 X X +block-buffer@0.10.4 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cc@1.2.7 X X +cfg-if@1.0.0 X X +cfg_aliases@0.2.1 X +chrono@0.4.39 X X +clap@4.5.24 X X +clap_builder@4.5.24 X X +clap_derive@4.5.24 X X +clap_lex@0.7.4 X X +cloud-filter@0.0.5 X +cloud_filter_opendal@0.0.4 X +colorchoice@1.0.3 X X +concurrent-queue@2.5.0 X X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crossbeam-utils@0.8.21 X X +crypto-common@0.1.6 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +dotenvy@0.15.7 X +either@1.13.0 X X +env_filter@0.1.3 X X +env_logger@0.11.6 X X +errno@0.3.10 X X +event-listener@4.0.3 X X +fastrand@2.3.0 X X +flagset@0.4.6 X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +fuse3@0.8.1 X +fuse3_opendal@0.0.11 X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-executor@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +heck@0.5.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +humantime@2.1.0 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +ipnet@2.10.1 X X +is_terminal_polyfill@1.70.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +lazy_static@1.5.0 X X +libc@0.2.169 X X +linux-raw-sys@0.4.15 X X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +memoffset@0.9.1 X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +nix@0.29.0 X +nt-time@0.8.1 X X +num-conv@0.1.0 X X +num-traits@0.2.19 X X +object@0.36.7 X X +ofs@0.0.16 X +once_cell@1.20.2 X X +opendal@0.51.1 X +parking@2.2.1 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +regex@1.11.1 X X +regex-automata@0.4.9 X X +regex-syntax@0.8.5 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustix@0.38.43 X X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +sharded-slab@0.1.7 X +shlex@1.3.0 X X +signal-hook-registry@1.4.2 X X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +stable_deref_trait@1.2.0 X X +strsim@0.11.1 X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-macros@2.4.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X +trait-make@0.1.0 X X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +utf8parse@0.2.2 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +which@6.0.3 X +widestring@1.1.0 X X +windows@0.58.0 X X +windows-core@0.52.0 X X +windows-core@0.58.0 X X +windows-implement@0.58.0 X X +windows-interface@0.58.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +winsafe@0.0.19 X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bin/oli/Cargo.lock b/bin/oli/Cargo.lock index 91b109ea7548..beaba4083904 100644 --- a/bin/oli/Cargo.lock +++ b/bin/oli/Cargo.lock @@ -94,9 +94,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "assert_cmd" @@ -116,9 +116,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", @@ -201,9 +201,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786a307d683a5bf92e6fd5fd69a7eb613751668d1d8d67d802846dfe367c62c8" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", "regex-automata", @@ -239,9 +239,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.5" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "shlex", ] @@ -284,9 +284,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.23" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd" dependencies = [ "clap_builder", "clap_derive", @@ -294,9 +294,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd" dependencies = [ "anstream", "anstyle", @@ -306,9 +306,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck", "proc-macro2", @@ -1099,9 +1099,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -1238,16 +1238,16 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.6" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08dde84f120894086dbb40c7a0257f76fdc72b6f52cdb56c2b5121b2f81b0c83" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "oli" -version = "0.41.14" +version = "0.41.15" dependencies = [ "anyhow", "assert_cmd", @@ -1277,7 +1277,7 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opendal" -version = "0.51.0" +version = "0.51.1" dependencies = [ "anyhow", "async-trait", @@ -1385,9 +1385,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1529,7 +1529,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.8", + "thiserror 2.0.9", "tokio", "tracing", ] @@ -1548,7 +1548,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.8", + "thiserror 2.0.9", "tinyvec", "tracing", "web-time", @@ -1570,9 +1570,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1666,9 +1666,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", @@ -1698,6 +1698,7 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -1778,9 +1779,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ "bitflags", "errno", @@ -1872,18 +1873,18 @@ checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -1892,9 +1893,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ "itoa", "memchr", @@ -2043,9 +2044,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -2074,12 +2075,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys 0.59.0", @@ -2102,11 +2104,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "thiserror-impl 2.0.8", + "thiserror-impl 2.0.9", ] [[package]] @@ -2122,9 +2124,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", @@ -2282,6 +2284,27 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -2710,9 +2733,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" dependencies = [ "memchr", ] diff --git a/bin/oli/Cargo.toml b/bin/oli/Cargo.toml index 84b91d6247bc..03a2b9078b87 100644 --- a/bin/oli/Cargo.toml +++ b/bin/oli/Cargo.toml @@ -27,7 +27,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.41.14" +version = "0.41.15" [dependencies] anyhow = { version = "1.0" } @@ -54,13 +54,13 @@ opendal = { version = "0.51.0", path = "../../core", features = [ "services-webhdfs", "services-azfile", ] } +parse-size = { version = "1.1" } pollster = { version = "0.4" } serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.42", features = ["full"] } toml = { version = "0.8" } url = { version = "2.5" } uuid = { version = "1.11" } -parse-size = { version = "1.1" } [dev-dependencies] assert_cmd = { version = "2.0" } diff --git a/bin/oli/DEPENDENCIES.rust.tsv b/bin/oli/DEPENDENCIES.rust.tsv index d3952db2b54e..565fdda57484 100644 --- a/bin/oli/DEPENDENCIES.rust.tsv +++ b/bin/oli/DEPENDENCIES.rust.tsv @@ -1,240 +1,265 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anstream@0.6.15 X X -anstyle@1.0.8 X X -anstyle-parse@0.2.5 X X -anstyle-query@1.1.1 X X -anstyle-wincon@3.0.4 X X -anyhow@1.0.90 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -bitflags@2.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.7.2 X -cbc@0.1.2 X X -cc@1.1.31 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -clap@4.5.20 X X -clap_builder@4.5.20 X X -clap_derive@4.5.18 X X -clap_lex@0.7.2 X X -colorchoice@1.0.2 X X -console@0.15.8 X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dirs@5.0.1 X X -dirs-sys@0.4.1 X X -dlv-list@0.5.2 X X -encode_unicode@0.3.6 X X -equivalent@1.0.1 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-executor@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hashbrown@0.15.0 X X -heck@0.5.0 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.9 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -indexmap@2.6.0 X X -indicatif@0.17.9 X -inout@0.1.3 X X -ipnet@2.10.1 X X -is_terminal_polyfill@1.70.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.8 X X -libredox@0.1.3 X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -number_prefix@0.4.0 X -object@0.36.5 X X -oli@0.41.14 X -once_cell@1.20.2 X X -opendal@0.51.0 X -option-ext@0.2.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.14 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -portable-atomic@1.10.0 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.88 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -redox_users@0.4.6 X -reqsign@0.16.1 X -reqwest@0.12.8 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.15 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.215 X X -serde_derive@1.0.215 X X -serde_json@1.0.132 X X -serde_spanned@0.6.8 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -strsim@0.11.1 X -subtle@2.6.1 X -syn@2.0.81 X X -sync_wrapper@1.0.1 X -thiserror@1.0.64 X X -thiserror-impl@1.0.64 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.40.0 X -tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -toml@0.8.19 X X -toml_datetime@0.6.8 X X -toml_edit@0.22.22 X X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -unicode-width@0.1.14 X X -unicode-width@0.2.0 X X -untrusted@0.9.0 X -url@2.5.2 X X -utf8parse@0.2.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.1 X X -web-sys@0.3.72 X X -web-time@1.1.0 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.48.0 X X -windows-sys@0.52.0 X X -windows-targets@0.48.5 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.48.5 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.48.5 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.48.5 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.48.5 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.48.5 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.48.5 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.48.5 X X -windows_x86_64_msvc@0.52.6 X X -winnow@0.6.20 X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anstream@0.6.18 X X +anstyle@1.0.10 X X +anstyle-parse@0.2.6 X X +anstyle-query@1.1.2 X X +anstyle-wincon@3.0.6 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +bitflags@2.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +clap@4.5.24 X X +clap_builder@4.5.24 X X +clap_derive@4.5.24 X X +clap_lex@0.7.4 X X +colorchoice@1.0.3 X X +console@0.15.10 X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +dirs@5.0.1 X X +dirs-sys@0.4.1 X X +displaydoc@0.2.5 X X +encode_unicode@1.0.0 X X +equivalent@1.0.1 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-executor@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hashbrown@0.15.2 X X +heck@0.5.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +humansize@2.1.3 X X +humantime@2.1.0 X X +humantime-serde@1.1.1 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +indexmap@2.7.0 X X +indicatif@0.17.9 X +inout@0.1.3 X X +ipnet@2.10.1 X X +is_terminal_polyfill@1.70.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +libredox@0.1.3 X +litemap@0.7.4 X +lock_api@0.4.12 X X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +number_prefix@0.4.0 X +object@0.36.7 X X +oli@0.41.15 X +once_cell@1.20.2 X X +opendal@0.51.1 X +option-ext@0.2.0 X +parking_lot@0.12.3 X X +parking_lot_core@0.9.10 X X +parse-size@1.1.0 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +pollster@0.4.0 X X +portable-atomic@1.10.0 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +redox_syscall@0.5.8 X +redox_users@0.4.6 X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scopeguard@1.2.0 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_spanned@0.6.8 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signal-hook-registry@1.4.2 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +strsim@0.11.1 X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-macros@2.4.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +toml@0.8.19 X X +toml_datetime@0.6.8 X X +toml_edit@0.22.22 X X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +unicode-width@0.2.0 X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +utf8parse@0.2.2 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +web-time@1.1.0 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.48.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.48.5 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.48.5 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.48.5 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.48.5 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.48.5 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.48.5 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.48.5 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.48.5 X X +windows_x86_64_msvc@0.52.6 X X +winnow@0.6.22 X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/c/Cargo.toml b/bindings/c/Cargo.toml index a7d622949e75..723d270938ee 100644 --- a/bindings/c/Cargo.toml +++ b/bindings/c/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.45.2" +version = "0.45.3" [lib] crate-type = ["cdylib", "staticlib"] diff --git a/bindings/c/DEPENDENCIES.rust.tsv b/bindings/c/DEPENDENCIES.rust.tsv index d675a6482f07..4c0b6bab84a2 100644 --- a/bindings/c/DEPENDENCIES.rust.tsv +++ b/bindings/c/DEPENDENCIES.rust.tsv @@ -1,219 +1,233 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -atty@0.2.14 X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -bitflags@1.3.2 X X -bitflags@2.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cbindgen@0.26.0 X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -clap@3.2.25 X X -clap_lex@0.2.4 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -errno@0.3.9 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.12.3 X X -hashbrown@0.14.5 X X -heck@0.4.1 X X -hermit-abi@0.1.19 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -indexmap@1.9.3 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.11 X X -linux-raw-sys@0.4.14 X X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-c@0.46.0 X -ordered-multimap@0.7.3 X -os_str_bytes@6.6.1 X X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustix@0.38.38 X X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -strsim@0.10.0 X -subtle@2.6.1 X -syn@1.0.109 X X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -tempfile@3.13.0 X X -termcolor@1.4.1 X X -textwrap@0.16.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -toml@0.5.11 X X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -winapi@0.3.9 X X -winapi-i686-pc-windows-gnu@0.4.0 X X -winapi-util@0.1.9 X X -winapi-x86_64-pc-windows-gnu@0.4.0 X X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-sys@0.59.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +atty@0.2.14 X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +bitflags@1.3.2 X X +bitflags@2.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cbindgen@0.26.0 X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +clap@3.2.25 X X +clap_lex@0.2.4 X X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +errno@0.3.10 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hashbrown@0.12.3 X X +heck@0.4.1 X X +hermit-abi@0.1.19 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +indexmap@1.9.3 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +linux-raw-sys@0.4.15 X X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-c@0.45.3 X +os_str_bytes@6.6.1 X X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustix@0.38.43 X X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +strsim@0.10.0 X +subtle@2.6.1 X +syn@1.0.109 X X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +tempfile@3.15.0 X X +termcolor@1.4.1 X X +textwrap@0.16.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-macros@2.4.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +toml@0.5.11 X X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +winapi@0.3.9 X X +winapi-i686-pc-windows-gnu@0.4.0 X X +winapi-util@0.1.9 X X +winapi-x86_64-pc-windows-gnu@0.4.0 X X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/cpp/Cargo.toml b/bindings/cpp/Cargo.toml index 1a4be0576370..9d91c23c0965 100644 --- a/bindings/cpp/Cargo.toml +++ b/bindings/cpp/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.45.14" +version = "0.45.15" [lib] crate-type = ["staticlib"] diff --git a/bindings/cpp/DEPENDENCIES.rust.tsv b/bindings/cpp/DEPENDENCIES.rust.tsv index 2e9cfbcd3503..d030273deac0 100644 --- a/bindings/cpp/DEPENDENCIES.rust.tsv +++ b/bindings/cpp/DEPENDENCIES.rust.tsv @@ -1,204 +1,220 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -codespan-reporting@0.11.1 X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -cxx@1.0.129 X X -cxx-build@1.0.129 X X -cxxbridge-flags@1.0.129 X X -cxxbridge-macro@1.0.129 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.11 X X -link-cplusplus@1.0.9 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-cpp@0.46.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scratch@1.0.7 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -termcolor@1.4.1 X X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -unicode-width@0.1.14 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -winapi-util@0.1.9 X X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-sys@0.59.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +codespan-reporting@0.11.1 X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +cxx@1.0.136 X X +cxx-build@1.0.136 X X +cxxbridge-flags@1.0.136 X X +cxxbridge-macro@1.0.136 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +foldhash@0.1.4 X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +link-cplusplus@1.0.9 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-cpp@0.45.15 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +rustversion@1.0.19 X X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scratch@1.0.7 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +termcolor@1.4.1 X X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +unicode-width@0.1.14 X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +winapi-util@0.1.9 X X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/dotnet/Cargo.toml b/bindings/dotnet/Cargo.toml index 03423c45640b..cf00bce4e0eb 100644 --- a/bindings/dotnet/Cargo.toml +++ b/bindings/dotnet/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "opendal-dotnet" publish = false -version = "0.1.12" +version = "0.1.13" authors = ["Apache OpenDAL "] edition = "2021" diff --git a/bindings/dotnet/DEPENDENCIES.rust.tsv b/bindings/dotnet/DEPENDENCIES.rust.tsv index f665272cdb8c..33deefb1f63f 100644 --- a/bindings/dotnet/DEPENDENCIES.rust.tsv +++ b/bindings/dotnet/DEPENDENCIES.rust.tsv @@ -1,193 +1,208 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.11 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-dotnet@0.2.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-dotnet@0.1.13 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/haskell/Cargo.toml b/bindings/haskell/Cargo.toml index 920a7cebaecf..97f2126171f7 100644 --- a/bindings/haskell/Cargo.toml +++ b/bindings/haskell/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.44.14" +version = "0.44.15" [lib] crate-type = ["cdylib"] diff --git a/bindings/haskell/DEPENDENCIES.rust.tsv b/bindings/haskell/DEPENDENCIES.rust.tsv index b716d0afe5cf..1a3fea8f1917 100644 --- a/bindings/haskell/DEPENDENCIES.rust.tsv +++ b/bindings/haskell/DEPENDENCIES.rust.tsv @@ -1,193 +1,208 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.11 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-hs@0.45.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-hs@0.44.15 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/haskell/opendal.cabal b/bindings/haskell/opendal.cabal index 5270379a19a0..520e6a989e7f 100644 --- a/bindings/haskell/opendal.cabal +++ b/bindings/haskell/opendal.cabal @@ -17,7 +17,7 @@ cabal-version: 3.0 -- under the License. name: opendal -version: 0.44.14.0 +version: 0.44.15.0 license: Apache-2.0 synopsis: Apache OpenDALâ„¢ Haskell Binding description: diff --git a/bindings/java/Cargo.toml b/bindings/java/Cargo.toml index 5458f75b3686..c6b77acf2f8a 100644 --- a/bindings/java/Cargo.toml +++ b/bindings/java/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.47.6" +version = "0.47.7" [lib] crate-type = ["cdylib"] diff --git a/bindings/java/DEPENDENCIES.rust.tsv b/bindings/java/DEPENDENCIES.rust.tsv index f5cdd46c7c68..11225ea4df8f 100644 --- a/bindings/java/DEPENDENCIES.rust.tsv +++ b/bindings/java/DEPENDENCIES.rust.tsv @@ -1,251 +1,261 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.22.0 X X -adler@1.0.2 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.86 X X -arc-swap@1.7.1 X X -async-trait@0.1.81 X X -autocfg@1.3.0 X X -awaitable@0.4.0 X -awaitable-error@0.1.0 X -backon@1.2.0 X -backtrace@0.3.73 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -bb8@0.8.5 X -bitflags@2.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.7.1 X -cbc@0.1.2 X X -cc@1.1.15 X X -cesu8@1.1.0 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -combine@4.6.7 X -concurrent_arena@0.1.8 X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.13 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -derive_destructure2@0.1.3 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -errno@0.3.9 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.30 X X -futures-channel@0.3.30 X X -futures-core@0.3.30 X X -futures-io@0.3.30 X X -futures-macro@0.3.30 X X -futures-sink@0.3.30 X X -futures-task@0.3.30 X X -futures-util@0.3.30 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.29.0 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.4 X X -hyper@1.4.1 X -hyper-rustls@0.27.2 X X X -hyper-util@0.1.7 X -iana-time-zone@0.1.60 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.9.0 X X -itoa@1.0.11 X X -jni@0.21.1 X X -jni-sys@0.3.0 X X -js-sys@0.3.70 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.158 X X -libm@0.2.8 X X -linux-raw-sys@0.4.14 X X X -lock_api@0.4.12 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.7.4 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-derive@0.3.3 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.3 X X -once_cell@1.19.0 X X -opendal@0.51.0 X -opendal-java@0.48.0 X -openssh@0.11.2 X X -openssh-sftp-client@0.15.2 X -openssh-sftp-client-lowlevel@0.7.1 X -openssh-sftp-error@0.5.1 X -openssh-sftp-protocol@0.24.0 X -openssh-sftp-protocol-error@0.1.0 X -ordered-multimap@0.7.3 X -parking_lot@0.12.3 X X -parking_lot_core@0.9.10 X X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project@1.1.5 X X -pin-project-internal@1.1.5 X X -pin-project-lite@0.2.14 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.86 X X -quick-xml@0.35.0 X -quick-xml@0.36.1 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -redox_syscall@0.5.3 X -reqsign@0.16.1 X -reqwest@0.12.7 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustix@0.38.35 X X X -rustls@0.23.12 X X X -rustls-pemfile@2.1.3 X X X -rustls-pki-types@1.8.0 X X -rustls-webpki@0.102.7 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -same-file@1.0.6 X X -scopeguard@1.2.0 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.209 X X -serde_derive@1.0.209 X X -serde_json@1.0.127 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shell-escape@0.1.5 X X -shlex@1.3.0 X X -signal-hook-registry@1.4.2 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -ssh_format@0.14.1 X -ssh_format_error@0.1.0 X -stable_deref_trait@1.2.0 X X -subtle@2.6.1 X -syn@1.0.109 X X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -tempfile@3.12.0 X X -thin-vec@0.2.13 X X -thiserror@1.0.63 X X -thiserror@2.0.6 X X -thiserror-impl@1.0.63 X X -thiserror-impl@2.0.6 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.40.0 X -tokio-io-utility@0.7.6 X -tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.11 X -tower@0.4.13 X -tower-layer@0.3.3 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -triomphe@0.1.11 X X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.15 X X -unicode-ident@1.0.12 X X X -unicode-normalization@0.1.23 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.10.0 X X -vec-strings@0.4.8 X -version_check@0.9.5 X X -walkdir@2.5.0 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.93 X X -wasm-bindgen-backend@0.2.93 X X -wasm-bindgen-futures@0.4.43 X X -wasm-bindgen-macro@0.2.93 X X -wasm-bindgen-macro-support@0.2.93 X X -wasm-bindgen-shared@0.2.93 X X -wasm-streams@0.4.0 X X -web-sys@0.3.70 X X -webpki-roots@0.26.3 X -winapi-util@0.1.9 X X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.45.0 X X -windows-sys@0.52.0 X X -windows-sys@0.59.0 X X -windows-targets@0.42.2 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.42.2 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.42.2 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.42.2 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.42.2 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.42.2 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.42.2 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.42.2 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +arc-swap@1.7.1 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +awaitable@0.4.0 X +awaitable-error@0.1.0 X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +bb8@0.8.6 X +bitflags@2.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cesu8@1.1.0 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +combine@4.6.7 X +concurrent_arena@0.1.10 X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +derive_destructure2@0.1.3 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +errno@0.3.10 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +jni@0.21.1 X X +jni-sys@0.3.0 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +linux-raw-sys@0.4.15 X X X +litemap@0.7.4 X +lock_api@0.4.12 X X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-derive@0.4.2 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-java@0.47.7 X +openssh@0.11.4 X X +openssh-sftp-client@0.15.2 X +openssh-sftp-client-lowlevel@0.7.1 X +openssh-sftp-error@0.5.1 X +openssh-sftp-protocol@0.24.1 X +openssh-sftp-protocol-error@0.1.1 X +parking_lot@0.12.3 X X +parking_lot_core@0.9.10 X X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project@1.1.8 X X +pin-project-internal@1.1.8 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +redox_syscall@0.5.8 X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustix@0.38.43 X X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +same-file@1.0.6 X X +scopeguard@1.2.0 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shell-escape@0.1.5 X X +shlex@1.3.0 X X +signal-hook-registry@1.4.2 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +ssh_format@0.14.1 X +ssh_format_error@0.1.0 X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +tempfile@3.15.0 X X +thin-vec@0.2.13 X X +thiserror@1.0.69 X X +thiserror@2.0.9 X X +thiserror-impl@1.0.69 X X +thiserror-impl@2.0.9 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-io-utility@0.7.6 X +tokio-macros@2.4.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X +triomphe@0.1.14 X X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +vec-strings@0.4.8 X +version_check@0.9.5 X X +walkdir@2.5.0 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +winapi-util@0.1.9 X X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.45.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.42.2 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.42.2 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.42.2 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.42.2 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.42.2 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.42.2 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.42.2 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.42.2 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml index a9e719a36344..7cdb96220345 100644 --- a/bindings/java/pom.xml +++ b/bindings/java/pom.xml @@ -32,7 +32,7 @@ org.apache.opendal opendal - 0.47.6 + 0.47.7 Apache OpenDALâ„¢ diff --git a/bindings/lua/Cargo.toml b/bindings/lua/Cargo.toml index 22d3614c9742..83ea6da60d0a 100644 --- a/bindings/lua/Cargo.toml +++ b/bindings/lua/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "opendal-lua" publish = false -version = "0.1.12" +version = "0.1.13" authors = ["Apache OpenDAL "] edition = "2021" diff --git a/bindings/lua/DEPENDENCIES.rust.tsv b/bindings/lua/DEPENDENCIES.rust.tsv index 1609c640e859..9d397aff5211 100644 --- a/bindings/lua/DEPENDENCIES.rust.tsv +++ b/bindings/lua/DEPENDENCIES.rust.tsv @@ -1,208 +1,223 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -aho-corasick@1.1.3 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bstr@1.10.0 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -either@1.13.0 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itertools@0.12.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.11 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -mlua@0.9.9 X -mlua-sys@0.6.4 X -mlua_derive@0.9.3 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-lua@0.2.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -pkg-config@0.3.31 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro-error@1.0.4 X X -proc-macro-error-attr@1.0.4 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -regex@1.11.1 X X -regex-automata@0.4.8 X X -regex-syntax@0.8.5 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc-hash@2.0.0 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -subtle@2.6.1 X -syn@1.0.109 X X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +aho-corasick@1.1.3 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bstr@1.11.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +either@1.13.0 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itertools@0.12.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +mlua@0.9.9 X +mlua-sys@0.6.6 X +mlua_derive@0.9.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-lua@0.1.13 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +pkg-config@0.3.31 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro-error@1.0.4 X X +proc-macro-error-attr@1.0.4 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +regex@1.11.1 X X +regex-automata@0.4.9 X X +regex-syntax@0.8.5 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc-hash@2.1.0 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@1.0.109 X X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/lua/opendal-0.1.10-1.rockspec b/bindings/lua/opendal-0.1.13-1.rockspec similarity index 96% rename from bindings/lua/opendal-0.1.10-1.rockspec rename to bindings/lua/opendal-0.1.13-1.rockspec index 8d54d253138a..3fc7c26b0434 100644 --- a/bindings/lua/opendal-0.1.10-1.rockspec +++ b/bindings/lua/opendal-0.1.13-1.rockspec @@ -1,5 +1,5 @@ package = "opendal" -version = "0.1.10-1" +version = "0.1.13-1" source = { url = "git+https://github.com/apache/opendal/", diff --git a/bindings/nodejs/Cargo.toml b/bindings/nodejs/Cargo.toml index c6ea08df0967..d4dcc4cafe37 100644 --- a/bindings/nodejs/Cargo.toml +++ b/bindings/nodejs/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.47.8" +version = "0.47.9" [features] default = [ diff --git a/bindings/nodejs/DEPENDENCIES.rust.tsv b/bindings/nodejs/DEPENDENCIES.rust.tsv index da319db9139e..ea2306adf0a7 100644 --- a/bindings/nodejs/DEPENDENCIES.rust.tsv +++ b/bindings/nodejs/DEPENDENCIES.rust.tsv @@ -1,208 +1,223 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -aho-corasick@1.1.3 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -bitflags@2.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -convert_case@0.6.0 X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -ctor@0.2.8 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-executor@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libloading@0.8.5 X -libm@0.2.11 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -napi@2.16.13 X -napi-build@2.1.3 X -napi-derive@2.16.12 X -napi-derive-backend@1.0.74 X -napi-sys@2.4.0 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-nodejs@0.48.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -regex@1.11.1 X X -regex-automata@0.4.8 X X -regex-syntax@0.8.5 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -unicode-segmentation@1.12.0 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +aho-corasick@1.1.3 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +bitflags@2.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +const-oid@0.9.6 X X +convert_case@0.6.0 X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +ctor@0.2.9 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-executor@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libloading@0.8.6 X +libm@0.2.11 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +napi@2.16.13 X +napi-build@2.1.4 X +napi-derive@2.16.13 X +napi-derive-backend@1.0.75 X +napi-sys@2.4.0 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-nodejs@0.47.9 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +regex@1.11.1 X X +regex-automata@0.4.9 X X +regex-syntax@0.8.5 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +unicode-segmentation@1.12.0 X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/nodejs/npm/darwin-arm64/package.json b/bindings/nodejs/npm/darwin-arm64/package.json index 9b3623e26553..33bc423936bc 100644 --- a/bindings/nodejs/npm/darwin-arm64/package.json +++ b/bindings/nodejs/npm/darwin-arm64/package.json @@ -1,7 +1,7 @@ { "name": "@opendal/lib-darwin-arm64", "repository": "git@github.com/apache/opendal.git", - "version": "0.47.8", + "version": "0.47.9", "os": [ "darwin" ], diff --git a/bindings/nodejs/npm/darwin-x64/package.json b/bindings/nodejs/npm/darwin-x64/package.json index d7af8a5043df..9def33e6bfe4 100644 --- a/bindings/nodejs/npm/darwin-x64/package.json +++ b/bindings/nodejs/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@opendal/lib-darwin-x64", - "version": "0.47.8", + "version": "0.47.9", "repository": "git@github.com/apache/opendal.git", "os": [ "darwin" diff --git a/bindings/nodejs/npm/linux-arm64-gnu/package.json b/bindings/nodejs/npm/linux-arm64-gnu/package.json index 288893e28a26..270b0c773ac5 100644 --- a/bindings/nodejs/npm/linux-arm64-gnu/package.json +++ b/bindings/nodejs/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@opendal/lib-linux-arm64-gnu", - "version": "0.47.8", + "version": "0.47.9", "repository": "git@github.com/apache/opendal.git", "os": [ "linux" diff --git a/bindings/nodejs/npm/linux-arm64-musl/package.json b/bindings/nodejs/npm/linux-arm64-musl/package.json index 77aef5c5a6c6..f6b95c6ad9f8 100644 --- a/bindings/nodejs/npm/linux-arm64-musl/package.json +++ b/bindings/nodejs/npm/linux-arm64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@opendal/lib-linux-arm64-musl", - "version": "0.47.8", + "version": "0.47.9", "repository": "git@github.com/apache/opendal.git", "os": [ "linux" diff --git a/bindings/nodejs/npm/linux-x64-gnu/package.json b/bindings/nodejs/npm/linux-x64-gnu/package.json index 2013c68c2cda..33dbd34f63eb 100644 --- a/bindings/nodejs/npm/linux-x64-gnu/package.json +++ b/bindings/nodejs/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@opendal/lib-linux-x64-gnu", - "version": "0.47.8", + "version": "0.47.9", "repository": "git@github.com/apache/opendal.git", "os": [ "linux" diff --git a/bindings/nodejs/npm/win32-arm64-msvc/package.json b/bindings/nodejs/npm/win32-arm64-msvc/package.json index e161a8442952..ee75bbd6730b 100644 --- a/bindings/nodejs/npm/win32-arm64-msvc/package.json +++ b/bindings/nodejs/npm/win32-arm64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@opendal/lib-win32-arm64-msvc", - "version": "0.47.8", + "version": "0.47.9", "repository": "git@github.com/apache/opendal.git", "os": [ "win32" diff --git a/bindings/nodejs/npm/win32-x64-msvc/package.json b/bindings/nodejs/npm/win32-x64-msvc/package.json index dca3da72517d..0c54997d7b4c 100644 --- a/bindings/nodejs/npm/win32-x64-msvc/package.json +++ b/bindings/nodejs/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@opendal/lib-win32-x64-msvc", - "version": "0.47.8", + "version": "0.47.9", "repository": "git@github.com/apache/opendal.git", "os": [ "win32" diff --git a/bindings/nodejs/package.json b/bindings/nodejs/package.json index aa3f22a6d48f..9048ce8b9582 100644 --- a/bindings/nodejs/package.json +++ b/bindings/nodejs/package.json @@ -1,7 +1,7 @@ { "name": "opendal", "author": "Apache OpenDAL ", - "version": "0.47.8", + "version": "0.47.9", "license": "Apache-2.0", "main": "index.js", "types": "index.d.ts", diff --git a/bindings/ocaml/DEPENDENCIES.rust.tsv b/bindings/ocaml/DEPENDENCIES.rust.tsv index 5008c03dc591..0d9cf658266e 100644 --- a/bindings/ocaml/DEPENDENCIES.rust.tsv +++ b/bindings/ocaml/DEPENDENCIES.rust.tsv @@ -1,199 +1,214 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -cty@0.2.2 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.11 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -ocaml@1.0.1 X -ocaml-boxroot-sys@0.3.1 X -ocaml-build@1.0.0 X -ocaml-derive@1.0.0 X -ocaml-sys@0.24.0 X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-ocaml@0.0.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +cty@0.2.2 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +ocaml@1.1.0 X +ocaml-boxroot-sys@0.3.1 X +ocaml-build@1.0.0 X +ocaml-derive@1.0.0 X +ocaml-sys@0.25.0 X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-ocaml@0.0.0 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/php/Cargo.toml b/bindings/php/Cargo.toml index 7a30c4135946..13661f8fc81c 100644 --- a/bindings/php/Cargo.toml +++ b/bindings/php/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "opendal-php" publish = false -version = "0.1.11" +version = "0.1.12" authors = ["Apache OpenDAL "] edition = "2021" diff --git a/bindings/php/DEPENDENCIES.rust.tsv b/bindings/php/DEPENDENCIES.rust.tsv index 95fa5fc0936a..5c8dc0e6640d 100644 --- a/bindings/php/DEPENDENCIES.rust.tsv +++ b/bindings/php/DEPENDENCIES.rust.tsv @@ -1,13 +1,13 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X aes@0.8.4 X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X autocfg@1.4.0 X X -backon@1.2.0 X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.21.7 X X base64@0.22.1 X X @@ -19,30 +19,27 @@ block-padding@0.3.3 X X bumpalo@3.16.0 X X bytecount@0.6.8 X X byteorder@1.5.0 X X -bytes@1.8.0 X +bytes@1.9.0 X bzip2@0.4.4 X X bzip2-sys@0.1.11+1.0.8 X X camino@1.1.9 X X -cargo-platform@0.1.8 X X +cargo-platform@0.1.9 X X cargo_metadata@0.14.2 X cbc@0.1.2 X X -cc@1.1.34 X X +cc@1.2.7 X X cexpr@0.6.0 X X cfg-if@1.0.0 X X -chrono@0.4.38 X X +chrono@0.4.39 X X cipher@0.4.4 X X clang-sys@1.8.1 X const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X constant_time_eq@0.1.5 X core-foundation@0.9.4 X X core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X +cpufeatures@0.2.16 X X crc32c@0.6.8 X X crc32fast@1.4.2 X X -crossbeam-utils@0.8.20 X X -crunchy@0.2.2 X +crossbeam-utils@0.8.21 X X crypto-common@0.1.6 X X darling@0.14.4 X darling_core@0.14.4 X @@ -50,14 +47,14 @@ darling_macro@0.14.4 X der@0.7.9 X X deranged@0.3.11 X X digest@0.10.7 X X -dlv-list@0.5.2 X X +displaydoc@0.2.5 X X either@1.13.0 X X -errno@0.3.9 X X +errno@0.3.10 X X error-chain@0.12.4 X X ext-php-rs@0.11.2 X X ext-php-rs-derive@0.10.1 X X -fastrand@2.1.1 X X -flate2@1.0.34 X X +fastrand@2.3.0 X X +flate2@1.0.35 X X fnv@1.0.7 X X foreign-types@0.3.2 X X foreign-types-shared@0.1.1 X X @@ -73,44 +70,54 @@ futures-util@0.3.31 X X generic-array@0.14.7 X getrandom@0.2.15 X X gimli@0.31.1 X X -glob@0.3.1 X X +glob@0.3.2 X X gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X hex@0.4.3 X X hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X +home@0.5.11 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X ident_case@1.0.1 X X -idna@0.5.0 X X +idna@1.0.3 X X +idna_adapter@1.2.0 X X inout@0.1.3 X X ipnet@2.10.1 X X -itoa@1.0.11 X X +itoa@1.0.14 X X jobserver@0.1.32 X X -js-sys@0.3.72 X X +js-sys@0.3.76 X X jsonwebtoken@9.3.0 X lazy_static@1.5.0 X X lazycell@1.3.0 X X -libc@0.2.161 X X -libloading@0.8.5 X +libc@0.2.169 X X +libloading@0.8.6 X libm@0.2.11 X X -linux-raw-sys@0.4.14 X X X +linux-raw-sys@0.4.15 X X X +litemap@0.7.4 X lock_api@0.4.12 X X log@0.4.22 X X md-5@0.10.6 X X memchr@2.7.4 X X mime@0.3.17 X X minimal-lexical@0.2.1 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X native-tls@0.2.12 X X nom@7.1.3 X num-bigint@0.4.6 X X @@ -119,15 +126,14 @@ num-conv@0.1.0 X X num-integer@0.1.46 X X num-iter@0.1.45 X X num-traits@0.2.19 X X -object@0.36.5 X X +object@0.36.7 X X once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-php@0.2.0 X +opendal@0.51.1 X +opendal-php@0.1.12 X openssl@0.10.68 X openssl-macros@0.1.1 X X openssl-probe@0.1.5 X X openssl-sys@0.9.104 X -ordered-multimap@0.7.3 X parking_lot@0.12.3 X X parking_lot_core@0.9.10 X X password-hash@0.4.2 X X @@ -137,7 +143,7 @@ peeking_take_while@0.1.2 X X pem@3.0.4 X pem-rfc7468@0.7.0 X X percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X pkcs1@0.7.5 X X pkcs5@0.7.1 X X @@ -145,44 +151,43 @@ pkcs8@0.10.2 X X pkg-config@0.3.31 X X powerfmt@0.2.0 X X ppv-lite86@0.2.20 X X -prettyplease@0.2.25 X X -proc-macro2@1.0.89 X X +prettyplease@0.2.27 X X +proc-macro2@1.0.92 X X pulldown-cmark@0.9.6 X quick-xml@0.35.0 X quick-xml@0.36.2 X -quote@1.0.37 X X +quote@1.0.38 X X rand@0.8.5 X X rand_chacha@0.3.1 X X rand_core@0.6.4 X X -redox_syscall@0.5.7 X +redox_syscall@0.5.8 X regex@1.11.1 X X -regex-automata@0.4.8 X X +regex-automata@0.4.9 X X regex-syntax@0.8.5 X X reqsign@0.16.1 X -reqwest@0.12.9 X X +reqwest@0.12.12 X X ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X +rsa@0.9.7 X X rustc-demangle@0.1.24 X X rustc-hash@1.1.0 X X rustc_version@0.4.1 X X -rustix@0.38.38 X X X -rustls@0.23.16 X X X +rustix@0.38.43 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X ryu@1.0.18 X X salsa20@0.10.2 X X same-file@1.0.6 X X -schannel@0.1.26 X +schannel@0.1.27 X scopeguard@1.2.0 X X scrypt@0.11.0 X X security-framework@2.11.1 X X -security-framework-sys@2.12.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X +security-framework-sys@2.14.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_urlencoded@0.7.1 X X sha1@0.10.6 X X sha2@0.10.8 X X @@ -192,54 +197,55 @@ simple_asn1@0.6.2 X skeptic@0.13.7 X X slab@0.4.9 X smallvec@1.13.2 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X spki@0.7.3 X X +stable_deref_trait@1.2.0 X X strsim@0.10.0 X subtle@2.6.1 X syn@1.0.109 X X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -tempfile@3.13.0 X X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +tempfile@3.15.0 X X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X +tracing@0.1.41 X +tracing-core@0.1.33 X try-lock@0.2.5 X typenum@1.17.0 X X -unicase@2.8.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unicase@2.8.1 X X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -ureq@2.10.1 X X -url@2.5.2 X X +ureq@2.12.1 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X vcpkg@0.2.15 X X version_check@0.9.5 X X walkdir@2.5.0 X X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X which@4.4.2 X winapi-util@0.1.9 X X windows-core@0.52.0 X X @@ -257,9 +263,17 @@ windows_i686_msvc@0.52.6 X X windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X zerocopy@0.7.35 X X X zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X zip@0.6.6 X zstd@0.11.2+zstd.1.5.2 X zstd-safe@5.0.2+zstd.1.5.2 X X diff --git a/bindings/python/Cargo.toml b/bindings/python/Cargo.toml index 84c38d73e344..01a91ee29a39 100644 --- a/bindings/python/Cargo.toml +++ b/bindings/python/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.45.13" +version = "0.45.14" [features] default = [ @@ -164,7 +164,9 @@ bytes = "1.5.0" dict_derive = "0.6.0" futures = "0.3.28" # this crate won't be published, we always use the local version -opendal = { version = ">=0", path = "../../core", features = ["layers-blocking"] } +opendal = { version = ">=0", path = "../../core", features = [ + "layers-blocking", +] } pyo3 = { version = "0.23.3", features = ["generate-import-lib"] } pyo3-async-runtimes = { version = "0.23.0", features = ["tokio-runtime"] } tokio = "1" diff --git a/bindings/python/DEPENDENCIES.rust.tsv b/bindings/python/DEPENDENCIES.rust.tsv index 1764872e5226..a8d2ab7b6c2e 100644 --- a/bindings/python/DEPENDENCIES.rust.tsv +++ b/bindings/python/DEPENDENCIES.rust.tsv @@ -1,247 +1,261 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.91 X X -arc-swap@1.7.1 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -awaitable@0.4.0 X -awaitable-error@0.1.0 X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -bb8@0.8.6 X -bitflags@2.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.31 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -concurrent_arena@0.1.10 X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -derive_destructure2@0.1.3 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -errno@0.3.9 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-executor@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -heck@0.5.0 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.9 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -indoc@2.0.5 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -libc@0.2.161 X X -libm@0.2.10 X X -linux-raw-sys@0.4.14 X X X -lock_api@0.4.12 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -memoffset@0.9.1 X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-derive@0.3.3 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-python@0.46.0 X -openssh@0.11.2 X X -openssh-sftp-client@0.15.2 X -openssh-sftp-client-lowlevel@0.7.1 X -openssh-sftp-error@0.5.1 X -openssh-sftp-protocol@0.24.0 X -openssh-sftp-protocol-error@0.1.0 X -ordered-multimap@0.7.3 X -parking_lot@0.12.3 X X -parking_lot_core@0.9.10 X X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project@1.1.7 X X -pin-project-internal@1.1.7 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -portable-atomic@1.9.0 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -pyo3@0.23.3 X X -pyo3-async-runtimes@0.23.0 X -pyo3-build-config@0.23.3 X X -pyo3-ffi@0.23.3 X X -pyo3-macros@0.23.3 X X -pyo3-macros-backend@0.23.3 X X -python3-dll-a@0.2.11 X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -redox_syscall@0.5.7 X -reqsign@0.16.1 X -reqwest@0.12.8 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustix@0.38.38 X X X -rustls@0.23.15 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scopeguard@1.2.0 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -serde@1.0.213 X X -serde_derive@1.0.213 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shell-escape@0.1.5 X X -shlex@1.3.0 X X -signal-hook-registry@1.4.2 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -ssh_format@0.14.1 X -ssh_format_error@0.1.0 X -stable_deref_trait@1.2.0 X X -subtle@2.6.1 X -syn@1.0.109 X X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -target-lexicon@0.12.16 X -tempfile@3.13.0 X X -thin-vec@0.2.13 X X -thiserror@1.0.65 X X -thiserror@2.0.6 X X -thiserror-impl@1.0.65 X X -thiserror-impl@2.0.6 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-io-utility@0.7.6 X -tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -triomphe@0.1.11 X X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -unindent@0.2.3 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -vec-strings@0.4.8 X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-sys@0.59.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +arc-swap@1.7.1 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +awaitable@0.4.0 X +awaitable-error@0.1.0 X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +bb8@0.8.6 X +bitflags@2.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +concurrent_arena@0.1.10 X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +derive_destructure2@0.1.3 X X +dict_derive@0.6.0 X +digest@0.10.7 X X +displaydoc@0.2.5 X X +errno@0.3.10 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-executor@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +heck@0.5.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +indoc@2.0.5 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +libc@0.2.169 X X +libm@0.2.11 X X +linux-raw-sys@0.4.15 X X X +litemap@0.7.4 X +lock_api@0.4.12 X X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +memoffset@0.9.1 X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-derive@0.4.2 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-python@0.45.14 X +openssh@0.11.4 X X +openssh-sftp-client@0.15.2 X +openssh-sftp-client-lowlevel@0.7.1 X +openssh-sftp-error@0.5.1 X +openssh-sftp-protocol@0.24.1 X +openssh-sftp-protocol-error@0.1.1 X +parking_lot@0.12.3 X X +parking_lot_core@0.9.10 X X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project@1.1.8 X X +pin-project-internal@1.1.8 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +portable-atomic@1.10.0 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +pyo3@0.23.3 X X +pyo3-async-runtimes@0.23.0 X +pyo3-build-config@0.23.3 X X +pyo3-ffi@0.23.3 X X +pyo3-macros@0.23.3 X X +pyo3-macros-backend@0.23.3 X X +python3-dll-a@0.2.12 X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +redox_syscall@0.5.8 X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustix@0.38.43 X X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scopeguard@1.2.0 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shell-escape@0.1.5 X X +shlex@1.3.0 X X +signal-hook-registry@1.4.2 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +ssh_format@0.14.1 X +ssh_format_error@0.1.0 X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@1.0.109 X X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +target-lexicon@0.12.16 X +tempfile@3.15.0 X X +thin-vec@0.2.13 X X +thiserror@1.0.69 X X +thiserror@2.0.9 X X +thiserror-impl@1.0.69 X X +thiserror-impl@2.0.9 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-io-utility@0.7.6 X +tokio-macros@2.4.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X +triomphe@0.1.14 X X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +unindent@0.2.3 X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +vec-strings@0.4.8 X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/bindings/ruby/Cargo.toml b/bindings/ruby/Cargo.toml index f73bef37ace5..1962365a58df 100644 --- a/bindings/ruby/Cargo.toml +++ b/bindings/ruby/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "opendal-ruby" publish = false -version = "0.1.12" +version = "0.1.13" authors = ["Apache OpenDAL "] edition = "2021" diff --git a/bindings/ruby/DEPENDENCIES.rust.tsv b/bindings/ruby/DEPENDENCIES.rust.tsv index cd3e6a9507ad..f274c04b3f18 100644 --- a/bindings/ruby/DEPENDENCIES.rust.tsv +++ b/bindings/ruby/DEPENDENCIES.rust.tsv @@ -1,216 +1,231 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -aes@0.8.4 X X -aho-corasick@1.1.3 X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.21.7 X X -base64@0.22.1 X X -base64ct@1.6.0 X X -bindgen@0.69.5 X -bitflags@2.6.0 X X -block-buffer@0.10.4 X X -block-padding@0.3.3 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cbc@0.1.2 X X -cc@1.1.34 X X -cexpr@0.6.0 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cipher@0.4.4 X X -clang-sys@1.8.1 X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -der@0.7.9 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -either@1.13.0 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -glob@0.3.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -inout@0.1.3 X X -ipnet@2.10.1 X X -itertools@0.12.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -jsonwebtoken@9.3.0 X -lazy_static@1.5.0 X X -lazycell@1.3.0 X X -libc@0.2.161 X X -libloading@0.8.5 X -libm@0.2.11 X X -log@0.4.22 X X -magnus@0.7.1 X -magnus-macros@0.6.0 X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -minimal-lexical@0.2.1 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -nom@7.1.3 X -num-bigint@0.4.6 X X -num-bigint-dig@0.8.4 X X -num-conv@0.1.0 X X -num-integer@0.1.46 X X -num-iter@0.1.45 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -opendal-ruby@0.2.0 X -ordered-multimap@0.7.3 X -pbkdf2@0.12.2 X X -pem@3.0.4 X -pem-rfc7468@0.7.0 X X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -pkcs1@0.7.5 X X -pkcs5@0.7.1 X X -pkcs8@0.10.2 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -rb-sys@0.9.102 X X -rb-sys-build@0.9.102 X X -rb-sys-env@0.1.2 X X -regex@1.11.1 X X -regex-automata@0.4.8 X X -regex-syntax@0.8.5 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rsa@0.9.6 X X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc-hash@1.1.0 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -salsa20@0.10.2 X X -scrypt@0.11.0 X X -semver@1.0.23 X X -seq-macro@0.3.5 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shell-words@1.1.0 X X -shlex@1.3.0 X X -signature@2.2.0 X X -simple_asn1@0.6.2 X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -spki@0.7.3 X X -subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +aes@0.8.4 X X +aho-corasick@1.1.3 X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.21.7 X X +base64@0.22.1 X X +base64ct@1.6.0 X X +bindgen@0.69.5 X +bitflags@2.6.0 X X +block-buffer@0.10.4 X X +block-padding@0.3.3 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cbc@0.1.2 X X +cc@1.2.7 X X +cexpr@0.6.0 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cipher@0.4.4 X X +clang-sys@1.8.1 X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +der@0.7.9 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +either@1.13.0 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +glob@0.3.2 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +inout@0.1.3 X X +ipnet@2.10.1 X X +itertools@0.12.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +jsonwebtoken@9.3.0 X +lazy_static@1.5.0 X X +lazycell@1.3.0 X X +libc@0.2.169 X X +libloading@0.8.6 X +libm@0.2.11 X X +litemap@0.7.4 X +log@0.4.22 X X +magnus@0.7.1 X +magnus-macros@0.6.0 X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +minimal-lexical@0.2.1 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +nom@7.1.3 X +num-bigint@0.4.6 X X +num-bigint-dig@0.8.4 X X +num-conv@0.1.0 X X +num-integer@0.1.46 X X +num-iter@0.1.45 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +opendal-ruby@0.1.13 X +pbkdf2@0.12.2 X X +pem@3.0.4 X +pem-rfc7468@0.7.0 X X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +pkcs1@0.7.5 X X +pkcs5@0.7.1 X X +pkcs8@0.10.2 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +rb-sys@0.9.106 X X +rb-sys-build@0.9.106 X X +rb-sys-env@0.1.2 X X +regex@1.11.1 X X +regex-automata@0.4.9 X X +regex-syntax@0.8.5 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rsa@0.9.7 X X +rustc-demangle@0.1.24 X X +rustc-hash@1.1.0 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +salsa20@0.10.2 X X +scrypt@0.11.0 X X +semver@1.0.24 X X +seq-macro@0.3.5 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shell-words@1.1.0 X X +shlex@1.3.0 X X +signature@2.2.0 X X +simple_asn1@0.6.2 X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +spki@0.7.3 X X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/core/Cargo.lock b/core/Cargo.lock index 28417ce9e28b..c2200da5c530 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "ammonia" @@ -137,9 +137,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -152,36 +152,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -192,9 +192,9 @@ checksum = "ea50b14b7a4b9343f8c627a7a53c52076482bd4bdad0a24fd3ec533ed616cc2c" [[package]] name = "anyhow" -version = "1.0.90" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "approx" @@ -216,9 +216,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -249,9 +249,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" @@ -271,7 +271,7 @@ dependencies = [ "async-backtrace-attributes", "dashmap 5.5.3", "futures", - "loom", + "loom 0.5.6", "once_cell", "pin-project-lite", "rustc-hash 1.1.0", @@ -286,7 +286,7 @@ checksum = "affbba0d438add06462a0371997575927bc05052f7ec486e7a4ca405c956c3d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -355,9 +355,9 @@ dependencies = [ [[package]] name = "async-graphql" -version = "7.0.11" +version = "7.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ba6d24703c5adc5ba9116901b92ee4e4c0643c01a56c4fd303f3818638d7449" +checksum = "59fd6bd734afb8b6e4d0f84a3e77305ce0a7ccc60d70f6001cb5e1c3f38d8ff1" dependencies = [ "async-graphql-derive", "async-graphql-parser", @@ -369,26 +369,25 @@ dependencies = [ "fnv", "futures-timer", "futures-util", - "http 1.1.0", - "indexmap 2.6.0", + "http 1.2.0", + "indexmap 2.7.0", "mime", "multer", "num-traits", - "once_cell", "pin-project-lite", "regex", "serde", "serde_json", "serde_urlencoded", "static_assertions_next", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] name = "async-graphql-derive" -version = "7.0.11" +version = "7.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a94c2d176893486bd37cd1b6defadd999f7357bf5804e92f510c08bcf16c538f" +checksum = "ac38b4dd452d529d6c0248b51df23603f0a875770352e26ae8c346ce6c149b3e" dependencies = [ "Inflector", "async-graphql-parser", @@ -397,15 +396,15 @@ dependencies = [ "proc-macro2", "quote", "strum", - "syn 2.0.90", - "thiserror 1.0.64", + "syn 2.0.95", + "thiserror 1.0.69", ] [[package]] name = "async-graphql-parser" -version = "7.0.11" +version = "7.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79272bdbf26af97866e149f05b2b546edb5c00e51b5f916289931ed233e208ad" +checksum = "42d271ddda2f55b13970928abbcbc3423cfc18187c60e8769b48f21a93b7adaa" dependencies = [ "async-graphql-value", "pest", @@ -415,21 +414,21 @@ dependencies = [ [[package]] name = "async-graphql-value" -version = "7.0.11" +version = "7.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5ec94176a12a8cbe985cd73f2e54dc9c702c88c766bdef12f1f3a67cedbee1" +checksum = "aefe909173a037eaf3281b046dc22580b59a38b765d7b8d5116f2ffef098048d" dependencies = [ "bytes", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_json", ] [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", "cfg-if", @@ -450,7 +449,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] @@ -474,7 +473,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -532,7 +531,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -556,13 +555,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -619,7 +618,7 @@ checksum = "62f7df18977a1ee03650ee4b31b4aefed6d56bac188760b6e37610400fe8d4bb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -664,9 +663,9 @@ checksum = "d5b3469636cdf8543cceab175efca534471f36eee12fb8374aba00eb5e7e7f8a" [[package]] name = "aws-config" -version = "1.5.8" +version = "1.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7198e6f03240fdceba36656d8be440297b6b82270325908c7381f37d826a74f6" +checksum = "c03a50b30228d3af8865ce83376b4e99e1ffa34728220fe2860e4df0bb5278d6" dependencies = [ "aws-credential-types", "aws-runtime", @@ -704,38 +703,11 @@ dependencies = [ "zeroize", ] -[[package]] -name = "aws-lc-rs" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" -dependencies = [ - "bindgen 0.69.5", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - [[package]] name = "aws-runtime" -version = "1.4.3" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a10d5c055aa540164d9561a0e2e74ad30f0dcf7393c3a92f6733ddf9c5762468" +checksum = "b16d1aa50accc11a4b4d5c50f7fb81cc0cf60328259c587d0e6b0f11385bde46" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -759,11 +731,10 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.57.0" +version = "1.68.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8888c238bf93c77c5df8274b3999fd7fc1bb3fb658616f40dfde9e4fcd9efd94" +checksum = "bc5ddf1dc70287dc9a2f953766a1fe15e3e74aef02fd1335f2afa475c9b4f4fc" dependencies = [ - "ahash 0.8.11", "aws-credential-types", "aws-runtime", "aws-sigv4", @@ -794,9 +765,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.46.0" +version = "1.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc2faec3205d496c7e57eff685dd944203df7ce16a4116d0281c44021788a7b" +checksum = "1605dc0bf9f0a4b05b451441a17fcb0bda229db384f23bf5cead3adbab0664ac" dependencies = [ "aws-credential-types", "aws-runtime", @@ -816,9 +787,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.47.0" +version = "1.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c93c241f52bc5e0476e259c953234dab7e2a35ee207ee202e86c0095ec4951dc" +checksum = "59f3f73466ff24f6ad109095e0f3f2c830bfb4cd6c8b12f744c8e61ebf4d3ba1" dependencies = [ "aws-credential-types", "aws-runtime", @@ -838,9 +809,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.46.0" +version = "1.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b259429be94a3459fa1b00c5684faee118d74f9577cc50aebadc36e507c63b5f" +checksum = "249b2acaa8e02fd4718705a9494e3eb633637139aa4bb09d70965b0448e865db" dependencies = [ "aws-credential-types", "aws-runtime", @@ -861,9 +832,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.2.4" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8db6904450bafe7473c6ca9123f88cc11089e41a025408f992db4e22d3be68" +checksum = "7d3820e0c08d0737872ff3c7c1f21ebbb6693d832312d6152bf18ef50a5471c2" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -876,7 +847,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.1.0", + "http 1.2.0", "once_cell", "p256", "percent-encoding", @@ -890,9 +861,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62220bc6e97f946ddd51b5f1361f78996e704677afc518a4ff66b7a72ea1378c" +checksum = "427cb637d15d63d6f9aae26358e1c9a9c09d5aa490d64b09354c8217cfef0f28" dependencies = [ "futures-util", "pin-project-lite", @@ -901,9 +872,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.60.12" +version = "0.60.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598b1689d001c4d4dc3cb386adb07d37786783aee3ac4b324bcadac116bf3d23" +checksum = "ba1a71073fca26775c8b5189175ea8863afb1c9ea2cceb02a5de5ad9dfbaa795" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -954,9 +925,9 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.60.7" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4683df9469ef09468dad3473d129960119a0d3593617542b7d52086c8486f2d6" +checksum = "ee4e69cc50921eb913c6b662f8d909131bb3e6ad6cb6090d3a39b66fc5c52095" dependencies = [ "aws-smithy-types", ] @@ -973,9 +944,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.7.2" +version = "1.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a065c0fe6fdbdf9f11817eb68582b2ab4aff9e9c39e986ae48f7ec576c6322db" +checksum = "a05dd41a70fc74051758ee75b5c4db2c0ca070ed9229c3df50e9475cda1cb985" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -988,7 +959,7 @@ dependencies = [ "http-body 0.4.6", "http-body 1.0.1", "httparse", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.24.2", "once_cell", "pin-project-lite", @@ -1000,15 +971,15 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.7.2" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e086682a53d3aa241192aa110fa8dfce98f2f5ac2ead0de84d41582c7e8fdb96" +checksum = "92165296a47a812b267b4f41032ff8069ab7ff783696d217f0994a0d7ab585cd" dependencies = [ "aws-smithy-async", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.1.0", + "http 1.2.0", "pin-project-lite", "tokio", "tracing", @@ -1017,16 +988,16 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.2.7" +version = "1.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147100a7bea70fa20ef224a6bad700358305f5dc0f84649c53769761395b355b" +checksum = "38ddc9bd6c28aeb303477170ddd183760a956a03e083b3902a990238a7e3792d" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.1.0", + "http 1.2.0", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", @@ -1077,7 +1048,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "itoa", "matchit", "memchr", @@ -1094,15 +1065,15 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core 0.4.5", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "itoa", @@ -1113,8 +1084,8 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.1", - "tower 0.5.1", + "sync_wrapper 1.0.2", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -1145,22 +1116,22 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", ] [[package]] name = "backon" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4fa97bb310c33c811334143cf64c5bb2b7b3c06e453db6b095d7061eff8f113" +checksum = "ba5289ec98f68f28dd809fd601059e6aa908bb8f6108620930828283d4ee23d7" dependencies = [ "fastrand", "gloo-timers", @@ -1280,30 +1251,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", -] - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.6.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.90", - "which", + "syn 2.0.95", ] [[package]] @@ -1323,7 +1271,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -1379,9 +1327,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" dependencies = [ "arrayref", "arrayvec", @@ -1433,9 +1381,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" dependencies = [ "borsh-derive", "cfg_aliases", @@ -1443,16 +1391,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.90", - "syn_derive", + "syn 2.0.95", ] [[package]] @@ -1465,7 +1412,7 @@ dependencies = [ "base64 0.13.1", "bitvec", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "js-sys", "once_cell", "rand 0.8.5", @@ -1478,9 +1425,9 @@ dependencies = [ [[package]] name = "bufsize" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7864afba28009cd99a4d973c3de89cc766b800cdf1bd909966d454906f3bce5d" +checksum = "9f8a4e46ce09fc3179be25d4927caef87469d56cca38a6d6b9b1cadc9fc9ab7d" dependencies = [ "bytes", ] @@ -1521,9 +1468,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -1533,9 +1480,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -1563,9 +1510,9 @@ dependencies = [ [[package]] name = "cacache" -version = "13.0.0" +version = "13.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61ff12b19d89c752c213316b87fdb4a587f073d219b893cc56974b8c9f39bf7" +checksum = "5c5063741c7b2e260bbede781cf4679632dd90e2718e99f7715e46824b65670b" dependencies = [ "digest", "either", @@ -1582,7 +1529,7 @@ dependencies = [ "sha2", "ssri", "tempfile", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "tokio-stream", "walkdir", @@ -1599,9 +1546,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] @@ -1645,9 +1592,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "jobserver", "libc", @@ -1668,7 +1615,7 @@ dependencies = [ "serde", "serde_json", "smol_str", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -1691,7 +1638,7 @@ dependencies = [ "serde_with", "smol_str", "stacker", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -1707,7 +1654,7 @@ dependencies = [ "serde_with", "smol_str", "stacker", - "thiserror 1.0.64", + "thiserror 1.0.69", "unicode-security", ] @@ -1734,9 +1681,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1797,9 +1744,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd" dependencies = [ "clap_builder", "clap_derive", @@ -1807,9 +1754,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd" dependencies = [ "anstream", "anstyle", @@ -1819,36 +1766,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "cmake" -version = "0.1.51" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" -dependencies = [ - "cc", -] +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "coarsetime" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b3839cf01bb7960114be3ccf2340f541b6d0c81f8690b007b2b39f750f7e5d" +checksum = "4252bf230cb600c19826a575b31c8c9c84c6f11acfab6dfcad2e941b10b6f8e2" dependencies = [ "libc", "wasix", @@ -1857,9 +1795,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "combine" @@ -1894,9 +1832,9 @@ dependencies = [ [[package]] name = "compio-buf" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe0e1ba3af4fcf7ee139f145c3d085b5051e10c5fba16dec8ecbb4fd632a676" +checksum = "d14413106aad7dd931df3c4724110dabd731c81d52ba18edb4f2d57e7beb611b" dependencies = [ "arrayvec", "bytes", @@ -1917,9 +1855,9 @@ dependencies = [ [[package]] name = "compio-driver" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9390aaf493319bddd20bbe084a5062f33e133926fc4c3a2ed29a717f765788f" +checksum = "a6be49fe37cd203d925e3850522a47f453b4cb98960846be5e4ebae42e26a64c" dependencies = [ "aligned-array", "cfg-if", @@ -1928,7 +1866,7 @@ dependencies = [ "crossbeam-channel", "crossbeam-queue", "futures-util", - "io-uring", + "io-uring 0.7.3", "libc", "once_cell", "os_pipe", @@ -2052,16 +1990,6 @@ dependencies = [ "triomphe", ] -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - [[package]] name = "const-cstr" version = "0.3.0" @@ -2124,9 +2052,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -2210,18 +2138,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -2238,18 +2166,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -2329,7 +2257,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2340,7 +2268,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2408,10 +2336,10 @@ dependencies = [ ] [[package]] -name = "derivative" -version = "2.2.0" +name = "derive-new" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" dependencies = [ "proc-macro2", "quote", @@ -2419,25 +2347,25 @@ dependencies = [ ] [[package]] -name = "derive-new" -version = "0.5.9" +name = "derive-where" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.95", ] [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2458,7 +2386,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2468,7 +2396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2479,7 +2407,7 @@ checksum = "64b697ac90ff296f0fc031ee5a61c7ac31fb9fff50e3fb32873b09223613fc0c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2492,7 +2420,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2549,6 +2477,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "dlv-list" version = "0.5.2" @@ -2597,12 +2536,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - [[package]] name = "earcutr" version = "0.4.3" @@ -2627,7 +2560,7 @@ dependencies = [ [[package]] name = "edge_test_aws_s3_assume_role_with_web_identity" -version = "0.50.1" +version = "0.51.1" dependencies = [ "opendal", "tokio", @@ -2636,7 +2569,7 @@ dependencies = [ [[package]] name = "edge_test_file_write_on_full_disk" -version = "0.50.1" +version = "0.51.1" dependencies = [ "futures", "opendal", @@ -2646,7 +2579,7 @@ dependencies = [ [[package]] name = "edge_test_s3_read_on_wasm" -version = "0.50.1" +version = "0.51.1" dependencies = [ "opendal", "wasm-bindgen", @@ -2694,9 +2627,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -2716,7 +2649,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2727,12 +2660,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2756,8 +2689,8 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39bde3ce50a626efeb1caa9ab1083972d178bebb55ca627639c8ded507dfcbde" dependencies = [ - "http 1.1.0", - "prost 0.13.3", + "http 1.2.0", + "prost 0.13.4", "tokio", "tokio-stream", "tonic 0.12.3", @@ -2785,9 +2718,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -2796,11 +2729,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "pin-project-lite", ] @@ -2817,9 +2750,9 @@ dependencies = [ [[package]] name = "fastrace" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe845ecd1e3dba36bd7a20ea3b46c81ec610d5a2ffe288160a7cc6a2051496a5" +checksum = "5787c4baf9b6add08d3cbd45e818e1fdee548bf875f2ed15d8f1b65df24d3119" dependencies = [ "fastrace-macro", "minstant", @@ -2832,9 +2765,9 @@ dependencies = [ [[package]] name = "fastrace-jaeger" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeef3190f9e737d3abe818b0cec47ec479e4a0870847131bc641faf96ad0a7aa" +checksum = "b1458f1184af9f3eeb1e5d9af29be4194c0910964257d477601d66f4cf52e67e" dependencies = [ "fastrace", "log", @@ -2843,21 +2776,21 @@ dependencies = [ [[package]] name = "fastrace-macro" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a09bf248c7ec91a448701fa2c31750f78be6cbc3d5269dbb82a9f3945776d1f4" +checksum = "3141a07a966757217b75f231f59359ee7336170938644ecca7528fe4b3399e3b" dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "ff" @@ -2877,9 +2810,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -2920,9 +2853,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "foreign-types" @@ -2986,7 +2919,7 @@ checksum = "afc84a5ff0dba78222551017f5625f3365aa09551c78cfaa44136fc6818c2611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "try_map", ] @@ -3010,12 +2943,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "fst" version = "0.4.7" @@ -3099,9 +3026,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "fastrand", "futures-core", @@ -3118,7 +3045,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3184,7 +3111,7 @@ dependencies = [ "g2poly", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3216,6 +3143,19 @@ dependencies = [ "windows 0.48.0", ] +[[package]] +name = "generator" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +dependencies = [ + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.58.0", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -3246,9 +3186,9 @@ dependencies = [ [[package]] name = "geo-types" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ff16065e5720f376fbced200a5ae0f47ace85fd70b7e54269790281353b6d61" +checksum = "b6f47c611187777bbca61ea7aba780213f5f3441fd36294ab333e96cfa791b65" dependencies = [ "approx 0.5.1", "arbitrary", @@ -3292,13 +3232,13 @@ dependencies = [ [[package]] name = "ghost" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0e085ded9f1267c32176b40921b9754c474f7dd96f7e808d4a982e48aa1e854" +checksum = "39b697dbd8bfcc35d0ee91698aaa379af096368ba8837d279cc097b276edda45" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3309,9 +3249,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "gloo-timers" @@ -3327,15 +3267,14 @@ dependencies = [ [[package]] name = "governor" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7ecdc5898f6a43e08a7e2c9e2266beb98fd4dfbf2634182540fbb715245093" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" dependencies = [ "cfg-if", "dashmap 5.5.3", - "futures-sink", + "futures", "futures-timer", - "futures-util", "no-std-compat", "nonzero_ext", "parking_lot 0.12.3", @@ -3369,7 +3308,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -3378,17 +3317,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", + "http 1.2.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -3435,9 +3374,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -3446,18 +3385,18 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] name = "hdfs-native" -version = "0.10.1" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98360797512f137f2e1de9cf9bc387ca874627411c1904fffc216456b2e9899b" +checksum = "4e72db0dfc43c1e6b7ef6d34f6d38eff079cbd30dbc18924b27108793e47893c" dependencies = [ "aes", "base64 0.21.7", @@ -3486,7 +3425,7 @@ dependencies = [ "regex", "roxmltree", "socket2", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "url", "uuid", @@ -3559,9 +3498,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hickory-proto" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" +checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" dependencies = [ "async-trait", "cfg-if", @@ -3570,11 +3509,11 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna 0.4.0", + "idna", "ipnet", "once_cell", "rand 0.8.5", - "thiserror 1.0.64", + "thiserror 1.0.69", "tinyvec", "tokio", "tracing", @@ -3583,9 +3522,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" +checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" dependencies = [ "cfg-if", "futures-util", @@ -3597,7 +3536,7 @@ dependencies = [ "rand 0.8.5", "resolv-conf", "smallvec", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -3622,11 +3561,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3663,7 +3602,7 @@ dependencies = [ "markup5ever", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3679,9 +3618,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -3706,7 +3645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -3717,7 +3656,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -3742,9 +3681,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -3766,15 +3705,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.7", + "http 1.2.0", "http-body 1.0.1", "httparse", "httpdate", @@ -3793,7 +3732,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", @@ -3803,20 +3742,20 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.5.0", + "http 1.2.0", + "hyper 1.5.2", "hyper-util", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tower-service", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", ] [[package]] @@ -3825,7 +3764,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.31", + "hyper 0.14.32", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -3833,11 +3772,11 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.5.0", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -3846,16 +3785,16 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.0", + "hyper 1.5.2", "pin-project-lite", "socket2", "tokio", @@ -3886,6 +3825,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -3894,22 +3951,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "idna" -version = "0.5.0" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -3925,37 +3983,37 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] [[package]] name = "indextree" -version = "4.7.2" +version = "4.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6f1b8dbc8f1e5a0f45e05b9293c42cbab79086baeb3e914d3936f8149edc4f" +checksum = "91f3e68a01402c3404bfb739079f38858325bc7ad775b07922278a8a415b1a3f" dependencies = [ "indextree-macros", ] [[package]] name = "indextree-macros" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357230c23ee6024223892ce0de19888a04139ca5bb94f5becb04d38b75a4bccf" +checksum = "477e2e7ec7379407656293ff74902caea786a1dda427ca1f84b923c4fdeb7659" dependencies = [ "either", "itertools 0.13.0", "proc-macro2", "quote", "strum", - "syn 2.0.90", - "thiserror 1.0.64", + "syn 2.0.95", + "thiserror 1.0.69", ] [[package]] @@ -3987,6 +4045,17 @@ dependencies = [ "libc", ] +[[package]] +name = "io-uring" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d5b4a5e02a58296749114728ea3644f9a4cd5669c243896e445b90bd299ad6" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -4060,18 +4129,17 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "java-locator" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2abecabd9961c5e01405a6426687fcf1bd94a269927137e4c3cc1a7419b93fd" +checksum = "6f25f28894af6a5dd349ed5ec46e178654e75f62edb6717ac74007102a57deb5" dependencies = [ "glob", - "lazy_static", ] [[package]] @@ -4085,10 +4153,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -4144,14 +4213,14 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.8", + "regex-automata 0.4.9", ] [[package]] name = "lazy-regex" -version = "3.3.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8e41c97e6bc7ecb552016274b99fbb5d035e8de288c582d9b933af6677bfda" +checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" dependencies = [ "lazy-regex-proc_macros", "once_cell", @@ -4160,14 +4229,14 @@ dependencies = [ [[package]] name = "lazy-regex-proc_macros" -version = "3.3.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e1d8b05d672c53cb9c7b920bbba8783845ae4f0b076e02a3db1d02c81b4163" +checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -4196,26 +4265,25 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.161" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libfuzzer-sys" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" dependencies = [ "arbitrary", "cc", - "once_cell", ] [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -4223,9 +4291,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" @@ -4276,9 +4344,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.20" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" dependencies = [ "cc", "pkg-config", @@ -4294,7 +4362,7 @@ dependencies = [ "ndarray", "num-traits", "rand 0.8.5", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -4305,9 +4373,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -4335,7 +4409,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if", - "generator", + "generator 0.7.5", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator 0.8.4", "scoped-tls", "tracing", "tracing-subscriber", @@ -4347,7 +4434,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.0", + "hashbrown 0.15.2", ] [[package]] @@ -4452,9 +4539,9 @@ dependencies = [ [[package]] name = "metrics" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae428771d17306715c5091d446327d1cfdedc82185c65ba8423ab404e45bf10" +checksum = "7a7deb012b3b2767169ff203fadb4c6b0b82b947512e5eb9e0b78c2e186ad9e3" dependencies = [ "ahash 0.8.11", "portable-atomic", @@ -4468,7 +4555,7 @@ checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" dependencies = [ "miette-derive", "once_cell", - "thiserror 1.0.64", + "thiserror 1.0.69", "unicode-width", ] @@ -4480,7 +4567,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -4516,9 +4603,9 @@ dependencies = [ [[package]] name = "minicov" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" dependencies = [ "cc", "walkdir", @@ -4532,9 +4619,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] @@ -4563,58 +4650,49 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - [[package]] name = "moka" -version = "0.12.8" +version = "0.12.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cf62eb4dd975d2dde76432fb1075c49e3ee2331cf36f1f8fd4b66550d32b6f" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" dependencies = [ "async-lock", - "async-trait", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "event-listener 5.3.1", + "event-listener 5.4.0", "futures-util", - "once_cell", + "loom 0.7.2", "parking_lot 0.12.3", - "quanta", + "portable-atomic", "rustc_version", "smallvec", "tagptr", - "thiserror 1.0.64", - "triomphe", + "thiserror 1.0.69", "uuid", ] [[package]] name = "mongodb" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c857d71f918b38221baf2fdff7207fec9984b4504901544772b1edf0302d669f" +checksum = "ff1f6edf7fe8828429647a2200f684681ca6d5a33b45edc3140c81390d852301" dependencies = [ "async-trait", "base64 0.13.1", "bitflags 1.3.2", "bson", "chrono", - "derivative", + "derive-where", "derive_more", "futures-core", "futures-executor", @@ -4642,7 +4720,7 @@ dependencies = [ "stringprep", "strsim", "take_mut", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "tokio-rustls 0.24.1", "tokio-util", @@ -4653,13 +4731,13 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6dbc533e93429a71c44a14c04547ac783b56d3f22e6c4f12b1b994cf93844e" +checksum = "8b07bfd601af78e39384707a8e80041946c98260e3e0190e294ee7435823e6bf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -4672,7 +4750,7 @@ dependencies = [ "bytes", "flume", "fxhash", - "io-uring", + "io-uring 0.6.4", "libc", "memchr", "mio 0.8.11", @@ -4693,7 +4771,7 @@ checksum = "176a5f5e69613d9e88337cf2a65e11135332b4efbcc628404a7c555e4452084c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -4705,7 +4783,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.1.0", + "http 1.2.0", "httparse", "memchr", "mime", @@ -4896,13 +4974,24 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-derive" -version = "0.3.3" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.95", ] [[package]] @@ -4947,9 +5036,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -4989,7 +5078,7 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "opendal" -version = "0.51.0" +version = "0.51.1" dependencies = [ "anyhow", "async-backtrace", @@ -5020,7 +5109,7 @@ dependencies = [ "hdrs", "hmac", "hrana-client-proto", - "http 1.1.0", + "http 1.2.0", "libtest-mimic", "log", "md-5", @@ -5043,7 +5132,7 @@ dependencies = [ "probe", "prometheus", "prometheus-client", - "prost 0.13.3", + "prost 0.13.4", "quick-xml 0.36.2", "rand 0.8.5", "redb", @@ -5099,7 +5188,7 @@ dependencies = [ [[package]] name = "opendal-examples-basic" -version = "0.50.1" +version = "0.51.1" dependencies = [ "futures", "opendal", @@ -5108,7 +5197,7 @@ dependencies = [ [[package]] name = "opendal-examples-concurrent-upload" -version = "0.50.1" +version = "0.51.1" dependencies = [ "futures", "opendal", @@ -5117,7 +5206,7 @@ dependencies = [ [[package]] name = "opendal-examples-multipart-upload" -version = "0.50.1" +version = "0.51.1" dependencies = [ "futures", "opendal", @@ -5142,15 +5231,15 @@ dependencies = [ [[package]] name = "openssh" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf397b60b682d691bf2c6125b848304ef0df2023a657aa0fc006fd6769c3d8fa" +checksum = "fabb3ca0c2ac5024fe5658a732b4dc36d1d9c49409f7d1774c9df2764143499f" dependencies = [ "libc", "once_cell", "shell-escape", "tempfile", - "thiserror 1.0.64", + "thiserror 2.0.9", "tokio", ] @@ -5202,18 +5291,18 @@ dependencies = [ "openssh", "openssh-sftp-protocol-error", "ssh_format_error", - "thiserror 2.0.3", + "thiserror 2.0.9", "tokio", ] [[package]] name = "openssh-sftp-protocol" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf38532d784978966f95d241226223823f351d5bb2a4bebcf6b20b9cb1e393e0" +checksum = "a9c862e0c56553146306507f55958c11ff554e02c46de287e6976e50d815b350" dependencies = [ "bitflags 2.6.0", - "num-derive", + "num-derive 0.4.2", "num-traits", "openssh-sftp-protocol-error", "serde", @@ -5223,12 +5312,12 @@ dependencies = [ [[package]] name = "openssh-sftp-protocol-error" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0719269eb3f037866ae07ec89cb44ed2c1d63b72b2390cef8e1aa3016a956ff8" +checksum = "42b54df62ccfd9a7708a83a9d60c46293837e478f9f4c0829360dcfa60ede8d2" dependencies = [ "serde", - "thiserror 1.0.64", + "thiserror 2.0.9", "vec-strings", ] @@ -5255,7 +5344,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -5287,7 +5376,7 @@ dependencies = [ "js-sys", "once_cell", "pin-project-lite", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -5298,12 +5387,12 @@ checksum = "29e1f9c8b032d4f635c730c0efcf731d5e2530ea13fa8bef7939ddc8420696bd" dependencies = [ "async-trait", "futures-core", - "http 1.1.0", + "http 1.2.0", "opentelemetry", "opentelemetry-proto", "opentelemetry_sdk", - "prost 0.13.3", - "thiserror 1.0.64", + "prost 0.13.4", + "thiserror 1.0.69", "tokio", "tonic 0.12.3", ] @@ -5316,7 +5405,7 @@ checksum = "c9d3968ce3aefdcca5c27e3c4ea4391b37547726a70893aab52d3de95d5f8b34" dependencies = [ "opentelemetry", "opentelemetry_sdk", - "prost 0.13.3", + "prost 0.13.4", "tonic 0.12.3", ] @@ -5336,7 +5425,7 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "serde_json", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -5391,7 +5480,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -5472,7 +5561,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "smallvec", "windows-targets 0.52.6", ] @@ -5563,19 +5652,19 @@ dependencies = [ "fs2", "linked-hash-map", "rand 0.8.5", - "thiserror 1.0.64", + "thiserror 1.0.69", "unsigned-varint", "zigzag", ] [[package]] name = "pest" -version = "2.7.14" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 1.0.64", + "thiserror 2.0.9", "ucd-trie", ] @@ -5586,7 +5675,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -5601,22 +5690,22 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", - "phf_shared 0.11.2", + "phf_shared 0.11.3", ] [[package]] name = "phf_codegen" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -5631,25 +5720,25 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.11.3", "rand 0.8.5", ] [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "unicase", ] @@ -5659,16 +5748,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher", + "siphasher 1.0.1", "unicase", ] @@ -5680,29 +5769,29 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -5805,9 +5894,9 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -5820,9 +5909,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "powerfmt" @@ -5857,12 +5946,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" +checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" dependencies = [ "proc-macro2", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -5880,29 +5969,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -5922,7 +5988,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -5942,7 +6008,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "version_check", "yansi", ] @@ -5984,7 +6050,7 @@ dependencies = [ "parking_lot 0.12.3", "procfs", "protobuf", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -6007,7 +6073,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -6022,21 +6088,20 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", - "prost-derive 0.13.3", + "prost-derive 0.13.4", ] [[package]] name = "prost-build" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" +checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" dependencies = [ - "bytes", "heck 0.5.0", "itertools 0.13.0", "log", @@ -6044,10 +6109,10 @@ dependencies = [ "once_cell", "petgraph", "prettyplease", - "prost 0.13.3", - "prost-types 0.13.3", + "prost 0.13.4", + "prost-types 0.13.4", "regex", - "syn 2.0.90", + "syn 2.0.95", "tempfile", ] @@ -6061,20 +6126,20 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "prost-derive" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -6088,11 +6153,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" dependencies = [ - "prost 0.13.3", + "prost 0.13.4", ] [[package]] @@ -6109,9 +6174,9 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "psm" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" dependencies = [ "cc", ] @@ -6149,9 +6214,9 @@ dependencies = [ [[package]] name = "quanta" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" dependencies = [ "crossbeam-utils", "libc", @@ -6202,45 +6267,49 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", - "rustls 0.23.15", + "rustc-hash 2.1.0", + "rustls 0.23.20", "socket2", - "thiserror 1.0.64", + "thiserror 2.0.9", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom 0.2.15", "rand 0.8.5", "ring", - "rustc-hash 2.0.0", - "rustls 0.23.15", + "rustc-hash 2.1.0", + "rustls 0.23.20", + "rustls-pki-types", "slab", - "thiserror 1.0.64", + "thiserror 2.0.9", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -6250,9 +6319,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -6382,32 +6451,34 @@ dependencies = [ [[package]] name = "reblessive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d4f118ca848dfd632a8c0883f9aacd6b58da548eb0629a78cafee3d330938da" +checksum = "ffead9d0a0b45f3e0bc063a244b1779fd53a09d2c2f7282c186a016b1f10a778" [[package]] name = "redb" -version = "2.1.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "074373f3e7e5d27d8741d19512232adb47be8622d3daef3a45bcae72050c3d2a" +checksum = "ea0a72cd7140de9fc3e318823b883abf819c20d478ec89ce880466dc2ef263c6" dependencies = [ "libc", ] [[package]] name = "redis" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cccf17a692ce51b86564334614d72dcae1def0fd5ecebc9f02956da74352b5" +checksum = "09d8f99a4090c89cc489a94833c901ead69bfbf3877b4867d5482e321ee875bc" dependencies = [ "arc-swap", "async-trait", + "backon", "bytes", "combine", "crc16", "futures", "futures-util", + "itertools 0.13.0", "itoa", "log", "native-tls", @@ -6415,7 +6486,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rand 0.8.5", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-native-certs 0.7.3", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -6424,8 +6495,7 @@ dependencies = [ "socket2", "tokio", "tokio-native-tls", - "tokio-retry2", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tokio-util", "url", ] @@ -6441,9 +6511,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] @@ -6456,7 +6526,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -6476,14 +6546,14 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "reflink-copy" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31414597d1cd7fdd2422798b7652a6329dda0fe0219e6335a13d5bcaa9aeb6" +checksum = "17400ed684c3a0615932f00c271ae3eea13e47056a1455821995122348ab6438" dependencies = [ "cfg-if", "rustix", @@ -6492,13 +6562,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -6513,9 +6583,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -6564,7 +6634,7 @@ dependencies = [ "hex", "hmac", "home", - "http 1.1.0", + "http 1.2.0", "jsonwebtoken", "log", "once_cell", @@ -6582,19 +6652,19 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64 0.22.1", "bytes", "futures-core", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", - "hyper-rustls 0.27.3", + "hyper 1.5.2", + "hyper-rustls 0.27.5", "hyper-util", "ipnet", "js-sys", @@ -6605,23 +6675,24 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tokio-util", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", "windows-registry", ] @@ -6658,7 +6729,7 @@ checksum = "5f0ec466e5d8dca9965eb6871879677bef5590cf7525ad96cae14376efb75073" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -6739,9 +6810,9 @@ dependencies = [ [[package]] name = "roaring" -version = "0.10.6" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4b84ba6e838ceb47b41de5194a60244fac43d9fe03b71dbe8c5a201081d6d1" +checksum = "41589aba99537475bf697f2118357cad1c31590c5a1b9f6d9fc4ad6d07503661" dependencies = [ "bytemuck", "byteorder", @@ -6775,9 +6846,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest", @@ -6796,9 +6867,9 @@ dependencies = [ [[package]] name = "rstar" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133315eb94c7b1e8d0cb097e5a710d850263372fd028fff18969de708afc7008" +checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb" dependencies = [ "heapless", "num-traits", @@ -6807,9 +6878,9 @@ dependencies = [ [[package]] name = "rtrb" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f94e84c073f3b85d4012b44722fa8842b9986d741590d4f2636ad0a5b14143" +checksum = "ad8388ea1a9e0ea807e442e8263a699e7edcb320ecbcd21b4fa8ff859acce3ba" [[package]] name = "rust-ini" @@ -6840,13 +6911,13 @@ dependencies = [ "futures", "futures-util", "ghost", - "num-derive", + "num-derive 0.3.3", "num-traits", "ordered-float", "panic-message", "serde", "serde_json", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -6891,9 +6962,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc_lexer" @@ -6925,15 +6996,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6950,11 +7021,10 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ - "aws-lc-rs", "log", "once_cell", "ring", @@ -7009,9 +7079,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" dependencies = [ "web-time", ] @@ -7032,7 +7102,6 @@ version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -7040,9 +7109,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" @@ -7076,9 +7145,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -7152,9 +7221,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -7162,9 +7231,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" dependencies = [ "serde", ] @@ -7177,9 +7246,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -7204,13 +7273,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -7226,11 +7295,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -7251,15 +7320,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -7269,14 +7338,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -7382,7 +7451,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror 1.0.64", + "thiserror 1.0.69", "time", ] @@ -7392,6 +7461,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "size" version = "0.4.1" @@ -7490,14 +7565,14 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "398d462c4c454399be452039b24b0aa0ecb4c7a57f6ae615f5d25de2b032f850" dependencies = [ - "loom", + "loom 0.5.6", ] [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -7553,21 +7628,11 @@ dependencies = [ "der 0.7.9", ] -[[package]] -name = "sqlformat" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" -dependencies = [ - "nom", - "unicode_categories", -] - [[package]] name = "sqlx" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" dependencies = [ "sqlx-core", "sqlx-macros", @@ -7578,64 +7643,58 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" dependencies = [ - "atoi", - "byteorder", "bytes", "crc", "crossbeam-queue", "either", - "event-listener 5.3.1", - "futures-channel", + "event-listener 5.4.0", "futures-core", "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.14.5", + "hashbrown 0.15.2", "hashlink", - "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "memchr", "once_cell", - "paste", "percent-encoding", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-pemfile 2.2.0", "serde", "serde_json", "sha2", "smallvec", - "sqlformat", - "thiserror 1.0.64", + "thiserror 2.0.9", "tokio", "tokio-stream", "tracing", "url", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", ] [[package]] name = "sqlx-macros" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "sqlx-macros-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" dependencies = [ "dotenvy", "either", @@ -7651,7 +7710,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.90", + "syn 2.0.95", "tempfile", "tokio", "url", @@ -7659,9 +7718,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" +checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" dependencies = [ "atoi", "base64 0.22.1", @@ -7694,16 +7753,16 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 1.0.64", + "thiserror 2.0.9", "tracing", "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64 0.22.1", @@ -7714,7 +7773,6 @@ dependencies = [ "etcetera", "futures-channel", "futures-core", - "futures-io", "futures-util", "hex", "hkdf", @@ -7732,16 +7790,16 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 1.0.64", + "thiserror 2.0.9", "tracing", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" dependencies = [ "atoi", "flume", @@ -7793,7 +7851,7 @@ dependencies = [ "serde", "sha-1", "sha2", - "thiserror 1.0.64", + "thiserror 1.0.69", "xxhash-rust", ] @@ -7837,7 +7895,7 @@ dependencies = [ "byteorder", "memchr", "serde", - "thiserror 1.0.64", + "thiserror 1.0.69", ] [[package]] @@ -7902,7 +7960,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -7913,9 +7971,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "suppaftp" -version = "6.0.3" +version = "6.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7ae9f63c90e21e0afaf56d63516d3db678e57bc4ad7919c7db7a9c32db539c" +checksum = "a593e8bdcd2aff8369ccddf7fd42ae7ccaa0f8b6b343c16ed763c99c20926a29" dependencies = [ "async-std", "async-tls", @@ -7925,24 +7983,24 @@ dependencies = [ "lazy-regex", "log", "pin-project", - "rustls 0.23.15", - "thiserror 1.0.64", + "rustls 0.23.20", + "thiserror 2.0.9", ] [[package]] name = "surrealdb" -version = "2.0.4" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300749e641e2a5546a142333d91b3537969e9c4cbd1fa2d1d10d92f01624d470" +checksum = "d6c4b1b800a132d76a9899f813aa382c8866feb40a4637fdb14da5e5f3a9fbc7" dependencies = [ "arrayvec", - "async-channel 1.9.0", + "async-channel 2.3.1", "bincode", "chrono", "dmp", "futures", "geo", - "indexmap 2.6.0", + "indexmap 2.7.0", "path-clean", "pharos", "reblessive", @@ -7950,14 +8008,14 @@ dependencies = [ "revision", "ring", "rust_decimal", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-pki-types", "semver", "serde", "serde-content", "serde_json", "surrealdb-core", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "tokio-tungstenite", "tokio-util", @@ -7972,16 +8030,16 @@ dependencies = [ [[package]] name = "surrealdb-core" -version = "2.0.4" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5795fca60f099754934069dfb3d20824cfec94b4c13c7130d1cd52e0fcadfc42" +checksum = "582a63df1d8c2c8fb90cf923c25350946604b0bea9f6a9815fe02d074b136dea" dependencies = [ "addr", "ahash 0.8.11", "ammonia", "any_ascii", "argon2", - "async-channel 1.9.0", + "async-channel 2.3.1", "async-executor", "async-graphql", "base64 0.21.7", @@ -8020,6 +8078,7 @@ dependencies = [ "quick_cache", "radix_trie", "rand 0.8.5", + "rayon", "reblessive", "regex", "revision", @@ -8037,9 +8096,10 @@ dependencies = [ "sha2", "snap", "storekey", + "strsim", "subtle", "surrealdb-derive", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "tracing", "trice", @@ -8047,6 +8107,7 @@ dependencies = [ "unicase", "url", "uuid", + "vart", "wasm-bindgen-futures", "wasmtimer", "ws_stream_wasm", @@ -8075,27 +8136,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "syn_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.90", -] - [[package]] name = "sync_wrapper" version = "0.1.2" @@ -8104,13 +8153,24 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -8131,12 +8191,13 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.2.15", "once_cell", "rustix", "windows-sys 0.59.0", @@ -8172,42 +8233,42 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.64", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.3" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl 2.0.9", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -8261,16 +8322,16 @@ dependencies = [ "semver", "serde", "serde_derive", - "thiserror 1.0.64", + "thiserror 1.0.69", "tokio", "tonic 0.10.2", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -8289,9 +8350,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -8306,6 +8367,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -8318,9 +8389,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -8333,14 +8404,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio 1.0.3", "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", @@ -8377,7 +8448,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -8390,17 +8461,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-retry2" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903934dba1c4c2f2e9cb460ef10b5695e0b0ecad3bf9ee7c8675e540c5e8b2d1" -dependencies = [ - "pin-project", - "rand 0.8.5", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.24.1" @@ -8413,20 +8473,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.15", - "rustls-pki-types", + "rustls 0.23.20", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -8441,19 +8500,19 @@ checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" dependencies = [ "futures-util", "log", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tungstenite", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", ] [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -8475,7 +8534,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "toml_datetime", "winnow", ] @@ -8494,7 +8553,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-timeout 0.4.1", "percent-encoding", "pin-project", @@ -8518,23 +8577,23 @@ checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", - "axum 0.7.7", + "axum 0.7.9", "base64 0.22.1", "bytes", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.7", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", - "hyper-timeout 0.5.1", + "hyper 1.5.2", + "hyper-timeout 0.5.2", "hyper-util", "percent-encoding", "pin-project", - "prost 0.13.3", + "prost 0.13.4", "rustls-pemfile 2.2.0", "socket2", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.1", "tokio-stream", "tower 0.4.13", "tower-layer", @@ -8551,9 +8610,9 @@ dependencies = [ "prettyplease", "proc-macro2", "prost-build", - "prost-types 0.13.3", + "prost-types 0.13.4", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -8578,14 +8637,15 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.2", + "tokio", "tower-layer", "tower-service", ] @@ -8604,9 +8664,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -8616,20 +8676,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -8666,9 +8726,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -8720,9 +8780,9 @@ checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" [[package]] name = "triomphe" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" dependencies = [ "arc-swap", "serde", @@ -8750,14 +8810,14 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http 1.2.0", "httparse", "log", "rand 0.8.5", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-pki-types", "sha1", - "thiserror 1.0.64", + "thiserror 1.0.69", "url", "utf-8", ] @@ -8799,21 +8859,21 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -8858,12 +8918,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - [[package]] name = "unsigned-varint" version = "0.8.0" @@ -8878,28 +8932,28 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.10.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" dependencies = [ "base64 0.22.1", "flate2", "log", "once_cell", - "rustls 0.23.15", + "rustls 0.23.20", "rustls-pki-types", "url", - "webpki-roots 0.26.6", + "webpki-roots 0.26.7", ] [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", ] @@ -8915,6 +8969,18 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -8940,9 +9006,15 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.9.0" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + +[[package]] +name = "vart" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "1c92195d375eb94995afddeedfd7f246796eb60b85f727c538e42222c4c9b2d3" [[package]] name = "vcpkg" @@ -9020,9 +9092,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -9031,36 +9103,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9068,30 +9140,29 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-bindgen-test" -version = "0.3.45" +version = "0.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" +checksum = "c61d44563646eb934577f2772656c7ad5e9c90fac78aa8013d776fcdaf24625d" dependencies = [ - "console_error_panic_hook", "js-sys", "minicov", "scoped-tls", @@ -9102,20 +9173,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.45" +version = "0.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" +checksum = "54171416ce73aa0b9c377b51cc3cb542becee1cd678204812e8392e5b0e4a031" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -9145,9 +9216,9 @@ checksum = "323f4da9523e9a669e1eaf9c6e763892769b1d38c623913647bfdc1532fe4549" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -9190,32 +9261,20 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "whoami" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "wasite", "web-sys", ] @@ -9306,7 +9365,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -9317,7 +9376,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -9500,9 +9559,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" dependencies = [ "memchr", ] @@ -9517,6 +9576,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -9530,7 +9601,7 @@ dependencies = [ "pharos", "rustc_version", "send_wrapper", - "thiserror 1.0.64", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -9547,9 +9618,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.22" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" [[package]] name = "xmlparser" @@ -9559,9 +9630,9 @@ checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "xxhash-rust" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "yansi" @@ -9569,6 +9640,30 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -9587,7 +9682,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", + "synstructure", ] [[package]] @@ -9596,6 +9712,28 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "zigzag" version = "0.1.0" diff --git a/core/Cargo.toml b/core/Cargo.toml index d404845dd3e2..c05a8b5a693f 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -28,7 +28,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.51.0" +version = "0.51.1" [lints.clippy] unused_async = "warn" @@ -44,7 +44,7 @@ members = [".", "examples/*", "fuzz", "edge/*", "benches/vs_*"] edition = "2021" license = "Apache-2.0" rust-version = "1.75" -version = "0.50.1" +version = "0.51.1" [features] default = ["reqwest/rustls-tls", "executors-tokio", "services-memory"] @@ -56,16 +56,16 @@ default = ["reqwest/rustls-tls", "executors-tokio", "services-memory"] # # You should never enable this feature unless you are developing opendal. tests = [ - "dep:rand", - "dep:sha2", - "dep:dotenvy", - "layers-blocking", - "services-azblob", - "services-fs", - "services-http", - "services-memory", - "internal-tokio-rt", - "services-s3", + "dep:rand", + "dep:sha2", + "dep:dotenvy", + "layers-blocking", + "services-azblob", + "services-fs", + "services-http", + "services-memory", + "internal-tokio-rt", + "services-s3", ] # Enable path cache. @@ -107,20 +107,20 @@ services-aliyun-drive = [] services-alluxio = [] services-atomicserver = ["dep:atomic_lib"] services-azblob = [ - "dep:sha2", - "dep:reqsign", - "reqsign?/services-azblob", - "reqsign?/reqwest_request", + "dep:sha2", + "dep:reqsign", + "reqsign?/services-azblob", + "reqsign?/reqwest_request", ] services-azdls = [ - "dep:reqsign", - "reqsign?/services-azblob", - "reqsign?/reqwest_request", + "dep:reqsign", + "reqsign?/services-azblob", + "reqsign?/reqwest_request", ] services-azfile = [ - "dep:reqsign", - "reqsign?/services-azblob", - "reqsign?/reqwest_request", + "dep:reqsign", + "reqsign?/services-azblob", + "reqsign?/reqwest_request", ] services-b2 = [] services-cacache = ["dep:cacache"] @@ -128,9 +128,9 @@ services-chainsafe = [] services-cloudflare-kv = [] services-compfs = ["dep:compio"] services-cos = [ - "dep:reqsign", - "reqsign?/services-tencent", - "reqsign?/reqwest_request", + "dep:reqsign", + "reqsign?/services-tencent", + "reqsign?/reqwest_request", ] services-d1 = [] services-dashmap = ["dep:dashmap"] @@ -141,9 +141,9 @@ services-foundationdb = ["dep:foundationdb"] services-fs = ["tokio/fs", "internal-tokio-rt"] services-ftp = ["dep:suppaftp", "dep:bb8", "dep:async-tls"] services-gcs = [ - "dep:reqsign", - "reqsign?/services-google", - "reqsign?/reqwest_request", + "dep:reqsign", + "reqsign?/services-google", + "reqsign?/reqwest_request", ] services-gdrive = ["internal-path-cache"] services-ghac = [] @@ -168,15 +168,15 @@ services-monoiofs = ["dep:monoio", "dep:flume"] services-mysql = ["dep:sqlx", "sqlx?/mysql"] services-nebula-graph = ["dep:rust-nebula", "dep:bb8", "dep:snowflaked"] services-obs = [ - "dep:reqsign", - "reqsign?/services-huaweicloud", - "reqsign?/reqwest_request", + "dep:reqsign", + "reqsign?/services-huaweicloud", + "reqsign?/reqwest_request", ] services-onedrive = [] services-oss = [ - "dep:reqsign", - "reqsign?/services-aliyun", - "reqsign?/reqwest_request", + "dep:reqsign", + "reqsign?/services-aliyun", + "reqsign?/reqwest_request", ] services-pcloud = [] services-persy = ["dep:persy", "internal-tokio-rt"] @@ -186,10 +186,10 @@ services-redis = ["dep:redis", "dep:bb8", "redis?/tokio-rustls-comp"] services-redis-native-tls = ["services-redis", "redis?/tokio-native-tls-comp"] services-rocksdb = ["dep:rocksdb", "internal-tokio-rt"] services-s3 = [ - "dep:reqsign", - "reqsign?/services-aws", - "reqsign?/reqwest_request", - "dep:crc32c", + "dep:reqsign", + "reqsign?/services-aws", + "reqsign?/reqwest_request", + "dep:crc32c", ] services-seafile = [] services-sftp = ["dep:openssh", "dep:openssh-sftp-client", "dep:bb8"] @@ -235,12 +235,12 @@ backon = { version = "1.2", features = ["tokio-sleep"] } base64 = "0.22" bytes = "1.6" chrono = { version = "0.4.28", default-features = false, features = [ - "clock", - "std", + "clock", + "std", ] } futures = { version = "0.3", default-features = false, features = [ - "std", - "async-await", + "std", + "async-await", ] } http = "1.1" log = "0.4" @@ -250,7 +250,7 @@ once_cell = "1" percent-encoding = "2" quick-xml = { version = "0.36", features = ["serialize", "overlapped-lists"] } reqwest = { version = "0.12.2", features = [ - "stream", + "stream", ], default-features = false } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -270,7 +270,7 @@ prost = { version = "0.13", optional = true } sha1 = { version = "0.10.6", optional = true } sha2 = { version = "0.10", optional = true } sqlx = { version = "0.8.0", features = [ - "runtime-tokio-rustls", + "runtime-tokio-rustls", ], optional = true } # For http based services. @@ -283,8 +283,8 @@ ouroboros = { version = "0.18.4", optional = true } atomic_lib = { version = "0.39.0", optional = true } # for services-cacache cacache = { version = "13.0", default-features = false, features = [ - "tokio-runtime", - "mmap", + "tokio-runtime", + "mmap", ], optional = true } # for services-dashmap dashmap = { version = "6", optional = true } @@ -292,8 +292,8 @@ dashmap = { version = "6", optional = true } etcd-client = { version = "0.14", optional = true, features = ["tls"] } # for services-foundationdb foundationdb = { version = "0.9.0", features = [ - "embedded-fdb-include", - "fdb-7_3", + "embedded-fdb-include", + "fdb-7_3", ], optional = true } # for services-hdfs hdrs = { version = "0.3.2", optional = true, features = ["async_file"] } @@ -310,8 +310,8 @@ mongodb = { version = "3", optional = true } # for services-sftp openssh = { version = "0.11.0", optional = true } openssh-sftp-client = { version = "0.15.2", optional = true, features = [ - "openssh", - "tracing", + "openssh", + "tracing", ] } # for services-persy persy = { version = "1.4.6", optional = true } @@ -319,9 +319,9 @@ persy = { version = "1.4.6", optional = true } redb = { version = "2", optional = true } # for services-redis redis = { version = "0.27", features = [ - "cluster-async", - "tokio-comp", - "connection-manager", + "cluster-async", + "tokio-comp", + "connection-manager", ], optional = true } # for services-rocksdb rocksdb = { version = "0.21.0", default-features = false, optional = true } @@ -329,9 +329,9 @@ rocksdb = { version = "0.21.0", default-features = false, optional = true } sled = { version = "0.34.7", optional = true } # for services-ftp suppaftp = { version = "6.0.3", default-features = false, features = [ - "async-secure", - "rustls", - "async-rustls", + "async-secure", + "rustls", + "async-rustls", ], optional = true } # for services-tikv tikv-client = { version = "0.3.0", optional = true, default-features = false } @@ -341,10 +341,10 @@ hdfs-native = { version = "0.10", optional = true } surrealdb = { version = "2", optional = true, features = ["protocol-http"] } # for services-compfs compio = { version = "0.12.0", optional = true, features = [ - "runtime", - "bytes", - "polling", - "dispatcher", + "runtime", + "bytes", + "polling", + "dispatcher", ] } # for services-s3 crc32c = { version = "0.6.6", optional = true } @@ -354,10 +354,10 @@ snowflaked = { version = "1", optional = true, features = ["sync"] } # for services-monoiofs flume = { version = "0.11", optional = true } monoio = { version = "0.2.4", optional = true, features = [ - "sync", - "mkdirat", - "unlinkat", - "renameat", + "sync", + "mkdirat", + "unlinkat", + "renameat", ] } # Layers @@ -396,7 +396,7 @@ fastrace = { version = "0.7", features = ["enable"] } fastrace-jaeger = "0.7" libtest-mimic = "0.8" opentelemetry = { version = "0.26", default-features = false, features = [ - "trace", + "trace", ] } opentelemetry-otlp = "0.26" opentelemetry_sdk = "0.26" @@ -407,6 +407,6 @@ size = "0.4" tokio = { version = "1.27", features = ["fs", "macros", "rt-multi-thread"] } tracing-opentelemetry = "0.27.0" tracing-subscriber = { version = "0.3", features = [ - "env-filter", - "tracing-log", + "env-filter", + "tracing-log", ] } diff --git a/core/DEPENDENCIES.rust.tsv b/core/DEPENDENCIES.rust.tsv index aebf9f43cef1..b00ac4fe58c6 100644 --- a/core/DEPENDENCIES.rust.tsv +++ b/core/DEPENDENCIES.rust.tsv @@ -1,167 +1,181 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.90 X X -async-trait@0.1.83 X X -atomic-waker@1.1.2 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.22.1 X X -block-buffer@0.10.4 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.7.2 X -cc@1.1.31 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -dotenvy@0.15.7 X -equivalent@1.0.1 X X -fastrand@2.1.1 X X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -h2@0.4.6 X -hashbrown@0.14.5 X X -hashbrown@0.15.0 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -httpdate@1.0.3 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.9 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -indexmap@2.6.0 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -libc@0.2.161 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -ordered-multimap@0.7.3 X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.14 X X -pin-utils@0.1.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.92 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -reqsign@0.16.1 X -reqwest@0.12.8 X X -ring@0.17.8 X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.15 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -semver@1.0.23 X X -serde@1.0.210 X X -serde_derive@1.0.210 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -subtle@2.6.1 X -syn@2.0.90 X X -sync_wrapper@1.0.1 X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.40.0 X -tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -valuable@0.1.0 X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.1 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -windows-core@0.52.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +atomic-waker@1.1.2 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.22.1 X X +block-buffer@0.10.4 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +dotenvy@0.15.7 X +equivalent@1.0.1 X X +fastrand@2.3.0 X X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +h2@0.4.7 X +hashbrown@0.15.2 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +httpdate@1.0.3 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +indexmap@2.7.0 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +libc@0.2.169 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-macros@2.4.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +windows-core@0.52.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/core/src/services/gdrive/core.rs b/core/src/services/gdrive/core.rs index af4407ee9e17..eaace611852c 100644 --- a/core/src/services/gdrive/core.rs +++ b/core/src/services/gdrive/core.rs @@ -65,7 +65,7 @@ impl GdriveCore { // The file metadata in the Google Drive API is very complex. // For now, we only need the file id, name, mime type and modified time. - let mut req = Request::get(&format!( + let mut req = Request::get(format!( "https://www.googleapis.com/drive/v3/files/{}?fields=id,name,mimeType,size,modifiedTime", file_id )) diff --git a/integrations/cloud_filter/DEPENDENCIES.rust.tsv b/integrations/cloud_filter/DEPENDENCIES.rust.tsv index da48ab7d3e93..fe932b62fa5e 100644 --- a/integrations/cloud_filter/DEPENDENCIES.rust.tsv +++ b/integrations/cloud_filter/DEPENDENCIES.rust.tsv @@ -1,178 +1,193 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib -addr2line@0.24.2 X X -adler2@2.0.0 X X X -android-tzdata@0.1.1 X X -android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X -autocfg@1.4.0 X X -backon@1.2.0 X -backtrace@0.3.74 X X -base64@0.22.1 X X -bincode@1.3.3 X -block-buffer@0.10.4 X X -bumpalo@3.16.0 X X -byteorder@1.5.0 X X -bytes@1.8.0 X -cc@1.1.34 X X -cfg-if@1.0.0 X X -chrono@0.4.38 X X -cloud-filter@0.0.5 X -cloud_filter_opendal@0.0.4 X -const-oid@0.9.6 X X -const-random@0.1.18 X X -const-random-macro@0.1.16 X X -core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X -crc32c@0.6.8 X X -crunchy@0.2.2 X -crypto-common@0.1.6 X X -deranged@0.3.11 X X -digest@0.10.7 X X -dlv-list@0.5.2 X X -dotenvy@0.15.7 X -fastrand@2.1.1 X X -flagset@0.4.6 X -fnv@1.0.7 X X -form_urlencoded@1.2.1 X X -futures@0.3.31 X X -futures-channel@0.3.31 X X -futures-core@0.3.31 X X -futures-executor@0.3.31 X X -futures-io@0.3.31 X X -futures-macro@0.3.31 X X -futures-sink@0.3.31 X X -futures-task@0.3.31 X X -futures-util@0.3.31 X X -generic-array@0.14.7 X -getrandom@0.2.15 X X -gimli@0.31.1 X X -gloo-timers@0.3.0 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X -hex@0.4.3 X X -hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X -http-body@1.0.1 X -http-body-util@0.1.2 X -httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X -hyper-util@0.1.10 X -iana-time-zone@0.1.61 X X -iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X -ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -libc@0.2.161 X X -log@0.4.22 X X -md-5@0.10.6 X X -memchr@2.7.4 X X -memoffset@0.9.1 X -mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -nt-time@0.8.1 X X -num-conv@0.1.0 X X -num-traits@0.2.19 X X -object@0.36.5 X X -once_cell@1.20.2 X X -opendal@0.51.0 X -ordered-multimap@0.7.3 X -percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X -pin-utils@0.1.0 X X -powerfmt@0.2.0 X X -ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X -quick-xml@0.35.0 X -quick-xml@0.36.2 X -quote@1.0.37 X X -rand@0.8.5 X X -rand_chacha@0.3.1 X X -rand_core@0.6.4 X X -reqsign@0.16.1 X -reqwest@0.12.9 X X -ring@0.17.8 X -rust-ini@0.21.1 X -rustc-demangle@0.1.24 X X -rustc_version@0.4.1 X X -rustls@0.23.16 X X X -rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X -rustls-webpki@0.102.8 X -ryu@1.0.18 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X -serde_urlencoded@0.7.1 X X -sha1@0.10.6 X X -sha2@0.10.8 X X -shlex@1.3.0 X X -signal-hook-registry@1.4.2 X X -slab@0.4.9 X -smallvec@1.13.2 X X -socket2@0.5.7 X X -spin@0.9.8 X -subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -time@0.3.36 X X -time-core@0.1.2 X X -time-macros@0.2.18 X X -tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X -tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X -trim-in-place@0.1.7 X -try-lock@0.2.5 X -typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X -untrusted@0.9.0 X -url@2.5.2 X X -uuid@1.11.0 X X -version_check@0.9.5 X X -want@0.3.1 X -wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X -wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X -widestring@1.1.0 X X -windows@0.58.0 X X -windows-core@0.52.0 X X -windows-core@0.58.0 X X -windows-implement@0.58.0 X X -windows-interface@0.58.0 X X -windows-registry@0.2.0 X X -windows-result@0.2.0 X X -windows-strings@0.1.0 X X -windows-sys@0.52.0 X X -windows-targets@0.52.6 X X -windows_aarch64_gnullvm@0.52.6 X X -windows_aarch64_msvc@0.52.6 X X -windows_i686_gnu@0.52.6 X X -windows_i686_gnullvm@0.52.6 X X -windows_i686_msvc@0.52.6 X X -windows_x86_64_gnu@0.52.6 X X -windows_x86_64_gnullvm@0.52.6 X X -windows_x86_64_msvc@0.52.6 X X -zerocopy@0.7.35 X X X -zerocopy-derive@0.7.35 X X X -zeroize@1.8.1 X X +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib +addr2line@0.24.2 X X +adler2@2.0.0 X X X +android-tzdata@0.1.1 X X +android_system_properties@0.1.5 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X +autocfg@1.4.0 X X +backon@1.3.0 X +backtrace@0.3.74 X X +base64@0.22.1 X X +bincode@1.3.3 X +block-buffer@0.10.4 X X +bumpalo@3.16.0 X X +byteorder@1.5.0 X X +bytes@1.9.0 X +cc@1.2.7 X X +cfg-if@1.0.0 X X +chrono@0.4.39 X X +cloud-filter@0.0.5 X +cloud_filter_opendal@0.0.4 X +const-oid@0.9.6 X X +core-foundation-sys@0.8.7 X X +cpufeatures@0.2.16 X X +crc32c@0.6.8 X X +crypto-common@0.1.6 X X +deranged@0.3.11 X X +digest@0.10.7 X X +displaydoc@0.2.5 X X +dotenvy@0.15.7 X +fastrand@2.3.0 X X +flagset@0.4.6 X +fnv@1.0.7 X X +form_urlencoded@1.2.1 X X +futures@0.3.31 X X +futures-channel@0.3.31 X X +futures-core@0.3.31 X X +futures-executor@0.3.31 X X +futures-io@0.3.31 X X +futures-macro@0.3.31 X X +futures-sink@0.3.31 X X +futures-task@0.3.31 X X +futures-util@0.3.31 X X +generic-array@0.14.7 X +getrandom@0.2.15 X X +gimli@0.31.1 X X +gloo-timers@0.3.0 X X +hex@0.4.3 X X +hmac@0.12.1 X X +home@0.5.11 X X +http@1.2.0 X X +http-body@1.0.1 X +http-body-util@0.1.2 X +httparse@1.9.5 X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X +hyper-util@0.1.10 X +iana-time-zone@0.1.61 X X +iana-time-zone-haiku@0.1.2 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X +ipnet@2.10.1 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +libc@0.2.169 X X +litemap@0.7.4 X +log@0.4.22 X X +md-5@0.10.6 X X +memchr@2.7.4 X X +memoffset@0.9.1 X +mime@0.3.17 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +nt-time@0.8.1 X X +num-conv@0.1.0 X X +num-traits@0.2.19 X X +object@0.36.7 X X +once_cell@1.20.2 X X +opendal@0.51.1 X +percent-encoding@2.3.1 X X +pin-project-lite@0.2.16 X X +pin-utils@0.1.0 X X +powerfmt@0.2.0 X X +ppv-lite86@0.2.20 X X +proc-macro2@1.0.92 X X +quick-xml@0.35.0 X +quick-xml@0.36.2 X +quote@1.0.38 X X +rand@0.8.5 X X +rand_chacha@0.3.1 X X +rand_core@0.6.4 X X +reqsign@0.16.1 X +reqwest@0.12.12 X X +ring@0.17.8 X +rustc-demangle@0.1.24 X X +rustc_version@0.4.1 X X +rustls@0.23.20 X X X +rustls-pemfile@2.2.0 X X X +rustls-pki-types@1.10.1 X X +rustls-webpki@0.102.8 X +ryu@1.0.18 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X +serde_urlencoded@0.7.1 X X +sha1@0.10.6 X X +sha2@0.10.8 X X +shlex@1.3.0 X X +signal-hook-registry@1.4.2 X X +slab@0.4.9 X +smallvec@1.13.2 X X +socket2@0.5.8 X X +spin@0.9.8 X +stable_deref_trait@1.2.0 X X +subtle@2.6.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +time@0.3.37 X X +time-core@0.1.2 X X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-macros@2.4.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X +tower-service@0.3.3 X +tracing@0.1.41 X +tracing-core@0.1.33 X +try-lock@0.2.5 X +typenum@1.17.0 X X +unicode-ident@1.0.14 X X X +untrusted@0.9.0 X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X +uuid@1.11.0 X X +version_check@0.9.5 X X +want@0.3.1 X +wasi@0.11.0+wasi-snapshot-preview1 X X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X +wasm-streams@0.4.2 X X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X +widestring@1.1.0 X X +windows@0.58.0 X X +windows-core@0.52.0 X X +windows-core@0.58.0 X X +windows-implement@0.58.0 X X +windows-interface@0.58.0 X X +windows-registry@0.2.0 X X +windows-result@0.2.0 X X +windows-strings@0.1.0 X X +windows-sys@0.52.0 X X +windows-sys@0.59.0 X X +windows-targets@0.52.6 X X +windows_aarch64_gnullvm@0.52.6 X X +windows_aarch64_msvc@0.52.6 X X +windows_i686_gnu@0.52.6 X X +windows_i686_gnullvm@0.52.6 X X +windows_i686_msvc@0.52.6 X X +windows_x86_64_gnu@0.52.6 X X +windows_x86_64_gnullvm@0.52.6 X X +windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerocopy@0.7.35 X X X +zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X +zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/integrations/compat/DEPENDENCIES.rust.tsv b/integrations/compat/DEPENDENCIES.rust.tsv index b6322b419f4f..151d7201c9bc 100644 --- a/integrations/compat/DEPENDENCIES.rust.tsv +++ b/integrations/compat/DEPENDENCIES.rust.tsv @@ -1,7 +1,7 @@ -crate Apache-2.0 MIT Unicode-DFS-2016 -async-trait@0.1.83 X X +crate Apache-2.0 MIT Unicode-3.0 +async-trait@0.1.85 X X opendal_compat@1.0.2 X -proc-macro2@1.0.89 X X -quote@1.0.37 X X -syn@2.0.87 X X -unicode-ident@1.0.13 X X X +proc-macro2@1.0.92 X X +quote@1.0.38 X X +syn@2.0.95 X X +unicode-ident@1.0.14 X X X diff --git a/integrations/dav-server/Cargo.toml b/integrations/dav-server/Cargo.toml index bb781bbdf3d2..1e49923d6d93 100644 --- a/integrations/dav-server/Cargo.toml +++ b/integrations/dav-server/Cargo.toml @@ -18,7 +18,7 @@ [package] description = "Use OpenDAL as a backend to access data in various service with WebDAV protocol" name = "dav-server-opendalfs" -version = "0.2.3" +version = "0.3.0" authors = ["Apache OpenDAL "] edition = "2021" diff --git a/integrations/dav-server/DEPENDENCIES.rust.tsv b/integrations/dav-server/DEPENDENCIES.rust.tsv index 27edf1c4ae97..be1b080ff98c 100644 --- a/integrations/dav-server/DEPENDENCIES.rust.tsv +++ b/integrations/dav-server/DEPENDENCIES.rust.tsv @@ -1,35 +1,36 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X aho-corasick@1.1.3 X X -allocator-api2@0.2.18 X X +allocator-api2@0.2.21 X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X autocfg@1.4.0 X X -backon@1.2.0 X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.21.7 X X base64@0.22.1 X X bitflags@2.6.0 X X block-buffer@0.10.4 X X bumpalo@3.16.0 X X -bytes@1.8.0 X -cc@1.1.34 X X +bytes@1.9.0 X +cc@1.2.7 X X cfg-if@1.0.0 X X -chrono@0.4.38 X X +chrono@0.4.39 X X core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X +cpufeatures@0.2.16 X X crypto-common@0.1.6 X X dav-server@0.7.0 X -dav-server-opendalfs@0.2.3 X +dav-server-opendalfs@0.3.0 X deranged@0.3.11 X X digest@0.10.7 X X +displaydoc@0.2.5 X X equivalent@1.0.1 X X -fastrand@2.1.1 X X +fastrand@2.3.0 X X fnv@1.0.7 X X -foldhash@0.1.3 X +foldhash@0.1.4 X form_urlencoded@1.2.1 X X futures@0.3.31 X X futures-channel@0.3.31 X X @@ -44,27 +45,38 @@ generic-array@0.14.7 X getrandom@0.2.15 X X gimli@0.31.1 X X gloo-timers@0.3.0 X X -hashbrown@0.15.0 X X +hashbrown@0.15.2 X X headers@0.4.0 X headers-core@0.3.0 X -hermit-abi@0.3.9 X X htmlescape@0.3.1 X X X -http@1.1.0 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X httpdate@1.0.3 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X lazy_static@1.5.0 X X -libc@0.2.161 X X +libc@0.2.169 X X +litemap@0.7.4 X lock_api@0.4.12 X X log@0.4.22 X X lru@0.12.5 X @@ -72,83 +84,86 @@ md-5@0.10.6 X X memchr@2.7.4 X X mime@0.3.17 X X mime_guess@2.0.5 X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X num-conv@0.1.0 X X num-traits@0.2.19 X X -object@0.36.5 X X +object@0.36.7 X X once_cell@1.20.2 X X -opendal@0.51.0 X +opendal@0.51.1 X parking_lot@0.12.3 X X parking_lot_core@0.9.10 X X percent-encoding@2.3.1 X X -pin-project@1.1.7 X X -pin-project-internal@1.1.7 X X -pin-project-lite@0.2.15 X X +pin-project@1.1.8 X X +pin-project-internal@1.1.8 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X powerfmt@0.2.0 X X -proc-macro2@1.0.89 X X +proc-macro2@1.0.92 X X quick-xml@0.36.2 X -quote@1.0.37 X X -redox_syscall@0.5.7 X +quote@1.0.38 X X +redox_syscall@0.5.8 X regex@1.11.1 X X -regex-automata@0.4.8 X X +regex-automata@0.4.9 X X regex-syntax@0.8.5 X X -reqwest@0.12.9 X X +reqwest@0.12.12 X X ring@0.17.8 X rustc-demangle@0.1.24 X X -rustls@0.23.16 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X ryu@1.0.18 X X scopeguard@1.2.0 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_urlencoded@0.7.1 X X sha1@0.10.6 X X shlex@1.3.0 X X slab@0.4.9 X smallvec@1.13.2 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X +stable_deref_trait@1.2.0 X X subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -time@0.3.36 X X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +time@0.3.37 X X time-core@0.1.2 X X -time-macros@0.2.18 X X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X +tracing@0.1.41 X +tracing-core@0.1.33 X try-lock@0.2.5 X typenum@1.17.0 X X -unicase@2.8.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unicase@2.8.1 X X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -url@2.5.2 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X version_check@0.9.5 X X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X windows-core@0.52.0 X X windows-registry@0.2.0 X X windows-result@0.2.0 X X @@ -163,6 +178,14 @@ windows_i686_msvc@0.52.6 X X windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X -xml-rs@0.8.22 X +write16@1.0.0 X X +writeable@0.5.5 X +xml-rs@0.8.25 X xmltree@0.10.3 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/integrations/fuse3/Cargo.toml b/integrations/fuse3/Cargo.toml index 5d3db43328f1..0c0cf4a29acb 100644 --- a/integrations/fuse3/Cargo.toml +++ b/integrations/fuse3/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.0.10" +version = "0.0.11" [dependencies] bytes = "1.6.0" diff --git a/integrations/fuse3/DEPENDENCIES.rust.tsv b/integrations/fuse3/DEPENDENCIES.rust.tsv index 322ed15d5e1a..5d31dfe33cd6 100644 --- a/integrations/fuse3/DEPENDENCIES.rust.tsv +++ b/integrations/fuse3/DEPENDENCIES.rust.tsv @@ -1,37 +1,38 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.92 X X +anyhow@1.0.95 X X async-notify@0.3.0 X -async-trait@0.1.83 X X +async-trait@0.1.85 X X autocfg@1.4.0 X X -backon@1.2.0 X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.22.1 X X bincode@1.3.3 X bitflags@2.6.0 X X block-buffer@0.10.4 X X bumpalo@3.16.0 X X -bytes@1.8.0 X -cc@1.1.34 X X +bytes@1.9.0 X +cc@1.2.7 X X cfg-if@1.0.0 X X cfg_aliases@0.2.1 X -chrono@0.4.38 X X +chrono@0.4.39 X X concurrent-queue@2.5.0 X X core-foundation-sys@0.8.7 X X -crossbeam-utils@0.8.20 X X +crossbeam-utils@0.8.21 X X crypto-common@0.1.6 X X digest@0.10.7 X X +displaydoc@0.2.5 X X either@1.13.0 X X -errno@0.3.9 X X +errno@0.3.10 X X event-listener@4.0.3 X X -fastrand@2.1.1 X X +fastrand@2.3.0 X X fnv@1.0.7 X X form_urlencoded@1.2.1 X X fuse3@0.8.1 X -fuse3_opendal@0.0.10 X +fuse3_opendal@0.0.11 X futures@0.3.31 X X futures-channel@0.3.31 X X futures-core@0.3.31 X X @@ -44,103 +45,118 @@ generic-array@0.14.7 X getrandom@0.2.15 X X gimli@0.31.1 X X gloo-timers@0.3.0 X X -hermit-abi@0.3.9 X X -home@0.5.9 X X -http@1.1.0 X X +home@0.5.11 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X lazy_static@1.5.0 X X -libc@0.2.161 X X -linux-raw-sys@0.4.14 X X X +libc@0.2.169 X X +linux-raw-sys@0.4.15 X X X +litemap@0.7.4 X log@0.4.22 X X md-5@0.10.6 X X memchr@2.7.4 X X memoffset@0.9.1 X mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X nix@0.29.0 X num-traits@0.2.19 X X -object@0.36.5 X X +object@0.36.7 X X once_cell@1.20.2 X X -opendal@0.51.0 X +opendal@0.51.1 X parking@2.2.1 X X percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X -proc-macro2@1.0.89 X X +proc-macro2@1.0.92 X X quick-xml@0.36.2 X -quote@1.0.37 X X -reqwest@0.12.9 X X +quote@1.0.38 X X +reqwest@0.12.12 X X ring@0.17.8 X rustc-demangle@0.1.24 X X -rustix@0.38.38 X X X -rustls@0.23.16 X X X +rustix@0.38.43 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X ryu@1.0.18 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_urlencoded@0.7.1 X X sharded-slab@0.1.7 X shlex@1.3.0 X X signal-hook-registry@1.4.2 X X slab@0.4.9 X smallvec@1.13.2 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X +stable_deref_trait@1.2.0 X X subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +tinystr@0.7.6 X +tokio@1.42.0 X tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X trait-make@0.1.0 X X try-lock@0.2.5 X typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -url@2.5.2 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X version_check@0.9.5 X X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X which@6.0.3 X windows-core@0.52.0 X X windows-registry@0.2.0 X X windows-result@0.2.0 X X windows-strings@0.1.0 X X windows-sys@0.52.0 X X +windows-sys@0.59.0 X X windows-targets@0.52.6 X X windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_msvc@0.52.6 X X @@ -151,4 +167,12 @@ windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X winsafe@0.0.19 X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/integrations/object_store/Cargo.toml b/integrations/object_store/Cargo.toml index e33f594be091..97e6e76bd510 100644 --- a/integrations/object_store/Cargo.toml +++ b/integrations/object_store/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.48.3" +version = "0.49.0" [features] send_wrapper = ["dep:send_wrapper"] diff --git a/integrations/object_store/DEPENDENCIES.rust.tsv b/integrations/object_store/DEPENDENCIES.rust.tsv index 4d5c2505d271..166f555ac7bb 100644 --- a/integrations/object_store/DEPENDENCIES.rust.tsv +++ b/integrations/object_store/DEPENDENCIES.rust.tsv @@ -1,30 +1,31 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -async-trait@0.1.83 X X +anyhow@1.0.95 X X +async-trait@0.1.85 X X autocfg@1.4.0 X X -backon@1.2.0 X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.22.1 X X bitflags@2.6.0 X X block-buffer@0.10.4 X X bumpalo@3.16.0 X X byteorder@1.5.0 X X -bytes@1.8.0 X -cc@1.1.34 X X +bytes@1.9.0 X +cc@1.2.7 X X cfg-if@1.0.0 X X -chrono@0.4.38 X X +chrono@0.4.39 X X const-oid@0.9.6 X X core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X +cpufeatures@0.2.16 X X crc32c@0.6.8 X X crypto-common@0.1.6 X X digest@0.10.7 X X +displaydoc@0.2.5 X X either@1.13.0 X X -fastrand@2.1.1 X X +fastrand@2.3.0 X X flagset@0.4.6 X fnv@1.0.7 X X form_urlencoded@1.2.1 X X @@ -42,70 +43,81 @@ getrandom@0.2.15 X X gimli@0.31.1 X X gloo-timers@0.3.0 X X heck@0.5.0 X X -hermit-abi@0.3.9 X X hex@0.4.3 X X hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X +home@0.5.11 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X humantime@2.1.0 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X ipnet@2.10.1 X X itertools@0.13.0 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -libc@0.2.161 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +libc@0.2.169 X X +litemap@0.7.4 X lock_api@0.4.12 X X log@0.4.22 X X md-5@0.10.6 X X memchr@2.7.4 X X mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X num-traits@0.2.19 X X -object@0.36.5 X X -object_store@0.11.1 X X -object_store_opendal@0.48.3 X +object@0.36.7 X X +object_store@0.11.2 X X +object_store_opendal@0.49.0 X once_cell@1.20.2 X X -opendal@0.51.0 X +opendal@0.51.1 X parking_lot@0.12.3 X X parking_lot_core@0.9.10 X X percent-encoding@2.3.1 X X -pin-project@1.1.7 X X -pin-project-internal@1.1.7 X X -pin-project-lite@0.2.15 X X +pin-project@1.1.8 X X +pin-project-internal@1.1.8 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X +proc-macro2@1.0.92 X X quick-xml@0.36.2 X -quote@1.0.37 X X +quote@1.0.38 X X rand@0.8.5 X X rand_chacha@0.3.1 X X rand_core@0.6.4 X X -redox_syscall@0.5.7 X +redox_syscall@0.5.8 X reqsign@0.16.1 X -reqwest@0.12.9 X X +reqwest@0.12.12 X X ring@0.17.8 X rustc-demangle@0.1.24 X X rustc_version@0.4.1 X X -rustls@0.23.16 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X ryu@1.0.18 X X same-file@1.0.6 X X scopeguard@1.2.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_urlencoded@0.7.1 X X sha1@0.10.6 X X sha2@0.10.8 X X @@ -114,42 +126,45 @@ slab@0.4.9 X smallvec@1.13.2 X X snafu@0.8.5 X X snafu-derive@0.8.5 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X +stable_deref_trait@1.2.0 X X subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +tinystr@0.7.6 X +tokio@1.42.0 X tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X try-lock@0.2.5 X typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -url@2.5.2 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X version_check@0.9.5 X X walkdir@2.5.0 X X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X winapi-util@0.1.9 X X windows-core@0.52.0 X X windows-registry@0.2.0 X X @@ -166,6 +181,14 @@ windows_i686_msvc@0.52.6 X X windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X zerocopy@0.7.35 X X X zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/integrations/parquet/Cargo.toml b/integrations/parquet/Cargo.toml index 65706bb791c5..8222918621d6 100644 --- a/integrations/parquet/Cargo.toml +++ b/integrations/parquet/Cargo.toml @@ -25,7 +25,7 @@ homepage = "https://opendal.apache.org/" license = "Apache-2.0" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.2.3" +version = "0.3.0" [dependencies] async-trait = "0.1" diff --git a/integrations/parquet/DEPENDENCIES.rust.tsv b/integrations/parquet/DEPENDENCIES.rust.tsv index 580f80d71865..6ac933d83956 100644 --- a/integrations/parquet/DEPENDENCIES.rust.tsv +++ b/integrations/parquet/DEPENDENCIES.rust.tsv @@ -1,42 +1,43 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X ahash@0.8.11 X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.92 X X -arrow-array@53.2.0 X -arrow-buffer@53.2.0 X -arrow-cast@53.2.0 X -arrow-data@53.2.0 X -arrow-ipc@53.2.0 X -arrow-schema@53.2.0 X -arrow-select@53.2.0 X -async-trait@0.1.83 X X +anyhow@1.0.95 X X +arrow-array@53.3.0 X +arrow-buffer@53.3.0 X +arrow-cast@53.3.0 X +arrow-data@53.3.0 X +arrow-ipc@53.3.0 X +arrow-schema@53.3.0 X +arrow-select@53.3.0 X +async-trait@0.1.85 X X atoi@2.0.0 X autocfg@1.4.0 X X -backon@1.2.0 X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.22.1 X X bitflags@1.3.2 X X block-buffer@0.10.4 X X bumpalo@3.16.0 X X byteorder@1.5.0 X X -bytes@1.8.0 X -cc@1.1.34 X X +bytes@1.9.0 X +cc@1.2.7 X X cfg-if@1.0.0 X X -chrono@0.4.38 X X +chrono@0.4.39 X X const-oid@0.9.6 X X const-random@0.1.18 X X const-random-macro@0.1.16 X X core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X +cpufeatures@0.2.16 X X crc32c@0.6.8 X X crunchy@0.2.2 X crypto-common@0.1.6 X X digest@0.10.7 X X -fastrand@2.1.1 X X -flatbuffers@24.3.25 X +displaydoc@0.2.5 X X +fastrand@2.3.0 X X +flatbuffers@24.12.23 X fnv@1.0.7 X X form_urlencoded@1.2.1 X X futures@0.3.31 X X @@ -53,39 +54,50 @@ getrandom@0.2.15 X X gimli@0.31.1 X X gloo-timers@0.3.0 X X half@2.4.1 X X -hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X +hashbrown@0.15.2 X X hex@0.4.3 X X hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X +home@0.5.11 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X integer-encoding@3.0.4 X ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X -lexical-core@1.0.2 X X -lexical-parse-float@1.0.2 X X -lexical-parse-integer@1.0.2 X X -lexical-util@1.0.3 X X -lexical-write-float@1.0.2 X X -lexical-write-integer@1.0.2 X X -libc@0.2.161 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X +lexical-core@1.0.5 X X +lexical-parse-float@1.0.5 X X +lexical-parse-integer@1.0.5 X X +lexical-util@1.0.6 X X +lexical-write-float@1.0.5 X X +lexical-write-integer@1.0.5 X X +libc@0.2.169 X X libm@0.2.11 X X +litemap@0.7.4 X log@0.4.22 X X md-5@0.10.6 X X memchr@2.7.4 X X mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X num@0.4.3 X X num-bigint@0.4.6 X X num-complex@0.4.6 X X @@ -93,87 +105,91 @@ num-integer@0.1.46 X X num-iter@0.1.45 X X num-rational@0.4.2 X X num-traits@0.2.19 X X -object@0.36.5 X X +object@0.36.7 X X once_cell@1.20.2 X X -opendal@0.51.0 X +opendal@0.51.1 X ordered-float@2.10.1 X -parquet@53.2.0 X -parquet_opendal@0.2.3 X +parquet@53.3.0 X +parquet_opendal@0.3.0 X paste@1.0.15 X X percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X ppv-lite86@0.2.20 X X -proc-macro2@1.0.89 X X +proc-macro2@1.0.92 X X quick-xml@0.36.2 X -quote@1.0.37 X X +quote@1.0.38 X X rand@0.8.5 X X rand_chacha@0.3.1 X X rand_core@0.6.4 X X reqsign@0.16.1 X -reqwest@0.12.9 X X +reqwest@0.12.12 X X ring@0.17.8 X rustc-demangle@0.1.24 X X rustc_version@0.4.1 X X -rustls@0.23.16 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X ryu@1.0.18 X X -semver@1.0.23 X X +semver@1.0.24 X X seq-macro@0.3.5 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_urlencoded@0.7.1 X X sha1@0.10.6 X X sha2@0.10.8 X X shlex@1.3.0 X X slab@0.4.9 X smallvec@1.13.2 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X +stable_deref_trait@1.2.0 X X static_assertions@1.1.0 X X subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X thrift@0.17.0 X tiny-keccak@2.0.2 X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X +tinystr@0.7.6 X +tokio@1.42.0 X tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X +tracing@0.1.41 X +tracing-core@0.1.33 X try-lock@0.2.5 X twox-hash@1.6.3 X typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -url@2.5.2 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X version_check@0.9.5 X X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X windows-core@0.52.0 X X windows-registry@0.2.0 X X windows-result@0.2.0 X X windows-strings@0.1.0 X X windows-sys@0.52.0 X X +windows-sys@0.59.0 X X windows-targets@0.52.6 X X windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_msvc@0.52.6 X X @@ -183,6 +199,14 @@ windows_i686_msvc@0.52.6 X X windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X zerocopy@0.7.35 X X X zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/integrations/unftp-sbe/Cargo.toml b/integrations/unftp-sbe/Cargo.toml index b997aa644fd0..2daf77dcba57 100644 --- a/integrations/unftp-sbe/Cargo.toml +++ b/integrations/unftp-sbe/Cargo.toml @@ -24,7 +24,7 @@ license = "Apache-2.0" name = "unftp-sbe-opendal" repository = "https://github.com/apache/opendal" rust-version = "1.75" -version = "0.0.10" +version = "0.0.11" [dependencies] async-trait = "0.1.80" diff --git a/integrations/unftp-sbe/DEPENDENCIES.rust.tsv b/integrations/unftp-sbe/DEPENDENCIES.rust.tsv index de23c29261ce..3f63899508ed 100644 --- a/integrations/unftp-sbe/DEPENDENCIES.rust.tsv +++ b/integrations/unftp-sbe/DEPENDENCIES.rust.tsv @@ -1,18 +1,18 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MIT-0 MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-2-Clause BSD-3-Clause BSL-1.0 CC0-1.0 ISC MIT MIT-0 MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.92 X X +anyhow@1.0.95 X X arc-swap@1.7.1 X X asn1-rs@0.6.2 X X asn1-rs-derive@0.5.1 X X asn1-rs-impl@0.2.0 X X -async-trait@0.1.83 X X +async-trait@0.1.85 X X autocfg@1.4.0 X X -aws-lc-rs@1.10.0 X X -aws-lc-sys@0.22.0 X X X -backon@1.2.0 X +aws-lc-rs@1.12.0 X X +aws-lc-sys@0.24.1 X X X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.22.1 X X bindgen@0.69.5 X @@ -20,22 +20,22 @@ bitflags@2.6.0 X X block-buffer@0.10.4 X X bumpalo@3.16.0 X X byteorder@1.5.0 X X -bytes@1.8.0 X -cc@1.1.34 X X +bytes@1.9.0 X +cc@1.2.7 X X cexpr@0.6.0 X X cfg-if@1.0.0 X X cfg_aliases@0.2.1 X -chrono@0.4.38 X X +chrono@0.4.39 X X clang-sys@1.8.1 X -cmake@0.1.51 X X +cmake@0.1.52 X X const-oid@0.9.6 X X convert_case@0.4.0 X core-foundation-sys@0.8.7 X X -cpufeatures@0.2.14 X X +cpufeatures@0.2.16 X X crc32c@0.6.8 X X -crossbeam-channel@0.5.13 X X +crossbeam-channel@0.5.14 X X crossbeam-epoch@0.9.18 X X -crossbeam-utils@0.8.20 X X +crossbeam-utils@0.8.21 X X crypto-common@0.1.6 X X dashmap@5.5.3 X data-encoding@2.6.0 X @@ -47,8 +47,8 @@ displaydoc@0.2.5 X X doc-comment@0.3.3 X dunce@1.0.5 X X X either@1.13.0 X X -errno@0.3.9 X X -fastrand@2.1.1 X X +errno@0.3.10 X X +fastrand@2.3.0 X X fnv@1.0.7 X X form_urlencoded@1.2.1 X X fs_extra@1.3.0 X @@ -60,99 +60,120 @@ futures-macro@0.3.31 X X futures-sink@0.3.31 X X futures-task@0.3.31 X X futures-util@0.3.31 X X +generator@0.8.4 X X generic-array@0.14.7 X getrandom@0.2.15 X X gimli@0.31.1 X X -glob@0.3.1 X X +glob@0.3.2 X X gloo-timers@0.3.0 X X hashbrown@0.14.5 X X -hermit-abi@0.3.9 X X hex@0.4.3 X X hmac@0.12.1 X X -home@0.5.9 X X -http@1.1.0 X X +home@0.5.11 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X ipnet@2.10.1 X X itertools@0.12.1 X X -itoa@1.0.11 X X +itoa@1.0.14 X X jobserver@0.1.32 X X -js-sys@0.3.72 X X +js-sys@0.3.76 X X lazy_static@1.5.0 X X lazycell@1.3.0 X X -libc@0.2.161 X X -libloading@0.8.5 X -libunftp@0.20.1 X -linux-raw-sys@0.4.14 X X X +libc@0.2.169 X X +libloading@0.8.6 X +libunftp@0.20.3 X +linux-raw-sys@0.4.15 X X X +litemap@0.7.4 X lock_api@0.4.12 X X log@0.4.22 X X +loom@0.7.2 X +matchers@0.1.0 X md-5@0.10.6 X X memchr@2.7.4 X X mime@0.3.17 X X minimal-lexical@0.2.1 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X -mirai-annotations@1.12.0 X -moka@0.12.8 X X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X +moka@0.12.10 X X nix@0.29.0 X nom@7.1.3 X +nu-ansi-term@0.46.0 X num-bigint@0.4.6 X X num-conv@0.1.0 X X num-integer@0.1.46 X X num-traits@0.2.19 X X -object@0.36.5 X X +object@0.36.7 X X oid-registry@0.7.1 X X once_cell@1.20.2 X X -opendal@0.51.0 X +opendal@0.51.1 X +overload@0.1.1 X parking_lot@0.12.3 X X parking_lot_core@0.9.10 X X paste@1.0.15 X X percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X +portable-atomic@1.10.0 X X powerfmt@0.2.0 X X ppv-lite86@0.2.20 X X -prettyplease@0.2.25 X X -proc-macro2@1.0.89 X X +prettyplease@0.2.27 X X +proc-macro2@1.0.92 X X prometheus@0.13.4 X proxy-protocol@0.5.0 X X quick-xml@0.36.2 X -quote@1.0.37 X X +quote@1.0.38 X X rand@0.8.5 X X rand_chacha@0.3.1 X X rand_core@0.6.4 X X -redox_syscall@0.5.7 X +redox_syscall@0.5.8 X regex@1.11.1 X X -regex-automata@0.4.8 X X +regex-automata@0.1.10 X X +regex-automata@0.4.9 X X +regex-syntax@0.6.29 X X regex-syntax@0.8.5 X X reqsign@0.16.1 X -reqwest@0.12.9 X X +reqwest@0.12.12 X X ring@0.17.8 X rustc-demangle@0.1.24 X X rustc-hash@1.1.0 X X rustc_version@0.4.1 X X rusticata-macros@4.1.0 X X -rustix@0.38.38 X X X -rustls@0.23.16 X X X +rustix@0.38.43 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X +rustversion@1.0.19 X X ryu@1.0.18 X X +scoped-tls@1.0.1 X X scopeguard@1.2.0 X X -semver@1.0.23 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X +semver@1.0.24 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_urlencoded@0.7.1 X X sha1@0.10.6 X X sha2@0.10.8 X X +sharded-slab@0.1.7 X shlex@1.3.0 X X signal-hook-registry@1.4.2 X X slab@0.4.9 X @@ -162,57 +183,69 @@ slog-stdlog@4.1.1 X X X smallvec@1.13.2 X X snafu@0.6.10 X X snafu-derive@0.6.10 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X +stable_deref_trait@1.2.0 X X subtle@2.6.1 X syn@1.0.109 X X -syn@2.0.87 X X -sync_wrapper@1.0.1 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X synstructure@0.13.1 X tagptr@0.2.0 X X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -time@0.3.36 X X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +thread_local@1.1.8 X X +time@0.3.37 X X time-core@0.1.2 X X -time-macros@0.2.18 X X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X +time-macros@0.2.19 X X +tinystr@0.7.6 X +tokio@1.42.0 X tokio-macros@2.4.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-attributes@0.1.27 X -tracing-core@0.1.32 X -triomphe@0.1.11 X X +tracing@0.1.41 X +tracing-attributes@0.1.28 X +tracing-core@0.1.33 X +tracing-log@0.2.0 X +tracing-subscriber@0.3.19 X try-lock@0.2.5 X typenum@1.17.0 X X -unftp-sbe-opendal@0.0.10 X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unftp-sbe-opendal@0.0.11 X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -url@2.5.2 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X version_check@0.9.5 X X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X which@4.4.2 X +winapi@0.3.9 X X +winapi-i686-pc-windows-gnu@0.4.0 X X +winapi-x86_64-pc-windows-gnu@0.4.0 X X +windows@0.58.0 X X windows-core@0.52.0 X X +windows-core@0.58.0 X X +windows-implement@0.58.0 X X +windows-interface@0.58.0 X X windows-registry@0.2.0 X X windows-result@0.2.0 X X windows-strings@0.1.0 X X windows-sys@0.52.0 X X +windows-sys@0.59.0 X X windows-targets@0.52.6 X X windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_msvc@0.52.6 X X @@ -222,7 +255,15 @@ windows_i686_msvc@0.52.6 X X windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X x509-parser@0.16.0 X X +yoke@0.7.5 X +yoke-derive@0.7.5 X zerocopy@0.7.35 X X X zerocopy-derive@0.7.35 X X X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X diff --git a/integrations/virtiofs/DEPENDENCIES.rust.tsv b/integrations/virtiofs/DEPENDENCIES.rust.tsv index b7668c44ca52..c4e3d0efc4b3 100644 --- a/integrations/virtiofs/DEPENDENCIES.rust.tsv +++ b/integrations/virtiofs/DEPENDENCIES.rust.tsv @@ -1,27 +1,28 @@ -crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-DFS-2016 Unlicense Zlib +crate 0BSD Apache-2.0 Apache-2.0 WITH LLVM-exception BSD-3-Clause BSL-1.0 ISC MIT MPL-2.0 OpenSSL Unicode-3.0 Unlicense Zlib addr2line@0.24.2 X X adler2@2.0.0 X X X android-tzdata@0.1.1 X X android_system_properties@0.1.5 X X -anyhow@1.0.92 X X +anyhow@1.0.95 X X arc-swap@1.7.1 X X -async-trait@0.1.83 X X +async-trait@0.1.85 X X autocfg@1.4.0 X X -backon@1.2.0 X +backon@1.3.0 X backtrace@0.3.74 X X base64@0.22.1 X X bitflags@1.3.2 X X bitflags@2.6.0 X X block-buffer@0.10.4 X X bumpalo@3.16.0 X X -bytes@1.8.0 X -cc@1.1.34 X X +bytes@1.9.0 X +cc@1.2.7 X X cfg-if@1.0.0 X X -chrono@0.4.38 X X +chrono@0.4.39 X X core-foundation-sys@0.8.7 X X crypto-common@0.1.6 X X digest@0.10.7 X X -fastrand@2.1.1 X X +displaydoc@0.2.5 X X +fastrand@2.3.0 X X fnv@1.0.7 X X form_urlencoded@1.2.1 X X futures@0.3.31 X X @@ -37,49 +38,60 @@ getrandom@0.2.15 X X gimli@0.31.1 X X gloo-timers@0.3.0 X X heck@0.5.0 X X -hermit-abi@0.3.9 X X -http@1.1.0 X X +http@1.2.0 X X http-body@1.0.1 X http-body-util@0.1.2 X httparse@1.9.5 X X -hyper@1.5.0 X -hyper-rustls@0.27.3 X X X +hyper@1.5.2 X +hyper-rustls@0.27.5 X X X hyper-util@0.1.10 X iana-time-zone@0.1.61 X X iana-time-zone-haiku@0.1.2 X X -idna@0.5.0 X X +icu_collections@1.5.0 X +icu_locid@1.5.0 X +icu_locid_transform@1.5.0 X +icu_locid_transform_data@1.5.0 X +icu_normalizer@1.5.0 X +icu_normalizer_data@1.5.0 X +icu_properties@1.5.1 X +icu_properties_data@1.5.0 X +icu_provider@1.5.0 X +icu_provider_macros@1.5.0 X +idna@1.0.3 X X +idna_adapter@1.2.0 X X ipnet@2.10.1 X X -itoa@1.0.11 X X -js-sys@0.3.72 X X +itoa@1.0.14 X X +js-sys@0.3.76 X X lazy_static@1.5.0 X X -libc@0.2.161 X X +libc@0.2.169 X X +litemap@0.7.4 X log@0.4.22 X X md-5@0.10.6 X X memchr@2.7.4 X X mime@0.3.17 X X -miniz_oxide@0.8.0 X X X -mio@1.0.2 X +miniz_oxide@0.8.2 X X X +mio@1.0.3 X num-traits@0.2.19 X X -object@0.36.5 X X +object@0.36.7 X X once_cell@1.20.2 X X -opendal@0.51.0 X +opendal@0.51.1 X percent-encoding@2.3.1 X X -pin-project-lite@0.2.15 X X +pin-project-lite@0.2.16 X X pin-utils@0.1.0 X X -proc-macro2@1.0.89 X X +proc-macro2@1.0.92 X X quick-xml@0.36.2 X -quote@1.0.37 X X -reqwest@0.12.9 X X +quote@1.0.38 X X +reqwest@0.12.12 X X ring@0.17.8 X rustc-demangle@0.1.24 X X -rustls@0.23.16 X X X +rustls@0.23.20 X X X rustls-pemfile@2.2.0 X X X -rustls-pki-types@1.10.0 X X +rustls-pki-types@1.10.1 X X rustls-webpki@0.102.8 X ryu@1.0.18 X X -serde@1.0.214 X X -serde_derive@1.0.214 X X -serde_json@1.0.132 X X +serde@1.0.217 X X +serde_derive@1.0.217 X X +serde_json@1.0.135 X X serde_urlencoded@0.7.1 X X sharded-slab@0.1.7 X shlex@1.3.0 X X @@ -87,28 +99,31 @@ slab@0.4.9 X smallvec@1.13.2 X X snafu@0.8.5 X X snafu-derive@0.8.5 X X -socket2@0.5.7 X X +socket2@0.5.8 X X spin@0.9.8 X +stable_deref_trait@1.2.0 X X subtle@2.6.1 X -syn@2.0.87 X X -sync_wrapper@1.0.1 X -thiserror@1.0.67 X X -thiserror-impl@1.0.67 X X -tinyvec@1.8.0 X X X -tinyvec_macros@0.1.1 X X X -tokio@1.41.0 X -tokio-rustls@0.26.0 X X -tokio-util@0.7.12 X +syn@2.0.95 X X +sync_wrapper@1.0.2 X +synstructure@0.13.1 X +thiserror@1.0.69 X X +thiserror-impl@1.0.69 X X +tinystr@0.7.6 X +tokio@1.42.0 X +tokio-rustls@0.26.1 X X +tokio-util@0.7.13 X +tower@0.5.2 X +tower-layer@0.3.3 X tower-service@0.3.3 X -tracing@0.1.40 X -tracing-core@0.1.32 X +tracing@0.1.41 X +tracing-core@0.1.33 X try-lock@0.2.5 X typenum@1.17.0 X X -unicode-bidi@0.3.17 X X -unicode-ident@1.0.13 X X X -unicode-normalization@0.1.24 X X +unicode-ident@1.0.14 X X X untrusted@0.9.0 X -url@2.5.2 X X +url@2.5.4 X X +utf16_iter@1.0.5 X X +utf8_iter@1.0.4 X X uuid@1.11.0 X X version_check@0.9.5 X X vhost@0.10.0 X X @@ -120,15 +135,15 @@ vm-memory@0.14.1 X X vmm-sys-util@0.12.1 X want@0.3.1 X wasi@0.11.0+wasi-snapshot-preview1 X X X -wasm-bindgen@0.2.95 X X -wasm-bindgen-backend@0.2.95 X X -wasm-bindgen-futures@0.4.45 X X -wasm-bindgen-macro@0.2.95 X X -wasm-bindgen-macro-support@0.2.95 X X -wasm-bindgen-shared@0.2.95 X X +wasm-bindgen@0.2.99 X X +wasm-bindgen-backend@0.2.99 X X +wasm-bindgen-futures@0.4.49 X X +wasm-bindgen-macro@0.2.99 X X +wasm-bindgen-macro-support@0.2.99 X X +wasm-bindgen-shared@0.2.99 X X wasm-streams@0.4.2 X X -web-sys@0.3.72 X X -webpki-roots@0.26.6 X +web-sys@0.3.76 X X +webpki-roots@0.26.7 X winapi@0.3.9 X X winapi-i686-pc-windows-gnu@0.4.0 X X winapi-x86_64-pc-windows-gnu@0.4.0 X X @@ -146,4 +161,12 @@ windows_i686_msvc@0.52.6 X X windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_msvc@0.52.6 X X +write16@1.0.0 X X +writeable@0.5.5 X +yoke@0.7.5 X +yoke-derive@0.7.5 X +zerofrom@0.1.5 X +zerofrom-derive@0.1.5 X zeroize@1.8.1 X X +zerovec@0.10.4 X +zerovec-derive@0.10.3 X From 86ba75d692365a264d42d27fcd942aba424f9461 Mon Sep 17 00:00:00 2001 From: meteorgan Date: Thu, 9 Jan 2025 22:21:27 +0800 Subject: [PATCH 07/14] feat(core): implement if_modified_since and if_unmodified_since for stat_with (#5528) --- core/src/raw/ops.rs | 24 ++++++++ core/src/services/s3/backend.rs | 2 + core/src/services/s3/core.rs | 14 ++++- core/src/types/capability.rs | 4 ++ core/src/types/operator/operator.rs | 44 +++++++++++++- core/src/types/operator/operator_futures.rs | 10 ++++ core/tests/behavior/async_stat.rs | 63 +++++++++++++++++++++ 7 files changed, 158 insertions(+), 3 deletions(-) diff --git a/core/src/raw/ops.rs b/core/src/raw/ops.rs index 6d00808ac212..12f4a3a05357 100644 --- a/core/src/raw/ops.rs +++ b/core/src/raw/ops.rs @@ -511,6 +511,8 @@ impl OpReader { pub struct OpStat { if_match: Option, if_none_match: Option, + if_modified_since: Option>, + if_unmodified_since: Option>, override_content_type: Option, override_cache_control: Option, override_content_disposition: Option, @@ -545,6 +547,28 @@ impl OpStat { self.if_none_match.as_deref() } + /// Set the If-Modified-Since of the option + pub fn with_if_modified_since(mut self, v: DateTime) -> Self { + self.if_modified_since = Some(v); + self + } + + /// Get If-Modified-Since from option + pub fn if_modified_since(&self) -> Option> { + self.if_modified_since + } + + /// Set the If-Unmodified-Since of the option + pub fn with_if_unmodified_since(mut self, v: DateTime) -> Self { + self.if_unmodified_since = Some(v); + self + } + + /// Get If-Unmodified-Since from option + pub fn if_unmodified_since(&self) -> Option> { + self.if_unmodified_since + } + /// Sets the content-disposition header that should be sent back by the remote read operation. pub fn with_override_content_disposition(mut self, content_disposition: &str) -> Self { self.override_content_disposition = Some(content_disposition.into()); diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs index 46f0df1ee771..3f3f00521aae 100644 --- a/core/src/services/s3/backend.rs +++ b/core/src/services/s3/backend.rs @@ -926,6 +926,8 @@ impl Access for S3Backend { stat_has_content_encoding: true, stat_with_if_match: true, stat_with_if_none_match: true, + stat_with_if_modified_since: true, + stat_with_if_unmodified_since: true, stat_with_override_cache_control: !self.core.disable_stat_with_override, stat_with_override_content_disposition: !self.core.disable_stat_with_override, stat_with_override_content_type: !self.core.disable_stat_with_override, diff --git a/core/src/services/s3/core.rs b/core/src/services/s3/core.rs index c5c32e9ad516..69cab8f2b93d 100644 --- a/core/src/services/s3/core.rs +++ b/core/src/services/s3/core.rs @@ -338,11 +338,23 @@ impl S3Core { if let Some(if_none_match) = args.if_none_match() { req = req.header(IF_NONE_MATCH, if_none_match); } - if let Some(if_match) = args.if_match() { req = req.header(IF_MATCH, if_match); } + if let Some(if_modified_since) = args.if_modified_since() { + req = req.header( + IF_MODIFIED_SINCE, + format_datetime_into_http_date(if_modified_since), + ); + } + if let Some(if_unmodified_since) = args.if_unmodified_since() { + req = req.header( + IF_UNMODIFIED_SINCE, + format_datetime_into_http_date(if_unmodified_since), + ); + } + let req = req.body(Buffer::new()).map_err(new_request_build_error)?; Ok(req) diff --git a/core/src/types/capability.rs b/core/src/types/capability.rs index fcad9a66ebdf..b9e60d305088 100644 --- a/core/src/types/capability.rs +++ b/core/src/types/capability.rs @@ -70,6 +70,10 @@ pub struct Capability { pub stat_with_if_match: bool, /// Indicates if conditional stat operations using If-None-Match are supported. pub stat_with_if_none_match: bool, + /// Indicates if conditional stat operations using If-Modified-Since are supported. + pub stat_with_if_modified_since: bool, + /// Indicates if conditional stat operations using If-Unmodified-Since are supported. + pub stat_with_if_unmodified_since: bool, /// Indicates if Cache-Control header override is supported during stat operations. pub stat_with_override_cache_control: bool, /// Indicates if Content-Disposition header override is supported during stat operations. diff --git a/core/src/types/operator/operator.rs b/core/src/types/operator/operator.rs index 085e15c7bf05..a65e572fbbd9 100644 --- a/core/src/types/operator/operator.rs +++ b/core/src/types/operator/operator.rs @@ -257,7 +257,7 @@ impl Operator { /// /// This feature can be used to check if the file's `ETag` matches the given `ETag`. /// - /// If file exists and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// If file exists, and it's etag doesn't match, an error with kind [`ErrorKind::ConditionNotMatch`] /// will be returned. /// /// ``` @@ -276,7 +276,7 @@ impl Operator { /// /// This feature can be used to check if the file's `ETag` doesn't match the given `ETag`. /// - /// If file exists and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] + /// If file exists, and it's etag match, an error with kind [`ErrorKind::ConditionNotMatch`] /// will be returned. /// /// ``` @@ -289,6 +289,46 @@ impl Operator { /// # } /// ``` /// + /// ## `if_modified_since` + /// + /// set `if_modified_since` for this `stat` request. + /// + /// This feature can be used to check if the file has been modified since the given time. + /// + /// If file exists, and it's not modified after the given time, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::Utc; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut metadata = op.stat_with("path/to/file").if_modified_since(Utc::now()).await?; + /// # Ok(()) + /// # } + /// ``` + /// + /// ## `if_unmodified_since` + /// + /// set `if_unmodified_since` for this `stat` request. + /// + /// This feature can be used to check if the file has NOT been modified since the given time. + /// + /// If file exists, and it's modified after the given time, an error with kind [`ErrorKind::ConditionNotMatch`] + /// will be returned. + /// + /// ``` + /// # use opendal::Result; + /// use opendal::Operator; + /// use chrono::Utc; + /// + /// # async fn test(op: Operator) -> Result<()> { + /// let mut metadata = op.stat_with("path/to/file").if_unmodified_since(Utc::now()).await?; + /// # Ok(()) + /// # } + /// ``` + /// /// ## `version` /// /// Set `version` for this `stat` request. diff --git a/core/src/types/operator/operator_futures.rs b/core/src/types/operator/operator_futures.rs index c847b53745e2..4c1b90657df2 100644 --- a/core/src/types/operator/operator_futures.rs +++ b/core/src/types/operator/operator_futures.rs @@ -104,6 +104,16 @@ impl>> FutureStat { self.map(|args| args.with_if_none_match(v)) } + /// Set the If-Modified-Since for this operation. + pub fn if_modified_since(self, v: DateTime) -> Self { + self.map(|args| args.with_if_modified_since(v)) + } + + /// Set the If-Unmodified-Since for this operation. + pub fn if_unmodified_since(self, v: DateTime) -> Self { + self.map(|args| args.with_if_unmodified_since(v)) + } + /// Set the version for this operation. pub fn version(self, v: &str) -> Self { self.map(|args| args.with_version(v)) diff --git a/core/tests/behavior/async_stat.rs b/core/tests/behavior/async_stat.rs index 38f50704acd4..b4b004a7ddfe 100644 --- a/core/tests/behavior/async_stat.rs +++ b/core/tests/behavior/async_stat.rs @@ -23,6 +23,7 @@ use anyhow::Result; use http::StatusCode; use log::warn; use reqwest::Url; +use tokio::time::sleep; pub fn tests(op: &Operator, tests: &mut Vec) { let cap = op.info().full_capability(); @@ -38,6 +39,8 @@ pub fn tests(op: &Operator, tests: &mut Vec) { test_stat_not_exist, test_stat_with_if_match, test_stat_with_if_none_match, + test_stat_with_if_modified_since, + test_stat_with_if_unmodified_since, test_stat_with_override_cache_control, test_stat_with_override_content_disposition, test_stat_with_override_content_type, @@ -244,6 +247,66 @@ pub async fn test_stat_with_if_none_match(op: Operator) -> Result<()> { Ok(()) } +/// Stat file with if_modified_since should succeed, otherwise get a ConditionNotMatch error. +pub async fn test_stat_with_if_modified_since(op: Operator) -> Result<()> { + if !op.info().full_capability().stat_with_if_modified_since { + return Ok(()); + } + + let (path, content, _) = TEST_FIXTURE.new_file(op.clone()); + + op.write(&path, content.clone()) + .await + .expect("write must succeed"); + + let meta = op.stat(&path).await?; + assert_eq!(meta.mode(), EntryMode::FILE); + assert_eq!(meta.content_length(), content.len() as u64); + + let since = meta.last_modified().unwrap() - Duration::from_secs(1); + let res = op.stat_with(&path).if_modified_since(since).await?; + assert_eq!(res.last_modified(), meta.last_modified()); + + sleep(Duration::from_secs(1)).await; + + let since = meta.last_modified().unwrap() + Duration::from_secs(1); + let res = op.stat_with(&path).if_modified_since(since).await; + assert!(res.is_err()); + assert_eq!(res.err().unwrap().kind(), ErrorKind::ConditionNotMatch); + + Ok(()) +} + +/// Stat file with if_unmodified_since should succeed, otherwise get a ConditionNotMatch error. +pub async fn test_stat_with_if_unmodified_since(op: Operator) -> Result<()> { + if !op.info().full_capability().stat_with_if_unmodified_since { + return Ok(()); + } + + let (path, content, _) = TEST_FIXTURE.new_file(op.clone()); + + op.write(&path, content.clone()) + .await + .expect("write must succeed"); + + let meta = op.stat(&path).await?; + assert_eq!(meta.mode(), EntryMode::FILE); + assert_eq!(meta.content_length(), content.len() as u64); + + let since = meta.last_modified().unwrap() - Duration::from_secs(1); + let res = op.stat_with(&path).if_unmodified_since(since).await; + assert!(res.is_err()); + assert_eq!(res.err().unwrap().kind(), ErrorKind::ConditionNotMatch); + + sleep(Duration::from_secs(1)).await; + + let since = meta.last_modified().unwrap() + Duration::from_secs(1); + let res = op.stat_with(&path).if_unmodified_since(since).await?; + assert_eq!(res.last_modified(), meta.last_modified()); + + Ok(()) +} + /// Stat file with override-cache-control should succeed. pub async fn test_stat_with_override_cache_control(op: Operator) -> Result<()> { if !(op.info().full_capability().stat_with_override_cache_control From fc686ed56dc0814bc494a56234ad8be519c7fc4a Mon Sep 17 00:00:00 2001 From: Andy Lok Date: Thu, 9 Jan 2025 23:41:39 +0800 Subject: [PATCH 08/14] feat(layer/otelmetrics): add OtelMetricsLayer (#5524) --- core/Cargo.lock | 27 +-- core/Cargo.toml | 16 +- core/README.md | 40 ++-- core/src/layers/mod.rs | 5 + core/src/layers/otelmetrics.rs | 341 +++++++++++++++++++++++++++++++++ core/src/layers/tracing.rs | 11 +- 6 files changed, 396 insertions(+), 44 deletions(-) create mode 100644 core/src/layers/otelmetrics.rs diff --git a/core/Cargo.lock b/core/Cargo.lock index c2200da5c530..c409e9d6d3c2 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -5367,23 +5367,23 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.26.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570074cc999d1a58184080966e5bd3bf3a9a4af650c3b05047c2621e7405cd17" +checksum = "ab70038c28ed37b97d8ed414b6429d343a8bbf44c9f79ec854f3a643029ba6d7" dependencies = [ "futures-core", "futures-sink", "js-sys", - "once_cell", "pin-project-lite", "thiserror 1.0.69", + "tracing", ] [[package]] name = "opentelemetry-otlp" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e1f9c8b032d4f635c730c0efcf731d5e2530ea13fa8bef7939ddc8420696bd" +checksum = "91cf61a1868dacc576bf2b2a1c3e9ab150af7272909e80085c3173384fe11f76" dependencies = [ "async-trait", "futures-core", @@ -5395,13 +5395,14 @@ dependencies = [ "thiserror 1.0.69", "tokio", "tonic 0.12.3", + "tracing", ] [[package]] name = "opentelemetry-proto" -version = "0.26.1" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d3968ce3aefdcca5c27e3c4ea4391b37547726a70893aab52d3de95d5f8b34" +checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -5411,21 +5412,23 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.26.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c627d9f4c9cdc1f21a29ee4bfbd6028fcb8bcf2a857b43f3abdf72c9c862f3" +checksum = "231e9d6ceef9b0b2546ddf52335785ce41252bc7474ee8ba05bfad277be13ab8" dependencies = [ "async-trait", "futures-channel", "futures-executor", "futures-util", "glob", - "once_cell", "opentelemetry", "percent-encoding", "rand 0.8.5", "serde_json", "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tracing", ] [[package]] @@ -8708,9 +8711,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc58af5d3f6c5811462cabb3289aec0093f7338e367e5a33d28c0433b3c7360b" +checksum = "97a971f6058498b5c0f1affa23e7ea202057a7301dbff68e968b2d578bcbd053" dependencies = [ "js-sys", "once_cell", diff --git a/core/Cargo.toml b/core/Cargo.toml index c05a8b5a693f..8b0461a73f13 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -91,8 +91,10 @@ layers-prometheus-client = ["dep:prometheus-client"] layers-fastrace = ["dep:fastrace"] # Enable layers tracing support. layers-tracing = ["dep:tracing"] +# Enable layers otelmetrics support. +layers-otel-metrics = ["opentelemetry/metrics"] # Enable layers oteltrace support. -layers-otel-trace = ["dep:opentelemetry"] +layers-otel-trace = ["opentelemetry/trace"] # Enable layers throttle support. layers-throttle = ["dep:governor"] # Enable layers await-tree support. @@ -374,7 +376,7 @@ mime_guess = { version = "2.0.5", optional = true } # for layers-fastrace fastrace = { version = "0.7.1", optional = true } # for layers-opentelemetry -opentelemetry = { version = "0.26", optional = true } +opentelemetry = { version = "0.27", optional = true } # for layers-prometheus prometheus = { version = "0.13", features = ["process"], optional = true } # for layers-prometheus-client @@ -395,17 +397,17 @@ dotenvy = "0.15" fastrace = { version = "0.7", features = ["enable"] } fastrace-jaeger = "0.7" libtest-mimic = "0.8" -opentelemetry = { version = "0.26", default-features = false, features = [ - "trace", +opentelemetry = { version = "0.27", default-features = false, features = [ + "trace", ] } -opentelemetry-otlp = "0.26" -opentelemetry_sdk = "0.26" +opentelemetry-otlp = "0.27" +opentelemetry_sdk = { version = "0.27", features = ["rt-tokio"] } pretty_assertions = "1" rand = "0.8" sha2 = "0.10" size = "0.4" tokio = { version = "1.27", features = ["fs", "macros", "rt-multi-thread"] } -tracing-opentelemetry = "0.27.0" +tracing-opentelemetry = "0.28.0" tracing-subscriber = { version = "0.3", features = [ "env-filter", "tracing-log", diff --git a/core/README.md b/core/README.md index c76810dfbe97..788b6eb6212a 100644 --- a/core/README.md +++ b/core/README.md @@ -105,25 +105,26 @@ OpenDAL supports the following storage [services](https://docs.rs/opendal/latest OpenDAL supports the following storage [layers](https://docs.rs/opendal/latest/opendal/layers/index.html) to extend the behavior: -| Name | Depends | Description | -|---------------------------|------------------------|---------------------------------------------------------------------------------------| -| [`AsyncBacktraceLayer`] | [async-backtrace] | Add Efficient, logical 'stack' traces of async functions for the underlying services. | -| [`AwaitTreeLayer`] | [await-tree] | Add a Instrument await-tree for actor-based applications to the underlying services. | -| [`BlockingLayer`] | [tokio] | Add blocking API support for non-blocking services. | -| [`ChaosLayer`] | [rand] | Inject chaos into underlying services for robustness test. | -| [`ConcurrentLimitLayer`] | [tokio] | Add concurrent request limit. | -| [`DtraceLayer`] | [probe] | Support User Statically-Defined Tracing(aka USDT) on Linux | -| [`LoggingLayer`] | [log] | Add log for every operations. | -| [`MetricsLayer`] | [metrics] | Add metrics for every operations. | -| [`MimeGuessLayer`] | [mime_guess] | Add `Content-Type` automatically based on the file extension in the operation path. | -| [`FastraceLayer`] | [fastrace] | Add fastrace for every operations. | -| [`OtelTraceLayer`] | [opentelemetry::trace] | Add opentelemetry::trace for every operations. | -| [`PrometheusClientLayer`] | [prometheus_client] | Add prometheus metrics for every operations. | -| [`PrometheusLayer`] | [prometheus] | Add prometheus metrics for every operations. | -| [`RetryLayer`] | [backon] | Add retry for temporary failed operations. | -| [`ThrottleLayer`] | [governor] | Add a bandwidth rate limiter to the underlying services. | -| [`TimeoutLayer`] | [tokio] | Add timeout for every operations to avoid slow or unexpected hang operations. | -| [`TracingLayer`] | [tracing] | Add tracing for every operations. | +| Name | Depends | Description | +|---------------------------|--------------------------|---------------------------------------------------------------------------------------| +| [`AsyncBacktraceLayer`] | [async-backtrace] | Add Efficient, logical 'stack' traces of async functions for the underlying services. | +| [`AwaitTreeLayer`] | [await-tree] | Add a Instrument await-tree for actor-based applications to the underlying services. | +| [`BlockingLayer`] | [tokio] | Add blocking API support for non-blocking services. | +| [`ChaosLayer`] | [rand] | Inject chaos into underlying services for robustness test. | +| [`ConcurrentLimitLayer`] | [tokio] | Add concurrent request limit. | +| [`DtraceLayer`] | [probe] | Support User Statically-Defined Tracing(aka USDT) on Linux | +| [`LoggingLayer`] | [log] | Add log for every operations. | +| [`MetricsLayer`] | [metrics] | Add metrics for every operations. | +| [`MimeGuessLayer`] | [mime_guess] | Add `Content-Type` automatically based on the file extension in the operation path. | +| [`FastraceLayer`] | [fastrace] | Add fastrace for every operations. | +| [`OtelMetricsLayer`] | [opentelemetry::metrics] | Add opentelemetry::metrics for every operations. | +| [`OtelTraceLayer`] | [opentelemetry::trace] | Add opentelemetry::trace for every operations. | +| [`PrometheusClientLayer`] | [prometheus_client] | Add prometheus metrics for every operations. | +| [`PrometheusLayer`] | [prometheus] | Add prometheus metrics for every operations. | +| [`RetryLayer`] | [backon] | Add retry for temporary failed operations. | +| [`ThrottleLayer`] | [governor] | Add a bandwidth rate limiter to the underlying services. | +| [`TimeoutLayer`] | [tokio] | Add timeout for every operations to avoid slow or unexpected hang operations. | +| [`TracingLayer`] | [tracing] | Add tracing for every operations. | [`AsyncBacktraceLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.AsyncBacktraceLayer.html [async-backtrace]: https://github.com/tokio-rs/async-backtrace @@ -144,6 +145,7 @@ OpenDAL supports the following storage [layers](https://docs.rs/opendal/latest/o [mime_guess]: https://github.com/abonander/mime_guess [`FastraceLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.FastraceLayer.html [fastrace]: https://github.com/fastracelabs/fastrace +[`OtelMetricsLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.OtelMetricsLayer.html [`OtelTraceLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.OtelTraceLayer.html [opentelemetry::trace]: https://docs.rs/opentelemetry/latest/opentelemetry/trace/index.html [`PrometheusClientLayer`]: https://docs.rs/opendal/latest/opendal/layers/struct.PrometheusClientLayer.html diff --git a/core/src/layers/mod.rs b/core/src/layers/mod.rs index 0ac8f5f67abe..0c7657c57d45 100644 --- a/core/src/layers/mod.rs +++ b/core/src/layers/mod.rs @@ -87,6 +87,11 @@ mod fastrace; #[cfg(feature = "layers-fastrace")] pub use self::fastrace::FastraceLayer; +#[cfg(feature = "layers-otel-metrics")] +mod otelmetrics; +#[cfg(feature = "layers-otel-metrics")] +pub use self::otelmetrics::OtelMetricsLayer; + #[cfg(feature = "layers-otel-trace")] mod oteltrace; #[cfg(feature = "layers-otel-trace")] diff --git a/core/src/layers/otelmetrics.rs b/core/src/layers/otelmetrics.rs new file mode 100644 index 000000000000..5b3d083a74a4 --- /dev/null +++ b/core/src/layers/otelmetrics.rs @@ -0,0 +1,341 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use std::sync::Arc; +use std::time::Duration; + +use opentelemetry::global; +use opentelemetry::metrics::Counter; +use opentelemetry::metrics::Histogram; +use opentelemetry::KeyValue; + +use crate::layers::observe; +use crate::raw::*; +use crate::*; + +/// Add [opentelemetry::metrics](https://docs.rs/opentelemetry/latest/opentelemetry/metrics/index.html) for every operation. +/// +/// # Examples +/// +/// ```no_run +/// # use opendal::layers::OtelMetricsLayer; +/// # use opendal::services; +/// # use opendal::Operator; +/// # use opendal::Result; +/// +/// # fn main() -> Result<()> { +/// let _ = Operator::new(services::Memory::default())? +/// .layer(OtelMetricsLayer::builder().register()) +/// .finish(); +/// Ok(()) +/// # } +/// ``` +#[derive(Clone, Debug)] +pub struct OtelMetricsLayer { + interceptor: OtelMetricsInterceptor, +} + +impl OtelMetricsLayer { + /// Create a [`OtelMetricsLayerBuilder`] to set the configuration of metrics. + /// + /// # Default Configuration + /// + /// - `path_label`: `0` + /// + /// # Examples + /// + /// ```no_run + /// # use log::debug; + /// # use opendal::layers::OtelMetricsLayer; + /// # use opendal::services; + /// # use opendal::Operator; + /// # use opendal::Result; + /// + /// # #[tokio::main] + /// # async fn main() -> Result<()> { + /// let op = Operator::new(services::Memory::default())? + /// .layer(OtelMetricsLayer::builder().path_label(1).register()) + /// .finish(); + /// debug!("operator: {op:?}"); + /// + /// Ok(()) + /// # } + /// ``` + pub fn builder() -> OtelMetricsLayerBuilder { + OtelMetricsLayerBuilder::new() + } +} + +/// [`OtelMetricsLayerBuilder`] is a config builder to build a [`OtelMetricsLayer`]. +pub struct OtelMetricsLayerBuilder { + operation_duration_seconds_boundaries: Vec, + operation_bytes_boundaries: Vec, + path_label_level: usize, +} + +impl OtelMetricsLayerBuilder { + fn new() -> Self { + Self { + operation_duration_seconds_boundaries: exponential_boundary(0.01, 2.0, 16), + operation_bytes_boundaries: exponential_boundary(1.0, 2.0, 16), + path_label_level: 0, + } + } + + /// Set the level of path label. + /// + /// - level = 0: we will ignore the path label. + /// - level > 0: the path label will be the path split by "/" and get the last n level, + /// if n=1 and input path is "abc/def/ghi", and then we will get "abc/" as the path label. + /// + /// # Examples + /// + /// ```no_run + /// # use log::debug; + /// # use opendal::layers::OtelMetricsLayer; + /// # use opendal::services; + /// # use opendal::Operator; + /// # use opendal::Result; + /// + /// # #[tokio::main] + /// # async fn main() -> Result<()> { + /// let op = Operator::new(services::Memory::default())? + /// .layer(OtelMetricsLayer::builder().path_label(1).register()) + /// .finish(); + /// debug!("operator: {op:?}"); + /// + /// Ok(()) + /// # } + /// ``` + pub fn path_label(mut self, level: usize) -> Self { + self.path_label_level = level; + self + } + + /// Set boundaries for `operation_duration_seconds` histogram. + /// + /// # Examples + /// + /// ```no_run + /// # use log::debug; + /// # use opendal::layers::OtelMetricsLayer; + /// # use opendal::services; + /// # use opendal::Operator; + /// # use opendal::Result; + /// + /// # #[tokio::main] + /// # async fn main() -> Result<()> { + /// let op = Operator::new(services::Memory::default())? + /// .layer( + /// OtelMetricsLayer::builder() + /// .operation_duration_seconds_boundaries(vec![0.01, 0.02, 0.05, 0.1, 0.2, 0.5]) + /// .register() + /// ) + /// .finish(); + /// debug!("operator: {op:?}"); + /// + /// Ok(()) + /// # } + /// ``` + pub fn operation_duration_seconds_boundaries(mut self, boundaries: Vec) -> Self { + if !boundaries.is_empty() { + self.operation_duration_seconds_boundaries = boundaries; + } + self + } + + /// Set boundaries for `operation_bytes` histogram. + /// + /// # Examples + /// + /// ```no_run + /// # use log::debug; + /// # use opendal::layers::OtelMetricsLayer; + /// # use opendal::services; + /// # use opendal::Operator; + /// # use opendal::Result; + /// + /// # #[tokio::main] + /// # async fn main() -> Result<()> { + /// let op = Operator::new(services::Memory::default())? + /// .layer( + /// OtelMetricsLayer::builder() + /// .operation_bytes_boundaries(vec![1.0, 2.0, 5.0, 10.0, 20.0, 50.0]) + /// .register() + /// ) + /// .finish(); + /// debug!("operator: {op:?}"); + /// + /// Ok(()) + /// # } + /// ``` + pub fn operation_bytes_boundaries(mut self, boundaries: Vec) -> Self { + if !boundaries.is_empty() { + self.operation_bytes_boundaries = boundaries; + } + self + } + + /// Register the metrics and return a [`OtelMetricsLayer`]. + /// + /// # Examples + /// + /// ```no_run + /// # use log::debug; + /// # use opendal::layers::OtelMetricsLayer; + /// # use opendal::services; + /// # use opendal::Operator; + /// # use opendal::Result; + /// + /// # #[tokio::main] + /// # async fn main() -> Result<()> { + /// let op = Operator::new(services::Memory::default())? + /// .layer(OtelMetricsLayer::builder().register()) + /// .finish(); + /// debug!("operator: {op:?}"); + /// + /// Ok(()) + /// # } + /// ``` + pub fn register(self) -> OtelMetricsLayer { + let meter = global::meter("opendal"); + let duration_seconds = meter + .f64_histogram("opendal.operation.duration") + .with_description("Duration of operations") + .with_unit("second") + .with_boundaries(self.operation_duration_seconds_boundaries) + .build(); + let bytes = meter + .u64_histogram("opendal.operation.size") + .with_description("Size of operations") + .with_unit("byte") + .with_boundaries(self.operation_bytes_boundaries) + .build(); + let errors = meter + .u64_counter("opendal.operation.errors") + .with_description("Number of operation errors") + .build(); + + OtelMetricsLayer { + interceptor: OtelMetricsInterceptor { + duration_seconds, + bytes, + errors, + path_label_level: self.path_label_level, + }, + } + } +} + +impl Layer for OtelMetricsLayer { + type LayeredAccess = observe::MetricsAccessor; + + fn layer(&self, inner: A) -> Self::LayeredAccess { + observe::MetricsLayer::new(self.interceptor.clone()).layer(inner) + } +} + +#[derive(Clone, Debug)] +pub struct OtelMetricsInterceptor { + duration_seconds: Histogram, + bytes: Histogram, + errors: Counter, + path_label_level: usize, +} + +impl observe::MetricsIntercept for OtelMetricsInterceptor { + fn observe_operation_duration_seconds( + &self, + scheme: Scheme, + namespace: Arc, + root: Arc, + path: &str, + op: Operation, + duration: Duration, + ) { + let attributes = self.create_attributes(scheme, namespace, root, path, op, None); + self.duration_seconds + .record(duration.as_secs_f64(), &attributes); + } + + fn observe_operation_bytes( + &self, + scheme: Scheme, + namespace: Arc, + root: Arc, + path: &str, + op: Operation, + bytes: usize, + ) { + let attributes = self.create_attributes(scheme, namespace, root, path, op, None); + self.bytes.record(bytes as u64, &attributes); + } + + fn observe_operation_errors_total( + &self, + scheme: Scheme, + namespace: Arc, + root: Arc, + path: &str, + op: Operation, + error: ErrorKind, + ) { + let attributes = self.create_attributes(scheme, namespace, root, path, op, Some(error)); + self.errors.add(1, &attributes); + } +} + +impl OtelMetricsInterceptor { + fn create_attributes( + &self, + scheme: Scheme, + namespace: Arc, + root: Arc, + path: &str, + operation: Operation, + error: Option, + ) -> Vec { + let mut attributes = Vec::with_capacity(6); + + attributes.extend([ + KeyValue::new(observe::LABEL_SCHEME, scheme.into_static()), + KeyValue::new(observe::LABEL_NAMESPACE, (*namespace).clone()), + KeyValue::new(observe::LABEL_ROOT, (*root).clone()), + KeyValue::new(observe::LABEL_OPERATION, operation.into_static()), + ]); + + if let Some(path) = observe::path_label_value(path, self.path_label_level) { + attributes.push(KeyValue::new(observe::LABEL_PATH, path.to_owned())); + } + + if let Some(error) = error { + attributes.push(KeyValue::new(observe::LABEL_ERROR, error.into_static())); + } + + attributes + } +} + +fn exponential_boundary(start: f64, factor: f64, count: usize) -> Vec { + let mut boundaries = Vec::with_capacity(count); + let mut current = start; + for _ in 0..count { + boundaries.push(current); + current *= factor; + } + boundaries +} diff --git a/core/src/layers/tracing.rs b/core/src/layers/tracing.rs index 2a33c0c2a29e..efc1380db420 100644 --- a/core/src/layers/tracing.rs +++ b/core/src/layers/tracing.rs @@ -59,13 +59,12 @@ use crate::*; /// /// # fn main() -> Result<()> { /// use opentelemetry::trace::TracerProvider; -/// let tracer_provider = opentelemetry_otlp::new_pipeline() -/// .tracing() -/// .with_exporter(opentelemetry_otlp::new_exporter().tonic()) -/// .with_trace_config(trace::Config::default().with_resource(Resource::new(vec![ +/// let tracer_provider = opentelemetry_sdk::trace::TracerProvider::builder() +/// .with_simple_exporter(opentelemetry_otlp::SpanExporter::builder().with_tonic().build()?) +/// .with_resource(Resource::new(vec![ /// KeyValue::new("service.name", "opendal_example"), -/// ]))) -/// .install_simple()?; +/// ])) +/// .build(); /// let tracer = tracer_provider.tracer("opendal_tracer"); /// let opentelemetry = tracing_opentelemetry::layer().with_tracer(tracer); /// From 0996e136813eb2cc572114d4175e10eda8dea731 Mon Sep 17 00:00:00 2001 From: Xiangpeng Hao Date: Thu, 9 Jan 2025 21:15:35 -0500 Subject: [PATCH 09/14] fix(integrations/object_store) `object_store_opendal` now compiles on wasm32-unknown-unknown (#5530) --- integrations/object_store/Cargo.toml | 2 +- integrations/object_store/README.md | 8 ++++++++ integrations/object_store/src/lib.rs | 9 +++++---- integrations/object_store/src/store.rs | 2 ++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/integrations/object_store/Cargo.toml b/integrations/object_store/Cargo.toml index 97e6e76bd510..2afc0abd0a07 100644 --- a/integrations/object_store/Cargo.toml +++ b/integrations/object_store/Cargo.toml @@ -37,7 +37,7 @@ flagset = "0.4" futures = "0.3" futures-util = "0.3" object_store = "0.11" -opendal = { version = "0.51.0", path = "../../core" } +opendal = { version = "0.51.0", path = "../../core", default-features = false } pin-project = "1.1" send_wrapper = { version = "0.6", features = ["futures"], optional = true } tokio = { version = "1", default-features = false } diff --git a/integrations/object_store/README.md b/integrations/object_store/README.md index 1250a0a4aabc..115488f3b8b2 100644 --- a/integrations/object_store/README.md +++ b/integrations/object_store/README.md @@ -78,6 +78,14 @@ async fn main() { } ``` +## WASM support + +To build with `wasm32-unknown-unknown` target, you need to enable the `send_wrapper` feature: + +```sh +cargo build --target wasm32-unknown-unknown --features send_wrapper +``` + ## Branding The first and most prominent mentions must use the full form: **Apache OpenDALâ„¢** of the name for any individual usage (webpage, handout, slides, etc.) Depending on the context and writing style, you should use the full form of the name sufficiently often to ensure that readers clearly understand the association of both the OpenDAL project and the OpenDAL software product to the ASF as the parent organization. diff --git a/integrations/object_store/src/lib.rs b/integrations/object_store/src/lib.rs index 2afe685eb89e..f9951b8ce901 100644 --- a/integrations/object_store/src/lib.rs +++ b/integrations/object_store/src/lib.rs @@ -66,20 +66,21 @@ pub use store::OpendalStore; mod utils; // Make sure `send_wrapper` works as expected -#[cfg(all(feature = "send_wrapper", target_arch = "wasm32"))] +#[cfg(all(feature = "send_wrapper", test))] mod assert_send { - use object_store::ObjectStore; + use object_store::{ObjectStore, PutPayload}; + use opendal::Operator; #[allow(dead_code)] fn assert_send(_: T) {} #[allow(dead_code)] fn assertion() { - let op = super::Operator::new(opendal::services::Memory::default()) + let op = Operator::new(opendal::services::Memory::default()) .unwrap() .finish(); let store = super::OpendalStore::new(op); - assert_send(store.put(&"test".into(), bytes::Bytes::new())); + assert_send(store.put(&"test".into(), PutPayload::new())); assert_send(store.get(&"test".into())); assert_send(store.get_range(&"test".into(), 0..1)); assert_send(store.head(&"test".into())); diff --git a/integrations/object_store/src/store.rs b/integrations/object_store/src/store.rs index 32ccbc2d8a23..9ee32889f1ed 100644 --- a/integrations/object_store/src/store.rs +++ b/integrations/object_store/src/store.rs @@ -217,6 +217,7 @@ impl ObjectStore for OpendalStore { let stream = r .into_bytes_stream(0..meta.size as u64) + .into_send() .await .map_err(|err| object_store::Error::Generic { store: "IoError", @@ -400,6 +401,7 @@ impl ObjectStore for OpendalStore { let meta = self .inner .stat(entry.path()) + .into_send() .await .map_err(|err| format_object_store_error(err, entry.path()))?; objects.push(format_object_meta(entry.path(), &meta)); From 02381c57fff406984ec5dde62f9714623f840646 Mon Sep 17 00:00:00 2001 From: meteorgan Date: Sun, 12 Jan 2025 01:29:31 +0800 Subject: [PATCH 10/14] ci(integration/object_store): add integration tests for object_store_opendal (#5536) --- .../action.yml | 49 ++++++++++++ .github/scripts/test_behavior/plan.py | 64 ++++++++++++++- .github/scripts/test_behavior/test_plan.py | 10 +++ .github/workflows/test_behavior.yml | 14 ++++ ...test_behavior_integration_object_store.yml | 63 +++++++++++++++ core/src/types/read/buffer_stream.rs | 2 +- integrations/object_store/Cargo.toml | 9 +++ integrations/object_store/src/store.rs | 1 + .../object_store/tests/behavior/delete.rs | 40 ++++++++++ .../object_store/tests/behavior/get.rs | 80 +++++++++++++++++++ .../object_store/tests/behavior/main.rs | 39 +++++++++ .../object_store/tests/behavior/put.rs | 39 +++++++++ .../object_store/tests/behavior/utils.rs | 41 ++++++++++ 13 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 .github/actions/test_behavior_integration_object_store/action.yml create mode 100644 .github/workflows/test_behavior_integration_object_store.yml create mode 100644 integrations/object_store/tests/behavior/delete.rs create mode 100644 integrations/object_store/tests/behavior/get.rs create mode 100644 integrations/object_store/tests/behavior/main.rs create mode 100644 integrations/object_store/tests/behavior/put.rs create mode 100644 integrations/object_store/tests/behavior/utils.rs diff --git a/.github/actions/test_behavior_integration_object_store/action.yml b/.github/actions/test_behavior_integration_object_store/action.yml new file mode 100644 index 000000000000..707010b4db49 --- /dev/null +++ b/.github/actions/test_behavior_integration_object_store/action.yml @@ -0,0 +1,49 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Test Integration Object Store +description: 'Test Integration Object Store with given setup and service' +inputs: + setup: + description: "The setup action for test" + service: + description: "The service to test" + feature: + description: "The feature to test" + +runs: + using: "composite" + steps: + - name: Setup + shell: bash + run: | + mkdir -p ./dynamic_test_integration_object_store && + cat <./dynamic_test_integration_object_store/action.yml + runs: + using: composite + steps: + - name: Setup Test + uses: ./.github/services/${{ inputs.service }}/${{ inputs.setup }} + - name: Run Test Integration Object Store + shell: bash + working-directory: integrations/object_store + run: cargo test behavior + env: + OPENDAL_TEST: ${{ inputs.service }} + EOF + - name: Run + uses: ./dynamic_test_integration_object_store diff --git a/.github/scripts/test_behavior/plan.py b/.github/scripts/test_behavior/plan.py index 47f32aadf347..0f32ec6e4f53 100755 --- a/.github/scripts/test_behavior/plan.py +++ b/.github/scripts/test_behavior/plan.py @@ -35,6 +35,8 @@ BIN = ["ofs"] +INTEGRATIONS = ["object_store"] + def provided_cases() -> list[dict[str, str]]: root_dir = f"{GITHUB_DIR}/services" @@ -86,6 +88,8 @@ class Hint: binding_nodejs: bool = field(default=False, init=False) # Is bin ofs affected? bin_ofs: bool = field(default=False, init=False) + # Is integration object_store affected ? + integration_object_store: bool = field(default=False, init=False) # Should we run all services tests? all_service: bool = field(default=False, init=False) @@ -105,6 +109,8 @@ def calculate_hint(changed_files: list[str]) -> Hint: hint.core = True for language in LANGUAGE_BINDING: setattr(hint, f"binding_{language}", True) + for integration in INTEGRATIONS: + setattr(hint, f"integration_{integration}", True) hint.all_service = True if p == ".github/workflows/test_behavior_core.yml": @@ -115,11 +121,17 @@ def calculate_hint(changed_files: list[str]) -> Hint: if p == f".github/workflows/test_behavior_binding_{language}.yml": setattr(hint, f"binding_{language}", True) hint.all_service = True + for bin in BIN: if p == f".github/workflows/test_behavior_bin_{bin}.yml": setattr(hint, f"bin_{bin}", True) hint.all_service = True + for integration in INTEGRATIONS: + if p == f".github/workflows/test_behavior_integration_{integration}.yml": + setattr(hint, f"integration_{integration}", True) + hint.all_service = True + # core affected if ( p.startswith("core/") @@ -133,6 +145,8 @@ def calculate_hint(changed_files: list[str]) -> Hint: hint.binding_python = True hint.binding_nodejs = True hint.bin_ofs = True + for integration in INTEGRATIONS: + setattr(hint, f"integration_{integration}", True) hint.all_service = True # language binding affected @@ -147,6 +161,12 @@ def calculate_hint(changed_files: list[str]) -> Hint: setattr(hint, f"bin_{bin}", True) hint.all_service = True + # integration affected + for integration in INTEGRATIONS: + if p.startswith(f"integrations/{integration}"): + setattr(hint, f"integration_{integration}", True) + hint.all_service = True + # core service affected match = re.search(r"core/src/services/([^/]+)/", p) if match: @@ -155,6 +175,8 @@ def calculate_hint(changed_files: list[str]) -> Hint: setattr(hint, f"binding_{language}", True) for bin in BIN: setattr(hint, f"bin_{bin}", True) + for integration in INTEGRATIONS: + setattr(hint, f"integration_{integration}", True) hint.services.add(match.group(1)) # core test affected @@ -165,6 +187,8 @@ def calculate_hint(changed_files: list[str]) -> Hint: setattr(hint, f"binding_{language}", True) for bin in BIN: setattr(hint, f"bin_{bin}", True) + for integration in INTEGRATIONS: + setattr(hint, f"integration_{integration}", True) hint.services.add(match.group(1)) # fixture affected @@ -175,6 +199,8 @@ def calculate_hint(changed_files: list[str]) -> Hint: setattr(hint, f"binding_{language}", True) for bin in BIN: setattr(hint, f"bin_{bin}", True) + for integration in INTEGRATIONS: + setattr(hint, f"integration_{integration}", True) hint.services.add(match.group(1)) return hint @@ -243,7 +269,7 @@ def generate_language_binding_cases( if hint.all_service: return cases - # Filter all cases that not shown un in changed files + # Filter all cases that not shown up in changed files cases = [v for v in cases if v["service"] in hint.services] return cases @@ -265,7 +291,30 @@ def generate_bin_cases( if hint.all_service: return cases - # Filter all cases that not shown un in changed files + # Filter all cases that not shown up in changed files + cases = [v for v in cases if v["service"] in hint.services] + + return cases + + +def generate_integration_cases( + cases: list[dict[str, str]], hint: Hint, integration: str + ) -> list[dict[str, str]]: + # Return empty if this integration is False + if not getattr(hint, f"integration_{integration}"): + return [] + + cases = unique_cases(cases) + + if integration == "object_store": + supported_services = ["fs", "s3"] + cases = [v for v in cases if v["service"] in supported_services] + + # Return all services if all_service is True + if hint.all_service: + return cases + + # Filter all cases that not shown up in changed files cases = [v for v in cases if v["service"] in hint.services] return cases @@ -315,6 +364,17 @@ def plan(changed_files: list[str]) -> dict[str, Any]: if len(bin_cases) > 0: jobs["components"][f"bin_{bin}"] = True jobs[f"bin_{bin}"].append({"os": "ubuntu-latest", "cases": bin_cases}) + + for integration in INTEGRATIONS: + jobs[f"integration_{integration}"] = [] + jobs["components"][f"integration_{integration}"] = False + integration_cases = generate_integration_cases(cases, hint, integration) + if len(integration_cases) > 0: + jobs["components"][f"integration_{integration}"] = True + jobs[f"integration_{integration}"].append( + {"os": "ubuntu-latest", "cases": integration_cases} + ) + return jobs diff --git a/.github/scripts/test_behavior/test_plan.py b/.github/scripts/test_behavior/test_plan.py index 0e3f33069456..aaa72e21769f 100644 --- a/.github/scripts/test_behavior/test_plan.py +++ b/.github/scripts/test_behavior/test_plan.py @@ -60,6 +60,16 @@ def test_bin_ofs(self): # Should contain ofs self.assertTrue("fs" in cases) + def test_integration_object_store(self): + result = plan(["integrations/object_store/Cargo.toml"]) + self.assertTrue(result["components"]["integration_object_store"]) + self.assertTrue(len(result["integration_object_store"]) > 0) + + result = plan(["core/src/services/fs/mod.rs"]) + cases = [v["service"] for v in result["integration_object_store"][0]["cases"]] + # Should contain fs + self.assertTrue("fs" in cases) + if __name__ == "__main__": unittest.main() diff --git a/.github/workflows/test_behavior.yml b/.github/workflows/test_behavior.yml index 4f53ea9abf8e..0c087d24e1cc 100644 --- a/.github/workflows/test_behavior.yml +++ b/.github/workflows/test_behavior.yml @@ -145,3 +145,17 @@ jobs: with: os: ${{ matrix.os }} cases: ${{ toJson(matrix.cases) }} + + test_integration_object_store: + name: integration_object_store / ${{ matrix.os }} + needs: [ plan ] + if: fromJson(needs.plan.outputs.plan).components.integration_object_store + secrets: inherit + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.plan.outputs.plan).integration_object_store }} + uses: ./.github/workflows/test_behavior_integration_object_store.yml + with: + os: ${{ matrix.os }} + cases: ${{ toJson(matrix.cases) }} diff --git a/.github/workflows/test_behavior_integration_object_store.yml b/.github/workflows/test_behavior_integration_object_store.yml new file mode 100644 index 000000000000..7f05262b4b30 --- /dev/null +++ b/.github/workflows/test_behavior_integration_object_store.yml @@ -0,0 +1,63 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Behavior Test Integration Object Store + +on: + workflow_call: + inputs: + os: + required: true + type: string + cases: + required: true + type: string + +jobs: + test: + name: ${{ matrix.cases.service }} / ${{ matrix.cases.setup }} + runs-on: ${{ inputs.os }} + strategy: + fail-fast: false + matrix: + cases: ${{ fromJson(inputs.cases) }} + steps: + - uses: actions/checkout@v4 + - name: Setup Rust toolchain + uses: ./.github/actions/setup + with: + need-nextest: true + need-protoc: true + need-rocksdb: true + github-token: ${{ secrets.GITHUB_TOKEN }} + + # TODO: 1password is only supported on linux + # + # Waiting for https://github.com/1Password/load-secrets-action/issues/46 + - name: Setup 1Password Connect + if: runner.os == 'Linux' + uses: 1password/load-secrets-action/configure@v1 + with: + connect-host: ${{ secrets.OP_CONNECT_HOST }} + connect-token: ${{ secrets.OP_CONNECT_TOKEN }} + + - name: Test Core + uses: ./.github/actions/test_behavior_integration_object_store + with: + setup: ${{ matrix.cases.setup }} + service: ${{ matrix.cases.service }} + feature: ${{ matrix.cases.feature }} diff --git a/core/src/types/read/buffer_stream.rs b/core/src/types/read/buffer_stream.rs index eff0287e5e6d..304a5c6b411b 100644 --- a/core/src/types/read/buffer_stream.rs +++ b/core/src/types/read/buffer_stream.rs @@ -85,7 +85,7 @@ impl ChunkedReader { /// /// # Notes /// - /// We don't need to handle `Executor::timeout` since we are outside of the layer. + /// We don't need to handle `Executor::timeout` since we are outside the layer. fn new(ctx: Arc, range: BytesRange) -> Self { let tasks = ConcurrentTasks::new( ctx.args().executor().cloned().unwrap_or_default(), diff --git a/integrations/object_store/Cargo.toml b/integrations/object_store/Cargo.toml index 2afc0abd0a07..d7c78cd1598e 100644 --- a/integrations/object_store/Cargo.toml +++ b/integrations/object_store/Cargo.toml @@ -30,6 +30,11 @@ version = "0.49.0" [features] send_wrapper = ["dep:send_wrapper"] +[[test]] +harness = false +name = "behavior" +path = "tests/behavior/main.rs" + [dependencies] async-trait = "0.1" bytes = "1" @@ -46,6 +51,10 @@ tokio = { version = "1", default-features = false } opendal = { version = "0.51.0", path = "../../core", features = [ "services-memory", "services-s3", + "tests", ] } rand = "0.8.5" tokio = { version = "1", features = ["fs", "macros", "rt-multi-thread"] } +anyhow = "1.0.86" +libtest-mimic = "0.7.3" +uuid = "1.11.0" diff --git a/integrations/object_store/src/store.rs b/integrations/object_store/src/store.rs index 9ee32889f1ed..aaef7caa77bd 100644 --- a/integrations/object_store/src/store.rs +++ b/integrations/object_store/src/store.rs @@ -90,6 +90,7 @@ use tokio::sync::{Mutex, Notify}; /// assert_eq!(content, bytes); /// } /// ``` +#[derive(Clone)] pub struct OpendalStore { info: Arc, inner: Operator, diff --git a/integrations/object_store/tests/behavior/delete.rs b/integrations/object_store/tests/behavior/delete.rs new file mode 100644 index 000000000000..c971ec890d54 --- /dev/null +++ b/integrations/object_store/tests/behavior/delete.rs @@ -0,0 +1,40 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use crate::utils::build_trail; +use bytes::Bytes; +use libtest_mimic::Trial; +use object_store::path::Path; +use object_store::ObjectStore; +use object_store_opendal::OpendalStore; + +pub fn tests(store: &OpendalStore, tests: &mut Vec) { + tests.push(build_trail("test_delete", store, test_delete)); +} + +pub async fn test_delete(store: OpendalStore) -> anyhow::Result<()> { + let location = Path::from("data/test.txt"); + let value = Bytes::from("Hello, world!"); + store.put(&location, value.clone().into()).await?; + + store.delete(&location).await?; + + let err = store.get(&location).await.err().unwrap(); + assert!(matches!(err, object_store::Error::NotFound { .. })); + + Ok(()) +} diff --git a/integrations/object_store/tests/behavior/get.rs b/integrations/object_store/tests/behavior/get.rs new file mode 100644 index 000000000000..3b241864f61c --- /dev/null +++ b/integrations/object_store/tests/behavior/get.rs @@ -0,0 +1,80 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use crate::utils::{build_trail, new_file_path}; +use anyhow::Result; +use bytes::Bytes; +use libtest_mimic::Trial; +use object_store::ObjectStore; +use object_store_opendal::OpendalStore; + +pub fn tests(store: &OpendalStore, tests: &mut Vec) { + tests.push(build_trail("test_basic_get", store, test_basic_get)); + tests.push(build_trail("test_head", store, test_head)); + tests.push(build_trail("test_get_range", store, test_get_range)); +} + +pub async fn test_basic_get(store: OpendalStore) -> Result<()> { + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + + store.put(&location, value.clone().into()).await?; + + let ret = store.get(&location).await?; + + assert_eq!(0..value.len(), ret.range); + let data = ret.bytes().await?; + assert_eq!(value, data); + + let ret = store.get(&"not_exist".into()).await; + assert!(ret.is_err()); + assert!(matches!( + ret.err().unwrap(), + object_store::Error::NotFound { .. } + )); + + store.delete(&location).await?; + Ok(()) +} + +pub async fn test_head(store: OpendalStore) -> Result<()> { + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + + store.put(&location, value.clone().into()).await?; + + let meta = store.head(&location).await?; + + assert_eq!(meta.size, value.len()); + assert_eq!(meta.location, location); + + store.delete(&location).await?; + Ok(()) +} + +pub async fn test_get_range(store: OpendalStore) -> Result<()> { + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + + store.put(&location, value.clone().into()).await?; + + let ret = store.get_range(&location, 0..5).await?; + assert_eq!(Bytes::from_static(b"Hello"), ret); + + store.delete(&location).await?; + Ok(()) +} diff --git a/integrations/object_store/tests/behavior/main.rs b/integrations/object_store/tests/behavior/main.rs new file mode 100644 index 000000000000..1429eb5f505b --- /dev/null +++ b/integrations/object_store/tests/behavior/main.rs @@ -0,0 +1,39 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +mod delete; +mod get; +mod put; +mod utils; + +use libtest_mimic::Arguments; + +fn main() -> anyhow::Result<()> { + let Ok(Some(op)) = opendal::raw::tests::init_test_service() else { + return Ok(()); + }; + let store = object_store_opendal::OpendalStore::new(op); + + let mut tests = Vec::new(); + delete::tests(&store, &mut tests); + put::tests(&store, &mut tests); + get::tests(&store, &mut tests); + + let args = Arguments::from_args(); + let conclusion = libtest_mimic::run(&args, tests); + conclusion.exit(); +} diff --git a/integrations/object_store/tests/behavior/put.rs b/integrations/object_store/tests/behavior/put.rs new file mode 100644 index 000000000000..bbafd58b16c1 --- /dev/null +++ b/integrations/object_store/tests/behavior/put.rs @@ -0,0 +1,39 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use crate::utils::{build_trail, new_file_path}; +use anyhow::Result; +use bytes::Bytes; +use libtest_mimic::Trial; +use object_store::ObjectStore; +use object_store_opendal::OpendalStore; + +pub fn tests(store: &OpendalStore, tests: &mut Vec) { + tests.push(build_trail("test_basic_put", store, test_basic_put)); +} + +pub async fn test_basic_put(store: OpendalStore) -> Result<()> { + let location = new_file_path("data").into(); + let value = Bytes::from("Hello, world!"); + store.put(&location, value.clone().into()).await?; + + let data = store.get(&location).await?.bytes().await?; + assert_eq!(value, data); + + store.delete(&location).await?; + Ok(()) +} diff --git a/integrations/object_store/tests/behavior/utils.rs b/integrations/object_store/tests/behavior/utils.rs new file mode 100644 index 000000000000..8b75d96aeb21 --- /dev/null +++ b/integrations/object_store/tests/behavior/utils.rs @@ -0,0 +1,41 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +use libtest_mimic::{Failed, Trial}; +use object_store_opendal::OpendalStore; +use opendal::raw::tests::TEST_RUNTIME; +use opendal::raw::MaybeSend; +use std::future::Future; + +pub fn build_trail(name: &str, store: &OpendalStore, f: F) -> Trial +where + F: FnOnce(OpendalStore) -> Fut + MaybeSend + 'static, + Fut: Future>, +{ + let handle = TEST_RUNTIME.handle().clone(); + + let store = store.clone(); + Trial::test(format!("behavior::{name}"), move || { + handle + .block_on(f(store)) + .map_err(|err| Failed::from(err.to_string())) + }) +} + +pub fn new_file_path(dir: &str) -> String { + format!("{}/{}", dir, uuid::Uuid::new_v4()) +} From 03b78f10e5515f09cbef5150621884ba9461c74b Mon Sep 17 00:00:00 2001 From: meteorgan Date: Mon, 13 Jan 2025 10:19:50 +0800 Subject: [PATCH 11/14] feat(integrations/object_store): implement put_opts and get_opts (#5513) --- integrations/object_store/src/store.rs | 219 ++++++++------ integrations/object_store/src/utils.rs | 4 + .../object_store/tests/behavior/get.rs | 282 +++++++++++++++++- .../object_store/tests/behavior/put.rs | 110 ++++++- 4 files changed, 523 insertions(+), 92 deletions(-) diff --git a/integrations/object_store/src/store.rs b/integrations/object_store/src/store.rs index aaef7caa77bd..b32ec8f96469 100644 --- a/integrations/object_store/src/store.rs +++ b/integrations/object_store/src/store.rs @@ -17,19 +17,16 @@ use std::fmt::{self, Debug, Display, Formatter}; use std::future::IntoFuture; -use std::ops::Range; +use std::io; use std::sync::Arc; use crate::utils::*; use async_trait::async_trait; -use bytes::Bytes; use futures::stream::BoxStream; use futures::FutureExt; use futures::StreamExt; use futures::TryStreamExt; use object_store::path::Path; -use object_store::GetResult; -use object_store::GetResultPayload; use object_store::ListResult; use object_store::MultipartUpload; use object_store::ObjectMeta; @@ -39,6 +36,8 @@ use object_store::PutOptions; use object_store::PutPayload; use object_store::PutResult; use object_store::{GetOptions, UploadPart}; +use object_store::{GetRange, GetResultPayload}; +use object_store::{GetResult, PutMode}; use opendal::Buffer; use opendal::Writer; use opendal::{Operator, OperatorInfo}; @@ -104,6 +103,11 @@ impl OpendalStore { inner: op, } } + + /// Get the Operator info. + pub fn info(&self) -> &OperatorInfo { + self.info.as_ref() + } } impl Debug for OpendalStore { @@ -138,29 +142,47 @@ impl From for OpendalStore { #[async_trait] impl ObjectStore for OpendalStore { - async fn put(&self, location: &Path, bytes: PutPayload) -> object_store::Result { - self.inner - .write(location.as_ref(), Buffer::from_iter(bytes.into_iter())) - .into_send() - .await - .map_err(|err| format_object_store_error(err, location.as_ref()))?; - Ok(PutResult { - e_tag: None, - version: None, - }) - } - async fn put_opts( &self, - _location: &Path, - _bytes: PutPayload, - _opts: PutOptions, + location: &Path, + bytes: PutPayload, + opts: PutOptions, ) -> object_store::Result { - Err(object_store::Error::NotSupported { - source: Box::new(opendal::Error::new( - opendal::ErrorKind::Unsupported, - "put_opts is not implemented so far", - )), + let mut future_write = self + .inner + .write_with(location.as_ref(), Buffer::from_iter(bytes.into_iter())); + let opts_mode = opts.mode.clone(); + match opts.mode { + PutMode::Overwrite => {} + PutMode::Create => { + future_write = future_write.if_not_exists(true); + } + PutMode::Update(update_version) => { + let Some(etag) = update_version.e_tag else { + Err(object_store::Error::NotSupported { + source: Box::new(opendal::Error::new( + opendal::ErrorKind::Unsupported, + "etag is required for conditional put", + )), + })? + }; + future_write = future_write.if_match(etag.as_str()); + } + } + future_write.into_send().await.map_err(|err| { + match format_object_store_error(err, location.as_ref()) { + object_store::Error::Precondition { path, source } + if opts_mode == PutMode::Create => + { + object_store::Error::AlreadyExists { path, source } + } + e => e, + } + })?; + + Ok(PutResult { + e_tag: None, + version: None, }) } @@ -193,13 +215,32 @@ impl ObjectStore for OpendalStore { }) } - async fn get(&self, location: &Path) -> object_store::Result { - let meta = self - .inner - .stat(location.as_ref()) - .into_send() - .await - .map_err(|err| format_object_store_error(err, location.as_ref()))?; + async fn get_opts( + &self, + location: &Path, + options: GetOptions, + ) -> object_store::Result { + let meta = { + let mut s = self.inner.stat_with(location.as_ref()); + if let Some(version) = &options.version { + s = s.version(version.as_str()) + } + if let Some(if_match) = &options.if_match { + s = s.if_match(if_match.as_str()); + } + if let Some(if_none_match) = &options.if_none_match { + s = s.if_none_match(if_none_match.as_str()); + } + if let Some(if_modified_since) = options.if_modified_since { + s = s.if_modified_since(if_modified_since); + } + if let Some(if_unmodified_since) = options.if_unmodified_since { + s = s.if_unmodified_since(if_unmodified_since); + } + s.into_send() + .await + .map_err(|err| format_object_store_error(err, location.as_ref()))? + }; let meta = ObjectMeta { location: location.clone(), @@ -209,78 +250,76 @@ impl ObjectStore for OpendalStore { version: meta.version().map(|x| x.to_string()), }; - let r = self - .inner - .reader(location.as_ref()) - .into_send() - .await - .map_err(|err| format_object_store_error(err, location.as_ref()))?; + if options.head { + return Ok(GetResult { + payload: GetResultPayload::Stream(Box::pin(futures::stream::empty())), + range: 0..0, + meta, + attributes: Default::default(), + }); + } - let stream = r - .into_bytes_stream(0..meta.size as u64) + let reader = { + let mut r = self.inner.reader_with(location.as_ref()); + if let Some(version) = options.version { + r = r.version(version.as_str()); + } + if let Some(if_match) = options.if_match { + r = r.if_match(if_match.as_str()); + } + if let Some(if_none_match) = options.if_none_match { + r = r.if_none_match(if_none_match.as_str()); + } + if let Some(if_modified_since) = options.if_modified_since { + r = r.if_modified_since(if_modified_since); + } + if let Some(if_unmodified_since) = options.if_unmodified_since { + r = r.if_unmodified_since(if_unmodified_since); + } + r.into_send() + .await + .map_err(|err| format_object_store_error(err, location.as_ref()))? + }; + + let read_range = match options.range { + Some(GetRange::Bounded(r)) => { + if r.start >= r.end || r.start >= meta.size { + 0..0 + } else { + let end = r.end.min(meta.size); + r.start..end + } + } + Some(GetRange::Offset(r)) => { + if r < meta.size { + r..meta.size + } else { + 0..0 + } + } + Some(GetRange::Suffix(r)) if r < meta.size => (meta.size - r)..meta.size, + _ => 0..meta.size, + }; + + let stream = reader + .into_bytes_stream(read_range.start as u64..read_range.end as u64) .into_send() .await - .map_err(|err| object_store::Error::Generic { - store: "IoError", - source: Box::new(err), - })? + .map_err(|err| format_object_store_error(err, location.as_ref()))? .into_send() - .map_err(|err| object_store::Error::Generic { + .map_err(|err: io::Error| object_store::Error::Generic { store: "IoError", source: Box::new(err), }); Ok(GetResult { payload: GetResultPayload::Stream(Box::pin(stream)), - range: 0..meta.size, + range: read_range.start..read_range.end, meta, attributes: Default::default(), }) } - async fn get_opts( - &self, - _location: &Path, - _options: GetOptions, - ) -> object_store::Result { - Err(object_store::Error::NotSupported { - source: Box::new(opendal::Error::new( - opendal::ErrorKind::Unsupported, - "get_opts is not implemented so far", - )), - }) - } - - async fn get_range(&self, location: &Path, range: Range) -> object_store::Result { - let bs = self - .inner - .read_with(location.as_ref()) - .range(range.start as u64..range.end as u64) - .into_future() - .into_send() - .await - .map_err(|err| format_object_store_error(err, location.as_ref()))?; - - Ok(bs.to_bytes()) - } - - async fn head(&self, location: &Path) -> object_store::Result { - let meta = self - .inner - .stat(location.as_ref()) - .into_send() - .await - .map_err(|err| format_object_store_error(err, location.as_ref()))?; - - Ok(ObjectMeta { - location: location.clone(), - last_modified: meta.last_modified().unwrap_or_default(), - size: meta.content_length() as usize, - e_tag: meta.etag().map(|x| x.to_string()), - version: meta.version().map(|x| x.to_string()), - }) - } - async fn delete(&self, location: &Path) -> object_store::Result<()> { self.inner .delete(location.as_ref()) @@ -534,12 +573,12 @@ impl Debug for OpendalMultipartUpload { #[cfg(test)] mod tests { - use std::sync::Arc; - + use bytes::Bytes; use object_store::path::Path; use object_store::{ObjectStore, WriteMultipart}; use opendal::services; use rand::prelude::*; + use std::sync::Arc; use super::*; diff --git a/integrations/object_store/src/utils.rs b/integrations/object_store/src/utils.rs index 63357402b7a0..99a0578d121d 100644 --- a/integrations/object_store/src/utils.rs +++ b/integrations/object_store/src/utils.rs @@ -42,6 +42,10 @@ pub fn format_object_store_error(err: opendal::Error, path: &str) -> object_stor path: path.to_string(), source: Box::new(err), }, + ErrorKind::ConditionNotMatch => object_store::Error::Precondition { + path: path.to_string(), + source: Box::new(err), + }, kind => object_store::Error::Generic { store: kind.into_static(), source: Box::new(err), diff --git a/integrations/object_store/tests/behavior/get.rs b/integrations/object_store/tests/behavior/get.rs index 3b241864f61c..6e7c549dae4d 100644 --- a/integrations/object_store/tests/behavior/get.rs +++ b/integrations/object_store/tests/behavior/get.rs @@ -19,13 +19,48 @@ use crate::utils::{build_trail, new_file_path}; use anyhow::Result; use bytes::Bytes; use libtest_mimic::Trial; -use object_store::ObjectStore; +use object_store::{GetOptions, GetRange, ObjectStore}; use object_store_opendal::OpendalStore; pub fn tests(store: &OpendalStore, tests: &mut Vec) { tests.push(build_trail("test_basic_get", store, test_basic_get)); tests.push(build_trail("test_head", store, test_head)); tests.push(build_trail("test_get_range", store, test_get_range)); + tests.push(build_trail( + "test_get_opts_with_range", + store, + test_get_opts_with_range, + )); + tests.push(build_trail( + "test_get_opts_with_invalid_range", + store, + test_get_opts_with_invalid_range, + )); + tests.push(build_trail( + "test_get_opts_with_version", + store, + test_get_opts_with_version, + )); + tests.push(build_trail( + "test_get_ops_with_if_match", + store, + test_get_ops_with_if_match, + )); + tests.push(build_trail( + "test_get_ops_with_if_none_match", + store, + test_get_ops_with_if_none_match, + )); + tests.push(build_trail( + "test_get_opts_with_if_modified_since", + store, + test_get_opts_with_if_modified_since, + )); + tests.push(build_trail( + "test_get_opts_with_if_unmodified_since", + store, + test_get_opts_with_if_unmodified_since, + )); } pub async fn test_basic_get(store: OpendalStore) -> Result<()> { @@ -78,3 +113,248 @@ pub async fn test_get_range(store: OpendalStore) -> Result<()> { store.delete(&location).await?; Ok(()) } + +pub async fn test_get_opts_with_range(store: OpendalStore) -> Result<()> { + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + + store.put(&location, value.clone().into()).await?; + + let opts = GetOptions { + range: Some((0..5).into()), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(Bytes::from_static(b"Hello"), data); + + let opts = GetOptions { + range: Some(GetRange::Offset(7)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(Bytes::from_static(b"world!"), data); + + let opts = GetOptions { + range: Some(GetRange::Suffix(6)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(Bytes::from_static(b"world!"), data); + + store.delete(&location).await?; + Ok(()) +} + +pub async fn test_get_opts_with_invalid_range(store: OpendalStore) -> Result<()> { + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + + store.put(&location, value.clone().into()).await?; + + // the end of the range is greater than the size of the object + let opts = GetOptions { + range: Some((0..100).into()), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + assert_eq!(ret.range, 0..value.len()); + assert_eq!(ret.bytes().await?, value); + + // the offset of the range is greater than the size of the object + let opts = GetOptions { + range: Some(GetRange::Offset(100)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + assert_eq!(ret.range, 0..0); + + // the suffix of the range is greater than the size of the object + let opts = GetOptions { + range: Some(GetRange::Suffix(100)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + assert_eq!(ret.range, 0..value.len()); + assert_eq!(ret.bytes().await?, value); + + store.delete(&location).await?; + Ok(()) +} + +pub async fn test_get_opts_with_version(store: OpendalStore) -> Result<()> { + if !store.info().full_capability().read_with_version { + return Ok(()); + } + + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + store.put(&location, value.clone().into()).await?; + let meta = store.head(&location).await?; + + let opts = GetOptions { + version: meta.version, + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(value, data); + + let another_location = new_file_path("data").into(); + store + .put( + &another_location, + Bytes::from_static(b"Hello, world!").into(), + ) + .await?; + let another_version = store.head(&another_location).await?.version; + + let opts = GetOptions { + version: another_version, + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await; + assert!(ret.is_err()); + assert!(matches!( + ret.err().unwrap(), + object_store::Error::NotFound { .. } + )); + + store.delete(&location).await?; + store.delete(&another_location).await?; + Ok(()) +} + +async fn test_get_ops_with_if_match(store: OpendalStore) -> Result<()> { + if !store.info().full_capability().read_with_if_match { + return Ok(()); + } + + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + store.put(&location, value.clone().into()).await?; + let meta = store.head(&location).await?; + + let opts = GetOptions { + if_match: Some(meta.e_tag.unwrap()), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(value, data); + + let opts = GetOptions { + if_match: Some("invalid etag".to_string()), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await; + assert!(ret.is_err()); + assert!(matches!( + ret.err().unwrap(), + object_store::Error::Precondition { .. } + )); + + store.delete(&location).await?; + Ok(()) +} + +async fn test_get_ops_with_if_none_match(store: OpendalStore) -> Result<()> { + if !store.info().full_capability().read_with_if_none_match { + return Ok(()); + } + + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + store.put(&location, value.clone().into()).await?; + let meta = store.head(&location).await?; + + let opts = GetOptions { + if_none_match: Some("invalid etag".to_string()), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(value, data); + + let opts = GetOptions { + if_none_match: Some(meta.e_tag.unwrap()), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await; + assert!(ret.is_err()); + assert!(matches!( + ret.err().unwrap(), + object_store::Error::Precondition { .. } + )); + + store.delete(&location).await?; + Ok(()) +} + +async fn test_get_opts_with_if_modified_since(store: OpendalStore) -> Result<()> { + if !store.info().full_capability().read_with_if_modified_since { + return Ok(()); + } + + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + store.put(&location, value.clone().into()).await?; + let meta = store.head(&location).await?; + + let opts = GetOptions { + if_modified_since: Some(meta.last_modified - std::time::Duration::from_secs(1)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(value, data); + + let opts = GetOptions { + if_modified_since: Some(meta.last_modified + std::time::Duration::from_secs(1)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await; + assert!(ret.is_err()); + assert!(matches!( + ret.err().unwrap(), + object_store::Error::Precondition { .. } + )); + + store.delete(&location).await?; + Ok(()) +} + +async fn test_get_opts_with_if_unmodified_since(store: OpendalStore) -> Result<()> { + if !store.info().full_capability().read_with_if_unmodified_since { + return Ok(()); + } + + let location = new_file_path("data").into(); + let value = Bytes::from_static(b"Hello, world!"); + store.put(&location, value.clone().into()).await?; + let meta = store.head(&location).await?; + + let opts = GetOptions { + if_unmodified_since: Some(meta.last_modified + std::time::Duration::from_secs(1)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await?; + let data = ret.bytes().await?; + assert_eq!(value, data); + + let opts = GetOptions { + if_unmodified_since: Some(meta.last_modified - std::time::Duration::from_secs(1)), + ..Default::default() + }; + let ret = store.get_opts(&location, opts).await; + assert!(ret.is_err()); + assert!(matches!( + ret.err().unwrap(), + object_store::Error::Precondition { .. } + )); + + store.delete(&location).await?; + Ok(()) +} diff --git a/integrations/object_store/tests/behavior/put.rs b/integrations/object_store/tests/behavior/put.rs index bbafd58b16c1..be428ac3371d 100644 --- a/integrations/object_store/tests/behavior/put.rs +++ b/integrations/object_store/tests/behavior/put.rs @@ -19,11 +19,26 @@ use crate::utils::{build_trail, new_file_path}; use anyhow::Result; use bytes::Bytes; use libtest_mimic::Trial; -use object_store::ObjectStore; +use object_store::{ObjectStore, PutMode, UpdateVersion}; use object_store_opendal::OpendalStore; pub fn tests(store: &OpendalStore, tests: &mut Vec) { tests.push(build_trail("test_basic_put", store, test_basic_put)); + tests.push(build_trail( + "test_put_opts_with_overwrite", + store, + test_put_opts_with_overwrite, + )); + tests.push(build_trail( + "test_put_opts_with_create", + store, + test_put_opts_with_create, + )); + tests.push(build_trail( + "test_put_opts_with_update", + store, + test_put_opts_with_update, + )); } pub async fn test_basic_put(store: OpendalStore) -> Result<()> { @@ -37,3 +52,96 @@ pub async fn test_basic_put(store: OpendalStore) -> Result<()> { store.delete(&location).await?; Ok(()) } + +pub async fn test_put_opts_with_overwrite(store: OpendalStore) -> Result<()> { + let location = new_file_path("data").into(); + let value = Bytes::from("Hello, world!"); + store.put(&location, value.clone().into()).await?; + + let new_value = Bytes::from("Hello, world! 2"); + let opts = object_store::PutOptions { + mode: PutMode::Overwrite, + ..Default::default() + }; + store + .put_opts(&location, new_value.clone().into(), opts) + .await?; + + let data = store.get(&location).await?.bytes().await?; + assert_eq!(new_value, data); + + store.delete(&location).await?; + Ok(()) +} + +pub async fn test_put_opts_with_create(store: OpendalStore) -> Result<()> { + if !store.info().full_capability().write_with_if_not_exists { + return Ok(()); + } + + let location = new_file_path("data").into(); + let value = Bytes::from("Hello, world!"); + + let opts = object_store::PutOptions { + mode: PutMode::Create, + ..Default::default() + }; + let ret = store + .put_opts(&location, value.clone().into(), opts.clone()) + .await; + assert!(ret.is_ok()); + + let ret = store.put_opts(&location, value.clone().into(), opts).await; + assert!(ret.is_err()); + assert!(matches!( + ret.unwrap_err(), + object_store::Error::AlreadyExists { .. } + )); + + store.delete(&location).await?; + Ok(()) +} + +pub async fn test_put_opts_with_update(store: OpendalStore) -> Result<()> { + if !store.info().full_capability().write_with_if_match { + return Ok(()); + } + + let location = new_file_path("data").into(); + let value = Bytes::from("Hello, world!"); + store.put(&location, value.clone().into()).await?; + let meta = store.head(&location).await?; + + let new_value = Bytes::from("Hello, world! 2"); + let put_opts = object_store::PutOptions { + mode: PutMode::Update(UpdateVersion { + e_tag: meta.e_tag, + version: None, + }), + ..Default::default() + }; + store + .put_opts(&location, new_value.clone().into(), put_opts) + .await?; + let data = store.get(&location).await?.bytes().await?; + assert_eq!(new_value, data); + + let put_opts = object_store::PutOptions { + mode: PutMode::Update(UpdateVersion { + e_tag: Some("invalid etag".to_string()), + version: None, + }), + ..Default::default() + }; + let ret = store + .put_opts(&location, value.clone().into(), put_opts) + .await; + assert!(ret.is_err()); + assert!(matches!( + ret.unwrap_err(), + object_store::Error::Precondition { .. } + )); + + store.delete(&location).await?; + Ok(()) +} From f951963a9eb69fd24b14e58420265499a13d0579 Mon Sep 17 00:00:00 2001 From: Geetansh Juneja Date: Mon, 13 Jan 2025 09:50:08 +0530 Subject: [PATCH 12/14] feat: Conditional reader for azblob, gcs, oss (#5531) --- core/src/services/azblob/backend.rs | 2 ++ core/src/services/azblob/core.rs | 16 +++++++++++++++ core/src/services/gcs/backend.rs | 2 ++ core/src/services/gcs/core.rs | 30 +++++++++++++++++++++++++++++ core/src/services/oss/backend.rs | 2 ++ core/src/services/oss/core.rs | 16 +++++++++++++++ 6 files changed, 68 insertions(+) diff --git a/core/src/services/azblob/backend.rs b/core/src/services/azblob/backend.rs index 464d7c7116f6..f2adce968ae8 100644 --- a/core/src/services/azblob/backend.rs +++ b/core/src/services/azblob/backend.rs @@ -515,6 +515,8 @@ impl Access for AzblobBackend { read_with_if_match: true, read_with_if_none_match: true, read_with_override_content_disposition: true, + read_with_if_modified_since: true, + read_with_if_unmodified_since: true, write: true, write_can_append: true, diff --git a/core/src/services/azblob/core.rs b/core/src/services/azblob/core.rs index 1202ae8ba4bf..b080f098084f 100644 --- a/core/src/services/azblob/core.rs +++ b/core/src/services/azblob/core.rs @@ -29,7 +29,9 @@ use http::header::HeaderName; use http::header::CONTENT_LENGTH; use http::header::CONTENT_TYPE; use http::header::IF_MATCH; +use http::header::IF_MODIFIED_SINCE; use http::header::IF_NONE_MATCH; +use http::header::IF_UNMODIFIED_SINCE; use http::HeaderValue; use http::Request; use http::Response; @@ -208,6 +210,20 @@ impl AzblobCore { req = req.header(IF_MATCH, if_match); } + if let Some(if_modified_since) = args.if_modified_since() { + req = req.header( + IF_MODIFIED_SINCE, + format_datetime_into_http_date(if_modified_since), + ); + } + + if let Some(if_unmodified_since) = args.if_unmodified_since() { + req = req.header( + IF_UNMODIFIED_SINCE, + format_datetime_into_http_date(if_unmodified_since), + ); + } + let req = req.body(Buffer::new()).map_err(new_request_build_error)?; Ok(req) diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs index c61ff75ca290..d9b401ba8cfb 100644 --- a/core/src/services/gcs/backend.rs +++ b/core/src/services/gcs/backend.rs @@ -369,6 +369,8 @@ impl Access for GcsBackend { read_with_if_match: true, read_with_if_none_match: true, + read_with_if_modified_since: true, + read_with_if_unmodified_since: true, write: true, write_can_empty: true, diff --git a/core/src/services/gcs/core.rs b/core/src/services/gcs/core.rs index fe6a242f204c..7a7ef5992fde 100644 --- a/core/src/services/gcs/core.rs +++ b/core/src/services/gcs/core.rs @@ -28,7 +28,9 @@ use http::header::CONTENT_LENGTH; use http::header::CONTENT_TYPE; use http::header::HOST; use http::header::IF_MATCH; +use http::header::IF_MODIFIED_SINCE; use http::header::IF_NONE_MATCH; +use http::header::IF_UNMODIFIED_SINCE; use http::Request; use http::Response; use once_cell::sync::Lazy; @@ -201,6 +203,20 @@ impl GcsCore { req = req.header(http::header::RANGE, range.to_header()); } + if let Some(if_modified_since) = args.if_modified_since() { + req = req.header( + IF_MODIFIED_SINCE, + format_datetime_into_http_date(if_modified_since), + ); + } + + if let Some(if_unmodified_since) = args.if_unmodified_since() { + req = req.header( + IF_UNMODIFIED_SINCE, + format_datetime_into_http_date(if_unmodified_since), + ); + } + let req = req.body(Buffer::new()).map_err(new_request_build_error)?; Ok(req) @@ -221,6 +237,20 @@ impl GcsCore { req = req.header(IF_NONE_MATCH, if_none_match); } + if let Some(if_modified_since) = args.if_modified_since() { + req = req.header( + IF_MODIFIED_SINCE, + format_datetime_into_http_date(if_modified_since), + ); + } + + if let Some(if_unmodified_since) = args.if_unmodified_since() { + req = req.header( + IF_UNMODIFIED_SINCE, + format_datetime_into_http_date(if_unmodified_since), + ); + } + let req = req.body(Buffer::new()).map_err(new_request_build_error)?; Ok(req) diff --git a/core/src/services/oss/backend.rs b/core/src/services/oss/backend.rs index 0ec56cdc2acd..eb7616d148e9 100644 --- a/core/src/services/oss/backend.rs +++ b/core/src/services/oss/backend.rs @@ -459,6 +459,8 @@ impl Access for OssBackend { read_with_if_match: true, read_with_if_none_match: true, + read_with_if_modified_since: true, + read_with_if_unmodified_since: true, write: true, write_can_empty: true, diff --git a/core/src/services/oss/core.rs b/core/src/services/oss/core.rs index fef9a860496c..2467159d4c6d 100644 --- a/core/src/services/oss/core.rs +++ b/core/src/services/oss/core.rs @@ -27,7 +27,9 @@ use http::header::CONTENT_DISPOSITION; use http::header::CONTENT_LENGTH; use http::header::CONTENT_TYPE; use http::header::IF_MATCH; +use http::header::IF_MODIFIED_SINCE; use http::header::IF_NONE_MATCH; +use http::header::IF_UNMODIFIED_SINCE; use http::header::RANGE; use http::HeaderMap; use http::HeaderName; @@ -343,6 +345,20 @@ impl OssCore { req = req.header(IF_NONE_MATCH, if_none_match); } + if let Some(if_modified_since) = args.if_modified_since() { + req = req.header( + IF_MODIFIED_SINCE, + format_datetime_into_http_date(if_modified_since), + ); + } + + if let Some(if_unmodified_since) = args.if_unmodified_since() { + req = req.header( + IF_UNMODIFIED_SINCE, + format_datetime_into_http_date(if_unmodified_since), + ); + } + let req = req.body(Buffer::new()).map_err(new_request_build_error)?; Ok(req) From 85c380357a53d3ba9f09f12d1eb8717728bc8406 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Mon, 13 Jan 2025 12:44:23 +0800 Subject: [PATCH 13/14] fix(serivces/gcs): Gcs doesn't support read with if_(un)modified_since (#5537) --- core/src/services/gcs/backend.rs | 2 -- core/src/services/gcs/core.rs | 14 -------------- 2 files changed, 16 deletions(-) diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs index d9b401ba8cfb..c61ff75ca290 100644 --- a/core/src/services/gcs/backend.rs +++ b/core/src/services/gcs/backend.rs @@ -369,8 +369,6 @@ impl Access for GcsBackend { read_with_if_match: true, read_with_if_none_match: true, - read_with_if_modified_since: true, - read_with_if_unmodified_since: true, write: true, write_can_empty: true, diff --git a/core/src/services/gcs/core.rs b/core/src/services/gcs/core.rs index 7a7ef5992fde..3e06bf03b575 100644 --- a/core/src/services/gcs/core.rs +++ b/core/src/services/gcs/core.rs @@ -203,20 +203,6 @@ impl GcsCore { req = req.header(http::header::RANGE, range.to_header()); } - if let Some(if_modified_since) = args.if_modified_since() { - req = req.header( - IF_MODIFIED_SINCE, - format_datetime_into_http_date(if_modified_since), - ); - } - - if let Some(if_unmodified_since) = args.if_unmodified_since() { - req = req.header( - IF_UNMODIFIED_SINCE, - format_datetime_into_http_date(if_unmodified_since), - ); - } - let req = req.body(Buffer::new()).map_err(new_request_build_error)?; Ok(req) From 41c72d8e33fa4a888a3ac611eeea30caacd75b47 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Mon, 13 Jan 2025 14:39:09 +0800 Subject: [PATCH 14/14] feat(core): Add correctness check for read with if_xxx headers (#5538) --- core/src/layers/correctness_check.rs | 63 ++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/core/src/layers/correctness_check.rs b/core/src/layers/correctness_check.rs index 61d0669a393a..27383473cde2 100644 --- a/core/src/layers/correctness_check.rs +++ b/core/src/layers/correctness_check.rs @@ -56,7 +56,7 @@ pub(crate) fn new_unsupported_error(info: &AccessorInfo, op: Operation, args: &s Error::new( ErrorKind::Unsupported, - format!("service {scheme} doesn't support operation {op} with args {args}"), + format!("The service {scheme} does not support the operation {op} with the arguments {args}. Please verify if the relevant flags have been enabled, or submit an issue if you believe this is incorrect."), ) .with_operation(op) } @@ -102,6 +102,34 @@ impl LayeredAccess for CorrectnessAccessor { "version", )); } + if !capability.read_with_if_match && args.if_match().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Read, + "if_match", + )); + } + if !capability.read_with_if_none_match && args.if_none_match().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Read, + "if_none_match", + )); + } + if !capability.read_with_if_modified_since && args.if_modified_since().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Read, + "if_modified_since", + )); + } + if !capability.read_with_if_unmodified_since && args.if_unmodified_since().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Read, + "if_unmodified_since", + )); + } self.inner.read(path, args).await } @@ -146,6 +174,34 @@ impl LayeredAccess for CorrectnessAccessor { "version", )); } + if !capability.stat_with_if_match && args.if_match().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Stat, + "if_match", + )); + } + if !capability.stat_with_if_none_match && args.if_none_match().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Stat, + "if_none_match", + )); + } + if !capability.stat_with_if_modified_since && args.if_modified_since().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Stat, + "if_modified_since", + )); + } + if !capability.stat_with_if_unmodified_since && args.if_unmodified_since().is_some() { + return Err(new_unsupported_error( + self.info.as_ref(), + Operation::Stat, + "if_unmodified_since", + )); + } self.inner.stat(path, args).await } @@ -410,7 +466,7 @@ mod tests { assert!(res.is_err()); assert_eq!( res.unwrap_err().to_string(), - "Unsupported (permanent) at write => service memory doesn't support operation write with args if_none_match" + "Unsupported (permanent) at write => The service memory does not support the operation write with the arguments if_none_match. Please verify if the relevant flags have been enabled, or submit an issue if you believe this is incorrect." ); // Now try a wildcard if-none-match @@ -421,8 +477,7 @@ mod tests { assert!(res.is_err()); assert_eq!( res.unwrap_err().to_string(), - "Unsupported (permanent) at write, context: { hint: use if_not_exists instead } => \ - service memory doesn't support operation write with args if_none_match" + "Unsupported (permanent) at write, context: { hint: use if_not_exists instead } => The service memory does not support the operation write with the arguments if_none_match. Please verify if the relevant flags have been enabled, or submit an issue if you believe this is incorrect." ); let res = op