This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs-object-store.git
The following commit(s) were added to refs/heads/main by this push:
new ddb5d2a Bump rust edition to 2024, rust version to 1.85 (#515)
ddb5d2a is described below
commit ddb5d2a18941d2da8df53bfca78a6e7b59567148
Author: Adam Gutglick <[email protected]>
AuthorDate: Tue Oct 28 19:02:10 2025 +0000
Bump rust edition to 2024, rust version to 1.85 (#515)
* Bump the msrv to 1.67.1
* Bump rust edition
* Remove dependency pinning in CI to satisfy msrv check
* Fix fmt
---
.github/workflows/rust.yml | 13 ------
Cargo.toml | 4 +-
src/aws/builder.rs | 9 ++--
src/aws/client.rs | 12 ++---
src/aws/credential.rs | 29 +++++++++---
src/aws/mod.rs | 10 ++---
src/azure/builder.rs | 2 +-
src/azure/client.rs | 10 ++---
src/azure/credential.rs | 14 +++---
src/azure/mod.rs | 8 ++--
src/chunked.rs | 4 +-
src/client/get.rs | 8 ++--
src/client/header.rs | 4 +-
src/client/http/body.rs | 4 +-
src/client/http/connection.rs | 4 +-
src/client/http/spawn.rs | 4 +-
src/client/list.rs | 4 +-
src/client/mock_server.rs | 2 +-
src/client/mod.rs | 4 +-
src/client/retry.rs | 18 +++++---
src/gcp/builder.rs | 10 ++---
src/gcp/client.rs | 6 +--
src/gcp/credential.rs | 4 +-
src/gcp/mod.rs | 6 +--
src/http/client.rs | 10 +++--
src/http/mod.rs | 2 +-
src/integration.rs | 14 ++----
src/lib.rs | 10 ++---
src/limit.rs | 2 +-
src/local.rs | 102 +++++++++++++++++++++++-------------------
src/memory.rs | 8 ++--
src/parse.rs | 6 +--
src/path/parts.rs | 2 +-
src/prefix.rs | 2 +-
src/registry.rs | 26 ++++++-----
src/signer.rs | 2 +-
src/throttle.rs | 12 ++---
src/upload.rs | 2 +-
src/util.rs | 4 +-
tests/http.rs | 2 +-
40 files changed, 209 insertions(+), 190 deletions(-)
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index ed0683d..80d9e06 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -52,19 +52,6 @@ jobs:
- uses: actions/checkout@v5
- name: Install cargo-msrv
run: cargo install cargo-msrv
- - name: Downgrade object_store dependencies
- # Necessary because tokio 1.30.0 updates MSRV to 1.63
- # and url 2.5.1, updates to 1.67
- run: |
- cargo update -p tokio --precise 1.29.1
- cargo update -p url --precise 2.5.0
- cargo update -p once_cell --precise 1.20.3
- cargo update -p tracing-core --precise 0.1.33
- cargo update -p tracing-attributes --precise 0.1.28
- cargo update -p parking_lot --precise 0.12.4
- cargo update -p parking_lot_core --precise 0.9.11
- cargo update -p lock_api --precise 0.4.13
- cargo update -p syn --precise 2.0.106
- name: Check
run: |
# run `cargo msrv verify` to see problems
diff --git a/Cargo.toml b/Cargo.toml
index 137d2c5..e02d3b3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,13 +18,13 @@
[package]
name = "object_store"
version = "0.12.4"
-edition = "2021"
+edition = "2024"
license = "MIT/Apache-2.0"
readme = "README.md"
description = "A generic object store interface for uniformly interacting with
AWS S3, Google Cloud Storage, Azure Blob Storage and local files."
keywords = ["object", "storage", "cloud"]
repository = "https://github.com/apache/arrow-rs-object-store"
-rust-version = "1.64.0"
+rust-version = "1.85"
include = ["src/**/*.rs", "README.md", "LICENSE.txt", "NOTICE.txt",
"Cargo.toml"]
[package.metadata.docs.rs]
diff --git a/src/aws/builder.rs b/src/aws/builder.rs
index e833364..04d9d31 100644
--- a/src/aws/builder.rs
+++ b/src/aws/builder.rs
@@ -24,11 +24,11 @@ use crate::aws::{
AmazonS3, AwsCredential, AwsCredentialProvider, Checksum,
S3ConditionalPut, S3CopyIfNotExists,
STORE,
};
-use crate::client::{http_connector, HttpConnector, TokenCredentialProvider};
+use crate::client::{HttpConnector, TokenCredentialProvider, http_connector};
use crate::config::ConfigValue;
use crate::{ClientConfigKey, ClientOptions, Result, RetryConfig,
StaticCredentialProvider};
-use base64::prelude::BASE64_STANDARD;
use base64::Engine;
+use base64::prelude::BASE64_STANDARD;
use itertools::Itertools;
use md5::{Digest, Md5};
use reqwest::header::{HeaderMap, HeaderValue};
@@ -75,7 +75,10 @@ enum Error {
#[error("Invalid Zone suffix for bucket '{bucket}'")]
ZoneSuffix { bucket: String },
- #[error("Invalid encryption type: {}. Valid values are \"AES256\",
\"sse:kms\", \"sse:kms:dsse\" and \"sse-c\".", passed)]
+ #[error(
+ "Invalid encryption type: {}. Valid values are \"AES256\",
\"sse:kms\", \"sse:kms:dsse\" and \"sse-c\".",
+ passed
+ )]
InvalidEncryptionType { passed: String },
#[error(
diff --git a/src/aws/client.rs b/src/aws/client.rs
index aee3af8..6337187 100644
--- a/src/aws/client.rs
+++ b/src/aws/client.rs
@@ -19,12 +19,12 @@ use crate::aws::builder::S3EncryptionHeaders;
use crate::aws::checksum::Checksum;
use crate::aws::credential::{AwsCredential, CredentialExt};
use crate::aws::{
- AwsAuthorizer, AwsCredentialProvider, S3ConditionalPut, S3CopyIfNotExists,
COPY_SOURCE_HEADER,
+ AwsAuthorizer, AwsCredentialProvider, COPY_SOURCE_HEADER,
S3ConditionalPut, S3CopyIfNotExists,
STORE, STRICT_PATH_ENCODE_SET, TAGS_HEADER,
};
use crate::client::builder::{HttpRequestBuilder, RequestBuilderError};
use crate::client::get::GetClient;
-use crate::client::header::{get_etag, HeaderConfig};
+use crate::client::header::{HeaderConfig, get_etag};
use crate::client::header::{get_put_result, get_version};
use crate::client::list::ListClient;
use crate::client::retry::{RetryContext, RetryExt};
@@ -40,8 +40,8 @@ use crate::{
PutPayload, PutResult, Result, RetryConfig, TagSet,
};
use async_trait::async_trait;
-use base64::prelude::BASE64_STANDARD;
use base64::Engine;
+use base64::prelude::BASE64_STANDARD;
use bytes::{Buf, Bytes};
use http::header::{
CACHE_CONTROL, CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LANGUAGE,
CONTENT_LENGTH,
@@ -50,7 +50,7 @@ use http::header::{
use http::{HeaderMap, HeaderName, Method};
use itertools::Itertools;
use md5::{Digest, Md5};
-use percent_encoding::{utf8_percent_encode, PercentEncode};
+use percent_encoding::{PercentEncode, utf8_percent_encode};
use quick_xml::events::{self as xml_events};
use ring::digest;
use ring::digest::Context;
@@ -953,10 +953,10 @@ fn encode_path(path: &Path) -> PercentEncode<'_> {
#[cfg(test)]
mod tests {
use super::*;
- use crate::client::mock_server::MockServer;
use crate::client::HttpClient;
- use http::header::CONTENT_LENGTH;
+ use crate::client::mock_server::MockServer;
use http::Response;
+ use http::header::CONTENT_LENGTH;
#[tokio::test]
async fn test_create_multipart_has_content_length() {
diff --git a/src/aws/credential.rs b/src/aws/credential.rs
index 97d93cf..170c3e4 100644
--- a/src/aws/credential.rs
+++ b/src/aws/credential.rs
@@ -25,7 +25,7 @@ use crate::{CredentialProvider, Result, RetryConfig};
use async_trait::async_trait;
use bytes::Buf;
use chrono::{DateTime, Utc};
-use http::header::{HeaderMap, HeaderName, HeaderValue, AUTHORIZATION};
+use http::header::{AUTHORIZATION, HeaderMap, HeaderName, HeaderValue};
use http::{Method, StatusCode};
use percent_encoding::utf8_percent_encode;
use serde::Deserialize;
@@ -863,8 +863,8 @@ struct CreateSessionOutput {
mod tests {
use super::*;
use crate::aws::{AmazonS3Builder, AmazonS3ConfigKey};
- use crate::client::mock_server::MockServer;
use crate::client::HttpClient;
+ use crate::client::mock_server::MockServer;
use http::Response;
use reqwest::{Client, Method};
use std::env;
@@ -908,7 +908,10 @@ mod tests {
};
signer.authorize(&mut request, None);
- assert_eq!(request.headers().get(&AUTHORIZATION).unwrap(),
"AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220806/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=a3c787a7ed37f7fdfbfd2d7056a3d7c9d85e6d52a2bfbec73793c0be6e7862d4")
+ assert_eq!(
+ request.headers().get(&AUTHORIZATION).unwrap(),
+ "AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220806/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=a3c787a7ed37f7fdfbfd2d7056a3d7c9d85e6d52a2bfbec73793c0be6e7862d4"
+ )
}
#[test]
@@ -949,7 +952,10 @@ mod tests {
};
signer.authorize(&mut request, None);
- assert_eq!(request.headers().get(&AUTHORIZATION).unwrap(),
"AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220806/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-request-payer,
Signature=7030625a9e9b57ed2a40e63d749f4a4b7714b6e15004cab026152f870dd8565d")
+ assert_eq!(
+ request.headers().get(&AUTHORIZATION).unwrap(),
+ "AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220806/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-request-payer,
Signature=7030625a9e9b57ed2a40e63d749f4a4b7714b6e15004cab026152f870dd8565d"
+ )
}
#[test]
@@ -990,7 +996,10 @@ mod tests {
};
authorizer.authorize(&mut request, None);
- assert_eq!(request.headers().get(&AUTHORIZATION).unwrap(),
"AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220806/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=653c3d8ea261fd826207df58bc2bb69fbb5003e9eb3c0ef06e4a51f2a81d8699");
+ assert_eq!(
+ request.headers().get(&AUTHORIZATION).unwrap(),
+ "AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220806/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=653c3d8ea261fd826207df58bc2bb69fbb5003e9eb3c0ef06e4a51f2a81d8699"
+ );
}
#[test]
@@ -1113,7 +1122,10 @@ mod tests {
};
authorizer.authorize(&mut request, None);
- assert_eq!(request.headers().get(&AUTHORIZATION).unwrap(),
"AWS4-HMAC-SHA256
Credential=H20ABqCkLZID4rLe/20220809/us-east-1/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=9ebf2f92872066c99ac94e573b4e1b80f4dbb8a32b1e8e23178318746e7d1b4d")
+ assert_eq!(
+ request.headers().get(&AUTHORIZATION).unwrap(),
+ "AWS4-HMAC-SHA256
Credential=H20ABqCkLZID4rLe/20220809/us-east-1/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=9ebf2f92872066c99ac94e573b4e1b80f4dbb8a32b1e8e23178318746e7d1b4d"
+ )
}
#[tokio::test]
@@ -1320,7 +1332,10 @@ mod tests {
(" a b c ", "a b c"),
("a \t b c ", "a b c"),
("\"a \t b c ", "\"a b c"),
- (" \t\n\u{000b}\r\u{000c}a \t\n\u{000b}\r\u{000c} b
\t\n\u{000b}\r\u{000c} c \t\n\u{000b}\r\u{000c}", "a b c"),
+ (
+ " \t\n\u{000b}\r\u{000c}a \t\n\u{000b}\r\u{000c} b
\t\n\u{000b}\r\u{000c} c \t\n\u{000b}\r\u{000c}",
+ "a b c",
+ ),
];
for (input, expected) in test_cases {
diff --git a/src/aws/mod.rs b/src/aws/mod.rs
index 8dac2bd..3cd6ca8 100644
--- a/src/aws/mod.rs
+++ b/src/aws/mod.rs
@@ -37,9 +37,9 @@ use std::{sync::Arc, time::Duration};
use url::Url;
use crate::aws::client::{CompleteMultipartMode, PutPartPayload, RequestError,
S3Client};
+use crate::client::CredentialProvider;
use crate::client::get::GetClientExt;
use crate::client::list::{ListClient, ListClientExt};
-use crate::client::CredentialProvider;
use crate::multipart::{MultipartStore, PartId};
use crate::signer::Signer;
use crate::util::STRICT_ENCODE_SET;
@@ -358,7 +358,7 @@ impl ObjectStore for AmazonS3 {
None => {
return Err(Error::NotSupported {
source: "S3 does not support
copy-if-not-exists".to_string().into(),
- })
+ });
}
};
@@ -493,14 +493,14 @@ impl PaginatedListStore for AmazonS3 {
#[cfg(test)]
mod tests {
use super::*;
+ use crate::ClientOptions;
+ use crate::client::SpawnedReqwestConnector;
use crate::client::get::GetClient;
use crate::client::retry::RetryContext;
- use crate::client::SpawnedReqwestConnector;
use crate::integration::*;
use crate::tests::*;
- use crate::ClientOptions;
- use base64::prelude::BASE64_STANDARD;
use base64::Engine;
+ use base64::prelude::BASE64_STANDARD;
use http::HeaderMap;
const NON_EXISTENT_NAME: &str = "nonexistentname";
diff --git a/src/azure/builder.rs b/src/azure/builder.rs
index 182bdf0..e824217 100644
--- a/src/azure/builder.rs
+++ b/src/azure/builder.rs
@@ -21,7 +21,7 @@ use crate::azure::credential::{
ImdsManagedIdentityProvider, WorkloadIdentityOAuthProvider,
};
use crate::azure::{AzureCredential, AzureCredentialProvider, MicrosoftAzure,
STORE};
-use crate::client::{http_connector, HttpConnector, TokenCredentialProvider};
+use crate::client::{HttpConnector, TokenCredentialProvider, http_connector};
use crate::config::ConfigValue;
use crate::{ClientConfigKey, ClientOptions, Result, RetryConfig,
StaticCredentialProvider};
use percent_encoding::percent_decode_str;
diff --git a/src/azure/client.rs b/src/azure/client.rs
index 1e96aac..bce2c24 100644
--- a/src/azure/client.rs
+++ b/src/azure/client.rs
@@ -20,25 +20,25 @@ use crate::azure::credential::*;
use crate::azure::{AzureCredentialProvider, STORE};
use crate::client::builder::HttpRequestBuilder;
use crate::client::get::GetClient;
-use crate::client::header::{get_put_result, HeaderConfig};
+use crate::client::header::{HeaderConfig, get_put_result};
use crate::client::list::ListClient;
use crate::client::retry::{RetryContext, RetryExt};
use crate::client::{GetOptionsExt, HttpClient, HttpError, HttpRequest,
HttpResponse};
use crate::list::{PaginatedListOptions, PaginatedListResult};
use crate::multipart::PartId;
-use crate::util::{deserialize_rfc1123, GetRange};
+use crate::util::{GetRange, deserialize_rfc1123};
use crate::{
Attribute, Attributes, ClientOptions, GetOptions, ListResult, ObjectMeta,
Path, PutMode,
PutMultipartOptions, PutOptions, PutPayload, PutResult, Result,
RetryConfig, TagSet,
};
use async_trait::async_trait;
-use base64::prelude::{BASE64_STANDARD, BASE64_STANDARD_NO_PAD};
use base64::Engine;
+use base64::prelude::{BASE64_STANDARD, BASE64_STANDARD_NO_PAD};
use bytes::{Buf, Bytes};
use chrono::{DateTime, Utc};
use http::{
- header::{HeaderMap, HeaderValue, CONTENT_LENGTH, CONTENT_TYPE, IF_MATCH,
IF_NONE_MATCH},
HeaderName, Method,
+ header::{CONTENT_LENGTH, CONTENT_TYPE, HeaderMap, HeaderValue, IF_MATCH,
IF_NONE_MATCH},
};
use rand::Rng as _;
use serde::{Deserialize, Serialize};
@@ -497,7 +497,7 @@ async fn parse_blob_batch_delete_body(
code: code.to_string(),
reason:
part_response.reason.unwrap_or_default().to_string(),
}
- .into())
+ .into());
}
_ => return Err(invalid_response("missing part response status
code").into()),
}
diff --git a/src/azure/credential.rs b/src/azure/credential.rs
index 3720884..82477d5 100644
--- a/src/azure/credential.rs
+++ b/src/azure/credential.rs
@@ -16,23 +16,23 @@
// under the License.
use super::client::UserDelegationKey;
+use crate::RetryConfig;
use crate::azure::STORE;
-use crate::client::builder::{add_query_pairs, HttpRequestBuilder};
+use crate::client::builder::{HttpRequestBuilder, add_query_pairs};
use crate::client::retry::RetryExt;
use crate::client::token::{TemporaryToken, TokenCache};
use crate::client::{CredentialProvider, HttpClient, HttpError, HttpRequest,
TokenProvider};
use crate::util::hmac_sha256;
-use crate::RetryConfig;
use async_trait::async_trait;
-use base64::prelude::{BASE64_STANDARD, BASE64_URL_SAFE_NO_PAD};
use base64::Engine;
+use base64::prelude::{BASE64_STANDARD, BASE64_URL_SAFE_NO_PAD};
use chrono::{DateTime, SecondsFormat, Utc};
+use http::Method;
use http::header::{
- HeaderMap, HeaderName, HeaderValue, ACCEPT, AUTHORIZATION,
CONTENT_ENCODING, CONTENT_LANGUAGE,
- CONTENT_LENGTH, CONTENT_TYPE, DATE, IF_MATCH, IF_MODIFIED_SINCE,
IF_NONE_MATCH,
+ ACCEPT, AUTHORIZATION, CONTENT_ENCODING, CONTENT_LANGUAGE, CONTENT_LENGTH,
CONTENT_TYPE, DATE,
+ HeaderMap, HeaderName, HeaderValue, IF_MATCH, IF_MODIFIED_SINCE,
IF_NONE_MATCH,
IF_UNMODIFIED_SINCE, RANGE,
};
-use http::Method;
use serde::Deserialize;
use std::borrow::Cow;
use std::collections::HashMap;
@@ -1079,7 +1079,7 @@ mod tests {
async fn test_managed_identity() {
let server = MockServer::new().await;
- std::env::set_var(MSI_SECRET_ENV_KEY, "env-secret");
+ unsafe { std::env::set_var(MSI_SECRET_ENV_KEY, "env-secret") };
let endpoint = server.url();
let client = HttpClient::new(Client::new());
diff --git a/src/azure/mod.rs b/src/azure/mod.rs
index f65bf9f..c5344d7 100644
--- a/src/azure/mod.rs
+++ b/src/azure/mod.rs
@@ -23,11 +23,11 @@
//!
//! Unused blocks will automatically be dropped after 7 days.
use crate::{
+ GetOptions, GetResult, ListResult, MultipartId, MultipartUpload,
ObjectMeta, ObjectStore,
+ PutMultipartOptions, PutOptions, PutPayload, PutResult, Result, UploadPart,
multipart::{MultipartStore, PartId},
path::Path,
signer::Signer,
- GetOptions, GetResult, ListResult, MultipartId, MultipartUpload,
ObjectMeta, ObjectStore,
- PutMultipartOptions, PutOptions, PutPayload, PutResult, Result, UploadPart,
};
use async_trait::async_trait;
use futures::stream::{BoxStream, StreamExt, TryStreamExt};
@@ -37,10 +37,10 @@ use std::sync::Arc;
use std::time::Duration;
use url::Url;
+use crate::client::CredentialProvider;
use crate::client::get::GetClientExt;
use crate::client::list::{ListClient, ListClientExt};
-use crate::client::CredentialProvider;
-pub use credential::{authority_hosts, AzureAccessKey, AzureAuthorizer};
+pub use credential::{AzureAccessKey, AzureAuthorizer, authority_hosts};
mod builder;
mod client;
diff --git a/src/chunked.rs b/src/chunked.rs
index 8af3b2c..1f78415 100644
--- a/src/chunked.rs
+++ b/src/chunked.rs
@@ -23,8 +23,8 @@ use std::sync::Arc;
use async_trait::async_trait;
use bytes::{BufMut, Bytes, BytesMut};
-use futures::stream::BoxStream;
use futures::StreamExt;
+use futures::stream::BoxStream;
use crate::path::Path;
use crate::{
@@ -120,7 +120,7 @@ impl ObjectStore for ChunkedStore {
source: Box::new(e),
}),
(stream, buffer, exhausted,
chunk_size),
- ))
+ ));
}
};
}
diff --git a/src/client/get.rs b/src/client/get.rs
index 51d4e1b..be28574 100644
--- a/src/client/get.rs
+++ b/src/client/get.rs
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-use crate::client::header::{get_etag, header_meta, HeaderConfig};
+use crate::client::header::{HeaderConfig, get_etag, header_meta};
use crate::client::retry::RetryContext;
use crate::client::{HttpResponse, HttpResponseBody};
use crate::path::Path;
@@ -25,13 +25,13 @@ use crate::{
};
use async_trait::async_trait;
use bytes::Bytes;
-use futures::stream::BoxStream;
use futures::StreamExt;
+use futures::stream::BoxStream;
+use http::StatusCode;
use http::header::{
CACHE_CONTROL, CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LANGUAGE,
CONTENT_RANGE,
CONTENT_TYPE,
};
-use http::StatusCode;
use http_body_util::BodyExt;
use reqwest::header::ToStrError;
use std::ops::Range;
@@ -494,7 +494,7 @@ mod http_tests {
use http::{Response, StatusCode};
use hyper::body::Frame;
use std::pin::Pin;
- use std::task::{ready, Context, Poll};
+ use std::task::{Context, Poll, ready};
use std::time::Duration;
#[derive(Debug, thiserror::Error)]
diff --git a/src/client/header.rs b/src/client/header.rs
index d7e14b3..4c9470c 100644
--- a/src/client/header.rs
+++ b/src/client/header.rs
@@ -17,11 +17,11 @@
//! Logic for extracting ObjectMeta from headers used by AWS, GCP and Azure
-use crate::path::Path;
use crate::ObjectMeta;
+use crate::path::Path;
use chrono::{DateTime, TimeZone, Utc};
-use http::header::{CONTENT_LENGTH, ETAG, LAST_MODIFIED};
use http::HeaderMap;
+use http::header::{CONTENT_LENGTH, ETAG, LAST_MODIFIED};
#[derive(Debug, Copy, Clone)]
/// Configuration for header extraction
diff --git a/src/client/http/body.rs b/src/client/http/body.rs
index 504bebe..f59da97 100644
--- a/src/client/http/body.rs
+++ b/src/client/http/body.rs
@@ -16,10 +16,10 @@
// under the License.
use crate::client::{HttpError, HttpErrorKind};
-use crate::{collect_bytes, PutPayload};
+use crate::{PutPayload, collect_bytes};
use bytes::Bytes;
-use futures::stream::BoxStream;
use futures::StreamExt;
+use futures::stream::BoxStream;
use http_body_util::combinators::BoxBody;
use http_body_util::{BodyExt, Full};
use hyper::body::{Body, Frame, SizeHint};
diff --git a/src/client/http/connection.rs b/src/client/http/connection.rs
index 48b7549..ae474ce 100644
--- a/src/client/http/connection.rs
+++ b/src/client/http/connection.rs
@@ -15,9 +15,9 @@
// specific language governing permissions and limitations
// under the License.
+use crate::ClientOptions;
use crate::client::builder::{HttpRequestBuilder, RequestBuilderError};
use crate::client::{HttpRequest, HttpResponse, HttpResponseBody};
-use crate::ClientOptions;
use async_trait::async_trait;
use http::{Method, Uri};
use http_body_util::BodyExt;
@@ -232,8 +232,8 @@ impl HttpService for reqwest::Client {
impl HttpService for reqwest::Client {
async fn call(&self, req: HttpRequest) -> Result<HttpResponse, HttpError> {
use futures::{
- channel::{mpsc, oneshot},
SinkExt, StreamExt, TryStreamExt,
+ channel::{mpsc, oneshot},
};
use http_body_util::{Empty, StreamBody};
use wasm_bindgen_futures::spawn_local;
diff --git a/src/client/http/spawn.rs b/src/client/http/spawn.rs
index 32c7fc4..5450b63 100644
--- a/src/client/http/spawn.rs
+++ b/src/client/http/spawn.rs
@@ -129,10 +129,10 @@ impl Body for SpawnBody {
#[cfg(test)]
mod tests {
use super::*;
+ use crate::RetryConfig;
+ use crate::client::HttpClient;
use crate::client::mock_server::MockServer;
use crate::client::retry::RetryExt;
- use crate::client::HttpClient;
- use crate::RetryConfig;
async fn test_client(client: HttpClient) {
let (send, recv) = tokio::sync::oneshot::channel();
diff --git a/src/client/list.rs b/src/client/list.rs
index 7a2cf62..b7192bf 100644
--- a/src/client/list.rs
+++ b/src/client/list.rs
@@ -15,10 +15,10 @@
// specific language governing permissions and limitations
// under the License.
+use crate::Result;
use crate::client::pagination::stream_paginated;
use crate::list::{PaginatedListOptions, PaginatedListResult};
-use crate::path::{Path, DELIMITER};
-use crate::Result;
+use crate::path::{DELIMITER, Path};
use crate::{ListResult, ObjectMeta};
use async_trait::async_trait;
use futures::stream::BoxStream;
diff --git a/src/client/mock_server.rs b/src/client/mock_server.rs
index 9caf731..c27fc9f 100644
--- a/src/client/mock_server.rs
+++ b/src/client/mock_server.rs
@@ -16,8 +16,8 @@
// under the License.
use crate::client::{HttpResponse, HttpResponseBody};
-use futures::future::BoxFuture;
use futures::FutureExt;
+use futures::future::BoxFuture;
use hyper::body::Incoming;
use hyper::server::conn::http1;
use hyper::service::service_fn;
diff --git a/src/client/mod.rs b/src/client/mod.rs
index 5a11b7a..58b27d2 100644
--- a/src/client/mod.rs
+++ b/src/client/mod.rs
@@ -64,7 +64,7 @@ use std::time::Duration;
#[cfg(not(target_arch = "wasm32"))]
use reqwest::{NoProxy, Proxy};
-use crate::config::{fmt_duration, ConfigValue};
+use crate::config::{ConfigValue, fmt_duration};
use crate::path::Path;
use crate::{GetOptions, Result};
@@ -841,8 +841,8 @@ where
#[cfg(any(feature = "aws", feature = "azure", feature = "gcp"))]
mod cloud {
use super::*;
- use crate::client::token::{TemporaryToken, TokenCache};
use crate::RetryConfig;
+ use crate::client::token::{TemporaryToken, TokenCache};
/// A [`CredentialProvider`] that uses [`HttpClient`] to fetch temporary
tokens
#[derive(Debug)]
diff --git a/src/client/retry.rs b/src/client/retry.rs
index 50cf079..ed9bf0c 100644
--- a/src/client/retry.rs
+++ b/src/client/retry.rs
@@ -17,14 +17,14 @@
//! [`RetryConfig`] connection retry policy
+use crate::PutPayload;
use crate::client::backoff::{Backoff, BackoffConfig};
use crate::client::builder::HttpRequestBuilder;
use crate::client::{HttpClient, HttpError, HttpErrorKind, HttpRequest,
HttpResponse};
-use crate::PutPayload;
use futures::future::BoxFuture;
use http::{Method, Uri};
-use reqwest::header::LOCATION;
use reqwest::StatusCode;
+use reqwest::header::LOCATION;
#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))]
use std::time::{Duration, Instant};
use tracing::info;
@@ -108,7 +108,8 @@ impl RetryContext {
/// The reason a request failed
#[derive(Debug, thiserror::Error)]
pub enum RequestError {
- #[error("Received redirect without LOCATION, this normally indicates an
incorrectly configured region"
+ #[error(
+ "Received redirect without LOCATION, this normally indicates an
incorrectly configured region"
)]
BareRedirect,
@@ -507,15 +508,15 @@ impl RetryExt for HttpRequestBuilder {
#[cfg(not(target_arch = "wasm32"))]
#[cfg(test)]
mod tests {
+ use crate::RetryConfig;
use crate::client::mock_server::MockServer;
- use crate::client::retry::{body_contains_error, RequestError,
RetryContext, RetryExt};
+ use crate::client::retry::{RequestError, RetryContext, RetryExt,
body_contains_error};
use crate::client::{HttpClient, HttpResponse};
- use crate::RetryConfig;
use http::StatusCode;
+ use hyper::Response;
use hyper::header::LOCATION;
use hyper::server::conn::http1;
use hyper::service::service_fn;
- use hyper::Response;
use hyper_util::rt::TokioIo;
use reqwest::{Client, Method};
use std::convert::Infallible;
@@ -685,7 +686,10 @@ mod tests {
let e = do_request().await.unwrap_err();
assert!(matches!(e.inner(), RequestError::BareRedirect));
- assert_eq!(e.inner().to_string(), "Received redirect without LOCATION,
this normally indicates an incorrectly configured region");
+ assert_eq!(
+ e.inner().to_string(),
+ "Received redirect without LOCATION, this normally indicates an
incorrectly configured region"
+ );
// Gives up after the retrying the specified number of times
for _ in 0..=retry.max_retries {
diff --git a/src/gcp/builder.rs b/src/gcp/builder.rs
index f22d66d..1d3a495 100644
--- a/src/gcp/builder.rs
+++ b/src/gcp/builder.rs
@@ -15,16 +15,16 @@
// specific language governing permissions and limitations
// under the License.
-use crate::client::{http_connector, HttpConnector, TokenCredentialProvider};
+use crate::client::{HttpConnector, TokenCredentialProvider, http_connector};
use crate::config::ConfigValue;
use crate::gcp::client::{GoogleCloudStorageClient, GoogleCloudStorageConfig};
use crate::gcp::credential::{
- ApplicationDefaultCredentials, InstanceCredentialProvider,
ServiceAccountCredentials,
- DEFAULT_GCS_BASE_URL,
+ ApplicationDefaultCredentials, DEFAULT_GCS_BASE_URL,
InstanceCredentialProvider,
+ ServiceAccountCredentials,
};
use crate::gcp::{
- credential, GcpCredential, GcpCredentialProvider, GcpSigningCredential,
- GcpSigningCredentialProvider, GoogleCloudStorage, STORE,
+ GcpCredential, GcpCredentialProvider, GcpSigningCredential,
GcpSigningCredentialProvider,
+ GoogleCloudStorage, STORE, credential,
};
use crate::{ClientConfigKey, ClientOptions, Result, RetryConfig,
StaticCredentialProvider};
use serde::{Deserialize, Serialize};
diff --git a/src/gcp/client.rs b/src/gcp/client.rs
index 47af709..00d3168 100644
--- a/src/gcp/client.rs
+++ b/src/gcp/client.rs
@@ -17,7 +17,7 @@
use crate::client::builder::HttpRequestBuilder;
use crate::client::get::GetClient;
-use crate::client::header::{get_put_result, get_version, HeaderConfig};
+use crate::client::header::{HeaderConfig, get_put_result, get_version};
use crate::client::list::ListClient;
use crate::client::retry::{RetryContext, RetryExt};
use crate::client::s3::{
@@ -36,15 +36,15 @@ use crate::{
PutOptions, PutPayload, PutResult, Result, RetryConfig,
};
use async_trait::async_trait;
-use base64::prelude::BASE64_STANDARD;
use base64::Engine;
+use base64::prelude::BASE64_STANDARD;
use bytes::Buf;
use http::header::{
CACHE_CONTROL, CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LANGUAGE,
CONTENT_LENGTH,
CONTENT_TYPE,
};
use http::{HeaderName, Method, StatusCode};
-use percent_encoding::{percent_encode, utf8_percent_encode, NON_ALPHANUMERIC};
+use percent_encoding::{NON_ALPHANUMERIC, percent_encode, utf8_percent_encode};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
diff --git a/src/gcp/credential.rs b/src/gcp/credential.rs
index 1e067f5..2245829 100644
--- a/src/gcp/credential.rs
+++ b/src/gcp/credential.rs
@@ -21,11 +21,11 @@ use crate::client::retry::RetryExt;
use crate::client::token::TemporaryToken;
use crate::client::{HttpClient, HttpError, TokenProvider};
use crate::gcp::{GcpSigningCredentialProvider, STORE};
-use crate::util::{hex_digest, hex_encode, STRICT_ENCODE_SET};
+use crate::util::{STRICT_ENCODE_SET, hex_digest, hex_encode};
use crate::{RetryConfig, StaticCredentialProvider};
use async_trait::async_trait;
-use base64::prelude::BASE64_URL_SAFE_NO_PAD;
use base64::Engine;
+use base64::prelude::BASE64_URL_SAFE_NO_PAD;
use chrono::{DateTime, Utc};
use futures::TryFutureExt;
use http::{HeaderMap, Method};
diff --git a/src/gcp/mod.rs b/src/gcp/mod.rs
index 442b24f..44f2c2c 100644
--- a/src/gcp/mod.rs
+++ b/src/gcp/mod.rs
@@ -41,9 +41,9 @@ use crate::client::CredentialProvider;
use crate::gcp::credential::GCSAuthorizer;
use crate::signer::Signer;
use crate::{
- multipart::PartId, path::Path, GetOptions, GetResult, ListResult,
MultipartId, MultipartUpload,
- ObjectMeta, ObjectStore, PutMultipartOptions, PutOptions, PutPayload,
PutResult, Result,
- UploadPart,
+ GetOptions, GetResult, ListResult, MultipartId, MultipartUpload,
ObjectMeta, ObjectStore,
+ PutMultipartOptions, PutOptions, PutPayload, PutResult, Result,
UploadPart, multipart::PartId,
+ path::Path,
};
use async_trait::async_trait;
use client::GoogleCloudStorageClient;
diff --git a/src/http/client.rs b/src/http/client.rs
index d08e9fa..5b2d343 100644
--- a/src/http/client.rs
+++ b/src/http/client.rs
@@ -20,7 +20,7 @@ use crate::client::get::GetClient;
use crate::client::header::HeaderConfig;
use crate::client::retry::{self, RetryConfig, RetryContext, RetryExt};
use crate::client::{GetOptionsExt, HttpClient, HttpError, HttpResponse};
-use crate::path::{Path, DELIMITER};
+use crate::path::{DELIMITER, Path};
use crate::util::deserialize_rfc1123;
use crate::{Attribute, Attributes, ClientOptions, GetOptions, ObjectMeta,
PutPayload, Result};
use async_trait::async_trait;
@@ -197,7 +197,9 @@ impl Client {
builder.header(CONTENT_TYPE, v.as_ref())
}
Attribute::StorageClass => {
- tracing::warn!("StorageClass attribute not supported
on HTTP client as header key is unknown");
+ tracing::warn!(
+ "StorageClass attribute not supported on HTTP
client as header key is unknown"
+ );
builder
}
// Ignore metadata attributes
@@ -232,7 +234,7 @@ impl Client {
source,
path: location.to_string(),
}
- .into())
+ .into());
}
},
}
@@ -280,7 +282,7 @@ impl Client {
source,
path: location.map(|x| x.to_string()).unwrap_or_default(),
}
- .into())
+ .into());
}
};
diff --git a/src/http/mod.rs b/src/http/mod.rs
index 8581f92..d573125 100644
--- a/src/http/mod.rs
+++ b/src/http/mod.rs
@@ -41,7 +41,7 @@ use url::Url;
use crate::client::get::GetClientExt;
use crate::client::header::get_etag;
-use crate::client::{http_connector, HttpConnector};
+use crate::client::{HttpConnector, http_connector};
use crate::http::client::Client;
use crate::path::Path;
use crate::{
diff --git a/src/integration.rs b/src/integration.rs
index 1f769b1..e4e73e9 100644
--- a/src/integration.rs
+++ b/src/integration.rs
@@ -34,7 +34,7 @@ use crate::{
use bytes::Bytes;
use futures::stream::FuturesUnordered;
use futures::{StreamExt, TryStreamExt};
-use rand::{rng, Rng};
+use rand::{Rng, rng};
use std::collections::HashSet;
use std::slice;
@@ -1156,15 +1156,9 @@ pub async fn multipart_out_of_order(storage: &dyn
ObjectStore) {
let path = Path::from("test_multipart_out_of_order");
let mut multipart_upload = storage.put_multipart(&path).await.unwrap();
- let part1 = std::iter::repeat(b'1')
- .take(5 * 1024 * 1024)
- .collect::<Bytes>();
- let part2 = std::iter::repeat(b'2')
- .take(5 * 1024 * 1024)
- .collect::<Bytes>();
- let part3 = std::iter::repeat(b'3')
- .take(5 * 1024 * 1024)
- .collect::<Bytes>();
+ let part1 = std::iter::repeat_n(b'1', 5 * 1024 * 1024).collect::<Bytes>();
+ let part2 = std::iter::repeat_n(b'2', 5 * 1024 * 1024).collect::<Bytes>();
+ let part3 = std::iter::repeat_n(b'3', 5 * 1024 * 1024).collect::<Bytes>();
let full = [part1.as_ref(), part2.as_ref(), part3.as_ref()].concat();
let fut1 = multipart_upload.put_part(part1.into());
diff --git a/src/lib.rs b/src/lib.rs
index e37fb69..7bd3c99 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -557,8 +557,8 @@ pub mod client;
#[cfg(feature = "cloud")]
pub use client::{
- backoff::BackoffConfig, retry::RetryConfig, ClientConfigKey,
ClientOptions, CredentialProvider,
- StaticCredentialProvider,
+ ClientConfigKey, ClientOptions, CredentialProvider,
StaticCredentialProvider,
+ backoff::BackoffConfig, retry::RetryConfig,
};
#[cfg(all(feature = "cloud", not(target_arch = "wasm32")))]
@@ -585,10 +585,10 @@ pub mod integration;
pub use attributes::*;
-pub use parse::{parse_url, parse_url_opts, ObjectStoreScheme};
+pub use parse::{ObjectStoreScheme, parse_url, parse_url_opts};
pub use payload::*;
pub use upload::*;
-pub use util::{coalesce_ranges, collect_bytes, GetRange,
OBJECT_STORE_COALESCE_DEFAULT};
+pub use util::{GetRange, OBJECT_STORE_COALESCE_DEFAULT, coalesce_ranges,
collect_bytes};
// Re-export HTTP types used in public API
pub use ::http::{Extensions, HeaderMap, HeaderValue};
@@ -599,7 +599,7 @@ use crate::util::maybe_spawn_blocking;
use async_trait::async_trait;
use bytes::Bytes;
use chrono::{DateTime, Utc};
-use futures::{stream::BoxStream, StreamExt, TryStreamExt};
+use futures::{StreamExt, TryStreamExt, stream::BoxStream};
use std::fmt::{Debug, Formatter};
#[cfg(all(feature = "fs", not(target_arch = "wasm32")))]
use std::io::{Read, Seek, SeekFrom};
diff --git a/src/limit.rs b/src/limit.rs
index 8571496..ddafa92 100644
--- a/src/limit.rs
+++ b/src/limit.rs
@@ -276,10 +276,10 @@ impl MultipartUpload for LimitUpload {
#[cfg(test)]
mod tests {
+ use crate::ObjectStore;
use crate::integration::*;
use crate::limit::LimitStore;
use crate::memory::InMemory;
- use crate::ObjectStore;
use futures::stream::StreamExt;
use std::pin::Pin;
use std::time::Duration;
diff --git a/src/local.rs b/src/local.rs
index 3404bc8..9294424 100644
--- a/src/local.rs
+++ b/src/local.rs
@@ -16,7 +16,7 @@
// under the License.
//! An object store implementation for a local filesystem
-use std::fs::{metadata, symlink_metadata, File, Metadata, OpenOptions};
+use std::fs::{File, Metadata, OpenOptions, metadata, symlink_metadata};
use std::io::{ErrorKind, Read, Seek, SeekFrom, Write};
use std::ops::Range;
use std::sync::Arc;
@@ -27,19 +27,18 @@ use std::{collections::VecDeque, path::PathBuf};
use async_trait::async_trait;
use bytes::Bytes;
use chrono::{DateTime, Utc};
-use futures::{stream::BoxStream, StreamExt};
use futures::{FutureExt, TryStreamExt};
+use futures::{StreamExt, stream::BoxStream};
use parking_lot::Mutex;
use url::Url;
use walkdir::{DirEntry, WalkDir};
use crate::{
- maybe_spawn_blocking,
- path::{absolute_path_to_url, Path},
- util::InvalidGetRange,
Attributes, GetOptions, GetResult, GetResultPayload, ListResult,
MultipartUpload, ObjectMeta,
ObjectStore, PutMode, PutMultipartOptions, PutOptions, PutPayload,
PutResult, Result,
- UploadPart,
+ UploadPart, maybe_spawn_blocking,
+ path::{Path, absolute_path_to_url},
+ util::InvalidGetRange,
};
/// A specialized `Error` for filesystem object store-related errors
@@ -556,23 +555,25 @@ impl ObjectStore for LocalFileSystem {
// - atomically rename this temporary file into place
//
// This is necessary because hard_link returns an error if the
destination already exists
- maybe_spawn_blocking(move || loop {
- let staged = staged_upload_path(&to, &id.to_string());
- match std::fs::hard_link(&from, &staged) {
- Ok(_) => {
- return std::fs::rename(&staged, &to).map_err(|source| {
- let _ = std::fs::remove_file(&staged); // Attempt to
clean up
- Error::UnableToCopyFile { from, to, source }.into()
- });
- }
- Err(source) => match source.kind() {
- ErrorKind::AlreadyExists => id += 1,
- ErrorKind::NotFound => match from.exists() {
- true => create_parent_dirs(&to, source)?,
- false => return Err(Error::NotFound { path: from,
source }.into()),
+ maybe_spawn_blocking(move || {
+ loop {
+ let staged = staged_upload_path(&to, &id.to_string());
+ match std::fs::hard_link(&from, &staged) {
+ Ok(_) => {
+ return std::fs::rename(&staged, &to).map_err(|source| {
+ let _ = std::fs::remove_file(&staged); // Attempt
to clean up
+ Error::UnableToCopyFile { from, to, source }.into()
+ });
+ }
+ Err(source) => match source.kind() {
+ ErrorKind::AlreadyExists => id += 1,
+ ErrorKind::NotFound => match from.exists() {
+ true => create_parent_dirs(&to, source)?,
+ false => return Err(Error::NotFound { path: from,
source }.into()),
+ },
+ _ => return Err(Error::UnableToCopyFile { from, to,
source }.into()),
},
- _ => return Err(Error::UnableToCopyFile { from, to, source
}.into()),
- },
+ }
}
})
.await
@@ -581,16 +582,18 @@ impl ObjectStore for LocalFileSystem {
async fn rename(&self, from: &Path, to: &Path) -> Result<()> {
let from = self.path_to_filesystem(from)?;
let to = self.path_to_filesystem(to)?;
- maybe_spawn_blocking(move || loop {
- match std::fs::rename(&from, &to) {
- Ok(_) => return Ok(()),
- Err(source) => match source.kind() {
- ErrorKind::NotFound => match from.exists() {
- true => create_parent_dirs(&to, source)?,
- false => return Err(Error::NotFound { path: from,
source }.into()),
+ maybe_spawn_blocking(move || {
+ loop {
+ match std::fs::rename(&from, &to) {
+ Ok(_) => return Ok(()),
+ Err(source) => match source.kind() {
+ ErrorKind::NotFound => match from.exists() {
+ true => create_parent_dirs(&to, source)?,
+ false => return Err(Error::NotFound { path: from,
source }.into()),
+ },
+ _ => return Err(Error::UnableToCopyFile { from, to,
source }.into()),
},
- _ => return Err(Error::UnableToCopyFile { from, to, source
}.into()),
- },
+ }
}
})
.await
@@ -600,23 +603,25 @@ impl ObjectStore for LocalFileSystem {
let from = self.path_to_filesystem(from)?;
let to = self.path_to_filesystem(to)?;
- maybe_spawn_blocking(move || loop {
- match std::fs::hard_link(&from, &to) {
- Ok(_) => return Ok(()),
- Err(source) => match source.kind() {
- ErrorKind::AlreadyExists => {
- return Err(Error::AlreadyExists {
- path: to.to_str().unwrap().to_string(),
- source,
+ maybe_spawn_blocking(move || {
+ loop {
+ match std::fs::hard_link(&from, &to) {
+ Ok(_) => return Ok(()),
+ Err(source) => match source.kind() {
+ ErrorKind::AlreadyExists => {
+ return Err(Error::AlreadyExists {
+ path: to.to_str().unwrap().to_string(),
+ source,
+ }
+ .into());
}
- .into())
- }
- ErrorKind::NotFound => match from.exists() {
- true => create_parent_dirs(&to, source)?,
- false => return Err(Error::NotFound { path: from,
source }.into()),
+ ErrorKind::NotFound => match from.exists() {
+ true => create_parent_dirs(&to, source)?,
+ false => return Err(Error::NotFound { path: from,
source }.into()),
+ },
+ _ => return Err(Error::UnableToCopyFile { from, to,
source }.into()),
},
- _ => return Err(Error::UnableToCopyFile { from, to, source
}.into()),
- },
+ }
}
})
.await
@@ -1614,7 +1619,10 @@ mod tests {
let b = Path::parse("bar#123").unwrap();
let err = integration.get(&b).await.unwrap_err().to_string();
- assert_eq!(err, "Generic LocalFileSystem error: Filenames containing
trailing '/#\\d+/' are not supported: bar#123");
+ assert_eq!(
+ err,
+ "Generic LocalFileSystem error: Filenames containing trailing
'/#\\d+/' are not supported: bar#123"
+ );
let c = Path::parse("foo#123.txt").unwrap();
integration.put(&c, "test".into()).await.unwrap();
diff --git a/src/memory.rs b/src/memory.rs
index e15c246..517cb1d 100644
--- a/src/memory.rs
+++ b/src/memory.rs
@@ -23,15 +23,15 @@ use std::sync::Arc;
use async_trait::async_trait;
use bytes::Bytes;
use chrono::{DateTime, Utc};
-use futures::{stream::BoxStream, StreamExt};
+use futures::{StreamExt, stream::BoxStream};
use parking_lot::RwLock;
use crate::multipart::{MultipartStore, PartId};
use crate::util::InvalidGetRange;
use crate::{
- path::Path, Attributes, GetRange, GetResult, GetResultPayload, ListResult,
MultipartId,
- MultipartUpload, ObjectMeta, ObjectStore, PutMode, PutMultipartOptions,
PutOptions, PutResult,
- Result, UpdateVersion, UploadPart,
+ Attributes, GetRange, GetResult, GetResultPayload, ListResult,
MultipartId, MultipartUpload,
+ ObjectMeta, ObjectStore, PutMode, PutMultipartOptions, PutOptions,
PutResult, Result,
+ UpdateVersion, UploadPart, path::Path,
};
use crate::{GetOptions, PutPayload};
diff --git a/src/parse.rs b/src/parse.rs
index b1f653c..b8b6fa4 100644
--- a/src/parse.rs
+++ b/src/parse.rs
@@ -15,11 +15,11 @@
// specific language governing permissions and limitations
// under the License.
+use crate::ObjectStore;
#[cfg(all(feature = "fs", not(target_arch = "wasm32")))]
use crate::local::LocalFileSystem;
use crate::memory::InMemory;
use crate::path::Path;
-use crate::ObjectStore;
use url::Url;
#[derive(Debug, thiserror::Error)]
@@ -230,7 +230,7 @@ where
return Err(super::Error::Generic {
store: "parse_url",
source: format!("feature for {s:?} not enabled").into(),
- })
+ });
}
};
@@ -402,7 +402,7 @@ mod tests {
#[cfg(all(feature = "http", not(target_arch = "wasm32")))]
async fn test_url_http() {
use crate::client::mock_server::MockServer;
- use http::{header::USER_AGENT, Response};
+ use http::{Response, header::USER_AGENT};
let server = MockServer::new().await;
diff --git a/src/path/parts.rs b/src/path/parts.rs
index 9c6612b..2170510 100644
--- a/src/path/parts.rs
+++ b/src/path/parts.rs
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-use percent_encoding::{percent_encode, AsciiSet, CONTROLS};
+use percent_encoding::{AsciiSet, CONTROLS, percent_encode};
use std::borrow::Cow;
use crate::path::DELIMITER_BYTE;
diff --git a/src/prefix.rs b/src/prefix.rs
index 4720c98..160fbbf 100644
--- a/src/prefix.rs
+++ b/src/prefix.rs
@@ -17,7 +17,7 @@
//! An object store wrapper handling a constant path prefix
use bytes::Bytes;
-use futures::{stream::BoxStream, StreamExt, TryStreamExt};
+use futures::{StreamExt, TryStreamExt, stream::BoxStream};
use std::ops::Range;
use crate::path::Path;
diff --git a/src/registry.rs b/src/registry.rs
index 81770c5..4794842 100644
--- a/src/registry.rs
+++ b/src/registry.rs
@@ -18,7 +18,7 @@
//! Map object URLs to [`ObjectStore`]
use crate::path::{InvalidPart, Path, PathPart};
-use crate::{parse_url_opts, ObjectStore};
+use crate::{ObjectStore, parse_url_opts};
use parking_lot::RwLock;
use std::collections::HashMap;
use std::sync::Arc;
@@ -274,9 +274,11 @@ mod tests {
// Should not replace store
let banana = Arc::new(PrefixStore::new(InMemory::new(), "banana")) as
Arc<dyn ObjectStore>;
- assert!(registry
- .register(banana_url.clone(), Arc::clone(&banana))
- .is_none());
+ assert!(
+ registry
+ .register(banana_url.clone(), Arc::clone(&banana))
+ .is_none()
+ );
// Should resolve to banana store
let (resolved, path) = registry.resolve(&banana_url).unwrap();
@@ -317,9 +319,11 @@ mod tests {
let nested_url2 = Url::parse("memory:///1/2/3").unwrap();
let nested2 = Arc::new(PrefixStore::new(InMemory::new(), "1/2/3")) as
Arc<dyn ObjectStore>;
- assert!(registry
- .register(nested_url2, Arc::clone(&nested2))
- .is_none());
+ assert!(
+ registry
+ .register(nested_url2, Arc::clone(&nested2))
+ .is_none()
+ );
let to_resolve = Url::parse("memory:///1/2/3/4/5/6").unwrap();
let (resolved, path) = registry.resolve(&to_resolve).unwrap();
@@ -328,9 +332,11 @@ mod tests {
let custom_scheme_url = Url::parse("custom:///").unwrap();
let custom_scheme = Arc::new(InMemory::new()) as Arc<dyn ObjectStore>;
- assert!(registry
- .register(custom_scheme_url, Arc::clone(&custom_scheme))
- .is_none());
+ assert!(
+ registry
+ .register(custom_scheme_url, Arc::clone(&custom_scheme))
+ .is_none()
+ );
let to_resolve = Url::parse("custom:///6/7").unwrap();
let (resolved, path) = registry.resolve(&to_resolve).unwrap();
diff --git a/src/signer.rs b/src/signer.rs
index da55c68..ab3c7f9 100644
--- a/src/signer.rs
+++ b/src/signer.rs
@@ -17,7 +17,7 @@
//! Abstraction of signed URL generation for those object store
implementations that support it
-use crate::{path::Path, Result};
+use crate::{Result, path::Path};
use async_trait::async_trait;
use reqwest::Method;
use std::{fmt, time::Duration};
diff --git a/src/throttle.rs b/src/throttle.rs
index dec642a..85a9186 100644
--- a/src/throttle.rs
+++ b/src/throttle.rs
@@ -21,14 +21,14 @@ use std::ops::Range;
use std::{convert::TryInto, sync::Arc};
use crate::multipart::{MultipartStore, PartId};
+use crate::{GetOptions, UploadPart};
use crate::{
- path::Path, GetResult, GetResultPayload, ListResult, MultipartId,
MultipartUpload, ObjectMeta,
- ObjectStore, PutMultipartOptions, PutOptions, PutPayload, PutResult,
Result,
+ GetResult, GetResultPayload, ListResult, MultipartId, MultipartUpload,
ObjectMeta, ObjectStore,
+ PutMultipartOptions, PutOptions, PutPayload, PutResult, Result, path::Path,
};
-use crate::{GetOptions, UploadPart};
use async_trait::async_trait;
use bytes::Bytes;
-use futures::{stream::BoxStream, FutureExt, StreamExt};
+use futures::{FutureExt, StreamExt, stream::BoxStream};
use std::time::Duration;
/// Configuration settings for throttled store
@@ -559,7 +559,7 @@ mod tests {
let path = Path::from("foo");
if let Some(n_bytes) = n_bytes {
- let data: Vec<_> = std::iter::repeat(1u8).take(n_bytes).collect();
+ let data: Vec<_> = std::iter::repeat_n(1u8, n_bytes).collect();
store.put(&path, data.into()).await.unwrap();
} else {
// ensure object is absent
@@ -651,7 +651,7 @@ mod tests {
}
async fn measure_put(store: &ThrottledStore<InMemory>, n_bytes: usize) ->
Duration {
- let data: Vec<_> = std::iter::repeat(1u8).take(n_bytes).collect();
+ let data: Vec<_> = std::iter::repeat_n(1u8, n_bytes).collect();
let t0 = Instant::now();
store.put(&Path::from("foo"), data.into()).await.unwrap();
diff --git a/src/upload.rs b/src/upload.rs
index af5975a..a27d0dd 100644
--- a/src/upload.rs
+++ b/src/upload.rs
@@ -248,10 +248,10 @@ mod tests {
use rand::prelude::StdRng;
use rand::{Rng, SeedableRng};
+ use crate::ObjectStore;
use crate::memory::InMemory;
use crate::path::Path;
use crate::throttle::{ThrottleConfig, ThrottledStore};
- use crate::ObjectStore;
use super::*;
diff --git a/src/util.rs b/src/util.rs
index 4f297d9..b7f9182 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -23,7 +23,7 @@ use std::{
use super::Result;
use bytes::Bytes;
-use futures::{stream::StreamExt, Stream, TryStreamExt};
+use futures::{Stream, TryStreamExt, stream::StreamExt};
#[cfg(any(feature = "azure", feature = "http"))]
pub(crate) static RFC1123_FMT: &str = "%a, %d %h %Y %T GMT";
@@ -331,7 +331,7 @@ mod tests {
use crate::Error;
use super::*;
- use rand::{rng, Rng};
+ use rand::{Rng, rng};
use std::ops::Range;
/// Calls coalesce_ranges and validates the returned data is correct
diff --git a/tests/http.rs b/tests/http.rs
index 6c41792..f23ef74 100644
--- a/tests/http.rs
+++ b/tests/http.rs
@@ -18,7 +18,7 @@
//! Tests the HTTP store implementation
#[cfg(feature = "http")]
-use object_store::{http::HttpBuilder, path::Path, GetOptions, GetRange,
ObjectStore};
+use object_store::{GetOptions, GetRange, ObjectStore, http::HttpBuilder,
path::Path};
#[cfg(all(feature = "http", target_arch = "wasm32", target_os = "unknown"))]
use wasm_bindgen_test::*;