opendal 0.1.6.pre.rc.1-arm64-darwin-23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +7 -0
  2. data/.standard.yml +20 -0
  3. data/.tool-versions +1 -0
  4. data/.yardopts +1 -0
  5. data/DEPENDENCIES.md +9 -0
  6. data/DEPENDENCIES.rust.tsv +277 -0
  7. data/Gemfile +35 -0
  8. data/README.md +159 -0
  9. data/Rakefile +149 -0
  10. data/core/CHANGELOG.md +4929 -0
  11. data/core/CONTRIBUTING.md +61 -0
  12. data/core/DEPENDENCIES.md +3 -0
  13. data/core/DEPENDENCIES.rust.tsv +185 -0
  14. data/core/LICENSE +201 -0
  15. data/core/README.md +228 -0
  16. data/core/benches/README.md +18 -0
  17. data/core/benches/ops/README.md +26 -0
  18. data/core/benches/types/README.md +9 -0
  19. data/core/benches/vs_fs/README.md +35 -0
  20. data/core/benches/vs_s3/README.md +55 -0
  21. data/core/edge/README.md +3 -0
  22. data/core/edge/file_write_on_full_disk/README.md +14 -0
  23. data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
  24. data/core/edge/s3_read_on_wasm/.gitignore +3 -0
  25. data/core/edge/s3_read_on_wasm/README.md +42 -0
  26. data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
  27. data/core/examples/README.md +23 -0
  28. data/core/examples/basic/README.md +15 -0
  29. data/core/examples/concurrent-upload/README.md +15 -0
  30. data/core/examples/multipart-upload/README.md +15 -0
  31. data/core/fuzz/.gitignore +5 -0
  32. data/core/fuzz/README.md +68 -0
  33. data/core/src/docs/comparisons/vs_object_store.md +183 -0
  34. data/core/src/docs/performance/concurrent_write.md +101 -0
  35. data/core/src/docs/performance/http_optimization.md +124 -0
  36. data/core/src/docs/rfcs/0000_example.md +74 -0
  37. data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
  38. data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
  39. data/core/src/docs/rfcs/0044_error_handle.md +198 -0
  40. data/core/src/docs/rfcs/0057_auto_region.md +160 -0
  41. data/core/src/docs/rfcs/0069_object_stream.md +145 -0
  42. data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
  43. data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
  44. data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
  45. data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
  46. data/core/src/docs/rfcs/0221_create_dir.md +89 -0
  47. data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
  48. data/core/src/docs/rfcs/0293_object_id.md +67 -0
  49. data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
  50. data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
  51. data/core/src/docs/rfcs/0413_presign.md +154 -0
  52. data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
  53. data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
  54. data/core/src/docs/rfcs/0438_multipart.md +163 -0
  55. data/core/src/docs/rfcs/0443_gateway.md +73 -0
  56. data/core/src/docs/rfcs/0501_new_builder.md +111 -0
  57. data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
  58. data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
  59. data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
  60. data/core/src/docs/rfcs/0623_redis_service.md +300 -0
  61. data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
  62. data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
  63. data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
  64. data/core/src/docs/rfcs/0926_object_reader.md +93 -0
  65. data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
  66. data/core/src/docs/rfcs/1085_object_handler.md +73 -0
  67. data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
  68. data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
  69. data/core/src/docs/rfcs/1420_object_writer.md +147 -0
  70. data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
  71. data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
  72. data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
  73. data/core/src/docs/rfcs/2133_append_api.md +88 -0
  74. data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
  75. data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
  76. data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
  77. data/core/src/docs/rfcs/2774_lister_api.md +66 -0
  78. data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
  79. data/core/src/docs/rfcs/2852_native_capability.md +58 -0
  80. data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
  81. data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
  82. data/core/src/docs/rfcs/3197_config.md +237 -0
  83. data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
  84. data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
  85. data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
  86. data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
  87. data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
  88. data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
  89. data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
  90. data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
  91. data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
  92. data/core/src/docs/rfcs/4638_executor.md +215 -0
  93. data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
  94. data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
  95. data/core/src/docs/rfcs/5479_context.md +140 -0
  96. data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
  97. data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
  98. data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
  99. data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
  100. data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
  101. data/core/src/docs/rfcs/6209_glob_support.md +132 -0
  102. data/core/src/docs/rfcs/6213_options_api.md +142 -0
  103. data/core/src/docs/rfcs/README.md +62 -0
  104. data/core/src/docs/upgrade.md +1556 -0
  105. data/core/src/services/aliyun_drive/docs.md +61 -0
  106. data/core/src/services/alluxio/docs.md +45 -0
  107. data/core/src/services/azblob/docs.md +77 -0
  108. data/core/src/services/azdls/docs.md +73 -0
  109. data/core/src/services/azfile/docs.md +65 -0
  110. data/core/src/services/b2/docs.md +54 -0
  111. data/core/src/services/cacache/docs.md +38 -0
  112. data/core/src/services/cloudflare_kv/docs.md +21 -0
  113. data/core/src/services/cos/docs.md +55 -0
  114. data/core/src/services/d1/docs.md +48 -0
  115. data/core/src/services/dashmap/docs.md +38 -0
  116. data/core/src/services/dbfs/docs.md +57 -0
  117. data/core/src/services/dropbox/docs.md +64 -0
  118. data/core/src/services/etcd/docs.md +45 -0
  119. data/core/src/services/foundationdb/docs.md +42 -0
  120. data/core/src/services/fs/docs.md +49 -0
  121. data/core/src/services/ftp/docs.md +42 -0
  122. data/core/src/services/gcs/docs.md +76 -0
  123. data/core/src/services/gdrive/docs.md +65 -0
  124. data/core/src/services/ghac/docs.md +84 -0
  125. data/core/src/services/github/docs.md +52 -0
  126. data/core/src/services/gridfs/docs.md +46 -0
  127. data/core/src/services/hdfs/docs.md +140 -0
  128. data/core/src/services/hdfs_native/docs.md +35 -0
  129. data/core/src/services/http/docs.md +45 -0
  130. data/core/src/services/huggingface/docs.md +61 -0
  131. data/core/src/services/ipfs/docs.md +45 -0
  132. data/core/src/services/ipmfs/docs.md +14 -0
  133. data/core/src/services/koofr/docs.md +51 -0
  134. data/core/src/services/lakefs/docs.md +62 -0
  135. data/core/src/services/memcached/docs.md +47 -0
  136. data/core/src/services/memory/docs.md +36 -0
  137. data/core/src/services/mini_moka/docs.md +19 -0
  138. data/core/src/services/moka/docs.md +42 -0
  139. data/core/src/services/mongodb/docs.md +49 -0
  140. data/core/src/services/monoiofs/docs.md +46 -0
  141. data/core/src/services/mysql/docs.md +47 -0
  142. data/core/src/services/obs/docs.md +54 -0
  143. data/core/src/services/onedrive/docs.md +115 -0
  144. data/core/src/services/opfs/docs.md +18 -0
  145. data/core/src/services/oss/docs.md +74 -0
  146. data/core/src/services/pcloud/docs.md +51 -0
  147. data/core/src/services/persy/docs.md +43 -0
  148. data/core/src/services/postgresql/docs.md +47 -0
  149. data/core/src/services/redb/docs.md +41 -0
  150. data/core/src/services/redis/docs.md +43 -0
  151. data/core/src/services/rocksdb/docs.md +54 -0
  152. data/core/src/services/s3/compatible_services.md +126 -0
  153. data/core/src/services/s3/docs.md +244 -0
  154. data/core/src/services/seafile/docs.md +54 -0
  155. data/core/src/services/sftp/docs.md +49 -0
  156. data/core/src/services/sled/docs.md +39 -0
  157. data/core/src/services/sqlite/docs.md +46 -0
  158. data/core/src/services/surrealdb/docs.md +54 -0
  159. data/core/src/services/swift/compatible_services.md +53 -0
  160. data/core/src/services/swift/docs.md +52 -0
  161. data/core/src/services/tikv/docs.md +43 -0
  162. data/core/src/services/upyun/docs.md +51 -0
  163. data/core/src/services/vercel_artifacts/docs.md +40 -0
  164. data/core/src/services/vercel_blob/docs.md +45 -0
  165. data/core/src/services/webdav/docs.md +49 -0
  166. data/core/src/services/webhdfs/docs.md +90 -0
  167. data/core/src/services/yandex_disk/docs.md +45 -0
  168. data/core/tests/behavior/README.md +77 -0
  169. data/core/tests/data/normal_dir/.gitkeep +0 -0
  170. data/core/tests/data/normal_file.txt +1041 -0
  171. data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
  172. data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
  173. data/core/users.md +13 -0
  174. data/extconf.rb +24 -0
  175. data/lib/opendal.rb +25 -0
  176. data/lib/opendal_ruby/entry.rb +35 -0
  177. data/lib/opendal_ruby/io.rb +70 -0
  178. data/lib/opendal_ruby/metadata.rb +44 -0
  179. data/lib/opendal_ruby/opendal_ruby.bundle +0 -0
  180. data/lib/opendal_ruby/operator.rb +29 -0
  181. data/lib/opendal_ruby/operator_info.rb +26 -0
  182. data/opendal.gemspec +91 -0
  183. data/test/blocking_op_test.rb +112 -0
  184. data/test/capability_test.rb +42 -0
  185. data/test/io_test.rb +172 -0
  186. data/test/lister_test.rb +77 -0
  187. data/test/metadata_test.rb +78 -0
  188. data/test/middlewares_test.rb +46 -0
  189. data/test/operator_info_test.rb +35 -0
  190. data/test/test_helper.rb +36 -0
  191. metadata +240 -0
@@ -0,0 +1,40 @@
1
+ ## Capabilities
2
+
3
+ This service can be used to:
4
+
5
+ - [ ] stat
6
+ - [x] read
7
+ - [x] write
8
+ - [x] create_dir
9
+ - [x] delete
10
+ - [ ] ~~copy~~
11
+ - [ ] ~~rename~~
12
+ - [ ] ~~list~~
13
+ - [ ] ~~presign~~
14
+ - [ ] blocking
15
+
16
+ ## Configuration
17
+
18
+ - `access_token`: set the access_token for Rest API
19
+
20
+ You can refer to [`VercelArtifactsBuilder`]'s docs for more information
21
+
22
+ ## Example
23
+
24
+ ### Via Builder
25
+
26
+ ```no_run
27
+ use anyhow::Result;
28
+ use opendal::services::VercelArtifacts;
29
+ use opendal::Operator;
30
+
31
+ #[tokio::main]
32
+ async fn main() -> Result<()> {
33
+ // create backend builder
34
+ let mut builder = VercelArtifacts::default()
35
+ .access_token("xxx");
36
+
37
+ let op: Operator = Operator::new(builder)?.finish();
38
+ Ok(())
39
+ }
40
+ ```
@@ -0,0 +1,45 @@
1
+ ## Capabilities
2
+
3
+ This service can be used to:
4
+
5
+ - [x] stat
6
+ - [x] read
7
+ - [x] write
8
+ - [x] create_dir
9
+ - [x] delete
10
+ - [x] copy
11
+ - [ ] rename
12
+ - [x] list
13
+ - [ ] presign
14
+ - [ ] blocking
15
+
16
+ ## Configuration
17
+
18
+ - `root`: Set the work directory for backend
19
+ - `token`: VercelBlob token, environment var `BLOB_READ_WRITE_TOKEN`
20
+
21
+ You can refer to [`VercelBlobBuilder`]'s docs for more information
22
+
23
+ ## Example
24
+
25
+ ### Via Builder
26
+
27
+ ```rust,no_run
28
+ use anyhow::Result;
29
+ use opendal::services::VercelBlob;
30
+ use opendal::Operator;
31
+
32
+ #[tokio::main]
33
+ async fn main() -> Result<()> {
34
+ // create backend builder
35
+ let mut builder = VercelBlob::default()
36
+ // set the storage bucket for OpenDAL
37
+ .root("/")
38
+ // set the token for OpenDAL
39
+ .token("you_token");
40
+
41
+ let op: Operator = Operator::new(builder)?.finish();
42
+
43
+ Ok(())
44
+ }
45
+ ```
@@ -0,0 +1,49 @@
1
+ ## Capabilities
2
+
3
+ This service can be used to:
4
+
5
+ - [x] stat
6
+ - [x] read
7
+ - [x] write
8
+ - [x] create_dir
9
+ - [x] delete
10
+ - [x] copy
11
+ - [x] rename
12
+ - [x] list
13
+ - [ ] ~~presign~~
14
+ - [ ] blocking
15
+
16
+ ## Notes
17
+
18
+ Bazel Remote Caching and Ccache HTTP Storage is also part of this service.
19
+ Users can use `webdav` to connect those services.
20
+
21
+ ## Configuration
22
+
23
+ - `endpoint`: set the endpoint for webdav
24
+ - `root`: Set the work directory for backend
25
+
26
+ You can refer to [`WebdavBuilder`]'s docs for more information
27
+
28
+ ## Example
29
+
30
+ ### Via Builder
31
+
32
+ ```rust,no_run
33
+ use anyhow::Result;
34
+ use opendal::services::Webdav;
35
+ use opendal::Operator;
36
+
37
+ #[tokio::main]
38
+ async fn main() -> Result<()> {
39
+ // create backend builder
40
+ let mut builder = Webdav::default()
41
+ .endpoint("127.0.0.1")
42
+ .username("xxx")
43
+ .password("xxx");
44
+
45
+ let op: Operator = Operator::new(builder)?.finish();
46
+
47
+ Ok(())
48
+ }
49
+ ```
@@ -0,0 +1,90 @@
1
+ There two implementations of WebHDFS REST API:
2
+
3
+ - Native via HDFS Namenode and Datanode, data are transferred between nodes directly.
4
+ - [HttpFS](https://hadoop.apache.org/docs/stable/hadoop-hdfs-httpfs/index.html) is a gateway before hdfs nodes, data are proxied.
5
+
6
+ ## Capabilities
7
+
8
+ This service can be used to:
9
+
10
+ - [x] stat
11
+ - [x] read
12
+ - [x] write
13
+ - [x] create_dir
14
+ - [x] delete
15
+ - [ ] copy
16
+ - [ ] rename
17
+ - [x] list
18
+ - [ ] ~~presign~~
19
+ - [ ] blocking
20
+
21
+ ## Differences with HDFS
22
+
23
+ [Hdfs][crate::services::Hdfs] is powered by HDFS's native java client. Users need to set up the HDFS services correctly. But webhdfs can access from HTTP API and no extra setup needed.
24
+
25
+ ## WebHDFS Compatibility Guidelines
26
+
27
+ ### File Creation and Write
28
+
29
+ For [File creation and write](https://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Create_and_Write_to_a_File) operations,
30
+ OpenDAL WebHDFS is optimized for Hadoop Distributed File System (HDFS) versions 2.9 and later.
31
+ This involves two API calls in webhdfs, where the initial `put` call to the namenode is redirected to the datanode handling the file data.
32
+ The optional `noredirect` flag can be set to prevent redirection. If used, the API response body contains the datanode URL, which is then utilized for the subsequent `put` call with the actual file data.
33
+ OpenDAL automatically sets the `noredirect` flag with the first `put` call. This feature is supported starting from HDFS version 2.9.
34
+
35
+ ### Multi-Write Support
36
+
37
+ OpenDAL WebHDFS supports multi-write operations by creating temporary files in the specified `atomic_write_dir`.
38
+ The final concatenation of these temporary files occurs when the writer is closed.
39
+ However, it's essential to be aware of HDFS concat restrictions for earlier versions,
40
+ where the target file must not be empty, and its last block must be full. Due to these constraints, the concat operation might fail for HDFS 2.6.
41
+ This issue, identified as [HDFS-6641](https://issues.apache.org/jira/browse/HDFS-6641), has been addressed in later versions of HDFS.
42
+
43
+ In summary, OpenDAL WebHDFS is designed for optimal compatibility with HDFS, specifically versions 2.9 and later.
44
+
45
+
46
+
47
+ ## Configurations
48
+
49
+ - `root`: The root path of the WebHDFS service.
50
+ - `endpoint`: The endpoint of the WebHDFS service.
51
+ - `delegation`: The delegation token for WebHDFS.
52
+ - `atomic_write_dir`: The tmp write dir of multi write for WebHDFS.Needs to be configured for multi write support.
53
+
54
+ Refer to [`Builder`]'s public API docs for more information.
55
+
56
+ ## Examples
57
+
58
+ ### Via Builder
59
+
60
+ ```rust,no_run
61
+ use std::sync::Arc;
62
+
63
+ use anyhow::Result;
64
+ use opendal::services::Webhdfs;
65
+ use opendal::Operator;
66
+
67
+ #[tokio::main]
68
+ async fn main() -> Result<()> {
69
+ let mut builder = Webhdfs::default()
70
+ // set the root for WebHDFS, all operations will happen under this root
71
+ //
72
+ // Note:
73
+ // if the root exists, the builder will automatically create the
74
+ // root directory for you
75
+ // if the root exists and is a directory, the builder will continue working
76
+ // if the root exists and is a file, the builder will fail on building backend
77
+ .root("/path/to/dir")
78
+ // set the endpoint of webhdfs namenode, controlled by dfs.namenode.http-address
79
+ // default is http://127.0.0.1:9870
80
+ .endpoint("http://127.0.0.1:9870")
81
+ // set the delegation_token for builder
82
+ .delegation("delegation_token")
83
+ // set atomic_write_dir for builder
84
+ .atomic_write_dir(".opendal_tmp/");
85
+
86
+ let op: Operator = Operator::new(builder)?.finish();
87
+
88
+ Ok(())
89
+ }
90
+ ```
@@ -0,0 +1,45 @@
1
+ ## Capabilities
2
+
3
+ This service can be used to:
4
+
5
+ - [x] stat
6
+ - [x] read
7
+ - [x] write
8
+ - [x] create_dir
9
+ - [x] delete
10
+ - [x] copy
11
+ - [x] rename
12
+ - [x] list
13
+ - [ ] presign
14
+ - [ ] blocking
15
+
16
+ ## Configuration
17
+
18
+ - `root`: Set the work directory for backend
19
+ - `access_token` YandexDisk oauth access_token
20
+
21
+ You can refer to [`YandexDiskBuilder`]'s docs for more information
22
+
23
+ ## Example
24
+
25
+ ### Via Builder
26
+
27
+ ```rust,no_run
28
+ use anyhow::Result;
29
+ use opendal::services::YandexDisk;
30
+ use opendal::Operator;
31
+
32
+ #[tokio::main]
33
+ async fn main() -> Result<()> {
34
+ // create backend builder
35
+ let mut builder = YandexDisk::default()
36
+ // set the storage bucket for OpenDAL
37
+ .root("/")
38
+ // set the access_token for OpenDAL
39
+ .access_token("test");
40
+
41
+ let op: Operator = Operator::new(builder)?.finish();
42
+
43
+ Ok(())
44
+ }
45
+ ```
@@ -0,0 +1,77 @@
1
+ # Behavior Test for OpenDAL
2
+
3
+ Behavior tests are used to make sure every service works correctly.
4
+
5
+ To support different testing backends simultaneously, we use `environment value` to carry the backend config.
6
+
7
+ ## Setup
8
+
9
+ ### Install Docker
10
+
11
+ Currently, opendal uses Docker to set up environment for behaviour tests. If you are a MacOS user, The docker does not work properly by default(Docker Desktop) in the MacOS environment. It is strongly recommended to use **OrbStack** instead of Docker Desktop. You can install orbstack using Homebrew.
12
+
13
+ ```shell
14
+ brew install orbstack
15
+ ```
16
+
17
+ ### Prepare Env
18
+
19
+ To run the behavior tests, please copy the `.env.example`, which is at project root, to `.env` and change the values on need.
20
+
21
+ Take `fs` for example, we need to change to enable behavior test on `fs` on `/tmp`.
22
+
23
+ ```dotenv
24
+ OPENDAL_FS_ROOT=/path/to/dir/
25
+ ```
26
+
27
+ into
28
+
29
+ ```doten
30
+ OPENDAL_FS_ROOT=/tmp/
31
+ ```
32
+
33
+ Notice: If the env variables are not set, all behavior tests will be skipped by default.
34
+
35
+ ## Run
36
+
37
+ Use `OPENDAL_TEST` to control which service to test:
38
+
39
+ ```shell
40
+ OPENDAL_TEST=fs cargo test behavior --features tests
41
+ ```
42
+
43
+ To run certain types of tests(such as `write`), we use `behavior::test_write`.
44
+
45
+ ```shell
46
+ OPENDAL_TEST=fs cargo test behavior::test_write --features tests
47
+ ```
48
+
49
+ You can also run specific test(such as `test_stat_dir`) for specific backend.
50
+
51
+ ```shell
52
+ OPENDAL_TEST=fs cargo test behavior::test_stat_dir --features tests
53
+ ```
54
+
55
+ ## Debug
56
+
57
+ To debug a behavior test, you can:
58
+
59
+ - Add env `RUST_LOG=debug` to enable logging
60
+ - Add env `RUST_BACKTRACE=full` to enable the full backtrace
61
+ - Add `--show-output` to show the whole output even when test succeeded.
62
+
63
+ Take `memory` service as an example, the full command will be:
64
+
65
+ ```shell
66
+ RUST_LOG=debug RUST_BACKTRACE=full OPENDAL_TEST=memory cargo test behavior --features tests -- --show-output
67
+ ```
68
+
69
+ You use `export` to avoid set env every time:
70
+
71
+ ```shell
72
+ export RUST_LOG=debug
73
+ export RUST_BACKTRACE=full
74
+ OPENDAL_TEST=memory cargo test behavior --features tests -- --show-output
75
+ ```
76
+
77
+ For more details, please visit [cargo test](https://doc.rust-lang.org/cargo/commands/cargo-test.html) or run the command `cargo test --help`.
File without changes