maxframe 0.1.0b5__cp310-cp310-macosx_11_0_arm64.whl
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.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +32 -0
- maxframe/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pxd +33 -0
- maxframe/_utils.pyx +547 -0
- maxframe/codegen.py +528 -0
- maxframe/config/__init__.py +15 -0
- maxframe/config/config.py +443 -0
- maxframe/config/tests/__init__.py +13 -0
- maxframe/config/tests/test_config.py +103 -0
- maxframe/config/tests/test_validators.py +34 -0
- maxframe/config/validators.py +57 -0
- maxframe/conftest.py +139 -0
- maxframe/core/__init__.py +65 -0
- maxframe/core/base.py +156 -0
- maxframe/core/entity/__init__.py +44 -0
- maxframe/core/entity/chunks.py +68 -0
- maxframe/core/entity/core.py +152 -0
- maxframe/core/entity/executable.py +337 -0
- maxframe/core/entity/fuse.py +73 -0
- maxframe/core/entity/objects.py +100 -0
- maxframe/core/entity/output_types.py +90 -0
- maxframe/core/entity/tileables.py +438 -0
- maxframe/core/entity/utils.py +24 -0
- maxframe/core/graph/__init__.py +17 -0
- maxframe/core/graph/builder/__init__.py +16 -0
- maxframe/core/graph/builder/base.py +86 -0
- maxframe/core/graph/builder/chunk.py +430 -0
- maxframe/core/graph/builder/tileable.py +34 -0
- maxframe/core/graph/builder/utils.py +41 -0
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +467 -0
- maxframe/core/graph/entity.py +171 -0
- maxframe/core/graph/tests/__init__.py +13 -0
- maxframe/core/graph/tests/test_graph.py +205 -0
- maxframe/core/mode.py +96 -0
- maxframe/core/operator/__init__.py +34 -0
- maxframe/core/operator/base.py +450 -0
- maxframe/core/operator/core.py +276 -0
- maxframe/core/operator/fetch.py +53 -0
- maxframe/core/operator/fuse.py +29 -0
- maxframe/core/operator/objects.py +72 -0
- maxframe/core/operator/shuffle.py +111 -0
- maxframe/core/operator/tests/__init__.py +13 -0
- maxframe/core/operator/tests/test_core.py +64 -0
- maxframe/core/tests/__init__.py +13 -0
- maxframe/core/tests/test_mode.py +75 -0
- maxframe/dataframe/__init__.py +81 -0
- maxframe/dataframe/arithmetic/__init__.py +359 -0
- maxframe/dataframe/arithmetic/abs.py +33 -0
- maxframe/dataframe/arithmetic/add.py +60 -0
- maxframe/dataframe/arithmetic/arccos.py +28 -0
- maxframe/dataframe/arithmetic/arccosh.py +28 -0
- maxframe/dataframe/arithmetic/arcsin.py +28 -0
- maxframe/dataframe/arithmetic/arcsinh.py +28 -0
- maxframe/dataframe/arithmetic/arctan.py +28 -0
- maxframe/dataframe/arithmetic/arctanh.py +28 -0
- maxframe/dataframe/arithmetic/around.py +152 -0
- maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
- maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
- maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
- maxframe/dataframe/arithmetic/ceil.py +28 -0
- maxframe/dataframe/arithmetic/core.py +342 -0
- maxframe/dataframe/arithmetic/cos.py +28 -0
- maxframe/dataframe/arithmetic/cosh.py +28 -0
- maxframe/dataframe/arithmetic/degrees.py +28 -0
- maxframe/dataframe/arithmetic/docstring.py +442 -0
- maxframe/dataframe/arithmetic/equal.py +56 -0
- maxframe/dataframe/arithmetic/exp.py +28 -0
- maxframe/dataframe/arithmetic/exp2.py +28 -0
- maxframe/dataframe/arithmetic/expm1.py +28 -0
- maxframe/dataframe/arithmetic/floor.py +28 -0
- maxframe/dataframe/arithmetic/floordiv.py +64 -0
- maxframe/dataframe/arithmetic/greater.py +57 -0
- maxframe/dataframe/arithmetic/greater_equal.py +57 -0
- maxframe/dataframe/arithmetic/invert.py +33 -0
- maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
- maxframe/dataframe/arithmetic/less.py +57 -0
- maxframe/dataframe/arithmetic/less_equal.py +57 -0
- maxframe/dataframe/arithmetic/log.py +28 -0
- maxframe/dataframe/arithmetic/log10.py +28 -0
- maxframe/dataframe/arithmetic/log2.py +28 -0
- maxframe/dataframe/arithmetic/mod.py +60 -0
- maxframe/dataframe/arithmetic/multiply.py +60 -0
- maxframe/dataframe/arithmetic/negative.py +33 -0
- maxframe/dataframe/arithmetic/not_equal.py +56 -0
- maxframe/dataframe/arithmetic/power.py +68 -0
- maxframe/dataframe/arithmetic/radians.py +28 -0
- maxframe/dataframe/arithmetic/sin.py +28 -0
- maxframe/dataframe/arithmetic/sinh.py +28 -0
- maxframe/dataframe/arithmetic/sqrt.py +28 -0
- maxframe/dataframe/arithmetic/subtract.py +64 -0
- maxframe/dataframe/arithmetic/tan.py +28 -0
- maxframe/dataframe/arithmetic/tanh.py +28 -0
- maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
- maxframe/dataframe/arithmetic/truediv.py +64 -0
- maxframe/dataframe/arithmetic/trunc.py +28 -0
- maxframe/dataframe/arrays.py +864 -0
- maxframe/dataframe/core.py +2417 -0
- maxframe/dataframe/datasource/__init__.py +15 -0
- maxframe/dataframe/datasource/core.py +81 -0
- maxframe/dataframe/datasource/dataframe.py +59 -0
- maxframe/dataframe/datasource/date_range.py +504 -0
- maxframe/dataframe/datasource/from_index.py +54 -0
- maxframe/dataframe/datasource/from_records.py +107 -0
- maxframe/dataframe/datasource/from_tensor.py +419 -0
- maxframe/dataframe/datasource/index.py +117 -0
- maxframe/dataframe/datasource/read_csv.py +528 -0
- maxframe/dataframe/datasource/read_odps_query.py +299 -0
- maxframe/dataframe/datasource/read_odps_table.py +253 -0
- maxframe/dataframe/datasource/read_parquet.py +421 -0
- maxframe/dataframe/datasource/series.py +55 -0
- maxframe/dataframe/datasource/tests/__init__.py +13 -0
- maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
- maxframe/dataframe/datastore/__init__.py +26 -0
- maxframe/dataframe/datastore/core.py +19 -0
- maxframe/dataframe/datastore/to_csv.py +227 -0
- maxframe/dataframe/datastore/to_odps.py +162 -0
- maxframe/dataframe/extensions/__init__.py +41 -0
- maxframe/dataframe/extensions/accessor.py +50 -0
- maxframe/dataframe/extensions/reshuffle.py +83 -0
- maxframe/dataframe/extensions/tests/__init__.py +13 -0
- maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
- maxframe/dataframe/fetch/__init__.py +15 -0
- maxframe/dataframe/fetch/core.py +86 -0
- maxframe/dataframe/groupby/__init__.py +82 -0
- maxframe/dataframe/groupby/aggregation.py +350 -0
- maxframe/dataframe/groupby/apply.py +251 -0
- maxframe/dataframe/groupby/core.py +179 -0
- maxframe/dataframe/groupby/cum.py +124 -0
- maxframe/dataframe/groupby/fill.py +141 -0
- maxframe/dataframe/groupby/getitem.py +92 -0
- maxframe/dataframe/groupby/head.py +105 -0
- maxframe/dataframe/groupby/sample.py +214 -0
- maxframe/dataframe/groupby/tests/__init__.py +13 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
- maxframe/dataframe/groupby/transform.py +255 -0
- maxframe/dataframe/indexing/__init__.py +84 -0
- maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
- maxframe/dataframe/indexing/align.py +349 -0
- maxframe/dataframe/indexing/at.py +83 -0
- maxframe/dataframe/indexing/getitem.py +204 -0
- maxframe/dataframe/indexing/iat.py +37 -0
- maxframe/dataframe/indexing/iloc.py +566 -0
- maxframe/dataframe/indexing/insert.py +86 -0
- maxframe/dataframe/indexing/loc.py +411 -0
- maxframe/dataframe/indexing/reindex.py +526 -0
- maxframe/dataframe/indexing/rename.py +462 -0
- maxframe/dataframe/indexing/rename_axis.py +209 -0
- maxframe/dataframe/indexing/reset_index.py +402 -0
- maxframe/dataframe/indexing/sample.py +221 -0
- maxframe/dataframe/indexing/set_axis.py +194 -0
- maxframe/dataframe/indexing/set_index.py +61 -0
- maxframe/dataframe/indexing/setitem.py +130 -0
- maxframe/dataframe/indexing/tests/__init__.py +13 -0
- maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
- maxframe/dataframe/indexing/where.py +308 -0
- maxframe/dataframe/initializer.py +288 -0
- maxframe/dataframe/merge/__init__.py +32 -0
- maxframe/dataframe/merge/append.py +121 -0
- maxframe/dataframe/merge/concat.py +325 -0
- maxframe/dataframe/merge/merge.py +593 -0
- maxframe/dataframe/merge/tests/__init__.py +13 -0
- maxframe/dataframe/merge/tests/test_merge.py +215 -0
- maxframe/dataframe/misc/__init__.py +134 -0
- maxframe/dataframe/misc/_duplicate.py +46 -0
- maxframe/dataframe/misc/accessor.py +276 -0
- maxframe/dataframe/misc/apply.py +692 -0
- maxframe/dataframe/misc/astype.py +236 -0
- maxframe/dataframe/misc/case_when.py +141 -0
- maxframe/dataframe/misc/check_monotonic.py +84 -0
- maxframe/dataframe/misc/cut.py +383 -0
- maxframe/dataframe/misc/datetimes.py +79 -0
- maxframe/dataframe/misc/describe.py +108 -0
- maxframe/dataframe/misc/diff.py +210 -0
- maxframe/dataframe/misc/drop.py +440 -0
- maxframe/dataframe/misc/drop_duplicates.py +248 -0
- maxframe/dataframe/misc/duplicated.py +292 -0
- maxframe/dataframe/misc/eval.py +728 -0
- maxframe/dataframe/misc/explode.py +171 -0
- maxframe/dataframe/misc/get_dummies.py +208 -0
- maxframe/dataframe/misc/isin.py +217 -0
- maxframe/dataframe/misc/map.py +236 -0
- maxframe/dataframe/misc/melt.py +162 -0
- maxframe/dataframe/misc/memory_usage.py +248 -0
- maxframe/dataframe/misc/pct_change.py +150 -0
- maxframe/dataframe/misc/pivot_table.py +262 -0
- maxframe/dataframe/misc/qcut.py +104 -0
- maxframe/dataframe/misc/select_dtypes.py +104 -0
- maxframe/dataframe/misc/shift.py +256 -0
- maxframe/dataframe/misc/stack.py +238 -0
- maxframe/dataframe/misc/string_.py +221 -0
- maxframe/dataframe/misc/tests/__init__.py +13 -0
- maxframe/dataframe/misc/tests/test_misc.py +468 -0
- maxframe/dataframe/misc/to_numeric.py +178 -0
- maxframe/dataframe/misc/transform.py +361 -0
- maxframe/dataframe/misc/transpose.py +136 -0
- maxframe/dataframe/misc/value_counts.py +182 -0
- maxframe/dataframe/missing/__init__.py +53 -0
- maxframe/dataframe/missing/checkna.py +223 -0
- maxframe/dataframe/missing/dropna.py +280 -0
- maxframe/dataframe/missing/fillna.py +275 -0
- maxframe/dataframe/missing/replace.py +439 -0
- maxframe/dataframe/missing/tests/__init__.py +13 -0
- maxframe/dataframe/missing/tests/test_missing.py +89 -0
- maxframe/dataframe/operators.py +273 -0
- maxframe/dataframe/plotting/__init__.py +40 -0
- maxframe/dataframe/plotting/core.py +78 -0
- maxframe/dataframe/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
- maxframe/dataframe/reduction/__init__.py +107 -0
- maxframe/dataframe/reduction/aggregation.py +344 -0
- maxframe/dataframe/reduction/all.py +78 -0
- maxframe/dataframe/reduction/any.py +78 -0
- maxframe/dataframe/reduction/core.py +837 -0
- maxframe/dataframe/reduction/count.py +59 -0
- maxframe/dataframe/reduction/cummax.py +30 -0
- maxframe/dataframe/reduction/cummin.py +30 -0
- maxframe/dataframe/reduction/cumprod.py +30 -0
- maxframe/dataframe/reduction/cumsum.py +30 -0
- maxframe/dataframe/reduction/custom_reduction.py +42 -0
- maxframe/dataframe/reduction/kurtosis.py +104 -0
- maxframe/dataframe/reduction/max.py +65 -0
- maxframe/dataframe/reduction/mean.py +61 -0
- maxframe/dataframe/reduction/min.py +65 -0
- maxframe/dataframe/reduction/nunique.py +141 -0
- maxframe/dataframe/reduction/prod.py +76 -0
- maxframe/dataframe/reduction/reduction_size.py +36 -0
- maxframe/dataframe/reduction/sem.py +69 -0
- maxframe/dataframe/reduction/skew.py +89 -0
- maxframe/dataframe/reduction/std.py +53 -0
- maxframe/dataframe/reduction/str_concat.py +48 -0
- maxframe/dataframe/reduction/sum.py +77 -0
- maxframe/dataframe/reduction/tests/__init__.py +13 -0
- maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
- maxframe/dataframe/reduction/unique.py +90 -0
- maxframe/dataframe/reduction/var.py +72 -0
- maxframe/dataframe/sort/__init__.py +34 -0
- maxframe/dataframe/sort/core.py +36 -0
- maxframe/dataframe/sort/sort_index.py +153 -0
- maxframe/dataframe/sort/sort_values.py +311 -0
- maxframe/dataframe/sort/tests/__init__.py +13 -0
- maxframe/dataframe/sort/tests/test_sort.py +81 -0
- maxframe/dataframe/statistics/__init__.py +33 -0
- maxframe/dataframe/statistics/corr.py +280 -0
- maxframe/dataframe/statistics/quantile.py +341 -0
- maxframe/dataframe/statistics/tests/__init__.py +13 -0
- maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
- maxframe/dataframe/tests/__init__.py +13 -0
- maxframe/dataframe/tests/test_initializer.py +29 -0
- maxframe/dataframe/tseries/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
- maxframe/dataframe/tseries/to_datetime.py +297 -0
- maxframe/dataframe/ufunc/__init__.py +27 -0
- maxframe/dataframe/ufunc/tensor.py +54 -0
- maxframe/dataframe/ufunc/ufunc.py +52 -0
- maxframe/dataframe/utils.py +1267 -0
- maxframe/dataframe/window/__init__.py +29 -0
- maxframe/dataframe/window/aggregation.py +96 -0
- maxframe/dataframe/window/core.py +69 -0
- maxframe/dataframe/window/ewm.py +249 -0
- maxframe/dataframe/window/expanding.py +147 -0
- maxframe/dataframe/window/rolling.py +376 -0
- maxframe/dataframe/window/tests/__init__.py +13 -0
- maxframe/dataframe/window/tests/test_ewm.py +70 -0
- maxframe/dataframe/window/tests/test_expanding.py +66 -0
- maxframe/dataframe/window/tests/test_rolling.py +57 -0
- maxframe/env.py +33 -0
- maxframe/errors.py +21 -0
- maxframe/extension.py +81 -0
- maxframe/learn/__init__.py +17 -0
- maxframe/learn/contrib/__init__.py +17 -0
- maxframe/learn/contrib/pytorch/__init__.py +16 -0
- maxframe/learn/contrib/pytorch/run_function.py +110 -0
- maxframe/learn/contrib/pytorch/run_script.py +102 -0
- maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
- maxframe/learn/contrib/utils.py +52 -0
- maxframe/learn/contrib/xgboost/__init__.py +26 -0
- maxframe/learn/contrib/xgboost/classifier.py +86 -0
- maxframe/learn/contrib/xgboost/core.py +156 -0
- maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
- maxframe/learn/contrib/xgboost/predict.py +138 -0
- maxframe/learn/contrib/xgboost/regressor.py +78 -0
- maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
- maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
- maxframe/learn/contrib/xgboost/train.py +121 -0
- maxframe/learn/utils/__init__.py +15 -0
- maxframe/learn/utils/core.py +29 -0
- maxframe/lib/__init__.py +15 -0
- maxframe/lib/aio/__init__.py +27 -0
- maxframe/lib/aio/_runners.py +162 -0
- maxframe/lib/aio/_threads.py +35 -0
- maxframe/lib/aio/base.py +82 -0
- maxframe/lib/aio/file.py +85 -0
- maxframe/lib/aio/isolation.py +100 -0
- maxframe/lib/aio/lru.py +242 -0
- maxframe/lib/aio/parallelism.py +37 -0
- maxframe/lib/aio/tests/__init__.py +13 -0
- maxframe/lib/aio/tests/test_aio_file.py +55 -0
- maxframe/lib/compression.py +55 -0
- maxframe/lib/cython/__init__.py +13 -0
- maxframe/lib/cython/libcpp.pxd +30 -0
- maxframe/lib/filesystem/__init__.py +21 -0
- maxframe/lib/filesystem/_glob.py +173 -0
- maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
- maxframe/lib/filesystem/_oss_lib/common.py +198 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
- maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
- maxframe/lib/filesystem/arrow.py +236 -0
- maxframe/lib/filesystem/base.py +263 -0
- maxframe/lib/filesystem/core.py +95 -0
- maxframe/lib/filesystem/fsmap.py +164 -0
- maxframe/lib/filesystem/hdfs.py +31 -0
- maxframe/lib/filesystem/local.py +112 -0
- maxframe/lib/filesystem/oss.py +157 -0
- maxframe/lib/filesystem/tests/__init__.py +13 -0
- maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
- maxframe/lib/filesystem/tests/test_oss.py +182 -0
- maxframe/lib/functools_compat.py +81 -0
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
- maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
- maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
- maxframe/lib/sparse/__init__.py +861 -0
- maxframe/lib/sparse/array.py +1604 -0
- maxframe/lib/sparse/core.py +92 -0
- maxframe/lib/sparse/matrix.py +241 -0
- maxframe/lib/sparse/tests/__init__.py +15 -0
- maxframe/lib/sparse/tests/test_sparse.py +476 -0
- maxframe/lib/sparse/vector.py +150 -0
- maxframe/lib/tblib/LICENSE +20 -0
- maxframe/lib/tblib/__init__.py +327 -0
- maxframe/lib/tblib/cpython.py +83 -0
- maxframe/lib/tblib/decorators.py +44 -0
- maxframe/lib/tblib/pickling_support.py +90 -0
- maxframe/lib/tests/__init__.py +13 -0
- maxframe/lib/tests/test_wrapped_pickle.py +51 -0
- maxframe/lib/version.py +620 -0
- maxframe/lib/wrapped_pickle.py +139 -0
- maxframe/mixin.py +100 -0
- maxframe/odpsio/__init__.py +21 -0
- maxframe/odpsio/arrow.py +91 -0
- maxframe/odpsio/schema.py +364 -0
- maxframe/odpsio/tableio.py +322 -0
- maxframe/odpsio/tests/__init__.py +13 -0
- maxframe/odpsio/tests/test_arrow.py +88 -0
- maxframe/odpsio/tests/test_schema.py +297 -0
- maxframe/odpsio/tests/test_tableio.py +136 -0
- maxframe/odpsio/tests/test_volumeio.py +90 -0
- maxframe/odpsio/volumeio.py +95 -0
- maxframe/opcodes.py +590 -0
- maxframe/protocol.py +415 -0
- maxframe/remote/__init__.py +18 -0
- maxframe/remote/core.py +210 -0
- maxframe/remote/run_script.py +121 -0
- maxframe/serialization/__init__.py +26 -0
- maxframe/serialization/arrow.py +95 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +44 -0
- maxframe/serialization/core.pyi +61 -0
- maxframe/serialization/core.pyx +1094 -0
- maxframe/serialization/exception.py +86 -0
- maxframe/serialization/maxframe_objects.py +39 -0
- maxframe/serialization/numpy.py +91 -0
- maxframe/serialization/pandas.py +202 -0
- maxframe/serialization/scipy.py +71 -0
- maxframe/serialization/serializables/__init__.py +55 -0
- maxframe/serialization/serializables/core.py +262 -0
- maxframe/serialization/serializables/field.py +624 -0
- maxframe/serialization/serializables/field_type.py +589 -0
- maxframe/serialization/serializables/tests/__init__.py +13 -0
- maxframe/serialization/serializables/tests/test_field_type.py +121 -0
- maxframe/serialization/serializables/tests/test_serializable.py +250 -0
- maxframe/serialization/tests/__init__.py +13 -0
- maxframe/serialization/tests/test_serial.py +412 -0
- maxframe/session.py +1310 -0
- maxframe/tensor/__init__.py +183 -0
- maxframe/tensor/arithmetic/__init__.py +315 -0
- maxframe/tensor/arithmetic/abs.py +68 -0
- maxframe/tensor/arithmetic/absolute.py +68 -0
- maxframe/tensor/arithmetic/add.py +82 -0
- maxframe/tensor/arithmetic/angle.py +72 -0
- maxframe/tensor/arithmetic/arccos.py +104 -0
- maxframe/tensor/arithmetic/arccosh.py +91 -0
- maxframe/tensor/arithmetic/arcsin.py +94 -0
- maxframe/tensor/arithmetic/arcsinh.py +86 -0
- maxframe/tensor/arithmetic/arctan.py +106 -0
- maxframe/tensor/arithmetic/arctan2.py +128 -0
- maxframe/tensor/arithmetic/arctanh.py +86 -0
- maxframe/tensor/arithmetic/around.py +114 -0
- maxframe/tensor/arithmetic/bitand.py +95 -0
- maxframe/tensor/arithmetic/bitor.py +102 -0
- maxframe/tensor/arithmetic/bitxor.py +95 -0
- maxframe/tensor/arithmetic/cbrt.py +66 -0
- maxframe/tensor/arithmetic/ceil.py +71 -0
- maxframe/tensor/arithmetic/clip.py +165 -0
- maxframe/tensor/arithmetic/conj.py +74 -0
- maxframe/tensor/arithmetic/copysign.py +78 -0
- maxframe/tensor/arithmetic/core.py +544 -0
- maxframe/tensor/arithmetic/cos.py +85 -0
- maxframe/tensor/arithmetic/cosh.py +72 -0
- maxframe/tensor/arithmetic/deg2rad.py +72 -0
- maxframe/tensor/arithmetic/degrees.py +77 -0
- maxframe/tensor/arithmetic/divide.py +114 -0
- maxframe/tensor/arithmetic/equal.py +76 -0
- maxframe/tensor/arithmetic/exp.py +106 -0
- maxframe/tensor/arithmetic/exp2.py +67 -0
- maxframe/tensor/arithmetic/expm1.py +79 -0
- maxframe/tensor/arithmetic/fabs.py +74 -0
- maxframe/tensor/arithmetic/fix.py +69 -0
- maxframe/tensor/arithmetic/float_power.py +103 -0
- maxframe/tensor/arithmetic/floor.py +77 -0
- maxframe/tensor/arithmetic/floordiv.py +94 -0
- maxframe/tensor/arithmetic/fmax.py +105 -0
- maxframe/tensor/arithmetic/fmin.py +106 -0
- maxframe/tensor/arithmetic/fmod.py +99 -0
- maxframe/tensor/arithmetic/frexp.py +92 -0
- maxframe/tensor/arithmetic/greater.py +77 -0
- maxframe/tensor/arithmetic/greater_equal.py +69 -0
- maxframe/tensor/arithmetic/hypot.py +77 -0
- maxframe/tensor/arithmetic/i0.py +89 -0
- maxframe/tensor/arithmetic/imag.py +67 -0
- maxframe/tensor/arithmetic/invert.py +110 -0
- maxframe/tensor/arithmetic/isclose.py +115 -0
- maxframe/tensor/arithmetic/iscomplex.py +64 -0
- maxframe/tensor/arithmetic/isfinite.py +106 -0
- maxframe/tensor/arithmetic/isinf.py +103 -0
- maxframe/tensor/arithmetic/isnan.py +82 -0
- maxframe/tensor/arithmetic/isreal.py +63 -0
- maxframe/tensor/arithmetic/ldexp.py +99 -0
- maxframe/tensor/arithmetic/less.py +69 -0
- maxframe/tensor/arithmetic/less_equal.py +69 -0
- maxframe/tensor/arithmetic/log.py +92 -0
- maxframe/tensor/arithmetic/log10.py +85 -0
- maxframe/tensor/arithmetic/log1p.py +95 -0
- maxframe/tensor/arithmetic/log2.py +85 -0
- maxframe/tensor/arithmetic/logaddexp.py +80 -0
- maxframe/tensor/arithmetic/logaddexp2.py +78 -0
- maxframe/tensor/arithmetic/logical_and.py +81 -0
- maxframe/tensor/arithmetic/logical_not.py +74 -0
- maxframe/tensor/arithmetic/logical_or.py +82 -0
- maxframe/tensor/arithmetic/logical_xor.py +88 -0
- maxframe/tensor/arithmetic/lshift.py +82 -0
- maxframe/tensor/arithmetic/maximum.py +108 -0
- maxframe/tensor/arithmetic/minimum.py +108 -0
- maxframe/tensor/arithmetic/mod.py +104 -0
- maxframe/tensor/arithmetic/modf.py +83 -0
- maxframe/tensor/arithmetic/multiply.py +81 -0
- maxframe/tensor/arithmetic/nan_to_num.py +99 -0
- maxframe/tensor/arithmetic/negative.py +65 -0
- maxframe/tensor/arithmetic/nextafter.py +68 -0
- maxframe/tensor/arithmetic/not_equal.py +72 -0
- maxframe/tensor/arithmetic/positive.py +47 -0
- maxframe/tensor/arithmetic/power.py +106 -0
- maxframe/tensor/arithmetic/rad2deg.py +71 -0
- maxframe/tensor/arithmetic/radians.py +77 -0
- maxframe/tensor/arithmetic/real.py +70 -0
- maxframe/tensor/arithmetic/reciprocal.py +76 -0
- maxframe/tensor/arithmetic/rint.py +68 -0
- maxframe/tensor/arithmetic/rshift.py +81 -0
- maxframe/tensor/arithmetic/setimag.py +29 -0
- maxframe/tensor/arithmetic/setreal.py +29 -0
- maxframe/tensor/arithmetic/sign.py +81 -0
- maxframe/tensor/arithmetic/signbit.py +65 -0
- maxframe/tensor/arithmetic/sin.py +98 -0
- maxframe/tensor/arithmetic/sinc.py +102 -0
- maxframe/tensor/arithmetic/sinh.py +93 -0
- maxframe/tensor/arithmetic/spacing.py +72 -0
- maxframe/tensor/arithmetic/sqrt.py +81 -0
- maxframe/tensor/arithmetic/square.py +69 -0
- maxframe/tensor/arithmetic/subtract.py +81 -0
- maxframe/tensor/arithmetic/tan.py +88 -0
- maxframe/tensor/arithmetic/tanh.py +92 -0
- maxframe/tensor/arithmetic/tests/__init__.py +15 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
- maxframe/tensor/arithmetic/truediv.py +104 -0
- maxframe/tensor/arithmetic/trunc.py +72 -0
- maxframe/tensor/arithmetic/utils.py +65 -0
- maxframe/tensor/array_utils.py +186 -0
- maxframe/tensor/base/__init__.py +34 -0
- maxframe/tensor/base/astype.py +119 -0
- maxframe/tensor/base/atleast_1d.py +74 -0
- maxframe/tensor/base/broadcast_to.py +89 -0
- maxframe/tensor/base/ravel.py +92 -0
- maxframe/tensor/base/tests/__init__.py +13 -0
- maxframe/tensor/base/tests/test_base.py +114 -0
- maxframe/tensor/base/transpose.py +125 -0
- maxframe/tensor/base/unique.py +205 -0
- maxframe/tensor/base/where.py +127 -0
- maxframe/tensor/core.py +724 -0
- maxframe/tensor/datasource/__init__.py +32 -0
- maxframe/tensor/datasource/arange.py +156 -0
- maxframe/tensor/datasource/array.py +415 -0
- maxframe/tensor/datasource/core.py +109 -0
- maxframe/tensor/datasource/empty.py +169 -0
- maxframe/tensor/datasource/from_dataframe.py +70 -0
- maxframe/tensor/datasource/from_dense.py +54 -0
- maxframe/tensor/datasource/from_sparse.py +47 -0
- maxframe/tensor/datasource/full.py +186 -0
- maxframe/tensor/datasource/ones.py +173 -0
- maxframe/tensor/datasource/scalar.py +40 -0
- maxframe/tensor/datasource/tests/__init__.py +13 -0
- maxframe/tensor/datasource/tests/test_datasource.py +278 -0
- maxframe/tensor/datasource/zeros.py +188 -0
- maxframe/tensor/fetch/__init__.py +15 -0
- maxframe/tensor/fetch/core.py +54 -0
- maxframe/tensor/indexing/__init__.py +47 -0
- maxframe/tensor/indexing/choose.py +196 -0
- maxframe/tensor/indexing/compress.py +124 -0
- maxframe/tensor/indexing/core.py +190 -0
- maxframe/tensor/indexing/extract.py +71 -0
- maxframe/tensor/indexing/fill_diagonal.py +183 -0
- maxframe/tensor/indexing/flatnonzero.py +60 -0
- maxframe/tensor/indexing/getitem.py +175 -0
- maxframe/tensor/indexing/nonzero.py +120 -0
- maxframe/tensor/indexing/setitem.py +132 -0
- maxframe/tensor/indexing/slice.py +29 -0
- maxframe/tensor/indexing/take.py +130 -0
- maxframe/tensor/indexing/tests/__init__.py +15 -0
- maxframe/tensor/indexing/tests/test_indexing.py +234 -0
- maxframe/tensor/indexing/unravel_index.py +103 -0
- maxframe/tensor/merge/__init__.py +15 -0
- maxframe/tensor/merge/stack.py +132 -0
- maxframe/tensor/merge/tests/__init__.py +13 -0
- maxframe/tensor/merge/tests/test_merge.py +52 -0
- maxframe/tensor/operators.py +123 -0
- maxframe/tensor/random/__init__.py +168 -0
- maxframe/tensor/random/beta.py +87 -0
- maxframe/tensor/random/binomial.py +137 -0
- maxframe/tensor/random/bytes.py +39 -0
- maxframe/tensor/random/chisquare.py +110 -0
- maxframe/tensor/random/choice.py +186 -0
- maxframe/tensor/random/core.py +234 -0
- maxframe/tensor/random/dirichlet.py +123 -0
- maxframe/tensor/random/exponential.py +94 -0
- maxframe/tensor/random/f.py +135 -0
- maxframe/tensor/random/gamma.py +128 -0
- maxframe/tensor/random/geometric.py +93 -0
- maxframe/tensor/random/gumbel.py +167 -0
- maxframe/tensor/random/hypergeometric.py +148 -0
- maxframe/tensor/random/laplace.py +133 -0
- maxframe/tensor/random/logistic.py +129 -0
- maxframe/tensor/random/lognormal.py +159 -0
- maxframe/tensor/random/logseries.py +122 -0
- maxframe/tensor/random/multinomial.py +133 -0
- maxframe/tensor/random/multivariate_normal.py +192 -0
- maxframe/tensor/random/negative_binomial.py +125 -0
- maxframe/tensor/random/noncentral_chisquare.py +132 -0
- maxframe/tensor/random/noncentral_f.py +126 -0
- maxframe/tensor/random/normal.py +143 -0
- maxframe/tensor/random/pareto.py +140 -0
- maxframe/tensor/random/permutation.py +104 -0
- maxframe/tensor/random/poisson.py +111 -0
- maxframe/tensor/random/power.py +142 -0
- maxframe/tensor/random/rand.py +82 -0
- maxframe/tensor/random/randint.py +121 -0
- maxframe/tensor/random/randn.py +96 -0
- maxframe/tensor/random/random_integers.py +123 -0
- maxframe/tensor/random/random_sample.py +86 -0
- maxframe/tensor/random/rayleigh.py +110 -0
- maxframe/tensor/random/shuffle.py +61 -0
- maxframe/tensor/random/standard_cauchy.py +105 -0
- maxframe/tensor/random/standard_exponential.py +72 -0
- maxframe/tensor/random/standard_gamma.py +120 -0
- maxframe/tensor/random/standard_normal.py +74 -0
- maxframe/tensor/random/standard_t.py +135 -0
- maxframe/tensor/random/tests/__init__.py +15 -0
- maxframe/tensor/random/tests/test_random.py +167 -0
- maxframe/tensor/random/triangular.py +119 -0
- maxframe/tensor/random/uniform.py +131 -0
- maxframe/tensor/random/vonmises.py +131 -0
- maxframe/tensor/random/wald.py +114 -0
- maxframe/tensor/random/weibull.py +140 -0
- maxframe/tensor/random/zipf.py +122 -0
- maxframe/tensor/rechunk/__init__.py +26 -0
- maxframe/tensor/rechunk/rechunk.py +43 -0
- maxframe/tensor/reduction/__init__.py +66 -0
- maxframe/tensor/reduction/all.py +103 -0
- maxframe/tensor/reduction/allclose.py +88 -0
- maxframe/tensor/reduction/any.py +105 -0
- maxframe/tensor/reduction/argmax.py +103 -0
- maxframe/tensor/reduction/argmin.py +103 -0
- maxframe/tensor/reduction/array_equal.py +64 -0
- maxframe/tensor/reduction/core.py +168 -0
- maxframe/tensor/reduction/count_nonzero.py +81 -0
- maxframe/tensor/reduction/cumprod.py +97 -0
- maxframe/tensor/reduction/cumsum.py +101 -0
- maxframe/tensor/reduction/max.py +120 -0
- maxframe/tensor/reduction/mean.py +123 -0
- maxframe/tensor/reduction/min.py +120 -0
- maxframe/tensor/reduction/nanargmax.py +82 -0
- maxframe/tensor/reduction/nanargmin.py +76 -0
- maxframe/tensor/reduction/nancumprod.py +91 -0
- maxframe/tensor/reduction/nancumsum.py +94 -0
- maxframe/tensor/reduction/nanmax.py +111 -0
- maxframe/tensor/reduction/nanmean.py +106 -0
- maxframe/tensor/reduction/nanmin.py +111 -0
- maxframe/tensor/reduction/nanprod.py +94 -0
- maxframe/tensor/reduction/nanstd.py +126 -0
- maxframe/tensor/reduction/nansum.py +115 -0
- maxframe/tensor/reduction/nanvar.py +149 -0
- maxframe/tensor/reduction/prod.py +130 -0
- maxframe/tensor/reduction/std.py +134 -0
- maxframe/tensor/reduction/sum.py +125 -0
- maxframe/tensor/reduction/tests/__init__.py +13 -0
- maxframe/tensor/reduction/tests/test_reduction.py +181 -0
- maxframe/tensor/reduction/var.py +176 -0
- maxframe/tensor/reshape/__init__.py +17 -0
- maxframe/tensor/reshape/reshape.py +188 -0
- maxframe/tensor/reshape/tests/__init__.py +15 -0
- maxframe/tensor/reshape/tests/test_reshape.py +37 -0
- maxframe/tensor/statistics/__init__.py +13 -0
- maxframe/tensor/statistics/percentile.py +175 -0
- maxframe/tensor/statistics/quantile.py +288 -0
- maxframe/tensor/ufunc/__init__.py +26 -0
- maxframe/tensor/ufunc/ufunc.py +200 -0
- maxframe/tensor/utils.py +718 -0
- maxframe/tests/__init__.py +13 -0
- maxframe/tests/test_codegen.py +69 -0
- maxframe/tests/test_protocol.py +144 -0
- maxframe/tests/test_utils.py +376 -0
- maxframe/tests/utils.py +164 -0
- maxframe/typing_.py +37 -0
- maxframe/udf.py +134 -0
- maxframe/utils.py +1114 -0
- maxframe-0.1.0b5.dist-info/METADATA +104 -0
- maxframe-0.1.0b5.dist-info/RECORD +647 -0
- maxframe-0.1.0b5.dist-info/WHEEL +5 -0
- maxframe-0.1.0b5.dist-info/top_level.txt +3 -0
- maxframe_client/__init__.py +17 -0
- maxframe_client/clients/__init__.py +13 -0
- maxframe_client/clients/framedriver.py +118 -0
- maxframe_client/clients/spe.py +104 -0
- maxframe_client/conftest.py +15 -0
- maxframe_client/fetcher.py +264 -0
- maxframe_client/session/__init__.py +22 -0
- maxframe_client/session/consts.py +36 -0
- maxframe_client/session/graph.py +119 -0
- maxframe_client/session/odps.py +482 -0
- maxframe_client/session/task.py +280 -0
- maxframe_client/session/tests/__init__.py +13 -0
- maxframe_client/session/tests/test_task.py +85 -0
- maxframe_client/tests/__init__.py +13 -0
- maxframe_client/tests/test_fetcher.py +89 -0
- maxframe_client/tests/test_session.py +255 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from collections.abc import MutableMapping
|
|
16
|
+
from urllib.parse import urlparse
|
|
17
|
+
|
|
18
|
+
from .local import LocalFileSystem
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class FSMap(MutableMapping):
|
|
22
|
+
"""
|
|
23
|
+
Wrap a FileSystem instance as a mutable wrapping.
|
|
24
|
+
The keys of the mapping become files under the given root, and the
|
|
25
|
+
values (which must be bytes) the contents of those files.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
root: string
|
|
30
|
+
prefix for all the files
|
|
31
|
+
fs: FileSystem instance
|
|
32
|
+
check: bool (=True)
|
|
33
|
+
performs a touch at the location, to check for write access.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, root, fs, check=False, create=False):
|
|
37
|
+
self.fs = fs
|
|
38
|
+
self.root = self._get_path(fs, root)
|
|
39
|
+
if create:
|
|
40
|
+
if not self.fs.exists(root):
|
|
41
|
+
self.fs.mkdir(root)
|
|
42
|
+
if check:
|
|
43
|
+
if not self.fs.exists(root):
|
|
44
|
+
raise ValueError(
|
|
45
|
+
f"Path {root} does not exist. Create with the ``create=True`` keyword"
|
|
46
|
+
)
|
|
47
|
+
with self.fs.open(fs.pathsep.join([root, "a"]), "w"):
|
|
48
|
+
pass
|
|
49
|
+
self.fs.rm(fs.pathsep.join([root, "a"]))
|
|
50
|
+
|
|
51
|
+
@staticmethod
|
|
52
|
+
def _get_path(fs, path):
|
|
53
|
+
return path if isinstance(fs, LocalFileSystem) else urlparse(path).path
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def _normalize_path(fs, path, lstrip=False, rstrip=False):
|
|
57
|
+
if fs.pathsep != "/": # pragma: no cover
|
|
58
|
+
path = path.replace("/", fs.pathsep)
|
|
59
|
+
if lstrip:
|
|
60
|
+
path = path.lstrip(fs.pathsep)
|
|
61
|
+
if rstrip:
|
|
62
|
+
path = path.rstrip(fs.pathsep)
|
|
63
|
+
return path
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def _join_path(fs, paths):
|
|
67
|
+
if fs.pathsep == "/":
|
|
68
|
+
return "/".join(paths)
|
|
69
|
+
|
|
70
|
+
new_paths = []
|
|
71
|
+
for i, path in enumerate(paths):
|
|
72
|
+
path = FSMap._normalize_path(
|
|
73
|
+
fs, path, lstrip=i > 0, rstrip=i < len(paths) - 1
|
|
74
|
+
)
|
|
75
|
+
new_paths.append(path)
|
|
76
|
+
return fs.pathsep.join(new_paths)
|
|
77
|
+
|
|
78
|
+
def clear(self):
|
|
79
|
+
"""Remove all keys below root - empties out mapping"""
|
|
80
|
+
try:
|
|
81
|
+
self.fs.rm(self.root, True)
|
|
82
|
+
self.fs.mkdir(self.root)
|
|
83
|
+
except: # noqa: E722 # pragma: no cover
|
|
84
|
+
pass
|
|
85
|
+
|
|
86
|
+
def _key_to_str(self, key):
|
|
87
|
+
"""Generate full path for the key"""
|
|
88
|
+
if isinstance(key, (tuple, list)):
|
|
89
|
+
key = str(tuple(key))
|
|
90
|
+
else:
|
|
91
|
+
key = str(key)
|
|
92
|
+
return self._join_path(self.fs, [self.root, key]) if self.root else key
|
|
93
|
+
|
|
94
|
+
def _str_to_key(self, s):
|
|
95
|
+
"""Strip path of to leave key name"""
|
|
96
|
+
key = self._normalize_path(self.fs, s[len(self.root) :], lstrip=True)
|
|
97
|
+
if self.fs.pathsep != "/": # pragma: no cover
|
|
98
|
+
key = key.replace(self.fs.pathsep, "/")
|
|
99
|
+
return key
|
|
100
|
+
|
|
101
|
+
def __getitem__(self, key, default=None):
|
|
102
|
+
"""Retrieve data"""
|
|
103
|
+
key = self._key_to_str(key)
|
|
104
|
+
try:
|
|
105
|
+
result = self.fs.cat(key)
|
|
106
|
+
except: # noqa: E722
|
|
107
|
+
if default is not None:
|
|
108
|
+
return default
|
|
109
|
+
raise KeyError(key)
|
|
110
|
+
return result
|
|
111
|
+
|
|
112
|
+
def pop(self, key, default=None):
|
|
113
|
+
result = self.__getitem__(key, default)
|
|
114
|
+
try:
|
|
115
|
+
del self[key]
|
|
116
|
+
except KeyError:
|
|
117
|
+
pass
|
|
118
|
+
return result
|
|
119
|
+
|
|
120
|
+
@staticmethod
|
|
121
|
+
def _parent(fs, path):
|
|
122
|
+
path = FSMap._get_path(fs, path.rstrip(fs.pathsep))
|
|
123
|
+
if fs.pathsep in path:
|
|
124
|
+
return path.rsplit(fs.pathsep, 1)[0]
|
|
125
|
+
else: # pragma: no cover
|
|
126
|
+
return ""
|
|
127
|
+
|
|
128
|
+
def __setitem__(self, key, value):
|
|
129
|
+
"""Store value in key"""
|
|
130
|
+
key = self._key_to_str(key)
|
|
131
|
+
try:
|
|
132
|
+
self.fs.mkdir(self._parent(self.fs, key))
|
|
133
|
+
except FileExistsError:
|
|
134
|
+
pass
|
|
135
|
+
with self.fs.open(key, "wb") as f:
|
|
136
|
+
f.write(value)
|
|
137
|
+
|
|
138
|
+
@staticmethod
|
|
139
|
+
def _find(fs, path):
|
|
140
|
+
out = set()
|
|
141
|
+
for path, dirs, files in fs.walk(path):
|
|
142
|
+
out.update(fs.pathsep.join([path, f]) for f in files)
|
|
143
|
+
if fs.isfile(path) and path not in out:
|
|
144
|
+
# walk works on directories, but find should also return [path]
|
|
145
|
+
# when path happens to be a file
|
|
146
|
+
out.add(path)
|
|
147
|
+
return sorted(out)
|
|
148
|
+
|
|
149
|
+
def __iter__(self):
|
|
150
|
+
return (self._str_to_key(x) for x in self._find(self.fs, self.root))
|
|
151
|
+
|
|
152
|
+
def __len__(self):
|
|
153
|
+
return len(self._find(self.fs, self.root))
|
|
154
|
+
|
|
155
|
+
def __delitem__(self, key):
|
|
156
|
+
"""Remove key"""
|
|
157
|
+
try:
|
|
158
|
+
self.fs.rm(self._key_to_str(key))
|
|
159
|
+
except: # noqa: E722
|
|
160
|
+
raise KeyError
|
|
161
|
+
|
|
162
|
+
def __contains__(self, key):
|
|
163
|
+
"""Does key exist in mapping?"""
|
|
164
|
+
return self.fs.exists(self._key_to_str(key))
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
from pyarrow.fs import HadoopFileSystem as _ArrowHadoopFileSystem
|
|
17
|
+
|
|
18
|
+
from .arrow import HadoopFileSystem
|
|
19
|
+
|
|
20
|
+
del _ArrowHadoopFileSystem
|
|
21
|
+
except ImportError: # pragma: no cover
|
|
22
|
+
try:
|
|
23
|
+
# pyarrow < 2.0.0
|
|
24
|
+
from pyarrow import HadoopFileSystem
|
|
25
|
+
except ImportError:
|
|
26
|
+
HadoopFileSystem = None
|
|
27
|
+
|
|
28
|
+
from .core import register_filesystem
|
|
29
|
+
|
|
30
|
+
if HadoopFileSystem is not None: # pragma: no branch
|
|
31
|
+
register_filesystem("hdfs", HadoopFileSystem)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import glob
|
|
16
|
+
import os
|
|
17
|
+
import shutil
|
|
18
|
+
from typing import BinaryIO, Dict, Iterator, List, TextIO, Tuple, Union
|
|
19
|
+
|
|
20
|
+
from ...utils import implements, stringify_path
|
|
21
|
+
from .base import FileSystem, path_type
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class LocalFileSystem(FileSystem):
|
|
25
|
+
_instance = None
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def get_instance(cls):
|
|
29
|
+
if cls._instance is None:
|
|
30
|
+
cls._instance = LocalFileSystem()
|
|
31
|
+
return cls._instance
|
|
32
|
+
|
|
33
|
+
@implements(FileSystem.cat)
|
|
34
|
+
def cat(self, path: path_type):
|
|
35
|
+
with self.open(path, "rb") as f:
|
|
36
|
+
return f.read()
|
|
37
|
+
|
|
38
|
+
@implements(FileSystem.ls)
|
|
39
|
+
def ls(self, path: path_type) -> List[path_type]:
|
|
40
|
+
path = stringify_path(path)
|
|
41
|
+
return sorted(os.path.join(path, x) for x in os.listdir(path))
|
|
42
|
+
|
|
43
|
+
@implements(FileSystem.delete)
|
|
44
|
+
def delete(self, path: path_type, recursive: bool = False):
|
|
45
|
+
if os.path.isfile(path):
|
|
46
|
+
os.remove(path)
|
|
47
|
+
elif not recursive:
|
|
48
|
+
os.rmdir(path)
|
|
49
|
+
else:
|
|
50
|
+
shutil.rmtree(path)
|
|
51
|
+
|
|
52
|
+
@implements(FileSystem.rename)
|
|
53
|
+
def rename(self, path: path_type, new_path: path_type):
|
|
54
|
+
os.rename(path, new_path)
|
|
55
|
+
|
|
56
|
+
@implements(FileSystem.stat)
|
|
57
|
+
def stat(self, path: path_type) -> Dict:
|
|
58
|
+
os_stat = os.stat(path)
|
|
59
|
+
stat = dict(name=path, size=os_stat.st_size, modified_time=os_stat.st_mtime)
|
|
60
|
+
if os.path.isfile(path):
|
|
61
|
+
stat["type"] = "file"
|
|
62
|
+
elif os.path.isdir(path):
|
|
63
|
+
stat["type"] = "directory"
|
|
64
|
+
else: # pragma: no cover
|
|
65
|
+
stat["type"] = "other"
|
|
66
|
+
return stat
|
|
67
|
+
|
|
68
|
+
@implements(FileSystem.mkdir)
|
|
69
|
+
def mkdir(self, path: path_type, create_parents: bool = True):
|
|
70
|
+
path = stringify_path(path)
|
|
71
|
+
if create_parents:
|
|
72
|
+
os.makedirs(path)
|
|
73
|
+
else:
|
|
74
|
+
os.mkdir(path)
|
|
75
|
+
|
|
76
|
+
@implements(FileSystem.isdir)
|
|
77
|
+
def isdir(self, path: path_type) -> bool:
|
|
78
|
+
path = stringify_path(path)
|
|
79
|
+
return os.path.isdir(path)
|
|
80
|
+
|
|
81
|
+
@implements(FileSystem.isfile)
|
|
82
|
+
def isfile(self, path: path_type) -> bool:
|
|
83
|
+
path = stringify_path(path)
|
|
84
|
+
return os.path.isfile(path)
|
|
85
|
+
|
|
86
|
+
@implements(FileSystem._isfilestore)
|
|
87
|
+
def _isfilestore(self) -> bool:
|
|
88
|
+
return True
|
|
89
|
+
|
|
90
|
+
@implements(FileSystem.exists)
|
|
91
|
+
def exists(self, path: path_type):
|
|
92
|
+
path = stringify_path(path)
|
|
93
|
+
return os.path.exists(path)
|
|
94
|
+
|
|
95
|
+
@implements(FileSystem.open)
|
|
96
|
+
def open(self, path: path_type, mode: str = "rb") -> Union[BinaryIO, TextIO]:
|
|
97
|
+
path = stringify_path(path)
|
|
98
|
+
return open(path, mode=mode)
|
|
99
|
+
|
|
100
|
+
@implements(FileSystem.walk)
|
|
101
|
+
def walk(self, path: path_type) -> Iterator[Tuple[str, List[str], List[str]]]:
|
|
102
|
+
path = stringify_path(path)
|
|
103
|
+
return os.walk(path)
|
|
104
|
+
|
|
105
|
+
@implements(FileSystem.glob)
|
|
106
|
+
def glob(self, path: path_type, recursive: bool = False) -> List[path_type]:
|
|
107
|
+
path = stringify_path(path)
|
|
108
|
+
return glob.glob(path, recursive=recursive)
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def pathsep(self) -> str:
|
|
112
|
+
return os.path.sep
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import Dict, Iterator, List, Tuple
|
|
16
|
+
from urllib import parse
|
|
17
|
+
|
|
18
|
+
from ...utils import implements, lazy_import
|
|
19
|
+
from ._oss_lib import common as oc
|
|
20
|
+
from ._oss_lib.glob import glob
|
|
21
|
+
from ._oss_lib.handle import OSSIOBase
|
|
22
|
+
from .base import FileSystem, path_type
|
|
23
|
+
|
|
24
|
+
oss2 = lazy_import("oss2", placeholder=True)
|
|
25
|
+
|
|
26
|
+
_oss_time_out = 10
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class OSSFileSystem(FileSystem):
|
|
30
|
+
_instance = None
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def get_instance(cls):
|
|
34
|
+
if cls._instance is None:
|
|
35
|
+
cls._instance = OSSFileSystem()
|
|
36
|
+
return cls._instance
|
|
37
|
+
|
|
38
|
+
@implements(FileSystem.cat)
|
|
39
|
+
def cat(self, path: path_type):
|
|
40
|
+
raise NotImplementedError
|
|
41
|
+
|
|
42
|
+
@implements(FileSystem.ls)
|
|
43
|
+
def ls(self, path: path_type) -> List[path_type]:
|
|
44
|
+
file_list = []
|
|
45
|
+
file_entry = oc.OSSFileEntry(path)
|
|
46
|
+
if not file_entry.is_dir():
|
|
47
|
+
raise OSError("ls for file is not supported")
|
|
48
|
+
else:
|
|
49
|
+
bucket, key, access_key_id, access_key_secret, end_point = oc.parse_osspath(
|
|
50
|
+
path
|
|
51
|
+
)
|
|
52
|
+
oss_bucket = oss2.Bucket(
|
|
53
|
+
auth=oss2.Auth(
|
|
54
|
+
access_key_id=access_key_id, access_key_secret=access_key_secret
|
|
55
|
+
),
|
|
56
|
+
endpoint=end_point,
|
|
57
|
+
bucket_name=bucket,
|
|
58
|
+
connect_timeout=_oss_time_out,
|
|
59
|
+
)
|
|
60
|
+
for obj in oss2.ObjectIteratorV2(oss_bucket, prefix=key):
|
|
61
|
+
if obj.key.endswith("/"):
|
|
62
|
+
continue
|
|
63
|
+
obj_path = rf"oss://{bucket}/{obj.key}"
|
|
64
|
+
file_list.append(
|
|
65
|
+
build_oss_path(
|
|
66
|
+
obj_path, access_key_id, access_key_secret, end_point
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
return file_list
|
|
70
|
+
|
|
71
|
+
@implements(FileSystem.delete)
|
|
72
|
+
def delete(self, path: path_type, recursive: bool = False):
|
|
73
|
+
raise NotImplementedError
|
|
74
|
+
|
|
75
|
+
@implements(FileSystem.rename)
|
|
76
|
+
def rename(self, path: path_type, new_path: path_type):
|
|
77
|
+
raise NotImplementedError
|
|
78
|
+
|
|
79
|
+
@implements(FileSystem.stat)
|
|
80
|
+
def stat(self, path: path_type) -> Dict:
|
|
81
|
+
ofe = oc.OSSFileEntry(path)
|
|
82
|
+
return ofe.stat()
|
|
83
|
+
|
|
84
|
+
@implements(FileSystem.mkdir)
|
|
85
|
+
def mkdir(self, path: path_type, create_parents: bool = True):
|
|
86
|
+
raise NotImplementedError
|
|
87
|
+
|
|
88
|
+
@implements(FileSystem.isdir)
|
|
89
|
+
def isdir(self, path: path_type) -> bool:
|
|
90
|
+
file_entry = oc.OSSFileEntry(path)
|
|
91
|
+
return file_entry.is_dir()
|
|
92
|
+
|
|
93
|
+
@implements(FileSystem.isfile)
|
|
94
|
+
def isfile(self, path: path_type) -> bool:
|
|
95
|
+
file_entry = oc.OSSFileEntry(path)
|
|
96
|
+
return file_entry.is_file()
|
|
97
|
+
|
|
98
|
+
@implements(FileSystem._isfilestore)
|
|
99
|
+
def _isfilestore(self) -> bool:
|
|
100
|
+
raise NotImplementedError
|
|
101
|
+
|
|
102
|
+
@implements(FileSystem.exists)
|
|
103
|
+
def exists(self, path: path_type):
|
|
104
|
+
return oc.oss_exists(path)
|
|
105
|
+
|
|
106
|
+
@implements(FileSystem.open)
|
|
107
|
+
def open(self, path: path_type, mode: str = "rb") -> OSSIOBase:
|
|
108
|
+
file_handle = OSSIOBase(path, mode)
|
|
109
|
+
return file_handle
|
|
110
|
+
|
|
111
|
+
@implements(FileSystem.walk)
|
|
112
|
+
def walk(self, path: path_type) -> Iterator[Tuple[str, List[str], List[str]]]:
|
|
113
|
+
raise NotImplementedError
|
|
114
|
+
|
|
115
|
+
@implements(FileSystem.glob)
|
|
116
|
+
def glob(self, path: path_type, recursive: bool = False) -> List[path_type]:
|
|
117
|
+
return glob(path, recursive=recursive)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def build_oss_path(path: path_type, access_key_id, access_key_secret, end_point):
|
|
121
|
+
"""
|
|
122
|
+
Returns a path with oss info.
|
|
123
|
+
Used to register the access_key_id, access_key_secret and
|
|
124
|
+
endpoint of OSS. The access_key_id and endpoint are put
|
|
125
|
+
into the url with url-safe-base64 encoding.
|
|
126
|
+
|
|
127
|
+
Parameters
|
|
128
|
+
----------
|
|
129
|
+
path : path_type
|
|
130
|
+
The original oss url.
|
|
131
|
+
|
|
132
|
+
access_key_id : str
|
|
133
|
+
The access key id of oss.
|
|
134
|
+
|
|
135
|
+
access_key_secret : str
|
|
136
|
+
The access key secret of oss.
|
|
137
|
+
|
|
138
|
+
end_point : str
|
|
139
|
+
The endpoint of oss.
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
path_type
|
|
144
|
+
Path include the encoded access key id, end point and
|
|
145
|
+
access key secret of oss.
|
|
146
|
+
"""
|
|
147
|
+
if isinstance(path, (list, tuple)):
|
|
148
|
+
path = path[0]
|
|
149
|
+
param_dict = {"access_key_id": access_key_id, "end_point": end_point}
|
|
150
|
+
id_endpoint = oc.dict_to_url(param_dict)
|
|
151
|
+
password = access_key_secret
|
|
152
|
+
parse_result = parse.urlparse(path)
|
|
153
|
+
new_path = (
|
|
154
|
+
f"{parse_result.scheme}://{id_endpoint}:{password}"
|
|
155
|
+
f"@{parse_result.netloc}{parse_result.path}"
|
|
156
|
+
)
|
|
157
|
+
return new_path
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import glob as _glob
|
|
16
|
+
import os
|
|
17
|
+
import tempfile
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
import pyarrow as pa
|
|
24
|
+
except ImportError: # pragma: no cover
|
|
25
|
+
pa = None
|
|
26
|
+
|
|
27
|
+
from ....tests.utils import require_hadoop
|
|
28
|
+
from ....utils import lazy_import
|
|
29
|
+
from .. import FileSystem, FSMap, LocalFileSystem, glob
|
|
30
|
+
|
|
31
|
+
if pa is not None:
|
|
32
|
+
from ..arrow import ArrowBasedLocalFileSystem, HadoopFileSystem
|
|
33
|
+
else: # pragma: no cover
|
|
34
|
+
ArrowBasedLocalFileSystem = None
|
|
35
|
+
|
|
36
|
+
fsspec_installed = lazy_import("fsspec") is not None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_path_parser():
|
|
40
|
+
path = "hdfs://user:password@localhost:8080/test"
|
|
41
|
+
parsed_result = FileSystem.parse_from_path(path)
|
|
42
|
+
assert parsed_result["host"] == "localhost"
|
|
43
|
+
assert parsed_result["port"] == 8080
|
|
44
|
+
assert parsed_result["user"] == "user"
|
|
45
|
+
assert parsed_result["password"] == "password"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_local_filesystem():
|
|
49
|
+
local_fs1 = LocalFileSystem.get_instance()
|
|
50
|
+
local_fs2 = LocalFileSystem.get_instance()
|
|
51
|
+
assert local_fs1 is local_fs2
|
|
52
|
+
|
|
53
|
+
with tempfile.TemporaryDirectory() as tempdir:
|
|
54
|
+
file_path = os.path.join(tempdir, "test")
|
|
55
|
+
|
|
56
|
+
with open(file_path, "wb") as f:
|
|
57
|
+
f.write(b"text for test")
|
|
58
|
+
assert local_fs1.stat(tempdir)["type"] == "directory"
|
|
59
|
+
assert local_fs1.stat(file_path)["type"] == "file"
|
|
60
|
+
assert len(glob(tempdir + "*")) == 1
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@pytest.mark.parametrize(
|
|
64
|
+
"fs_type",
|
|
65
|
+
[LocalFileSystem, ArrowBasedLocalFileSystem]
|
|
66
|
+
if pa is not None
|
|
67
|
+
else [LocalFileSystem],
|
|
68
|
+
)
|
|
69
|
+
def test_filesystems(fs_type):
|
|
70
|
+
fs = fs_type.get_instance()
|
|
71
|
+
|
|
72
|
+
with tempfile.TemporaryDirectory() as root:
|
|
73
|
+
test1_dir = os.path.join(root, "test1")
|
|
74
|
+
fs.mkdir(test1_dir, create_parents=False)
|
|
75
|
+
test2_dir = os.path.join(root, "test2")
|
|
76
|
+
sub_test2_dir = os.path.join(test2_dir, "sub_test2")
|
|
77
|
+
fs.mkdir(sub_test2_dir)
|
|
78
|
+
|
|
79
|
+
sub_test2_dir_stat = fs.stat(sub_test2_dir)
|
|
80
|
+
assert sub_test2_dir_stat["type"] == "directory"
|
|
81
|
+
assert sub_test2_dir_stat["name"] == sub_test2_dir
|
|
82
|
+
assert fs.isdir(sub_test2_dir)
|
|
83
|
+
|
|
84
|
+
test1_file = os.path.join(test1_dir, "test1")
|
|
85
|
+
with fs.open(test1_file, "wb") as f:
|
|
86
|
+
f.write(b"abc test")
|
|
87
|
+
with fs.open(test1_file, "ab") as f:
|
|
88
|
+
f.write(b"\nappend test")
|
|
89
|
+
with fs.open(test1_file, "rb") as f:
|
|
90
|
+
content = f.read()
|
|
91
|
+
with open(test1_file, "rb") as f2:
|
|
92
|
+
expected = f2.read()
|
|
93
|
+
assert content == expected
|
|
94
|
+
|
|
95
|
+
assert fs.cat(test1_file) == expected
|
|
96
|
+
|
|
97
|
+
assert fs.isfile(test1_file)
|
|
98
|
+
test1_file_stat = fs.stat(test1_file)
|
|
99
|
+
assert test1_file_stat["type"] == "file"
|
|
100
|
+
assert test1_file_stat["name"] == test1_file
|
|
101
|
+
assert test1_file_stat["size"] == os.stat(test1_file).st_size
|
|
102
|
+
np.testing.assert_almost_equal(
|
|
103
|
+
test1_file_stat["modified_time"], os.stat(test1_file).st_mtime, decimal=6
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
walked = [
|
|
107
|
+
(os.path.normpath(root), dirs, files) for root, dirs, files in fs.walk(root)
|
|
108
|
+
]
|
|
109
|
+
expected = os.walk(root)
|
|
110
|
+
assert sorted(walked) == sorted(expected)
|
|
111
|
+
|
|
112
|
+
test2_file = os.path.join(sub_test2_dir, "test2")
|
|
113
|
+
with fs.open(test2_file, "wb") as f:
|
|
114
|
+
f.write(b"def test")
|
|
115
|
+
|
|
116
|
+
for recursive in [False, True]:
|
|
117
|
+
globs = [
|
|
118
|
+
os.path.normpath(p)
|
|
119
|
+
for p in fs.glob(os.path.join(root, "*"), recursive=recursive)
|
|
120
|
+
]
|
|
121
|
+
expected = [
|
|
122
|
+
os.path.normpath(p)
|
|
123
|
+
for p in _glob.glob(os.path.join(root, "*"), recursive=recursive)
|
|
124
|
+
]
|
|
125
|
+
assert sorted(globs) == sorted(expected)
|
|
126
|
+
|
|
127
|
+
for path in [os.path.join(root, "*", "*"), test1_dir]:
|
|
128
|
+
globs = [os.path.normpath(p) for p in fs.glob(path)]
|
|
129
|
+
expected = [os.path.normpath(p) for p in _glob.glob(path)]
|
|
130
|
+
assert sorted(globs) == sorted(expected)
|
|
131
|
+
|
|
132
|
+
test1_new_file = os.path.join(test1_dir, "test1_new")
|
|
133
|
+
fs.rename(test1_file, test1_new_file)
|
|
134
|
+
test1_new_file2 = os.path.join(test1_dir, "test1_new2")
|
|
135
|
+
fs.mv(test1_new_file, test1_new_file2)
|
|
136
|
+
assert fs.exists(test1_new_file2)
|
|
137
|
+
assert not fs.exists(test1_file)
|
|
138
|
+
|
|
139
|
+
assert fs.disk_usage(test1_dir) > 0
|
|
140
|
+
|
|
141
|
+
fs.delete(test2_file)
|
|
142
|
+
assert not fs.exists(test2_file)
|
|
143
|
+
|
|
144
|
+
assert fs._isfilestore()
|
|
145
|
+
|
|
146
|
+
with pytest.raises(OSError):
|
|
147
|
+
fs.delete(test1_dir)
|
|
148
|
+
fs.delete(test1_dir, recursive=True)
|
|
149
|
+
assert not fs.exists(test1_dir)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@require_hadoop
|
|
153
|
+
def test_hadoop_filesystem():
|
|
154
|
+
fs = HadoopFileSystem(host="localhost", port=8020)
|
|
155
|
+
|
|
156
|
+
test_dir = "/tmp/test/test_hadoop_fs"
|
|
157
|
+
fs.mkdir(test_dir)
|
|
158
|
+
test_file = f"{test_dir}/my_file.txt"
|
|
159
|
+
test_file_content = b"text for text"
|
|
160
|
+
with fs.open(test_file, "wb") as f:
|
|
161
|
+
f.write(test_file_content)
|
|
162
|
+
with fs.open(test_file, "rb") as f:
|
|
163
|
+
assert test_file_content == f.read()
|
|
164
|
+
# test file with hdfs:// prefix
|
|
165
|
+
assert fs.exists(f"hdfs://{test_dir}")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def test_fsmap():
|
|
169
|
+
fs = LocalFileSystem.get_instance()
|
|
170
|
+
with tempfile.TemporaryDirectory() as root:
|
|
171
|
+
fs_map = FSMap(root, fs, check=True)
|
|
172
|
+
|
|
173
|
+
path = "/to/path/test_file"
|
|
174
|
+
test_content = b"text for test"
|
|
175
|
+
fs_map[path] = test_content
|
|
176
|
+
assert fs_map[path] == test_content
|
|
177
|
+
assert len(fs_map) == 1
|
|
178
|
+
assert path in fs_map
|
|
179
|
+
|
|
180
|
+
path2 = "/to/path2/test_file2"
|
|
181
|
+
fs_map[path2] = test_content
|
|
182
|
+
assert len(fs_map) == 2
|
|
183
|
+
|
|
184
|
+
del fs_map[path]
|
|
185
|
+
assert list(fs_map) == ["to/path2/test_file2"]
|
|
186
|
+
|
|
187
|
+
path3 = "/to2/path3/test_file3"
|
|
188
|
+
fs_map[path3] = test_content
|
|
189
|
+
assert fs_map.pop(path3) == test_content
|
|
190
|
+
assert fs_map.pop(path3, "fake_content") == "fake_content"
|
|
191
|
+
with pytest.raises(KeyError):
|
|
192
|
+
fs_map.pop("not_exist")
|
|
193
|
+
|
|
194
|
+
fs_map.clear()
|
|
195
|
+
assert len(fs_map) == 0
|
|
196
|
+
|
|
197
|
+
# test root not exist
|
|
198
|
+
with pytest.raises(ValueError):
|
|
199
|
+
_ = FSMap(root + "/path2", fs, check=True)
|
|
200
|
+
|
|
201
|
+
# create root
|
|
202
|
+
fs_map = FSMap(root + "/path2", fs, create=True)
|
|
203
|
+
assert len(fs_map) == 0
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
@pytest.mark.skipif(not fsspec_installed, reason="fsspec not installed")
|
|
207
|
+
def test_get_fs():
|
|
208
|
+
from .. import get_fs, register_filesystem
|
|
209
|
+
from ..fsspec_adapter import FsSpecAdapter
|
|
210
|
+
|
|
211
|
+
class InMemoryFileSystemAdapter(FsSpecAdapter):
|
|
212
|
+
def __init__(self, **kwargs):
|
|
213
|
+
super().__init__("memory", **kwargs)
|
|
214
|
+
|
|
215
|
+
register_filesystem("memory", InMemoryFileSystemAdapter)
|
|
216
|
+
|
|
217
|
+
assert isinstance(get_fs("file://"), LocalFileSystem)
|
|
218
|
+
assert isinstance(get_fs("memory://"), InMemoryFileSystemAdapter)
|
|
219
|
+
|
|
220
|
+
try:
|
|
221
|
+
get_fs("unknown://")
|
|
222
|
+
except ValueError as e:
|
|
223
|
+
assert "Unknown file system type" in e.__str__()
|