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
|
@@ -0,0 +1,351 @@
|
|
|
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::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use base64::Engine;
|
|
23
|
+
use bytes::Buf;
|
|
24
|
+
use bytes::Bytes;
|
|
25
|
+
use http::header;
|
|
26
|
+
use http::request;
|
|
27
|
+
use http::Request;
|
|
28
|
+
use http::Response;
|
|
29
|
+
use http::StatusCode;
|
|
30
|
+
use serde::Deserialize;
|
|
31
|
+
use serde::Serialize;
|
|
32
|
+
|
|
33
|
+
use super::error::parse_error;
|
|
34
|
+
use crate::raw::*;
|
|
35
|
+
use crate::*;
|
|
36
|
+
|
|
37
|
+
/// Core of [github contents](https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28#create-or-update-file-contents) services support.
|
|
38
|
+
#[derive(Clone)]
|
|
39
|
+
pub struct GithubCore {
|
|
40
|
+
pub info: Arc<AccessorInfo>,
|
|
41
|
+
/// The root of this core.
|
|
42
|
+
pub root: String,
|
|
43
|
+
/// Github access_token.
|
|
44
|
+
pub token: Option<String>,
|
|
45
|
+
/// Github repo owner.
|
|
46
|
+
pub owner: String,
|
|
47
|
+
/// Github repo name.
|
|
48
|
+
pub repo: String,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
impl Debug for GithubCore {
|
|
52
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
53
|
+
f.debug_struct("Backend")
|
|
54
|
+
.field("root", &self.root)
|
|
55
|
+
.field("owner", &self.owner)
|
|
56
|
+
.field("repo", &self.repo)
|
|
57
|
+
.finish_non_exhaustive()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
impl GithubCore {
|
|
62
|
+
#[inline]
|
|
63
|
+
pub async fn send(&self, req: Request<Buffer>) -> Result<Response<Buffer>> {
|
|
64
|
+
self.info.http_client().send(req).await
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
pub fn sign(&self, req: request::Builder) -> Result<request::Builder> {
|
|
68
|
+
let mut req = req
|
|
69
|
+
.header(header::USER_AGENT, format!("opendal-{VERSION}"))
|
|
70
|
+
.header("X-GitHub-Api-Version", "2022-11-28");
|
|
71
|
+
|
|
72
|
+
// Github access_token is optional.
|
|
73
|
+
if let Some(token) = &self.token {
|
|
74
|
+
req = req.header(
|
|
75
|
+
header::AUTHORIZATION,
|
|
76
|
+
format_authorization_by_bearer(token)?,
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
Ok(req)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
impl GithubCore {
|
|
85
|
+
pub async fn get_file_sha(&self, path: &str) -> Result<Option<String>> {
|
|
86
|
+
// if the token is not set, we should not try to get the sha of the file.
|
|
87
|
+
if self.token.is_none() {
|
|
88
|
+
return Err(Error::new(
|
|
89
|
+
ErrorKind::PermissionDenied,
|
|
90
|
+
"Github access_token is not set",
|
|
91
|
+
));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let resp = self.stat(path).await?;
|
|
95
|
+
|
|
96
|
+
match resp.status() {
|
|
97
|
+
StatusCode::OK => {
|
|
98
|
+
let body = resp.into_body();
|
|
99
|
+
let resp: Entry =
|
|
100
|
+
serde_json::from_reader(body.reader()).map_err(new_json_deserialize_error)?;
|
|
101
|
+
|
|
102
|
+
Ok(Some(resp.sha))
|
|
103
|
+
}
|
|
104
|
+
StatusCode::NOT_FOUND => Ok(None),
|
|
105
|
+
_ => Err(parse_error(resp)),
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
pub async fn stat(&self, path: &str) -> Result<Response<Buffer>> {
|
|
110
|
+
let path = build_abs_path(&self.root, path);
|
|
111
|
+
|
|
112
|
+
let url = format!(
|
|
113
|
+
"https://api.github.com/repos/{}/{}/contents/{}",
|
|
114
|
+
self.owner,
|
|
115
|
+
self.repo,
|
|
116
|
+
percent_encode_path(&path)
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
let req = Request::get(url);
|
|
120
|
+
|
|
121
|
+
let req = req.extension(Operation::Stat);
|
|
122
|
+
|
|
123
|
+
let req = self.sign(req)?;
|
|
124
|
+
|
|
125
|
+
let req = req
|
|
126
|
+
.header("Accept", "application/vnd.github.object+json")
|
|
127
|
+
.body(Buffer::new())
|
|
128
|
+
.map_err(new_request_build_error)?;
|
|
129
|
+
|
|
130
|
+
self.send(req).await
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
pub async fn get(&self, path: &str, range: BytesRange) -> Result<Response<HttpBody>> {
|
|
134
|
+
let path = build_abs_path(&self.root, path);
|
|
135
|
+
|
|
136
|
+
let url = format!(
|
|
137
|
+
"https://api.github.com/repos/{}/{}/contents/{}",
|
|
138
|
+
self.owner,
|
|
139
|
+
self.repo,
|
|
140
|
+
percent_encode_path(&path)
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
let req = Request::get(url);
|
|
144
|
+
|
|
145
|
+
let req = req.extension(Operation::Read);
|
|
146
|
+
|
|
147
|
+
let req = self.sign(req)?;
|
|
148
|
+
|
|
149
|
+
let req = req
|
|
150
|
+
.header(header::ACCEPT, "application/vnd.github.raw+json")
|
|
151
|
+
.header(header::RANGE, range.to_header())
|
|
152
|
+
.body(Buffer::new())
|
|
153
|
+
.map_err(new_request_build_error)?;
|
|
154
|
+
|
|
155
|
+
self.info.http_client().fetch(req).await
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
pub async fn upload(&self, path: &str, bs: Buffer) -> Result<Response<Buffer>> {
|
|
159
|
+
let sha = self.get_file_sha(path).await?;
|
|
160
|
+
|
|
161
|
+
let path = build_abs_path(&self.root, path);
|
|
162
|
+
|
|
163
|
+
let url = format!(
|
|
164
|
+
"https://api.github.com/repos/{}/{}/contents/{}",
|
|
165
|
+
self.owner,
|
|
166
|
+
self.repo,
|
|
167
|
+
percent_encode_path(&path)
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
let req = Request::put(url);
|
|
171
|
+
|
|
172
|
+
let req = req.extension(Operation::Write);
|
|
173
|
+
|
|
174
|
+
let req = self.sign(req)?;
|
|
175
|
+
|
|
176
|
+
let mut req_body = CreateOrUpdateContentsRequest {
|
|
177
|
+
message: format!("Write {} at {} via opendal", path, chrono::Local::now()),
|
|
178
|
+
content: base64::engine::general_purpose::STANDARD.encode(bs.to_bytes()),
|
|
179
|
+
sha: None,
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
if let Some(sha) = sha {
|
|
183
|
+
req_body.sha = Some(sha);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
let req_body = serde_json::to_vec(&req_body).map_err(new_json_serialize_error)?;
|
|
187
|
+
|
|
188
|
+
let req = req
|
|
189
|
+
.header("Accept", "application/vnd.github+json")
|
|
190
|
+
.body(Buffer::from(req_body))
|
|
191
|
+
.map_err(new_request_build_error)?;
|
|
192
|
+
|
|
193
|
+
self.send(req).await
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
pub async fn delete(&self, path: &str) -> Result<()> {
|
|
197
|
+
// If path is a directory, we should delete path/.gitkeep
|
|
198
|
+
let formatted_path = format!("{path}.gitkeep");
|
|
199
|
+
let p = if path.ends_with('/') {
|
|
200
|
+
formatted_path.as_str()
|
|
201
|
+
} else {
|
|
202
|
+
path
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
let Some(sha) = self.get_file_sha(p).await? else {
|
|
206
|
+
return Ok(());
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
let path = build_abs_path(&self.root, p);
|
|
210
|
+
|
|
211
|
+
let url = format!(
|
|
212
|
+
"https://api.github.com/repos/{}/{}/contents/{}",
|
|
213
|
+
self.owner,
|
|
214
|
+
self.repo,
|
|
215
|
+
percent_encode_path(&path)
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
let req = Request::delete(url);
|
|
219
|
+
|
|
220
|
+
let req = req.extension(Operation::Delete);
|
|
221
|
+
|
|
222
|
+
let req = self.sign(req)?;
|
|
223
|
+
|
|
224
|
+
let req_body = DeleteContentsRequest {
|
|
225
|
+
message: format!("Delete {} at {} via opendal", path, chrono::Local::now()),
|
|
226
|
+
sha,
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
let req_body = serde_json::to_vec(&req_body).map_err(new_json_serialize_error)?;
|
|
230
|
+
|
|
231
|
+
let req = req
|
|
232
|
+
.header("Accept", "application/vnd.github.object+json")
|
|
233
|
+
.body(Buffer::from(Bytes::from(req_body)))
|
|
234
|
+
.map_err(new_request_build_error)?;
|
|
235
|
+
|
|
236
|
+
let resp = self.send(req).await?;
|
|
237
|
+
|
|
238
|
+
match resp.status() {
|
|
239
|
+
StatusCode::OK => Ok(()),
|
|
240
|
+
StatusCode::NOT_FOUND => Ok(()),
|
|
241
|
+
_ => Err(parse_error(resp)),
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
pub async fn list(&self, path: &str) -> Result<ListResponse> {
|
|
246
|
+
let path = build_abs_path(&self.root, path);
|
|
247
|
+
|
|
248
|
+
let url = format!(
|
|
249
|
+
"https://api.github.com/repos/{}/{}/contents/{}",
|
|
250
|
+
self.owner,
|
|
251
|
+
self.repo,
|
|
252
|
+
percent_encode_path(&path)
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
let req = Request::get(url);
|
|
256
|
+
|
|
257
|
+
let req = req.extension(Operation::List);
|
|
258
|
+
|
|
259
|
+
let req = self.sign(req)?;
|
|
260
|
+
|
|
261
|
+
let req = req
|
|
262
|
+
.header("Accept", "application/vnd.github.object+json")
|
|
263
|
+
.body(Buffer::new())
|
|
264
|
+
.map_err(new_request_build_error)?;
|
|
265
|
+
|
|
266
|
+
let resp = self.send(req).await?;
|
|
267
|
+
|
|
268
|
+
match resp.status() {
|
|
269
|
+
StatusCode::OK => {
|
|
270
|
+
let body = resp.into_body();
|
|
271
|
+
let resp: ListResponse =
|
|
272
|
+
serde_json::from_reader(body.reader()).map_err(new_json_deserialize_error)?;
|
|
273
|
+
|
|
274
|
+
Ok(resp)
|
|
275
|
+
}
|
|
276
|
+
StatusCode::NOT_FOUND => Ok(ListResponse::default()),
|
|
277
|
+
_ => Err(parse_error(resp)),
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/// We use git_url to call github's Tree based API.
|
|
282
|
+
pub async fn list_with_recursive(&self, git_url: &str) -> Result<Vec<Tree>> {
|
|
283
|
+
let url = format!("{git_url}?recursive=true");
|
|
284
|
+
|
|
285
|
+
let req = Request::get(url);
|
|
286
|
+
|
|
287
|
+
let req = req.extension(Operation::List);
|
|
288
|
+
|
|
289
|
+
let req = self.sign(req)?;
|
|
290
|
+
|
|
291
|
+
let req = req
|
|
292
|
+
.header("Accept", "application/vnd.github.object+json")
|
|
293
|
+
.body(Buffer::new())
|
|
294
|
+
.map_err(new_request_build_error)?;
|
|
295
|
+
|
|
296
|
+
let resp = self.send(req).await?;
|
|
297
|
+
|
|
298
|
+
match resp.status() {
|
|
299
|
+
StatusCode::OK => {
|
|
300
|
+
let body = resp.into_body();
|
|
301
|
+
let resp: ListTreeResponse =
|
|
302
|
+
serde_json::from_reader(body.reader()).map_err(new_json_deserialize_error)?;
|
|
303
|
+
|
|
304
|
+
Ok(resp.tree)
|
|
305
|
+
}
|
|
306
|
+
_ => Err(parse_error(resp)),
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
#[derive(Default, Debug, Clone, Serialize)]
|
|
312
|
+
pub struct CreateOrUpdateContentsRequest {
|
|
313
|
+
pub message: String,
|
|
314
|
+
pub content: String,
|
|
315
|
+
pub sha: Option<String>,
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
#[derive(Default, Debug, Clone, Serialize)]
|
|
319
|
+
pub struct DeleteContentsRequest {
|
|
320
|
+
pub message: String,
|
|
321
|
+
pub sha: String,
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
#[derive(Default, Debug, Clone, Deserialize)]
|
|
325
|
+
pub struct ListTreeResponse {
|
|
326
|
+
pub tree: Vec<Tree>,
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
#[derive(Default, Debug, Clone, Deserialize)]
|
|
330
|
+
pub struct Tree {
|
|
331
|
+
pub path: String,
|
|
332
|
+
#[serde(rename = "type")]
|
|
333
|
+
pub type_field: String,
|
|
334
|
+
pub size: Option<u64>,
|
|
335
|
+
pub sha: String,
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
#[derive(Default, Debug, Clone, Deserialize)]
|
|
339
|
+
pub struct ListResponse {
|
|
340
|
+
pub git_url: String,
|
|
341
|
+
pub entries: Vec<Entry>,
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
#[derive(Default, Debug, Clone, Deserialize)]
|
|
345
|
+
pub struct Entry {
|
|
346
|
+
pub path: String,
|
|
347
|
+
pub sha: String,
|
|
348
|
+
pub size: u64,
|
|
349
|
+
#[serde(rename = "type")]
|
|
350
|
+
pub type_field: String,
|
|
351
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
|
|
20
|
+
use super::core::*;
|
|
21
|
+
use crate::raw::*;
|
|
22
|
+
use crate::*;
|
|
23
|
+
|
|
24
|
+
pub struct GithubDeleter {
|
|
25
|
+
core: Arc<GithubCore>,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
impl GithubDeleter {
|
|
29
|
+
pub fn new(core: Arc<GithubCore>) -> Self {
|
|
30
|
+
Self { core }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
impl oio::OneShotDelete for GithubDeleter {
|
|
35
|
+
async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
|
|
36
|
+
match self.core.delete(&path).await {
|
|
37
|
+
Ok(_) => Ok(()),
|
|
38
|
+
Err(err) => Err(err),
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [ ] create_dir
|
|
9
|
+
- [x] delete
|
|
10
|
+
- [ ] copy
|
|
11
|
+
- [ ] rename
|
|
12
|
+
- [x] list
|
|
13
|
+
- [ ] presign
|
|
14
|
+
- [ ] blocking
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
- `root`: Set the work directory for backend
|
|
19
|
+
- `token`: Github access token
|
|
20
|
+
- `owner`: Github owner
|
|
21
|
+
- `repo`: Github repository
|
|
22
|
+
|
|
23
|
+
You can refer to [`GithubBuilder`]'s docs for more information
|
|
24
|
+
|
|
25
|
+
## Example
|
|
26
|
+
|
|
27
|
+
### Via Builder
|
|
28
|
+
|
|
29
|
+
```rust,no_run
|
|
30
|
+
use anyhow::Result;
|
|
31
|
+
use opendal::services::Github;
|
|
32
|
+
use opendal::Operator;
|
|
33
|
+
|
|
34
|
+
#[tokio::main]
|
|
35
|
+
async fn main() -> Result<()> {
|
|
36
|
+
// create backend builder
|
|
37
|
+
let mut builder = Github::default()
|
|
38
|
+
// set the storage root for OpenDAL
|
|
39
|
+
.root("/")
|
|
40
|
+
// set the access token for Github API
|
|
41
|
+
.token("your_access_token")
|
|
42
|
+
// set the owner for Github
|
|
43
|
+
.owner("your_owner")
|
|
44
|
+
// set the repository for Github
|
|
45
|
+
.repo("your_repo");
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
49
|
+
|
|
50
|
+
Ok(())
|
|
51
|
+
}
|
|
52
|
+
```
|
|
@@ -0,0 +1,101 @@
|
|
|
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 bytes::Buf;
|
|
19
|
+
use http::Response;
|
|
20
|
+
use serde::Deserialize;
|
|
21
|
+
|
|
22
|
+
use crate::raw::*;
|
|
23
|
+
use crate::*;
|
|
24
|
+
|
|
25
|
+
#[derive(Default, Debug, Deserialize)]
|
|
26
|
+
#[allow(dead_code)]
|
|
27
|
+
struct GithubError {
|
|
28
|
+
error: GithubSubError,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
#[derive(Default, Debug, Deserialize)]
|
|
32
|
+
#[allow(dead_code)]
|
|
33
|
+
struct GithubSubError {
|
|
34
|
+
message: String,
|
|
35
|
+
documentation_url: String,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// Parse error response into Error.
|
|
39
|
+
pub(super) fn parse_error(resp: Response<Buffer>) -> Error {
|
|
40
|
+
let (parts, body) = resp.into_parts();
|
|
41
|
+
let bs = body.to_bytes();
|
|
42
|
+
|
|
43
|
+
let (kind, retryable) = match parts.status.as_u16() {
|
|
44
|
+
401 | 403 => (ErrorKind::PermissionDenied, false),
|
|
45
|
+
404 => (ErrorKind::NotFound, false),
|
|
46
|
+
304 | 412 => (ErrorKind::ConditionNotMatch, false),
|
|
47
|
+
// https://github.com/apache/opendal/issues/4146
|
|
48
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/423
|
|
49
|
+
// We should retry it when we get 423 error.
|
|
50
|
+
423 => (ErrorKind::RateLimited, true),
|
|
51
|
+
// Service like Upyun could return 499 error with a message like:
|
|
52
|
+
// Client Disconnect, we should retry it.
|
|
53
|
+
499 => (ErrorKind::Unexpected, true),
|
|
54
|
+
500 | 502 | 503 | 504 => (ErrorKind::Unexpected, true),
|
|
55
|
+
_ => (ErrorKind::Unexpected, false),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
let (message, _github_content_err) =
|
|
59
|
+
serde_json::from_reader::<_, GithubError>(bs.clone().reader())
|
|
60
|
+
.map(|github_content_err| (format!("{github_content_err:?}"), Some(github_content_err)))
|
|
61
|
+
.unwrap_or_else(|_| (String::from_utf8_lossy(&bs).into_owned(), None));
|
|
62
|
+
|
|
63
|
+
let mut err = Error::new(kind, message);
|
|
64
|
+
|
|
65
|
+
err = with_error_response_context(err, parts);
|
|
66
|
+
|
|
67
|
+
if retryable {
|
|
68
|
+
err = err.set_temporary();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
err
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#[cfg(test)]
|
|
75
|
+
mod test {
|
|
76
|
+
use http::StatusCode;
|
|
77
|
+
|
|
78
|
+
use super::*;
|
|
79
|
+
|
|
80
|
+
#[tokio::test]
|
|
81
|
+
async fn test_parse_error() {
|
|
82
|
+
let err_res = vec![(
|
|
83
|
+
r#"{
|
|
84
|
+
"message": "Not Found",
|
|
85
|
+
"documentation_url": "https://docs.github.com/rest/repos/contents#get-repository-content"
|
|
86
|
+
}"#,
|
|
87
|
+
ErrorKind::NotFound,
|
|
88
|
+
StatusCode::NOT_FOUND,
|
|
89
|
+
)];
|
|
90
|
+
|
|
91
|
+
for res in err_res {
|
|
92
|
+
let bs = bytes::Bytes::from(res.0);
|
|
93
|
+
let body = Buffer::from(bs);
|
|
94
|
+
let resp = Response::builder().status(res.2).body(body).unwrap();
|
|
95
|
+
|
|
96
|
+
let err = parse_error(resp);
|
|
97
|
+
|
|
98
|
+
assert_eq!(err.kind(), res.1);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
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
|
+
|
|
20
|
+
use super::core::GithubCore;
|
|
21
|
+
use crate::raw::oio::Entry;
|
|
22
|
+
use crate::raw::*;
|
|
23
|
+
use crate::*;
|
|
24
|
+
|
|
25
|
+
pub struct GithubLister {
|
|
26
|
+
core: Arc<GithubCore>,
|
|
27
|
+
|
|
28
|
+
path: String,
|
|
29
|
+
recursive: bool,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
impl GithubLister {
|
|
33
|
+
pub fn new(core: Arc<GithubCore>, path: &str, recursive: bool) -> Self {
|
|
34
|
+
Self {
|
|
35
|
+
core,
|
|
36
|
+
|
|
37
|
+
path: path.to_string(),
|
|
38
|
+
recursive,
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
impl oio::PageList for GithubLister {
|
|
44
|
+
async fn next_page(&self, ctx: &mut oio::PageContext) -> Result<()> {
|
|
45
|
+
let resp = self.core.list(&self.path).await?;
|
|
46
|
+
|
|
47
|
+
// Record whether there is a dir in the list so that we need recursive later.
|
|
48
|
+
let has_dir = resp.entries.iter().any(|e| e.type_field == "dir");
|
|
49
|
+
|
|
50
|
+
ctx.done = true;
|
|
51
|
+
|
|
52
|
+
if !self.recursive || !has_dir {
|
|
53
|
+
for entry in resp.entries {
|
|
54
|
+
let path = build_rel_path(&self.core.root, &entry.path);
|
|
55
|
+
let entry = if entry.type_field == "dir" {
|
|
56
|
+
let path = format!("{path}/");
|
|
57
|
+
Entry::new(&path, Metadata::new(EntryMode::DIR))
|
|
58
|
+
} else {
|
|
59
|
+
if path.ends_with(".gitkeep") {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
let m = Metadata::new(EntryMode::FILE)
|
|
63
|
+
.with_content_length(entry.size)
|
|
64
|
+
.with_etag(entry.sha);
|
|
65
|
+
Entry::new(&path, m)
|
|
66
|
+
};
|
|
67
|
+
ctx.entries.push_back(entry);
|
|
68
|
+
}
|
|
69
|
+
if !self.path.ends_with('/') {
|
|
70
|
+
ctx.entries.push_back(Entry::new(
|
|
71
|
+
&format!("{}/", self.path),
|
|
72
|
+
Metadata::new(EntryMode::DIR),
|
|
73
|
+
));
|
|
74
|
+
}
|
|
75
|
+
return Ok(());
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// if recursive is true and there is a dir in the list, we need to list it recursively.
|
|
79
|
+
|
|
80
|
+
let tree = self.core.list_with_recursive(&resp.git_url).await?;
|
|
81
|
+
for t in tree {
|
|
82
|
+
let path = if self.path == "/" {
|
|
83
|
+
t.path
|
|
84
|
+
} else {
|
|
85
|
+
format!("{}/{}", self.path, t.path)
|
|
86
|
+
};
|
|
87
|
+
let entry = if t.type_field == "tree" {
|
|
88
|
+
let path = format!("{path}/");
|
|
89
|
+
Entry::new(&path, Metadata::new(EntryMode::DIR))
|
|
90
|
+
} else {
|
|
91
|
+
if path.ends_with(".gitkeep") {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
let mut m = Metadata::new(EntryMode::FILE).with_etag(t.sha);
|
|
95
|
+
|
|
96
|
+
if let Some(size) = t.size {
|
|
97
|
+
m = m.with_content_length(size);
|
|
98
|
+
}
|
|
99
|
+
Entry::new(&path, m)
|
|
100
|
+
};
|
|
101
|
+
ctx.entries.push_back(entry);
|
|
102
|
+
}
|
|
103
|
+
if !self.path.ends_with('/') {
|
|
104
|
+
ctx.entries.push_back(Entry::new(
|
|
105
|
+
&format!("{}/", self.path),
|
|
106
|
+
Metadata::new(EntryMode::DIR),
|
|
107
|
+
));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
Ok(())
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
/// Default scheme for github service.
|
|
19
|
+
#[cfg(feature = "services-github")]
|
|
20
|
+
pub(super) const DEFAULT_SCHEME: &str = "github";
|
|
21
|
+
#[cfg(feature = "services-github")]
|
|
22
|
+
mod core;
|
|
23
|
+
#[cfg(feature = "services-github")]
|
|
24
|
+
mod delete;
|
|
25
|
+
#[cfg(feature = "services-github")]
|
|
26
|
+
mod error;
|
|
27
|
+
#[cfg(feature = "services-github")]
|
|
28
|
+
mod lister;
|
|
29
|
+
#[cfg(feature = "services-github")]
|
|
30
|
+
mod writer;
|
|
31
|
+
|
|
32
|
+
#[cfg(feature = "services-github")]
|
|
33
|
+
mod backend;
|
|
34
|
+
#[cfg(feature = "services-github")]
|
|
35
|
+
pub use backend::GithubBuilder as Github;
|
|
36
|
+
|
|
37
|
+
mod config;
|
|
38
|
+
pub use config::GithubConfig;
|