You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2023/05/08 13:30:21 UTC

[incubator-opendal] branch main updated: feat(core): check capability (#2215)

This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 6fa13ad4 feat(core): check capability (#2215)
6fa13ad4 is described below

commit 6fa13ad41f5171f526258d162b26e518aee19022
Author: Suyan <su...@gmail.com>
AuthorDate: Mon May 8 21:30:17 2023 +0800

    feat(core): check capability (#2215)
    
    * feat(core): check capability for fs
    
    Signed-off-by: suyanhanx <su...@gmail.com>
    
    * basic check all
    
    Signed-off-by: suyanhanx <su...@gmail.com>
    
    * make fmt happy
    
    Signed-off-by: suyanhanx <su...@gmail.com>
    
    * check for all services
    
    Signed-off-by: suyanhanx <su...@gmail.com>
    
    * fix typo
    
    Signed-off-by: suyanhanx <su...@gmail.com>
    
    ---------
    
    Signed-off-by: suyanhanx <su...@gmail.com>
---
 core/src/services/azblob/backend.rs           | 16 +++++++++++---
 core/src/services/azdfs/backend.rs            | 11 +++++++++
 core/src/services/dashmap/backend.rs          | 11 +++++++--
 core/src/services/fs/backend.rs               | 12 +++++++++-
 core/src/services/ftp/backend.rs              | 12 ++++++++++
 core/src/services/gcs/backend.rs              | 19 +++++++++++-----
 core/src/services/gdrive/builder.rs           |  2 +-
 core/src/services/ghac/backend.rs             | 14 +++++++++---
 core/src/services/hdfs/backend.rs             | 16 +++++++++++---
 core/src/services/http/backend.rs             |  5 +++++
 core/src/services/ipfs/backend.rs             | 10 ++++++++-
 core/src/services/ipmfs/backend.rs            | 22 ++++++++++++++++++
 core/src/services/memcached/backend.rs        |  5 +++++
 core/src/services/memory/backend.rs           | 11 +++++++--
 core/src/services/moka/backend.rs             | 13 ++++++++---
 core/src/services/obs/backend.rs              | 10 +++++++--
 core/src/services/oss/backend.rs              | 22 +++++++++++++-----
 core/src/services/redis/backend.rs            | 12 ++++++++++
 core/src/services/rocksdb/backend.rs          |  7 +++++-
 core/src/services/s3/backend.rs               | 19 +++++++++++-----
 core/src/services/sftp/backend.rs             | 18 ++++++++++++++-
 core/src/services/sled/backend.rs             | 12 ++++++++++
 core/src/services/supabase/backend.rs         |  6 +++++
 core/src/services/vercel_artifacts/backend.rs |  2 ++
 core/src/services/vercel_artifacts/builder.rs |  3 +++
 core/src/services/wasabi/backend.rs           | 20 ++++++++++++-----
 core/src/services/webdav/backend.rs           | 12 +++++++++-
 core/src/services/webhdfs/backend.rs          | 12 ++++++++++
 core/src/types/capability.rs                  | 32 +++++++++++++--------------
 29 files changed, 305 insertions(+), 61 deletions(-)

diff --git a/core/src/services/azblob/backend.rs b/core/src/services/azblob/backend.rs
index 65bd334a..de9ed27c 100644
--- a/core/src/services/azblob/backend.rs
+++ b/core/src/services/azblob/backend.rs
@@ -56,9 +56,13 @@ const AZBLOB_BATCH_LIMIT: usize = 256;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [x] copy
+/// - [ ] rename
 /// - [x] list
 /// - [x] scan
 /// - [x] presign
@@ -471,15 +475,21 @@ impl Accessor for AzblobBackend {
 
                 delete: true,
                 create_dir: true,
-                list: true,
-                scan: true,
                 copy: true,
+
+                scan: true,
+                list: true,
+                list_with_delimiter_slash: true,
+
                 presign: self.has_sas_token,
+                presign_stat: self.has_sas_token,
+                presign_read: self.has_sas_token,
+                presign_write: self.has_sas_token,
+
                 batch: true,
                 batch_delete: true,
                 batch_max_operations: Some(AZBLOB_BATCH_LIMIT),
 
-                list_with_delimiter_slash: true,
                 ..Default::default()
             });
 
diff --git a/core/src/services/azdfs/backend.rs b/core/src/services/azdfs/backend.rs
index 167159d1..cde4bd59 100644
--- a/core/src/services/azdfs/backend.rs
+++ b/core/src/services/azdfs/backend.rs
@@ -55,8 +55,12 @@ const KNOWN_AZDFS_ENDPOINT_SUFFIX: &[&str] = &[
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
 /// - [x] rename
 /// - [x] list
 /// - [ ] ~~scan~~
@@ -309,13 +313,20 @@ impl Accessor for AzdfsBackend {
             .set_root(&self.core.root)
             .set_name(&self.core.filesystem)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_next: true,
                 read_with_range: true,
+
                 write: true,
+                create_dir: true,
+                delete: true,
                 rename: true,
+
                 list: true,
                 list_with_delimiter_slash: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/dashmap/backend.rs b/core/src/services/dashmap/backend.rs
index 18a4694b..c620d506 100644
--- a/core/src/services/dashmap/backend.rs
+++ b/core/src/services/dashmap/backend.rs
@@ -30,10 +30,17 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
-/// - [x] get
-/// - [x] set
+/// - [x] stat
+/// - [x] read
+/// - [x] write
+/// - [x] create_dir
 /// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
+/// - [ ] list
 /// - [x] scan
+/// - [ ] presign
+/// - [ ] blocking
 #[derive(Default)]
 pub struct DashmapBuilder {
     root: Option<String>,
diff --git a/core/src/services/fs/backend.rs b/core/src/services/fs/backend.rs
index a7eae790..3004dc7a 100644
--- a/core/src/services/fs/backend.rs
+++ b/core/src/services/fs/backend.rs
@@ -42,8 +42,11 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [x] copy
 /// - [x] rename
 /// - [x] list
@@ -301,17 +304,24 @@ impl Accessor for FsBackend {
         am.set_scheme(Scheme::Fs)
             .set_root(&self.root.to_string_lossy())
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_seek: true,
                 read_with_range: true,
+
                 write: true,
                 write_without_content_length: true,
                 create_dir: true,
+                delete: true,
+
                 list: true,
+                list_with_delimiter_slash: true,
+
                 copy: true,
                 rename: true,
                 blocking: true,
-                list_with_delimiter_slash: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/ftp/backend.rs b/core/src/services/ftp/backend.rs
index 4779db1e..998342d8 100644
--- a/core/src/services/ftp/backend.rs
+++ b/core/src/services/ftp/backend.rs
@@ -51,8 +51,13 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
 /// - [x] list
 /// - [ ] ~~scan~~
 /// - [ ] ~~presign~~
@@ -317,11 +322,18 @@ impl Accessor for FtpBackend {
         am.set_scheme(Scheme::Ftp)
             .set_root(&self.root)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_with_range: true,
+
                 write: true,
+                delete: true,
+                create_dir: true,
+
                 list: true,
                 list_with_delimiter_slash: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs
index 87b06337..078106d3 100644
--- a/core/src/services/gcs/backend.rs
+++ b/core/src/services/gcs/backend.rs
@@ -49,11 +49,15 @@ const DEFAULT_WRITE_FIXED_SIZE: usize = 8 * 1024 * 1024;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [x] copy
+/// - [ ] rename
 /// - [x] list
 /// - [x] scan
-/// - [x] copy
 /// - [x] presign
 /// - [ ] blocking
 ///
@@ -414,16 +418,21 @@ impl Accessor for GcsBackend {
                 write: true,
                 write_with_content_type: true,
                 write_without_content_length: true,
+                delete: true,
+                copy: true,
 
+                scan: true,
                 list: true,
                 list_with_limit: true,
                 list_with_start_after: true,
-                scan: true,
-                copy: true,
-                presign: true,
-
                 list_with_delimiter_slash: true,
                 list_without_delimiter: true,
+
+                presign: true,
+                presign_stat: true,
+                presign_read: true,
+                presign_write: true,
+
                 ..Default::default()
             });
         am
diff --git a/core/src/services/gdrive/builder.rs b/core/src/services/gdrive/builder.rs
index d7ed0c84..7a536b1b 100644
--- a/core/src/services/gdrive/builder.rs
+++ b/core/src/services/gdrive/builder.rs
@@ -47,7 +47,7 @@ use crate::*;
 /// - `access_token`: set the access_token for google drive api
 /// - `root`: Set the work directory for backend
 ///
-/// You can refer to [`GoogleDriveBuilder`]'s docs for more information
+/// You can refer to [`GdriveBuilder`]'s docs for more information
 ///
 /// # Example
 ///
diff --git a/core/src/services/ghac/backend.rs b/core/src/services/ghac/backend.rs
index 4b55014a..94778079 100644
--- a/core/src/services/ghac/backend.rs
+++ b/core/src/services/ghac/backend.rs
@@ -67,13 +67,17 @@ const GITHUB_API_VERSION: &str = "2022-11-28";
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [x] copy
+/// - [ ] rename
 /// - [ ] list
-/// - [ ] ~~scan~~
-/// - [ ] ~~presign~~
+/// - [ ] scan
+/// - [ ] presign
 /// - [ ] blocking
-///
 /// # Notes
 ///
 /// This service is mainly provided by github actions.
@@ -301,11 +305,15 @@ impl Accessor for GhacBackend {
             .set_root(&self.root)
             .set_name(&self.version)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_next: true,
                 read_with_range: true,
 
                 write: true,
+                create_dir: true,
+                delete: true,
 
                 ..Default::default()
             });
diff --git a/core/src/services/hdfs/backend.rs b/core/src/services/hdfs/backend.rs
index 5c0c8f0b..06e8ce27 100644
--- a/core/src/services/hdfs/backend.rs
+++ b/core/src/services/hdfs/backend.rs
@@ -41,13 +41,17 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
 /// - [x] list
 /// - [ ] ~~scan~~
 /// - [ ] ~~presign~~
 /// - [x] blocking
-///
 /// # Differences with webhdfs
 ///
 /// [Webhdfs][crate::services::Webhdfs] is powered by hdfs's RESTful HTTP API.
@@ -93,7 +97,7 @@ use crate::*;
 /// ```
 ///
 /// `CLASSPATH` is not set correctly or your hadoop installation is incorrect.
-///  
+///
 /// To set `CLASSPATH`:
 /// ```shell
 /// export CLASSPATH=$(find $HADOOP_HOME -iname "*.jar" | xargs echo | tr ' ' ':'):${CLASSPATH}
@@ -238,15 +242,21 @@ impl Accessor for HdfsBackend {
         am.set_scheme(Scheme::Hdfs)
             .set_root(&self.root)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_seek: true,
                 read_with_range: true,
 
                 write: true,
+                create_dir: true,
+                delete: true,
+
                 list: true,
+                list_with_delimiter_slash: true,
+
                 blocking: true,
 
-                list_with_delimiter_slash: true,
                 ..Default::default()
             });
 
diff --git a/core/src/services/http/backend.rs b/core/src/services/http/backend.rs
index e76536cc..99f02ba8 100644
--- a/core/src/services/http/backend.rs
+++ b/core/src/services/http/backend.rs
@@ -39,8 +39,13 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [ ] ~~write~~
+/// - [ ] ~~create_dir~~
+/// - [ ] ~~delete~~
+/// - [ ] ~~copy~~
+/// - [ ] ~~rename~~
 /// - [ ] ~~list~~
 /// - [ ] ~~scan~~
 /// - [ ] ~~presign~~
diff --git a/core/src/services/ipfs/backend.rs b/core/src/services/ipfs/backend.rs
index 9db6c8bd..78da66f9 100644
--- a/core/src/services/ipfs/backend.rs
+++ b/core/src/services/ipfs/backend.rs
@@ -39,8 +39,13 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [ ] ~~write~~
+/// - [ ] ~~create_dir~~
+/// - [ ] ~~delete~~
+/// - [ ] ~~copy~~
+/// - [ ] ~~rename~~
 /// - [x] list
 /// - [ ] ~~scan~~
 /// - [ ] presign
@@ -220,12 +225,15 @@ impl Accessor for IpfsBackend {
         ma.set_scheme(Scheme::Ipfs)
             .set_root(&self.root)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_next: true,
                 read_with_range: true,
-                list: true,
 
+                list: true,
                 list_with_delimiter_slash: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/ipmfs/backend.rs b/core/src/services/ipmfs/backend.rs
index c444f179..8b278e91 100644
--- a/core/src/services/ipmfs/backend.rs
+++ b/core/src/services/ipmfs/backend.rs
@@ -35,6 +35,23 @@ use crate::raw::*;
 use crate::*;
 
 /// Backend for IPFS service
+///
+/// # Capabilities
+///
+/// This service can be used to:
+///
+/// - [x] stat
+/// - [x] read
+/// - [x] write
+/// - [ ] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
+/// - [x] list
+/// - [ ] scan
+/// - [ ] presign
+/// - [ ] blocking
+///
 #[derive(Clone)]
 pub struct IpmfsBackend {
     root: String,
@@ -75,13 +92,18 @@ impl Accessor for IpmfsBackend {
         am.set_scheme(Scheme::Ipmfs)
             .set_root(&self.root)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_next: true,
                 read_with_range: true,
+
                 write: true,
+                delete: true,
 
                 list: true,
                 list_with_delimiter_slash: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/memcached/backend.rs b/core/src/services/memcached/backend.rs
index ee6b30e7..49d37dcb 100644
--- a/core/src/services/memcached/backend.rs
+++ b/core/src/services/memcached/backend.rs
@@ -34,8 +34,13 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
 /// - [ ] ~~list~~
 /// - [ ] scan
 /// - [ ] ~~presign~~
diff --git a/core/src/services/memory/backend.rs b/core/src/services/memory/backend.rs
index c745e288..9ec2ea21 100644
--- a/core/src/services/memory/backend.rs
+++ b/core/src/services/memory/backend.rs
@@ -31,10 +31,17 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
-/// - [x] get
-/// - [x] set
+/// - [x] stat
+/// - [x] read
+/// - [x] write
+/// - [x] create_dir
 /// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
+/// - [ ] list
 /// - [x] scan
+/// - [ ] presign
+/// - [ ] blocking
 #[derive(Default)]
 pub struct MemoryBuilder {
     root: Option<String>,
diff --git a/core/src/services/moka/backend.rs b/core/src/services/moka/backend.rs
index 381d8e72..f6b2a8fc 100644
--- a/core/src/services/moka/backend.rs
+++ b/core/src/services/moka/backend.rs
@@ -33,10 +33,17 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
-/// - [x] get
-/// - [x] set
+/// - [x] stat
+/// - [x] read
+/// - [x] write
+/// - [x] create_dir
 /// - [x] delete
-/// - [ ] ~~ scan ~~
+/// - [ ] copy
+/// - [ ] rename
+/// - [ ] list
+/// - [ ] ~~scan~~
+/// - [ ] presign
+/// - [ ] blocking
 #[derive(Default, Debug)]
 pub struct MokaBuilder {
     /// Name for this cache instance.
diff --git a/core/src/services/obs/backend.rs b/core/src/services/obs/backend.rs
index 13443551..8a9b06c6 100644
--- a/core/src/services/obs/backend.rs
+++ b/core/src/services/obs/backend.rs
@@ -41,9 +41,13 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [x] copy
+/// - [ ] rename
 /// - [x] list
 /// - [x] scan
 /// - [ ] presign
@@ -320,10 +324,12 @@ impl Accessor for ObsBackend {
                 write_with_content_type: true,
                 write_with_cache_control: true,
 
-                list: true,
-                scan: true,
+                delete: true,
+                create_dir: true,
                 copy: true,
 
+                scan: true,
+                list: true,
                 list_with_delimiter_slash: true,
                 list_without_delimiter: true,
 
diff --git a/core/src/services/oss/backend.rs b/core/src/services/oss/backend.rs
index 1f42d076..7728731b 100644
--- a/core/src/services/oss/backend.rs
+++ b/core/src/services/oss/backend.rs
@@ -45,12 +45,16 @@ const DEFAULT_WRITE_MIN_SIZE: usize = 8 * 1024 * 1024;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [x] copy
+/// - [ ] rename
 /// - [x] list
 /// - [x] scan
-/// - [ ] presign
+/// - [x] presign
 /// - [ ] blocking
 ///
 /// # Configuration
@@ -460,17 +464,23 @@ impl Accessor for OssBackend {
                 write_with_cache_control: true,
                 write_with_content_type: true,
                 write_without_content_length: true,
+                delete: true,
+                create_dir: true,
+                copy: true,
 
-                list: true,
                 scan: true,
-                copy: true,
+                list: true,
+                list_with_delimiter_slash: true,
+                list_without_delimiter: true,
+
                 presign: true,
+                presign_stat: true,
+                presign_read: true,
+                presign_write: true,
+
                 batch: true,
                 batch_max_operations: Some(1000),
 
-                list_with_delimiter_slash: true,
-                list_without_delimiter: true,
-
                 ..Default::default()
             });
 
diff --git a/core/src/services/redis/backend.rs b/core/src/services/redis/backend.rs
index 3e484af0..1afc0083 100644
--- a/core/src/services/redis/backend.rs
+++ b/core/src/services/redis/backend.rs
@@ -52,6 +52,18 @@ const DEFAULT_REDIS_PORT: u16 = 6379;
 /// - [ ] ~~presign~~
 /// - [ ] blocking
 ///
+/// - [x] stat
+/// - [x] read
+/// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
+/// - [ ] ~~list~~
+/// - [ ] scan
+/// - [ ] ~~presign~~
+/// - [ ] blocking
+///
 /// # Configuration
 ///
 /// - `root`: Set the working directory of `OpenDAL`
diff --git a/core/src/services/rocksdb/backend.rs b/core/src/services/rocksdb/backend.rs
index 503139b7..68aa9a44 100644
--- a/core/src/services/rocksdb/backend.rs
+++ b/core/src/services/rocksdb/backend.rs
@@ -33,10 +33,15 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
 /// - [ ] ~~list~~
-/// - [ ] scan
+/// - [x] scan
 /// - [ ] ~~presign~~
 /// - [x] blocking
 ///
diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs
index 25327f7e..75cc2af1 100644
--- a/core/src/services/s3/backend.rs
+++ b/core/src/services/s3/backend.rs
@@ -63,9 +63,13 @@ const DEFAULT_WRITE_MIN_SIZE: usize = 8 * 1024 * 1024;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [x] copy
+/// - [ ] rename
 /// - [x] list
 /// - [x] scan
 /// - [x] presign
@@ -972,20 +976,25 @@ impl Accessor for S3Backend {
                 write_with_cache_control: true,
                 write_with_content_type: true,
                 write_without_content_length: true,
+                create_dir: true,
+                delete: true,
+                copy: true,
 
+                scan: true,
                 list: true,
                 list_with_limit: true,
                 list_with_start_after: true,
+                list_without_delimiter: true,
+                list_with_delimiter_slash: true,
 
-                scan: true,
-                copy: true,
                 presign: true,
+                presign_stat: true,
+                presign_read: true,
+                presign_write: true,
+
                 batch: true,
                 batch_max_operations: Some(1000),
 
-                list_without_delimiter: true,
-                list_with_delimiter_slash: true,
-
                 ..Default::default()
             });
 
diff --git a/core/src/services/sftp/backend.rs b/core/src/services/sftp/backend.rs
index 352eef19..45e992b9 100644
--- a/core/src/services/sftp/backend.rs
+++ b/core/src/services/sftp/backend.rs
@@ -55,6 +55,18 @@ use crate::*;
 /// - [ ] ~~presign~~
 /// - [ ] blocking
 ///
+/// - [x] stat
+/// - [x] read
+/// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
+/// - [x] list
+/// - [ ] ~~scan~~
+/// - [ ] ~~presign~~
+/// - [ ] blocking
+///
 /// # Configuration
 ///
 /// - `endpoint`: Set the endpoint for connection
@@ -295,11 +307,15 @@ impl Accessor for SftpBackend {
             .set_scheme(Scheme::Sftp)
             .set_capability(Capability {
                 stat: true,
+
                 read: true,
+
                 write: true,
+                create_dir: true,
+                delete: true,
+
                 list: true,
                 list_with_limit: true,
-
                 list_with_delimiter_slash: true,
 
                 ..Default::default()
diff --git a/core/src/services/sled/backend.rs b/core/src/services/sled/backend.rs
index ecd9b4a9..0a4c7292 100644
--- a/core/src/services/sled/backend.rs
+++ b/core/src/services/sled/backend.rs
@@ -41,6 +41,18 @@ use crate::*;
 /// - [ ] ~~presign~~
 /// - [x] blocking
 ///
+/// - [x] stat
+/// - [x] read
+/// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
+/// - [ ] ~~list~~
+/// - [ ] scan
+/// - [ ] ~~presign~~
+/// - [x] blocking
+///
 /// # Configuration
 ///
 /// - `datadir`: Set the path to the sled data directory
diff --git a/core/src/services/supabase/backend.rs b/core/src/services/supabase/backend.rs
index 8d86f3d5..2efbdd7f 100644
--- a/core/src/services/supabase/backend.rs
+++ b/core/src/services/supabase/backend.rs
@@ -33,9 +33,13 @@ use crate::*;
 ///
 /// # Capabilities
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [ ] copy
+/// - [ ] rename
 /// - [ ] list
 /// - [ ] scan
 /// - [ ] presign
@@ -216,7 +220,9 @@ impl Accessor for SupabaseBackend {
             .set_name(&self.core.bucket)
             .set_capability(Capability {
                 stat: true,
+
                 read: true,
+
                 write: true,
                 create_dir: true,
                 delete: true,
diff --git a/core/src/services/vercel_artifacts/backend.rs b/core/src/services/vercel_artifacts/backend.rs
index b4f63ebf..ea850303 100644
--- a/core/src/services/vercel_artifacts/backend.rs
+++ b/core/src/services/vercel_artifacts/backend.rs
@@ -60,7 +60,9 @@ impl Accessor for VercelArtifactsBackend {
             .set_capability(Capability {
                 read: true,
                 read_can_next: true,
+
                 write: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/vercel_artifacts/builder.rs b/core/src/services/vercel_artifacts/builder.rs
index 7e760ecd..c2c2b33c 100644
--- a/core/src/services/vercel_artifacts/builder.rs
+++ b/core/src/services/vercel_artifacts/builder.rs
@@ -28,8 +28,11 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [ ] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [ ] ~~copy~~
 /// - [ ] ~~rename~~
 /// - [ ] ~~list~~
diff --git a/core/src/services/wasabi/backend.rs b/core/src/services/wasabi/backend.rs
index 4fb68601..671c477b 100644
--- a/core/src/services/wasabi/backend.rs
+++ b/core/src/services/wasabi/backend.rs
@@ -60,13 +60,16 @@ static ENDPOINT_TEMPLATES: Lazy<HashMap<&'static str, &'static str>> = Lazy::new
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [x] copy
+/// - [x] rename
 /// - [x] list
 /// - [x] scan
 /// - [x] presign
-/// - [x] rename
 /// - [ ] blocking
 ///
 /// # Configuration
@@ -911,16 +914,23 @@ impl Accessor for WasabiBackend {
                 read_with_range: true,
 
                 write: true,
-                list: true,
-                scan: true,
+                create_dir: true,
+                delete: true,
                 copy: true,
-                presign: true,
-                batch: true,
                 rename: true,
 
+                scan: true,
+                list: true,
                 list_without_delimiter: true,
                 list_with_delimiter_slash: true,
 
+                presign: true,
+                presign_stat: true,
+                presign_read: true,
+                presign_write: true,
+
+                batch: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/webdav/backend.rs b/core/src/services/webdav/backend.rs
index 95b741ea..76866c0e 100644
--- a/core/src/services/webdav/backend.rs
+++ b/core/src/services/webdav/backend.rs
@@ -42,8 +42,11 @@ use crate::*;
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
 /// - [x] copy
 /// - [x] rename
 /// - [x] list
@@ -267,15 +270,22 @@ impl Accessor for WebdavBackend {
         ma.set_scheme(Scheme::Webdav)
             .set_root(&self.root)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_next: true,
                 read_with_range: true,
+
                 write: true,
-                list: true,
+                create_dir: true,
+                delete: true,
                 copy: true,
                 rename: true,
+
+                list: true,
                 list_without_delimiter: true,
                 list_with_delimiter_slash: true,
+
                 ..Default::default()
             });
 
diff --git a/core/src/services/webhdfs/backend.rs b/core/src/services/webhdfs/backend.rs
index a1edc2d6..f065f141 100644
--- a/core/src/services/webhdfs/backend.rs
+++ b/core/src/services/webhdfs/backend.rs
@@ -51,8 +51,13 @@ const WEBHDFS_DEFAULT_ENDPOINT: &str = "http://127.0.0.1:9870";
 ///
 /// This service can be used to:
 ///
+/// - [x] stat
 /// - [x] read
 /// - [x] write
+/// - [x] create_dir
+/// - [x] delete
+/// - [ ] copy
+/// - [ ] rename
 /// - [x] list
 /// - [ ] ~~scan~~
 /// - [ ] ~~presign~~
@@ -466,13 +471,20 @@ impl Accessor for WebhdfsBackend {
         am.set_scheme(Scheme::Webhdfs)
             .set_root(&self.root)
             .set_capability(Capability {
+                stat: true,
+
                 read: true,
                 read_can_next: true,
                 read_with_range: true,
+
                 write: true,
+                create_dir: true,
+                delete: true,
+
                 list: true,
                 list_without_delimiter: true,
                 list_with_delimiter_slash: true,
+
                 ..Default::default()
             });
         am
diff --git a/core/src/types/capability.rs b/core/src/types/capability.rs
index 3aa7598b..67d8832e 100644
--- a/core/src/types/capability.rs
+++ b/core/src/types/capability.rs
@@ -43,7 +43,7 @@ use std::fmt::Debug;
 /// - Operation with sub operations should be named like `presign_read`.
 /// - Operation with variants should be named like `read_can_seek`.
 /// - Operation with arguments should be named like `read_with_range`.
-/// - Operation with limtations should be named like `batch_max_operations`.
+/// - Operation with limitations should be named like `batch_max_operations`.
 #[derive(Copy, Clone, Default)]
 pub struct Capability {
     /// If operator supports stat natively, it will be true.
@@ -92,6 +92,12 @@ pub struct Capability {
     /// If operator supports delete natively, it will be true.
     pub delete: bool,
 
+    /// If operator supports copy natively, it will be true.
+    pub copy: bool,
+
+    /// If operator supports rename natively, it will be true.
+    pub rename: bool,
+
     /// If operator supports list natively, it will be true.
     pub list: bool,
     /// If backend supports list with limit, it will be true.
@@ -107,12 +113,6 @@ pub struct Capability {
     /// If backend supports scan with limit, it will be true.
     pub scan_with_limit: bool,
 
-    /// If operator supports copy natively, it will be true.
-    pub copy: bool,
-
-    /// If operator supports rename natively, it will be true.
-    pub rename: bool,
-
     /// If operator supports presign natively, it will be true.
     pub presign: bool,
     /// If operator supports presign read natively, it will be true.
@@ -137,12 +137,12 @@ impl Debug for Capability {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         let mut s = vec![];
 
-        if self.read {
-            s.push("Read");
-        }
         if self.stat {
             s.push("Stat");
         }
+        if self.read {
+            s.push("Read");
+        }
         if self.write {
             s.push("Write");
         }
@@ -152,18 +152,18 @@ impl Debug for Capability {
         if self.delete {
             s.push("Delete");
         }
-        if self.list {
-            s.push("List");
-        }
-        if self.scan {
-            s.push("Scan");
-        }
         if self.copy {
             s.push("Copy");
         }
         if self.rename {
             s.push("Rename");
         }
+        if self.list {
+            s.push("List");
+        }
+        if self.scan {
+            s.push("Scan");
+        }
         if self.presign {
             s.push("Presign");
         }