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.
- checksums.yaml +7 -0
- data/.standard.yml +20 -0
- data/.tool-versions +1 -0
- data/.yardopts +1 -0
- data/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/DEPENDENCIES.md +3 -0
- data/core/DEPENDENCIES.rust.tsv +185 -0
- data/core/LICENSE +201 -0
- data/core/README.md +228 -0
- data/core/benches/README.md +18 -0
- data/core/benches/ops/README.md +26 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/README.md +68 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/performance/concurrent_write.md +101 -0
- data/core/src/docs/performance/http_optimization.md +124 -0
- data/core/src/docs/rfcs/0000_example.md +74 -0
- data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
- data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
- data/core/src/docs/rfcs/0044_error_handle.md +198 -0
- data/core/src/docs/rfcs/0057_auto_region.md +160 -0
- data/core/src/docs/rfcs/0069_object_stream.md +145 -0
- data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
- data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
- data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
- data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
- data/core/src/docs/rfcs/0221_create_dir.md +89 -0
- data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
- data/core/src/docs/rfcs/0293_object_id.md +67 -0
- data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
- data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
- data/core/src/docs/rfcs/0413_presign.md +154 -0
- data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
- data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
- data/core/src/docs/rfcs/0438_multipart.md +163 -0
- data/core/src/docs/rfcs/0443_gateway.md +73 -0
- data/core/src/docs/rfcs/0501_new_builder.md +111 -0
- data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
- data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
- data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
- data/core/src/docs/rfcs/0623_redis_service.md +300 -0
- data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
- data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
- data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
- data/core/src/docs/rfcs/0926_object_reader.md +93 -0
- data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
- data/core/src/docs/rfcs/1085_object_handler.md +73 -0
- data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
- data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
- data/core/src/docs/rfcs/1420_object_writer.md +147 -0
- data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
- data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
- data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
- data/core/src/docs/rfcs/2133_append_api.md +88 -0
- data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
- data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
- data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
- data/core/src/docs/rfcs/2774_lister_api.md +66 -0
- data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
- data/core/src/docs/rfcs/2852_native_capability.md +58 -0
- data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
- data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
- data/core/src/docs/rfcs/3197_config.md +237 -0
- data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
- data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
- data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
- data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
- data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
- data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
- data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
- data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
- data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
- data/core/src/docs/rfcs/4638_executor.md +215 -0
- data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
- data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
- data/core/src/docs/rfcs/5479_context.md +140 -0
- data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
- data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
- data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
- data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
- data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
- data/core/src/docs/rfcs/6209_glob_support.md +132 -0
- data/core/src/docs/rfcs/6213_options_api.md +142 -0
- data/core/src/docs/rfcs/README.md +62 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/data/normal_dir/.gitkeep +0 -0
- data/core/tests/data/normal_file.txt +1041 -0
- data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
- data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
- data/core/users.md +13 -0
- data/extconf.rb +24 -0
- data/lib/opendal.rb +25 -0
- data/lib/opendal_ruby/entry.rb +35 -0
- data/lib/opendal_ruby/io.rb +70 -0
- data/lib/opendal_ruby/metadata.rb +44 -0
- data/lib/opendal_ruby/opendal_ruby.bundle +0 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/opendal.gemspec +91 -0
- data/test/blocking_op_test.rb +112 -0
- data/test/capability_test.rb +42 -0
- data/test/io_test.rb +172 -0
- data/test/lister_test.rb +77 -0
- data/test/metadata_test.rb +78 -0
- data/test/middlewares_test.rb +46 -0
- data/test/operator_info_test.rb +35 -0
- data/test/test_helper.rb +36 -0
- 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
|