opendal 0.1.6.pre.rc.1
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/Cargo.toml +65 -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/build.rs +22 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/Cargo.lock +10259 -0
- data/core/Cargo.toml +437 -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/ops/main.rs +25 -0
- data/core/benches/ops/read.rs +100 -0
- data/core/benches/ops/utils.rs +59 -0
- data/core/benches/ops/write.rs +106 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/types/buffer.rs +114 -0
- data/core/benches/types/main.rs +23 -0
- data/core/benches/types/tasks.rs +64 -0
- data/core/benches/vs_fs/Cargo.toml +32 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_fs/src/main.rs +83 -0
- data/core/benches/vs_s3/Cargo.toml +38 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/benches/vs_s3/src/main.rs +123 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/Cargo.toml +29 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/basic/src/main.rs +51 -0
- data/core/examples/concurrent-upload/Cargo.toml +29 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/concurrent-upload/src/main.rs +68 -0
- data/core/examples/multipart-upload/Cargo.toml +29 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/examples/multipart-upload/src/main.rs +56 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/Cargo.toml +92 -0
- data/core/fuzz/README.md +68 -0
- data/core/fuzz/fuzz_reader.rs +102 -0
- data/core/fuzz/fuzz_writer.rs +123 -0
- data/core/src/blocking/delete.rs +74 -0
- data/core/src/blocking/list.rs +71 -0
- data/core/src/blocking/mod.rs +33 -0
- data/core/src/blocking/operator.rs +729 -0
- data/core/src/blocking/read/buffer_iterator.rs +66 -0
- data/core/src/blocking/read/mod.rs +27 -0
- data/core/src/blocking/read/reader.rs +124 -0
- data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
- data/core/src/blocking/read/std_reader.rs +95 -0
- data/core/src/blocking/write/mod.rs +22 -0
- data/core/src/blocking/write/std_writer.rs +82 -0
- data/core/src/blocking/write/writer.rs +109 -0
- data/core/src/docs/comparisons/mod.rs +30 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/concepts.rs +135 -0
- data/core/src/docs/internals/accessor.rs +306 -0
- data/core/src/docs/internals/layer.rs +42 -0
- data/core/src/docs/internals/mod.rs +62 -0
- data/core/src/docs/mod.rs +43 -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/performance/mod.rs +32 -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/rfcs/mod.rs +278 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/layers/async_backtrace.rs +174 -0
- data/core/src/layers/await_tree.rs +202 -0
- data/core/src/layers/capability_check.rs +239 -0
- data/core/src/layers/chaos.rs +170 -0
- data/core/src/layers/complete.rs +385 -0
- data/core/src/layers/concurrent_limit.rs +322 -0
- data/core/src/layers/correctness_check.rs +440 -0
- data/core/src/layers/dtrace.rs +294 -0
- data/core/src/layers/error_context.rs +310 -0
- data/core/src/layers/fastmetrics.rs +525 -0
- data/core/src/layers/fastrace.rs +271 -0
- data/core/src/layers/http_client.rs +206 -0
- data/core/src/layers/immutable_index.rs +408 -0
- data/core/src/layers/logging.rs +842 -0
- data/core/src/layers/metrics.rs +182 -0
- data/core/src/layers/mime_guess.rs +199 -0
- data/core/src/layers/mod.rs +130 -0
- data/core/src/layers/observe/metrics.rs +936 -0
- data/core/src/layers/observe/mod.rs +93 -0
- data/core/src/layers/otelmetrics.rs +496 -0
- data/core/src/layers/oteltrace.rs +203 -0
- data/core/src/layers/prometheus.rs +686 -0
- data/core/src/layers/prometheus_client.rs +519 -0
- data/core/src/layers/retry.rs +933 -0
- data/core/src/layers/throttle.rs +204 -0
- data/core/src/layers/timeout.rs +513 -0
- data/core/src/layers/tracing.rs +349 -0
- data/core/src/layers/type_eraser.rs +91 -0
- data/core/src/lib.rs +204 -0
- data/core/src/raw/accessor.rs +856 -0
- data/core/src/raw/adapters/kv/api.rs +164 -0
- data/core/src/raw/adapters/kv/backend.rs +253 -0
- data/core/src/raw/adapters/kv/mod.rs +31 -0
- data/core/src/raw/adapters/mod.rs +50 -0
- data/core/src/raw/adapters/typed_kv/api.rs +171 -0
- data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
- data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
- data/core/src/raw/atomic_util.rs +57 -0
- data/core/src/raw/azure.rs +570 -0
- data/core/src/raw/chrono_util.rs +109 -0
- data/core/src/raw/enum_utils.rs +201 -0
- data/core/src/raw/futures_util.rs +470 -0
- data/core/src/raw/http_util/body.rs +144 -0
- data/core/src/raw/http_util/bytes_content_range.rs +239 -0
- data/core/src/raw/http_util/bytes_range.rs +260 -0
- data/core/src/raw/http_util/client.rs +276 -0
- data/core/src/raw/http_util/error.rs +68 -0
- data/core/src/raw/http_util/header.rs +356 -0
- data/core/src/raw/http_util/mod.rs +78 -0
- data/core/src/raw/http_util/multipart.rs +1180 -0
- data/core/src/raw/http_util/uri.rs +190 -0
- data/core/src/raw/layer.rs +295 -0
- data/core/src/raw/mod.rs +101 -0
- data/core/src/raw/oio/buf/flex_buf.rs +118 -0
- data/core/src/raw/oio/buf/mod.rs +25 -0
- data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
- data/core/src/raw/oio/buf/queue_buf.rs +117 -0
- data/core/src/raw/oio/delete/api.rs +102 -0
- data/core/src/raw/oio/delete/batch_delete.rs +127 -0
- data/core/src/raw/oio/delete/mod.rs +30 -0
- data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
- data/core/src/raw/oio/entry.rs +89 -0
- data/core/src/raw/oio/list/api.rs +69 -0
- data/core/src/raw/oio/list/flat_list.rs +137 -0
- data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
- data/core/src/raw/oio/list/mod.rs +35 -0
- data/core/src/raw/oio/list/page_list.rs +105 -0
- data/core/src/raw/oio/list/prefix_list.rs +64 -0
- data/core/src/raw/oio/mod.rs +40 -0
- data/core/src/raw/oio/read/api.rs +119 -0
- data/core/src/raw/oio/read/mod.rs +21 -0
- data/core/src/raw/oio/write/api.rs +103 -0
- data/core/src/raw/oio/write/append_write.rs +111 -0
- data/core/src/raw/oio/write/block_write.rs +405 -0
- data/core/src/raw/oio/write/mod.rs +42 -0
- data/core/src/raw/oio/write/multipart_write.rs +518 -0
- data/core/src/raw/oio/write/one_shot_write.rs +77 -0
- data/core/src/raw/oio/write/position_write.rs +284 -0
- data/core/src/raw/operation.rs +88 -0
- data/core/src/raw/ops.rs +917 -0
- data/core/src/raw/path.rs +451 -0
- data/core/src/raw/path_cache.rs +244 -0
- data/core/src/raw/rps.rs +249 -0
- data/core/src/raw/serde_util.rs +423 -0
- data/core/src/raw/std_io_util.rs +65 -0
- data/core/src/raw/tests/mod.rs +30 -0
- data/core/src/raw/tests/read.rs +116 -0
- data/core/src/raw/tests/utils.rs +80 -0
- data/core/src/raw/tests/write.rs +79 -0
- data/core/src/raw/tokio_util.rs +24 -0
- data/core/src/raw/version.rs +19 -0
- data/core/src/services/aliyun_drive/backend.rs +421 -0
- data/core/src/services/aliyun_drive/config.rs +72 -0
- data/core/src/services/aliyun_drive/core.rs +651 -0
- data/core/src/services/aliyun_drive/delete.rs +51 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/aliyun_drive/error.rs +56 -0
- data/core/src/services/aliyun_drive/lister.rs +134 -0
- data/core/src/services/aliyun_drive/mod.rs +39 -0
- data/core/src/services/aliyun_drive/writer.rs +114 -0
- data/core/src/services/alluxio/backend.rs +257 -0
- data/core/src/services/alluxio/config.rs +50 -0
- data/core/src/services/alluxio/core.rs +367 -0
- data/core/src/services/alluxio/delete.rs +38 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/alluxio/error.rs +99 -0
- data/core/src/services/alluxio/lister.rs +73 -0
- data/core/src/services/alluxio/mod.rs +39 -0
- data/core/src/services/alluxio/writer.rs +74 -0
- data/core/src/services/azblob/backend.rs +594 -0
- data/core/src/services/azblob/config.rs +220 -0
- data/core/src/services/azblob/core.rs +937 -0
- data/core/src/services/azblob/delete.rs +108 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azblob/error.rs +164 -0
- data/core/src/services/azblob/lister.rs +107 -0
- data/core/src/services/azblob/mod.rs +38 -0
- data/core/src/services/azblob/writer.rs +177 -0
- data/core/src/services/azdls/backend.rs +435 -0
- data/core/src/services/azdls/config.rs +89 -0
- data/core/src/services/azdls/core.rs +388 -0
- data/core/src/services/azdls/delete.rs +48 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azdls/error.rs +107 -0
- data/core/src/services/azdls/lister.rs +165 -0
- data/core/src/services/azdls/mod.rs +38 -0
- data/core/src/services/azdls/writer.rs +129 -0
- data/core/src/services/azfile/backend.rs +373 -0
- data/core/src/services/azfile/config.rs +61 -0
- data/core/src/services/azfile/core.rs +435 -0
- data/core/src/services/azfile/delete.rs +51 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/azfile/error.rs +108 -0
- data/core/src/services/azfile/lister.rs +217 -0
- data/core/src/services/azfile/mod.rs +39 -0
- data/core/src/services/azfile/writer.rs +92 -0
- data/core/src/services/b2/backend.rs +434 -0
- data/core/src/services/b2/config.rs +64 -0
- data/core/src/services/b2/core.rs +742 -0
- data/core/src/services/b2/delete.rs +56 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/b2/error.rs +132 -0
- data/core/src/services/b2/lister.rs +110 -0
- data/core/src/services/b2/mod.rs +39 -0
- data/core/src/services/b2/writer.rs +189 -0
- data/core/src/services/cacache/backend.rs +160 -0
- data/core/src/services/cacache/config.rs +28 -0
- data/core/src/services/cacache/core.rs +96 -0
- data/core/src/services/cacache/delete.rs +39 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cacache/mod.rs +34 -0
- data/core/src/services/cacache/writer.rs +61 -0
- data/core/src/services/cloudflare_kv/backend.rs +513 -0
- data/core/src/services/cloudflare_kv/config.rs +55 -0
- data/core/src/services/cloudflare_kv/core.rs +168 -0
- data/core/src/services/cloudflare_kv/delete.rs +119 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cloudflare_kv/error.rs +79 -0
- data/core/src/services/cloudflare_kv/lister.rs +170 -0
- data/core/src/services/cloudflare_kv/mod.rs +39 -0
- data/core/src/services/cloudflare_kv/model.rs +76 -0
- data/core/src/services/cloudflare_kv/writer.rs +68 -0
- data/core/src/services/compfs/backend.rs +290 -0
- data/core/src/services/compfs/config.rs +30 -0
- data/core/src/services/compfs/core.rs +159 -0
- data/core/src/services/compfs/delete.rs +53 -0
- data/core/src/services/compfs/lister.rs +98 -0
- data/core/src/services/compfs/mod.rs +38 -0
- data/core/src/services/compfs/reader.rs +79 -0
- data/core/src/services/compfs/writer.rs +90 -0
- data/core/src/services/cos/backend.rs +442 -0
- data/core/src/services/cos/config.rs +54 -0
- data/core/src/services/cos/core.rs +761 -0
- data/core/src/services/cos/delete.rs +48 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/cos/error.rs +105 -0
- data/core/src/services/cos/lister.rs +237 -0
- data/core/src/services/cos/mod.rs +39 -0
- data/core/src/services/cos/writer.rs +234 -0
- data/core/src/services/d1/backend.rs +330 -0
- data/core/src/services/d1/config.rs +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/d1/error.rs +79 -0
- data/core/src/services/d1/mod.rs +29 -0
- data/core/src/services/d1/model.rs +125 -0
- data/core/src/services/dashmap/backend.rs +203 -0
- data/core/src/services/dashmap/config.rs +37 -0
- data/core/src/services/dashmap/core.rs +61 -0
- data/core/src/services/dashmap/delete.rs +40 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dashmap/lister.rs +63 -0
- data/core/src/services/dashmap/mod.rs +36 -0
- data/core/src/services/dashmap/writer.rs +87 -0
- data/core/src/services/dbfs/backend.rs +258 -0
- data/core/src/services/dbfs/config.rs +48 -0
- data/core/src/services/dbfs/core.rs +191 -0
- data/core/src/services/dbfs/delete.rs +49 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dbfs/error.rs +74 -0
- data/core/src/services/dbfs/lister.rs +96 -0
- data/core/src/services/dbfs/mod.rs +38 -0
- data/core/src/services/dbfs/writer.rs +64 -0
- data/core/src/services/dropbox/backend.rs +187 -0
- data/core/src/services/dropbox/builder.rs +222 -0
- data/core/src/services/dropbox/config.rs +47 -0
- data/core/src/services/dropbox/core.rs +496 -0
- data/core/src/services/dropbox/delete.rs +54 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/dropbox/error.rs +85 -0
- data/core/src/services/dropbox/lister.rs +117 -0
- data/core/src/services/dropbox/mod.rs +40 -0
- data/core/src/services/dropbox/writer.rs +51 -0
- data/core/src/services/etcd/backend.rs +345 -0
- data/core/src/services/etcd/config.rs +86 -0
- data/core/src/services/etcd/core.rs +143 -0
- data/core/src/services/etcd/deleter.rs +41 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/etcd/error.rs +26 -0
- data/core/src/services/etcd/lister.rs +79 -0
- data/core/src/services/etcd/mod.rs +36 -0
- data/core/src/services/etcd/writer.rs +61 -0
- data/core/src/services/foundationdb/backend.rs +171 -0
- data/core/src/services/foundationdb/config.rs +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/foundationdb/mod.rs +24 -0
- data/core/src/services/fs/backend.rs +299 -0
- data/core/src/services/fs/config.rs +33 -0
- data/core/src/services/fs/core.rs +227 -0
- data/core/src/services/fs/delete.rs +53 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/fs/error.rs +31 -0
- data/core/src/services/fs/lister.rs +81 -0
- data/core/src/services/fs/mod.rs +40 -0
- data/core/src/services/fs/reader.rs +83 -0
- data/core/src/services/fs/writer.rs +212 -0
- data/core/src/services/ftp/backend.rs +388 -0
- data/core/src/services/ftp/config.rs +46 -0
- data/core/src/services/ftp/core.rs +136 -0
- data/core/src/services/ftp/delete.rs +62 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/ftp/err.rs +47 -0
- data/core/src/services/ftp/lister.rs +72 -0
- data/core/src/services/ftp/mod.rs +41 -0
- data/core/src/services/ftp/reader.rs +84 -0
- data/core/src/services/ftp/writer.rs +122 -0
- data/core/src/services/gcs/backend.rs +499 -0
- data/core/src/services/gcs/config.rs +168 -0
- data/core/src/services/gcs/core.rs +1079 -0
- data/core/src/services/gcs/delete.rs +98 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gcs/error.rs +122 -0
- data/core/src/services/gcs/lister.rs +136 -0
- data/core/src/services/gcs/mod.rs +40 -0
- data/core/src/services/gcs/uri.rs +75 -0
- data/core/src/services/gcs/writer.rs +163 -0
- data/core/src/services/gdrive/backend.rs +176 -0
- data/core/src/services/gdrive/builder.rs +228 -0
- data/core/src/services/gdrive/config.rs +47 -0
- data/core/src/services/gdrive/core.rs +499 -0
- data/core/src/services/gdrive/delete.rs +57 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/gdrive/error.rs +80 -0
- data/core/src/services/gdrive/lister.rs +110 -0
- data/core/src/services/gdrive/mod.rs +40 -0
- data/core/src/services/gdrive/writer.rs +77 -0
- data/core/src/services/ghac/backend.rs +285 -0
- data/core/src/services/ghac/config.rs +36 -0
- data/core/src/services/ghac/core.rs +459 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/ghac/error.rs +52 -0
- data/core/src/services/ghac/mod.rs +35 -0
- data/core/src/services/ghac/writer.rs +201 -0
- data/core/src/services/github/backend.rs +285 -0
- data/core/src/services/github/config.rs +59 -0
- data/core/src/services/github/core.rs +351 -0
- data/core/src/services/github/delete.rs +41 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/github/error.rs +101 -0
- data/core/src/services/github/lister.rs +112 -0
- data/core/src/services/github/mod.rs +38 -0
- data/core/src/services/github/writer.rs +51 -0
- data/core/src/services/gridfs/backend.rs +166 -0
- data/core/src/services/gridfs/config.rs +50 -0
- data/core/src/services/gridfs/core.rs +154 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/gridfs/mod.rs +26 -0
- data/core/src/services/hdfs/backend.rs +413 -0
- data/core/src/services/hdfs/config.rs +59 -0
- data/core/src/services/hdfs/delete.rs +62 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs/lister.rs +70 -0
- data/core/src/services/hdfs/mod.rs +36 -0
- data/core/src/services/hdfs/reader.rs +79 -0
- data/core/src/services/hdfs/writer.rs +104 -0
- data/core/src/services/hdfs_native/backend.rs +340 -0
- data/core/src/services/hdfs_native/config.rs +45 -0
- data/core/src/services/hdfs_native/delete.rs +47 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/hdfs_native/error.rs +59 -0
- data/core/src/services/hdfs_native/lister.rs +85 -0
- data/core/src/services/hdfs_native/mod.rs +39 -0
- data/core/src/services/hdfs_native/reader.rs +62 -0
- data/core/src/services/hdfs_native/writer.rs +61 -0
- data/core/src/services/http/backend.rs +291 -0
- data/core/src/services/http/config.rs +49 -0
- data/core/src/services/http/core.rs +125 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/http/error.rs +53 -0
- data/core/src/services/http/mod.rs +32 -0
- data/core/src/services/huggingface/backend.rs +289 -0
- data/core/src/services/huggingface/config.rs +75 -0
- data/core/src/services/huggingface/core.rs +406 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/huggingface/error.rs +93 -0
- data/core/src/services/huggingface/lister.rs +91 -0
- data/core/src/services/huggingface/mod.rs +34 -0
- data/core/src/services/ipfs/backend.rs +257 -0
- data/core/src/services/ipfs/config.rs +32 -0
- data/core/src/services/ipfs/core.rs +239 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipfs/error.rs +52 -0
- data/core/src/services/ipfs/ipld.rs +162 -0
- data/core/src/services/ipfs/mod.rs +34 -0
- data/core/src/services/ipmfs/backend.rs +147 -0
- data/core/src/services/ipmfs/builder.rs +166 -0
- data/core/src/services/ipmfs/config.rs +32 -0
- data/core/src/services/ipmfs/core.rs +142 -0
- data/core/src/services/ipmfs/delete.rs +48 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/ipmfs/error.rs +83 -0
- data/core/src/services/ipmfs/lister.rs +135 -0
- data/core/src/services/ipmfs/mod.rs +40 -0
- data/core/src/services/ipmfs/writer.rs +49 -0
- data/core/src/services/koofr/backend.rs +361 -0
- data/core/src/services/koofr/config.rs +50 -0
- data/core/src/services/koofr/core.rs +458 -0
- data/core/src/services/koofr/delete.rs +50 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/koofr/error.rs +72 -0
- data/core/src/services/koofr/lister.rs +88 -0
- data/core/src/services/koofr/mod.rs +38 -0
- data/core/src/services/koofr/writer.rs +53 -0
- data/core/src/services/lakefs/backend.rs +309 -0
- data/core/src/services/lakefs/config.rs +81 -0
- data/core/src/services/lakefs/core.rs +261 -0
- data/core/src/services/lakefs/delete.rs +54 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/lakefs/error.rs +93 -0
- data/core/src/services/lakefs/lister.rs +120 -0
- data/core/src/services/lakefs/mod.rs +38 -0
- data/core/src/services/lakefs/writer.rs +50 -0
- data/core/src/services/memcached/backend.rs +284 -0
- data/core/src/services/memcached/binary.rs +289 -0
- data/core/src/services/memcached/config.rs +43 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memcached/mod.rs +27 -0
- data/core/src/services/memory/backend.rs +205 -0
- data/core/src/services/memory/config.rs +30 -0
- data/core/src/services/memory/core.rs +80 -0
- data/core/src/services/memory/delete.rs +42 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/memory/lister.rs +56 -0
- data/core/src/services/memory/mod.rs +36 -0
- data/core/src/services/memory/writer.rs +85 -0
- data/core/src/services/mini_moka/backend.rs +260 -0
- data/core/src/services/mini_moka/config.rs +56 -0
- data/core/src/services/mini_moka/core.rs +52 -0
- data/core/src/services/mini_moka/delete.rs +42 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/mini_moka/lister.rs +68 -0
- data/core/src/services/mini_moka/mod.rs +36 -0
- data/core/src/services/mini_moka/writer.rs +84 -0
- data/core/src/services/mod.rs +206 -0
- data/core/src/services/moka/backend.rs +326 -0
- data/core/src/services/moka/config.rs +59 -0
- data/core/src/services/moka/core.rs +62 -0
- data/core/src/services/moka/delete.rs +42 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/moka/lister.rs +65 -0
- data/core/src/services/moka/mod.rs +41 -0
- data/core/src/services/moka/writer.rs +83 -0
- data/core/src/services/mongodb/backend.rs +291 -0
- data/core/src/services/mongodb/config.rs +54 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/mongodb/mod.rs +24 -0
- data/core/src/services/monoiofs/backend.rs +238 -0
- data/core/src/services/monoiofs/config.rs +34 -0
- data/core/src/services/monoiofs/core.rs +313 -0
- data/core/src/services/monoiofs/delete.rs +64 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/monoiofs/mod.rs +36 -0
- data/core/src/services/monoiofs/reader.rs +147 -0
- data/core/src/services/monoiofs/writer.rs +189 -0
- data/core/src/services/mysql/backend.rs +256 -0
- data/core/src/services/mysql/config.rs +66 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/mysql/mod.rs +24 -0
- data/core/src/services/obs/backend.rs +442 -0
- data/core/src/services/obs/config.rs +53 -0
- data/core/src/services/obs/core.rs +608 -0
- data/core/src/services/obs/delete.rs +48 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/obs/error.rs +106 -0
- data/core/src/services/obs/lister.rs +101 -0
- data/core/src/services/obs/mod.rs +38 -0
- data/core/src/services/obs/writer.rs +235 -0
- data/core/src/services/onedrive/backend.rs +127 -0
- data/core/src/services/onedrive/builder.rs +236 -0
- data/core/src/services/onedrive/config.rs +49 -0
- data/core/src/services/onedrive/core.rs +691 -0
- data/core/src/services/onedrive/delete.rs +47 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/onedrive/error.rs +61 -0
- data/core/src/services/onedrive/graph_model.rs +425 -0
- data/core/src/services/onedrive/lister.rs +150 -0
- data/core/src/services/onedrive/mod.rs +42 -0
- data/core/src/services/onedrive/writer.rs +168 -0
- data/core/src/services/opfs/backend.rs +50 -0
- data/core/src/services/opfs/config.rs +25 -0
- data/core/src/services/opfs/core.rs +74 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/opfs/error.rs +27 -0
- data/core/src/services/opfs/mod.rs +30 -0
- data/core/src/services/opfs/utils.rs +70 -0
- data/core/src/services/oss/backend.rs +734 -0
- data/core/src/services/oss/config.rs +113 -0
- data/core/src/services/oss/core.rs +1088 -0
- data/core/src/services/oss/delete.rs +109 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/oss/error.rs +109 -0
- data/core/src/services/oss/lister.rs +256 -0
- data/core/src/services/oss/mod.rs +38 -0
- data/core/src/services/oss/writer.rs +228 -0
- data/core/src/services/pcloud/backend.rs +358 -0
- data/core/src/services/pcloud/config.rs +51 -0
- data/core/src/services/pcloud/core.rs +461 -0
- data/core/src/services/pcloud/delete.rs +66 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/pcloud/error.rs +88 -0
- data/core/src/services/pcloud/lister.rs +95 -0
- data/core/src/services/pcloud/mod.rs +38 -0
- data/core/src/services/pcloud/writer.rs +66 -0
- data/core/src/services/persy/backend.rs +226 -0
- data/core/src/services/persy/config.rs +32 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/persy/mod.rs +24 -0
- data/core/src/services/postgresql/backend.rs +258 -0
- data/core/src/services/postgresql/config.rs +66 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/postgresql/mod.rs +24 -0
- data/core/src/services/redb/backend.rs +280 -0
- data/core/src/services/redb/config.rs +34 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redb/mod.rs +24 -0
- data/core/src/services/redis/backend.rs +442 -0
- data/core/src/services/redis/config.rs +79 -0
- data/core/src/services/redis/core.rs +209 -0
- data/core/src/services/redis/delete.rs +40 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/redis/mod.rs +34 -0
- data/core/src/services/redis/writer.rs +57 -0
- data/core/src/services/rocksdb/backend.rs +159 -0
- data/core/src/services/rocksdb/config.rs +34 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/rocksdb/mod.rs +24 -0
- data/core/src/services/s3/backend.rs +1293 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/config.rs +327 -0
- data/core/src/services/s3/core.rs +1741 -0
- data/core/src/services/s3/delete.rs +109 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/s3/error.rs +171 -0
- data/core/src/services/s3/lister.rs +405 -0
- data/core/src/services/s3/mod.rs +38 -0
- data/core/src/services/s3/writer.rs +262 -0
- data/core/src/services/seafile/backend.rs +297 -0
- data/core/src/services/seafile/config.rs +56 -0
- data/core/src/services/seafile/core.rs +475 -0
- data/core/src/services/seafile/delete.rs +40 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/seafile/error.rs +86 -0
- data/core/src/services/seafile/lister.rs +83 -0
- data/core/src/services/seafile/mod.rs +38 -0
- data/core/src/services/seafile/writer.rs +55 -0
- data/core/src/services/sftp/backend.rs +397 -0
- data/core/src/services/sftp/config.rs +50 -0
- data/core/src/services/sftp/core.rs +154 -0
- data/core/src/services/sftp/delete.rs +55 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sftp/error.rs +57 -0
- data/core/src/services/sftp/lister.rs +88 -0
- data/core/src/services/sftp/mod.rs +42 -0
- data/core/src/services/sftp/reader.rs +78 -0
- data/core/src/services/sftp/utils.rs +51 -0
- data/core/src/services/sftp/writer.rs +67 -0
- data/core/src/services/sled/backend.rs +194 -0
- data/core/src/services/sled/config.rs +45 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sled/mod.rs +24 -0
- data/core/src/services/sqlite/backend.rs +326 -0
- data/core/src/services/sqlite/config.rs +70 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/sqlite/mod.rs +24 -0
- data/core/src/services/surrealdb/backend.rs +365 -0
- data/core/src/services/surrealdb/config.rs +64 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/surrealdb/mod.rs +24 -0
- data/core/src/services/swift/backend.rs +275 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/config.rs +53 -0
- data/core/src/services/swift/core.rs +310 -0
- data/core/src/services/swift/delete.rs +49 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/swift/error.rs +90 -0
- data/core/src/services/swift/lister.rs +119 -0
- data/core/src/services/swift/mod.rs +38 -0
- data/core/src/services/swift/writer.rs +53 -0
- data/core/src/services/tikv/backend.rs +237 -0
- data/core/src/services/tikv/config.rs +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/tikv/mod.rs +24 -0
- data/core/src/services/upyun/backend.rs +317 -0
- data/core/src/services/upyun/config.rs +51 -0
- data/core/src/services/upyun/core.rs +521 -0
- data/core/src/services/upyun/delete.rs +50 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/upyun/error.rs +97 -0
- data/core/src/services/upyun/lister.rs +101 -0
- data/core/src/services/upyun/mod.rs +38 -0
- data/core/src/services/upyun/writer.rs +127 -0
- data/core/src/services/vercel_artifacts/backend.rs +99 -0
- data/core/src/services/vercel_artifacts/builder.rs +117 -0
- data/core/src/services/vercel_artifacts/config.rs +39 -0
- data/core/src/services/vercel_artifacts/core.rs +112 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_artifacts/error.rs +50 -0
- data/core/src/services/vercel_artifacts/mod.rs +36 -0
- data/core/src/services/vercel_artifacts/writer.rs +58 -0
- data/core/src/services/vercel_blob/backend.rs +251 -0
- data/core/src/services/vercel_blob/config.rs +45 -0
- data/core/src/services/vercel_blob/core.rs +449 -0
- data/core/src/services/vercel_blob/delete.rs +38 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/vercel_blob/error.rs +110 -0
- data/core/src/services/vercel_blob/lister.rs +69 -0
- data/core/src/services/vercel_blob/mod.rs +38 -0
- data/core/src/services/vercel_blob/writer.rs +143 -0
- data/core/src/services/webdav/backend.rs +318 -0
- data/core/src/services/webdav/config.rs +53 -0
- data/core/src/services/webdav/core.rs +859 -0
- data/core/src/services/webdav/delete.rs +47 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webdav/error.rs +53 -0
- data/core/src/services/webdav/lister.rs +106 -0
- data/core/src/services/webdav/mod.rs +38 -0
- data/core/src/services/webdav/writer.rs +56 -0
- data/core/src/services/webhdfs/backend.rs +376 -0
- data/core/src/services/webhdfs/config.rs +52 -0
- data/core/src/services/webhdfs/core.rs +398 -0
- data/core/src/services/webhdfs/delete.rs +46 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/webhdfs/error.rs +126 -0
- data/core/src/services/webhdfs/lister.rs +130 -0
- data/core/src/services/webhdfs/message.rs +249 -0
- data/core/src/services/webhdfs/mod.rs +41 -0
- data/core/src/services/webhdfs/writer.rs +177 -0
- data/core/src/services/yandex_disk/backend.rs +267 -0
- data/core/src/services/yandex_disk/config.rs +45 -0
- data/core/src/services/yandex_disk/core.rs +340 -0
- data/core/src/services/yandex_disk/delete.rs +54 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/src/services/yandex_disk/error.rs +104 -0
- data/core/src/services/yandex_disk/lister.rs +113 -0
- data/core/src/services/yandex_disk/mod.rs +38 -0
- data/core/src/services/yandex_disk/writer.rs +52 -0
- data/core/src/types/buffer.rs +991 -0
- data/core/src/types/builder.rs +152 -0
- data/core/src/types/capability.rs +209 -0
- data/core/src/types/context/mod.rs +22 -0
- data/core/src/types/context/read.rs +231 -0
- data/core/src/types/context/write.rs +441 -0
- data/core/src/types/delete/deleter.rs +220 -0
- data/core/src/types/delete/futures_delete_sink.rs +176 -0
- data/core/src/types/delete/input.rs +97 -0
- data/core/src/types/delete/mod.rs +26 -0
- data/core/src/types/entry.rs +69 -0
- data/core/src/types/error.rs +570 -0
- data/core/src/types/execute/api.rs +110 -0
- data/core/src/types/execute/executor.rs +96 -0
- data/core/src/types/execute/executors/mod.rs +27 -0
- data/core/src/types/execute/executors/tokio_executor.rs +60 -0
- data/core/src/types/execute/mod.rs +25 -0
- data/core/src/types/list.rs +137 -0
- data/core/src/types/metadata.rs +436 -0
- data/core/src/types/mod.rs +72 -0
- data/core/src/types/mode.rs +68 -0
- data/core/src/types/operator/builder.rs +535 -0
- data/core/src/types/operator/info.rs +63 -0
- data/core/src/types/operator/mod.rs +33 -0
- data/core/src/types/operator/operator.rs +2236 -0
- data/core/src/types/operator/operator_futures.rs +1430 -0
- data/core/src/types/operator/registry.rs +129 -0
- data/core/src/types/options.rs +548 -0
- data/core/src/types/read/buffer_stream.rs +273 -0
- data/core/src/types/read/futures_async_reader.rs +289 -0
- data/core/src/types/read/futures_bytes_stream.rs +157 -0
- data/core/src/types/read/mod.rs +29 -0
- data/core/src/types/read/reader.rs +604 -0
- data/core/src/types/scheme.rs +475 -0
- data/core/src/types/write/buffer_sink.rs +188 -0
- data/core/src/types/write/futures_async_writer.rs +136 -0
- data/core/src/types/write/futures_bytes_sink.rs +103 -0
- data/core/src/types/write/mod.rs +26 -0
- data/core/src/types/write/writer.rs +411 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/behavior/async_copy.rs +314 -0
- data/core/tests/behavior/async_create_dir.rs +53 -0
- data/core/tests/behavior/async_delete.rs +354 -0
- data/core/tests/behavior/async_list.rs +739 -0
- data/core/tests/behavior/async_presign.rs +175 -0
- data/core/tests/behavior/async_read.rs +871 -0
- data/core/tests/behavior/async_rename.rs +210 -0
- data/core/tests/behavior/async_stat.rs +628 -0
- data/core/tests/behavior/async_write.rs +819 -0
- data/core/tests/behavior/main.rs +78 -0
- data/core/tests/behavior/utils.rs +187 -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/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/src/capability.rs +146 -0
- data/src/io.rs +464 -0
- data/src/lib.rs +63 -0
- data/src/lister.rs +141 -0
- data/src/metadata.rs +111 -0
- data/src/middlewares.rs +174 -0
- data/src/operator.rs +310 -0
- data/src/operator_info.rs +83 -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 +857 -0
data/src/metadata.rs
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
#![allow(
|
|
19
|
+
rustdoc::broken_intra_doc_links,
|
|
20
|
+
reason = "YARD's syntax for documentation"
|
|
21
|
+
)]
|
|
22
|
+
#![allow(rustdoc::invalid_html_tags, reason = "YARD's syntax for documentation")]
|
|
23
|
+
#![allow(rustdoc::bare_urls, reason = "YARD's syntax for documentation")]
|
|
24
|
+
|
|
25
|
+
use magnus::method;
|
|
26
|
+
use magnus::prelude::*;
|
|
27
|
+
use magnus::Error;
|
|
28
|
+
use magnus::RModule;
|
|
29
|
+
|
|
30
|
+
use crate::*;
|
|
31
|
+
|
|
32
|
+
/// @yard
|
|
33
|
+
/// Metadata about an object.
|
|
34
|
+
#[magnus::wrap(class = "OpenDal::Metadata", free_immediately, size)]
|
|
35
|
+
pub struct Metadata(ocore::Metadata);
|
|
36
|
+
|
|
37
|
+
impl Metadata {
|
|
38
|
+
pub fn new(metadata: ocore::Metadata) -> Self {
|
|
39
|
+
Self(metadata)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
impl Metadata {
|
|
44
|
+
/// @yard
|
|
45
|
+
/// @def mode
|
|
46
|
+
/// The entry mode of this Metadata.
|
|
47
|
+
/// @return [String] one of `File`, `Directory`, `Unknown`.
|
|
48
|
+
/// `Unknown` means OpenDAL doesn't have actions to the entry.
|
|
49
|
+
pub fn mode(&self) -> &str {
|
|
50
|
+
match self.0.mode() {
|
|
51
|
+
ocore::EntryMode::FILE => "File",
|
|
52
|
+
ocore::EntryMode::DIR => "Directory",
|
|
53
|
+
ocore::EntryMode::Unknown => "Unknown",
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/// @yard
|
|
58
|
+
/// @def content_disposition
|
|
59
|
+
/// Content-Disposition of this object
|
|
60
|
+
/// @return [String, nil]
|
|
61
|
+
pub fn content_disposition(&self) -> Option<&str> {
|
|
62
|
+
self.0.content_disposition()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/// @yard
|
|
66
|
+
/// @def content_length
|
|
67
|
+
/// Content length of this entry.
|
|
68
|
+
/// @return [Integer]
|
|
69
|
+
pub fn content_length(&self) -> u64 {
|
|
70
|
+
self.0.content_length()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// @yard
|
|
74
|
+
/// @def content_md5
|
|
75
|
+
/// Content MD5 of this entry.
|
|
76
|
+
/// @return [String, nil]
|
|
77
|
+
pub fn content_md5(&self) -> Option<&str> {
|
|
78
|
+
self.0.content_md5()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/// @yard
|
|
82
|
+
/// @def content_type
|
|
83
|
+
/// Content Type of this entry.
|
|
84
|
+
/// @return [String, nil]
|
|
85
|
+
pub fn content_type(&self) -> Option<&str> {
|
|
86
|
+
self.0.content_type()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// @yard
|
|
90
|
+
/// @def etag
|
|
91
|
+
/// ETag of this entry.
|
|
92
|
+
/// @return [String, nil]
|
|
93
|
+
pub fn etag(&self) -> Option<&str> {
|
|
94
|
+
self.0.etag()
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
pub fn include(ruby: &Ruby, gem_module: &RModule) -> Result<(), Error> {
|
|
99
|
+
let class = gem_module.define_class("Metadata", ruby.class_object())?;
|
|
100
|
+
class.define_method("mode", method!(Metadata::mode, 0))?;
|
|
101
|
+
class.define_method(
|
|
102
|
+
"content_disposition",
|
|
103
|
+
method!(Metadata::content_disposition, 0),
|
|
104
|
+
)?;
|
|
105
|
+
class.define_method("content_length", method!(Metadata::content_length, 0))?;
|
|
106
|
+
class.define_method("content_md5", method!(Metadata::content_md5, 0))?;
|
|
107
|
+
class.define_method("content_type", method!(Metadata::content_type, 0))?;
|
|
108
|
+
class.define_method("etag", method!(Metadata::etag, 0))?;
|
|
109
|
+
|
|
110
|
+
Ok(())
|
|
111
|
+
}
|
data/src/middlewares.rs
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
use std::sync::Mutex;
|
|
20
|
+
use std::time::Duration;
|
|
21
|
+
|
|
22
|
+
use magnus::method;
|
|
23
|
+
use magnus::prelude::*;
|
|
24
|
+
use magnus::Error;
|
|
25
|
+
use magnus::RModule;
|
|
26
|
+
use magnus::Ruby;
|
|
27
|
+
|
|
28
|
+
use opendal::raw::Accessor as OCoreAccessor;
|
|
29
|
+
use opendal::raw::Layer as OCoreLayer;
|
|
30
|
+
|
|
31
|
+
use crate::operator::Operator;
|
|
32
|
+
use crate::*;
|
|
33
|
+
|
|
34
|
+
// Applies an OpenDAL layer (treated as middleware in Ruby).
|
|
35
|
+
//
|
|
36
|
+
// Magnus provides `TypedData` and the `magnus::wrap` macro for strong typing between Ruby and Rust,
|
|
37
|
+
// but we avoid exposing Rust types directly in Ruby to allow packaging layers in separate gems.
|
|
38
|
+
//
|
|
39
|
+
// Instead, we rely on duck typing: each Ruby-defined layer must implement `#apply_to(operator)`.
|
|
40
|
+
// This internal function helps apply a Rust layer by locking the inner Layer and wrapping the result
|
|
41
|
+
// back into an `Operator`.
|
|
42
|
+
fn apply_layer<T>(
|
|
43
|
+
ruby: &Ruby,
|
|
44
|
+
inner: &Arc<Mutex<T>>,
|
|
45
|
+
operator: &Operator,
|
|
46
|
+
name: &'static str,
|
|
47
|
+
) -> Result<Operator, Error>
|
|
48
|
+
where
|
|
49
|
+
T: OCoreLayer<OCoreAccessor> + Clone + Send + Sync + 'static,
|
|
50
|
+
{
|
|
51
|
+
let guard = inner.lock().map_err(|_| {
|
|
52
|
+
Error::new(
|
|
53
|
+
ruby.exception_runtime_error(),
|
|
54
|
+
format!("poisoned {name} mutex"),
|
|
55
|
+
)
|
|
56
|
+
})?;
|
|
57
|
+
|
|
58
|
+
let layered = operator.async_op.clone().layer(guard.clone());
|
|
59
|
+
|
|
60
|
+
Ok(Operator::from_operator(layered))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// @yard
|
|
64
|
+
/// Adds retry for temporary failed operations.
|
|
65
|
+
///
|
|
66
|
+
/// See [`opendal::layers::RetryLayer`] for more information.
|
|
67
|
+
#[magnus::wrap(class = "OpenDal::Middleware::Retry")]
|
|
68
|
+
struct RetryMiddleware(Arc<Mutex<ocore::layers::RetryLayer>>);
|
|
69
|
+
|
|
70
|
+
impl RetryMiddleware {
|
|
71
|
+
fn new() -> Self {
|
|
72
|
+
Self(Arc::new(Mutex::new(ocore::layers::RetryLayer::default())))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fn apply_to(ruby: &Ruby, rb_self: &Self, operator: &Operator) -> Result<Operator, Error> {
|
|
76
|
+
apply_layer(ruby, &rb_self.0, operator, "OpenDal::Middleware::Retry")
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// @yard
|
|
81
|
+
/// Adds concurrent request limit.
|
|
82
|
+
///
|
|
83
|
+
/// See [`opendal::layers::ConcurrentLimitLayer`] for more information.
|
|
84
|
+
#[magnus::wrap(class = "OpenDal::Middleware::ConcurrentLimit")]
|
|
85
|
+
struct ConcurrentLimitMiddleware(Arc<Mutex<ocore::layers::ConcurrentLimitLayer>>);
|
|
86
|
+
|
|
87
|
+
impl ConcurrentLimitMiddleware {
|
|
88
|
+
fn new(permits: usize) -> Self {
|
|
89
|
+
Self(Arc::new(Mutex::new(
|
|
90
|
+
ocore::layers::ConcurrentLimitLayer::new(permits),
|
|
91
|
+
)))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
fn apply_to(ruby: &Ruby, rb_self: &Self, operator: &Operator) -> Result<Operator, Error> {
|
|
95
|
+
apply_layer(
|
|
96
|
+
ruby,
|
|
97
|
+
&rb_self.0,
|
|
98
|
+
operator,
|
|
99
|
+
"OpenDal::Middleware::ConcurrentLimit",
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// @yard
|
|
105
|
+
/// Adds a bandwidth rate limiter to the underlying services.
|
|
106
|
+
///
|
|
107
|
+
/// See [`opendal::layers::ThrottleLayer`] for more information.
|
|
108
|
+
#[magnus::wrap(class = "OpenDal::Middleware::Throttle")]
|
|
109
|
+
struct ThrottleMiddleware(Arc<Mutex<ocore::layers::ThrottleLayer>>);
|
|
110
|
+
|
|
111
|
+
impl ThrottleMiddleware {
|
|
112
|
+
fn new(bandwidth: u32, burst: u32) -> Self {
|
|
113
|
+
Self(Arc::new(Mutex::new(ocore::layers::ThrottleLayer::new(
|
|
114
|
+
bandwidth, burst,
|
|
115
|
+
))))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
fn apply_to(ruby: &Ruby, rb_self: &Self, operator: &Operator) -> Result<Operator, Error> {
|
|
119
|
+
apply_layer(ruby, &rb_self.0, operator, "OpenDal::Middleware::Throttle")
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
fn parse_duration(ruby: &Ruby, val: f64) -> Result<Duration, Error> {
|
|
124
|
+
Duration::try_from_secs_f64(val).map_err(|e| {
|
|
125
|
+
Error::new(
|
|
126
|
+
ruby.exception_arg_error(),
|
|
127
|
+
format!("invalid float duration: {e}"),
|
|
128
|
+
)
|
|
129
|
+
})
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/// @yard
|
|
133
|
+
/// Adds timeout for every operation to avoid slow or unexpected hang operations.
|
|
134
|
+
///
|
|
135
|
+
/// See [`opendal::layers::TimeoutLayer`] for more information.
|
|
136
|
+
#[magnus::wrap(class = "OpenDal::Middleware::Timeout")]
|
|
137
|
+
struct TimeoutMiddleware(Arc<Mutex<ocore::layers::TimeoutLayer>>);
|
|
138
|
+
|
|
139
|
+
impl TimeoutMiddleware {
|
|
140
|
+
fn new(ruby: &Ruby, timeout: f64, io_timeout: f64) -> Result<Self, Error> {
|
|
141
|
+
let layer = ocore::layers::TimeoutLayer::new()
|
|
142
|
+
.with_timeout(parse_duration(ruby, timeout)?)
|
|
143
|
+
.with_io_timeout(parse_duration(ruby, io_timeout)?);
|
|
144
|
+
Ok(Self(Arc::new(Mutex::new(layer))))
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
fn apply_to(ruby: &Ruby, rb_self: &Self, operator: &Operator) -> Result<Operator, Error> {
|
|
148
|
+
apply_layer(ruby, &rb_self.0, operator, "OpenDal::Middleware::Timeout")
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
pub fn include(ruby: &Ruby, middleware_module: &RModule) -> Result<(), Error> {
|
|
153
|
+
middleware_module.define_class("Retry", ruby.class_object())?;
|
|
154
|
+
|
|
155
|
+
let retry = middleware_module.define_class("Retry", ruby.class_object())?;
|
|
156
|
+
retry.define_singleton_method("new", function!(RetryMiddleware::new, 0))?;
|
|
157
|
+
retry.define_method("apply_to", method!(RetryMiddleware::apply_to, 1))?;
|
|
158
|
+
|
|
159
|
+
let concurrent_limit =
|
|
160
|
+
middleware_module.define_class("ConcurrentLimit", ruby.class_object())?;
|
|
161
|
+
concurrent_limit
|
|
162
|
+
.define_singleton_method("new", function!(ConcurrentLimitMiddleware::new, 1))?;
|
|
163
|
+
concurrent_limit.define_method("apply_to", method!(ConcurrentLimitMiddleware::apply_to, 1))?;
|
|
164
|
+
|
|
165
|
+
let throttle_middleware = middleware_module.define_class("Throttle", ruby.class_object())?;
|
|
166
|
+
throttle_middleware.define_singleton_method("new", function!(ThrottleMiddleware::new, 2))?;
|
|
167
|
+
throttle_middleware.define_method("apply_to", method!(ThrottleMiddleware::apply_to, 1))?;
|
|
168
|
+
|
|
169
|
+
let timeout_middleware = middleware_module.define_class("Timeout", ruby.class_object())?;
|
|
170
|
+
timeout_middleware.define_singleton_method("new", function!(TimeoutMiddleware::new, 2))?;
|
|
171
|
+
timeout_middleware.define_method("apply_to", method!(TimeoutMiddleware::apply_to, 1))?;
|
|
172
|
+
|
|
173
|
+
Ok(())
|
|
174
|
+
}
|
data/src/operator.rs
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
#![allow(
|
|
19
|
+
rustdoc::broken_intra_doc_links,
|
|
20
|
+
reason = "YARD's syntax for documentation"
|
|
21
|
+
)]
|
|
22
|
+
#![allow(rustdoc::invalid_html_tags, reason = "YARD's syntax for documentation")]
|
|
23
|
+
#![allow(rustdoc::bare_urls, reason = "YARD's syntax for documentation")]
|
|
24
|
+
|
|
25
|
+
use std::collections::HashMap;
|
|
26
|
+
use std::str::FromStr;
|
|
27
|
+
|
|
28
|
+
use magnus::method;
|
|
29
|
+
use magnus::prelude::*;
|
|
30
|
+
use magnus::scan_args::get_kwargs;
|
|
31
|
+
use magnus::scan_args::scan_args;
|
|
32
|
+
use magnus::Error;
|
|
33
|
+
use magnus::RHash;
|
|
34
|
+
use magnus::RModule;
|
|
35
|
+
use magnus::RString;
|
|
36
|
+
use magnus::Ruby;
|
|
37
|
+
use magnus::Value;
|
|
38
|
+
|
|
39
|
+
use crate::capability::Capability;
|
|
40
|
+
use crate::io::Io;
|
|
41
|
+
use crate::lister::Lister;
|
|
42
|
+
use crate::metadata::Metadata;
|
|
43
|
+
use crate::operator_info::OperatorInfo;
|
|
44
|
+
use crate::*;
|
|
45
|
+
|
|
46
|
+
/// @yard
|
|
47
|
+
/// The entrypoint for operating with file services and files.
|
|
48
|
+
#[magnus::wrap(class = "OpenDal::Operator", free_immediately, size)]
|
|
49
|
+
pub struct Operator {
|
|
50
|
+
// We keep a reference to an `Operator` because:
|
|
51
|
+
// 1. Some builder functions exist only with the `Operator` struct.
|
|
52
|
+
// 2. Some builder functions don't exist in the `BlockingOperator`, e.g., `Operator::layer`, builder methods.
|
|
53
|
+
//
|
|
54
|
+
// We don't support async because:
|
|
55
|
+
// 1. Ractor and async is not stable.
|
|
56
|
+
// 2. magnus doesn't release GVL lock during operations yet.
|
|
57
|
+
// 3. Majority of use cases are still blocking.
|
|
58
|
+
//
|
|
59
|
+
// In practice, we will not use operator directly because of the async support.
|
|
60
|
+
pub async_op: ocore::Operator,
|
|
61
|
+
// The cached blocking operator coming from `Operator::blocking`.
|
|
62
|
+
// Important to keep in sync after making changes to the `Operator`.
|
|
63
|
+
//
|
|
64
|
+
// We declare this `BlockingOperator` to state the intent of assumptions instead of
|
|
65
|
+
// getting a `BlockingOperator` for an operation dynamically every time.
|
|
66
|
+
pub blocking_op: ocore::blocking::Operator,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
impl Operator {
|
|
70
|
+
// Convenience helper to construct operator
|
|
71
|
+
#[inline]
|
|
72
|
+
pub(crate) fn from_operator(operator: ocore::Operator) -> Operator {
|
|
73
|
+
let handle = RUNTIME.handle();
|
|
74
|
+
let _enter = handle.enter();
|
|
75
|
+
let blocking_op = ocore::blocking::Operator::new(operator.clone())
|
|
76
|
+
.expect("initiate blocking operator must succeed");
|
|
77
|
+
|
|
78
|
+
Operator {
|
|
79
|
+
async_op: operator,
|
|
80
|
+
blocking_op,
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
impl Operator {
|
|
86
|
+
fn new(
|
|
87
|
+
ruby: &Ruby,
|
|
88
|
+
scheme: String,
|
|
89
|
+
options: Option<HashMap<String, String>>,
|
|
90
|
+
) -> Result<Self, Error> {
|
|
91
|
+
let scheme = ocore::Scheme::from_str(&scheme)
|
|
92
|
+
.map_err(|err| {
|
|
93
|
+
ocore::Error::new(ocore::ErrorKind::Unexpected, "unsupported scheme")
|
|
94
|
+
.set_source(err)
|
|
95
|
+
})
|
|
96
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))?;
|
|
97
|
+
let options = options.unwrap_or_default();
|
|
98
|
+
|
|
99
|
+
let op = ocore::Operator::via_iter(scheme, options)
|
|
100
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))?;
|
|
101
|
+
|
|
102
|
+
Ok(Operator::from_operator(op))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/// @yard
|
|
106
|
+
/// @def read(path)
|
|
107
|
+
/// Reads the whole path into string.
|
|
108
|
+
/// @param path [String]
|
|
109
|
+
/// @return [String]
|
|
110
|
+
fn read(ruby: &Ruby, rb_self: &Self, path: String) -> Result<bytes::Bytes, Error> {
|
|
111
|
+
let buffer = rb_self
|
|
112
|
+
.blocking_op
|
|
113
|
+
.read(&path)
|
|
114
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))?;
|
|
115
|
+
Ok(buffer.to_bytes())
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// @yard
|
|
119
|
+
/// @def write(path, buffer)
|
|
120
|
+
/// Writes string into given path.
|
|
121
|
+
/// @param path [String]
|
|
122
|
+
/// @param buffer [String]
|
|
123
|
+
/// @return [nil]
|
|
124
|
+
fn write(ruby: &Ruby, rb_self: &Self, path: String, bs: RString) -> Result<(), Error> {
|
|
125
|
+
rb_self
|
|
126
|
+
.blocking_op
|
|
127
|
+
.write(&path, bs.to_bytes())
|
|
128
|
+
.map(|_| ())
|
|
129
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/// @yard
|
|
133
|
+
/// @def read(path)
|
|
134
|
+
/// Gets current path's metadata **without cache** directly.
|
|
135
|
+
/// @param path
|
|
136
|
+
/// @return [Metadata]
|
|
137
|
+
fn stat(ruby: &Ruby, rb_self: &Self, path: String) -> Result<Metadata, Error> {
|
|
138
|
+
rb_self
|
|
139
|
+
.blocking_op
|
|
140
|
+
.stat(&path)
|
|
141
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
142
|
+
.map(Metadata::new)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/// @yard
|
|
146
|
+
/// @def capability
|
|
147
|
+
/// Gets capabilities of the current operator
|
|
148
|
+
/// @return [Capability]
|
|
149
|
+
fn capability(&self) -> Result<Capability, Error> {
|
|
150
|
+
let capability = self.blocking_op.info().full_capability();
|
|
151
|
+
Ok(Capability::new(capability))
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/// @yard
|
|
155
|
+
/// @def create_dir(path)
|
|
156
|
+
/// Creates directory recursively similar as `mkdir -p`
|
|
157
|
+
/// The ending path must be `/`. Otherwise, OpenDAL throws `NotADirectory` error.
|
|
158
|
+
/// @param path [String]
|
|
159
|
+
/// @return [nil]
|
|
160
|
+
fn create_dir(ruby: &Ruby, rb_self: &Self, path: String) -> Result<(), Error> {
|
|
161
|
+
rb_self
|
|
162
|
+
.blocking_op
|
|
163
|
+
.create_dir(&path)
|
|
164
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/// @yard
|
|
168
|
+
/// @def delete(path)
|
|
169
|
+
/// Deletes given path
|
|
170
|
+
/// @param path [String]
|
|
171
|
+
/// @return [nil]
|
|
172
|
+
fn delete(ruby: &Ruby, rb_self: &Self, path: String) -> Result<(), Error> {
|
|
173
|
+
rb_self
|
|
174
|
+
.blocking_op
|
|
175
|
+
.delete(&path)
|
|
176
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/// @yard
|
|
180
|
+
/// @def exist?(path)
|
|
181
|
+
/// Returns if this path exists
|
|
182
|
+
/// @param path [String]
|
|
183
|
+
/// @return [Boolean]
|
|
184
|
+
fn exists(ruby: &Ruby, rb_self: &Self, path: String) -> Result<bool, Error> {
|
|
185
|
+
rb_self
|
|
186
|
+
.blocking_op
|
|
187
|
+
.exists(&path)
|
|
188
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/// @yard
|
|
192
|
+
/// @def rename(from, to)
|
|
193
|
+
/// Renames a file from `from` to `to`
|
|
194
|
+
/// @param from [String] a file path
|
|
195
|
+
/// @param to [String] a file path
|
|
196
|
+
/// @return [nil]
|
|
197
|
+
fn rename(ruby: &Ruby, rb_self: &Self, from: String, to: String) -> Result<(), Error> {
|
|
198
|
+
rb_self
|
|
199
|
+
.blocking_op
|
|
200
|
+
.rename(&from, &to)
|
|
201
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// @yard
|
|
205
|
+
/// @def remove_all(path)
|
|
206
|
+
/// Removes the path and all nested directories and files recursively
|
|
207
|
+
/// @param path [String]
|
|
208
|
+
/// @return [nil]
|
|
209
|
+
fn remove_all(ruby: &Ruby, rb_self: &Self, path: String) -> Result<(), Error> {
|
|
210
|
+
rb_self
|
|
211
|
+
.blocking_op
|
|
212
|
+
.remove_all(&path)
|
|
213
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/// @yard
|
|
217
|
+
/// @def copy(from, to)
|
|
218
|
+
/// Copies a file from `from` to `to`.
|
|
219
|
+
/// @param from [String] a file path
|
|
220
|
+
/// @param to [String] a file path
|
|
221
|
+
/// @return [nil]
|
|
222
|
+
fn copy(ruby: &Ruby, rb_self: &Self, from: String, to: String) -> Result<(), Error> {
|
|
223
|
+
rb_self
|
|
224
|
+
.blocking_op
|
|
225
|
+
.copy(&from, &to)
|
|
226
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/// @yard
|
|
230
|
+
/// @def open(path, mode)
|
|
231
|
+
/// Opens a `IO`-like reader for the given path.
|
|
232
|
+
/// @param path [String] file path
|
|
233
|
+
/// @param mode [String] operation mode, e.g., `r`, `w`, or `rb`.
|
|
234
|
+
/// @raise [ArgumentError] invalid mode, or when the mode is not unique
|
|
235
|
+
/// @return [OpenDal::IO]
|
|
236
|
+
fn open(ruby: &Ruby, rb_self: &Self, args: &[Value]) -> Result<Io, Error> {
|
|
237
|
+
let args = scan_args::<(String,), (Option<Value>, Option<Value>), (), (), RHash, ()>(args)?;
|
|
238
|
+
let (path,) = args.required;
|
|
239
|
+
let (option_mode, option_permission) = args.optional;
|
|
240
|
+
let kwargs = args.keywords;
|
|
241
|
+
|
|
242
|
+
// Ruby handles Qnil safely (will not assign to Qnil)
|
|
243
|
+
let mode = option_mode.unwrap_or(ruby.str_new("r").as_value());
|
|
244
|
+
let permission = option_permission.unwrap_or(ruby.qnil().as_value());
|
|
245
|
+
|
|
246
|
+
let operator = rb_self.blocking_op.clone();
|
|
247
|
+
Io::new(ruby, operator, path, mode, permission, kwargs)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/// @yard
|
|
251
|
+
/// @def list(limit: nil, start_after: nil, recursive: nil)
|
|
252
|
+
/// Lists the directory.
|
|
253
|
+
/// @param limit [usize, nil] per-request max results
|
|
254
|
+
/// @param start_after [String, nil] the specified key to start listing from.
|
|
255
|
+
/// @param recursive [Boolean, nil] lists the directory recursively.
|
|
256
|
+
/// @return [Lister]
|
|
257
|
+
pub fn list(ruby: &Ruby, rb_self: &Self, args: &[Value]) -> Result<Lister, Error> {
|
|
258
|
+
let args = scan_args::<(String,), (), (), (), _, ()>(args)?;
|
|
259
|
+
let (path,) = args.required;
|
|
260
|
+
let kwargs = get_kwargs::<_, (), (Option<usize>, Option<String>, Option<bool>), ()>(
|
|
261
|
+
args.keywords,
|
|
262
|
+
&[],
|
|
263
|
+
&["limit", "start_after", "recursive"],
|
|
264
|
+
)?;
|
|
265
|
+
let (limit, start_after, recursive) = kwargs.optional;
|
|
266
|
+
|
|
267
|
+
let lister = rb_self
|
|
268
|
+
.blocking_op
|
|
269
|
+
.lister_options(
|
|
270
|
+
&path,
|
|
271
|
+
ocore::options::ListOptions {
|
|
272
|
+
limit,
|
|
273
|
+
start_after,
|
|
274
|
+
recursive: recursive.unwrap_or(false),
|
|
275
|
+
..Default::default()
|
|
276
|
+
},
|
|
277
|
+
)
|
|
278
|
+
.map_err(|err| Error::new(ruby.exception_runtime_error(), err.to_string()))?;
|
|
279
|
+
|
|
280
|
+
Ok(Lister::new(lister))
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/// @yard
|
|
284
|
+
/// @def info
|
|
285
|
+
/// Gets meta information of the underlying accessor.
|
|
286
|
+
/// @return [OperatorInfo]
|
|
287
|
+
fn info(&self) -> Result<OperatorInfo, Error> {
|
|
288
|
+
Ok(OperatorInfo(self.blocking_op.info()))
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
pub fn include(ruby: &Ruby, gem_module: &RModule) -> Result<(), Error> {
|
|
293
|
+
let class = gem_module.define_class("Operator", ruby.class_object())?;
|
|
294
|
+
class.define_singleton_method("new", function!(Operator::new, 2))?;
|
|
295
|
+
class.define_method("read", method!(Operator::read, 1))?;
|
|
296
|
+
class.define_method("write", method!(Operator::write, 2))?;
|
|
297
|
+
class.define_method("stat", method!(Operator::stat, 1))?;
|
|
298
|
+
class.define_method("capability", method!(Operator::capability, 0))?;
|
|
299
|
+
class.define_method("create_dir", method!(Operator::create_dir, 1))?;
|
|
300
|
+
class.define_method("delete", method!(Operator::delete, 1))?;
|
|
301
|
+
class.define_method("exist?", method!(Operator::exists, 1))?;
|
|
302
|
+
class.define_method("rename", method!(Operator::rename, 2))?;
|
|
303
|
+
class.define_method("remove_all", method!(Operator::remove_all, 1))?;
|
|
304
|
+
class.define_method("copy", method!(Operator::copy, 2))?;
|
|
305
|
+
class.define_method("open", method!(Operator::open, -1))?;
|
|
306
|
+
class.define_method("list", method!(Operator::list, -1))?;
|
|
307
|
+
class.define_method("info", method!(Operator::info, 0))?;
|
|
308
|
+
|
|
309
|
+
Ok(())
|
|
310
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
#![allow(
|
|
19
|
+
rustdoc::broken_intra_doc_links,
|
|
20
|
+
reason = "YARD's syntax for documentation"
|
|
21
|
+
)]
|
|
22
|
+
|
|
23
|
+
use magnus::method;
|
|
24
|
+
use magnus::prelude::*;
|
|
25
|
+
use magnus::Error;
|
|
26
|
+
use magnus::RModule;
|
|
27
|
+
|
|
28
|
+
use crate::capability::Capability;
|
|
29
|
+
use crate::*;
|
|
30
|
+
|
|
31
|
+
/// Metadata for operator, users can use this metadata to get information of operator.
|
|
32
|
+
#[magnus::wrap(class = "OpenDal::OperatorInfo", free_immediately, size)]
|
|
33
|
+
pub struct OperatorInfo(pub ocore::OperatorInfo);
|
|
34
|
+
|
|
35
|
+
impl OperatorInfo {
|
|
36
|
+
/// @yard
|
|
37
|
+
/// @def scheme
|
|
38
|
+
/// Returns the scheme string of the operator.
|
|
39
|
+
/// @return [String]
|
|
40
|
+
pub fn scheme(&self) -> &str {
|
|
41
|
+
self.0.scheme().into()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/// @yard
|
|
45
|
+
/// @def root
|
|
46
|
+
/// Returns the root path of the operator, will be in format like `/path/to/dir/`
|
|
47
|
+
/// @return [String]
|
|
48
|
+
pub fn root(&self) -> String {
|
|
49
|
+
self.0.root()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// @yard
|
|
53
|
+
/// @def name
|
|
54
|
+
/// Returns the name of backend, could be empty if underlying backend doesn't have namespace concept.
|
|
55
|
+
///
|
|
56
|
+
/// For example:
|
|
57
|
+
///
|
|
58
|
+
/// - name for `s3` => bucket name
|
|
59
|
+
/// - name for `azblob` => container name
|
|
60
|
+
///
|
|
61
|
+
/// @return [String]
|
|
62
|
+
pub fn name(&self) -> String {
|
|
63
|
+
self.0.name()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// @yard
|
|
67
|
+
/// @def capability
|
|
68
|
+
/// Returns the [`Full Capability`] of the operator.
|
|
69
|
+
/// @return [Capability]
|
|
70
|
+
pub fn capability(&self) -> Capability {
|
|
71
|
+
Capability::new(self.0.full_capability())
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
pub fn include(ruby: &Ruby, gem_module: &RModule) -> Result<(), Error> {
|
|
76
|
+
let class = gem_module.define_class("OperatorInfo", ruby.class_object())?;
|
|
77
|
+
class.define_method("scheme", method!(OperatorInfo::scheme, 0))?;
|
|
78
|
+
class.define_method("root", method!(OperatorInfo::root, 0))?;
|
|
79
|
+
class.define_method("name", method!(OperatorInfo::name, 0))?;
|
|
80
|
+
class.define_method("capability", method!(OperatorInfo::capability, 0))?;
|
|
81
|
+
|
|
82
|
+
Ok(())
|
|
83
|
+
}
|