maxframe 0.1.0b5__cp39-cp39-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-39-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-39-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-39-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-39-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,198 @@
|
|
|
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 base64
|
|
16
|
+
import json
|
|
17
|
+
import os
|
|
18
|
+
|
|
19
|
+
from ....utils import lazy_import
|
|
20
|
+
from ..base import path_type, stringify_path
|
|
21
|
+
|
|
22
|
+
oss2 = lazy_import("oss2", placeholder=True)
|
|
23
|
+
|
|
24
|
+
# OSS api time out
|
|
25
|
+
_oss_time_out = 10
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class OSSFileEntry:
|
|
29
|
+
def __init__(
|
|
30
|
+
self, path, *, is_dir=None, is_file=None, stat=None, storage_options=None
|
|
31
|
+
):
|
|
32
|
+
self._path = path
|
|
33
|
+
self._name = os.path.basename(path)
|
|
34
|
+
self._is_file = is_file
|
|
35
|
+
self._is_dir = is_dir
|
|
36
|
+
self._stat = stat
|
|
37
|
+
self._storage_options = storage_options
|
|
38
|
+
|
|
39
|
+
def is_dir(self):
|
|
40
|
+
if self._is_dir is None:
|
|
41
|
+
self._is_dir = oss_isdir(self._path)
|
|
42
|
+
return self._is_dir
|
|
43
|
+
|
|
44
|
+
def is_file(self):
|
|
45
|
+
if self._is_file is None:
|
|
46
|
+
if self.is_dir() or not oss_exists(self._path):
|
|
47
|
+
self._is_file = False
|
|
48
|
+
else:
|
|
49
|
+
self._is_file = True
|
|
50
|
+
return self._is_file
|
|
51
|
+
|
|
52
|
+
def stat(self):
|
|
53
|
+
if self._stat is None:
|
|
54
|
+
self._stat = oss_stat(self._path)
|
|
55
|
+
return self._stat
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def name(self):
|
|
59
|
+
return self._name
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def path(self):
|
|
63
|
+
return self._path
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def parse_osspath(path: path_type):
|
|
67
|
+
# Extract OSS configuration from the encoded URL.
|
|
68
|
+
str_path = stringify_path(path)
|
|
69
|
+
parse_result = oss2.urlparse(str_path)
|
|
70
|
+
if parse_result.scheme != "oss":
|
|
71
|
+
raise ValueError(
|
|
72
|
+
f"Except scheme oss, but got scheme: {parse_result.scheme}"
|
|
73
|
+
f" in path: {str_path}"
|
|
74
|
+
)
|
|
75
|
+
bucket = parse_result.hostname
|
|
76
|
+
if not (parse_result.username and parse_result.password):
|
|
77
|
+
raise RuntimeError(r"Please use build_oss_path to add OSS info")
|
|
78
|
+
param_dict = url_to_dict(parse_result.username)
|
|
79
|
+
access_key_id = param_dict["access_key_id"]
|
|
80
|
+
access_key_secret = parse_result.password
|
|
81
|
+
end_point = param_dict["end_point"]
|
|
82
|
+
key = parse_result.path
|
|
83
|
+
key = key[1:] if key.startswith("/") else key
|
|
84
|
+
return bucket, key, access_key_id, access_key_secret, end_point
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _get_oss_bucket(bucket, access_key_id, access_key_secret, end_point):
|
|
88
|
+
oss_bucket = oss2.Bucket(
|
|
89
|
+
auth=oss2.Auth(
|
|
90
|
+
access_key_id=access_key_id, access_key_secret=access_key_secret
|
|
91
|
+
),
|
|
92
|
+
endpoint=end_point,
|
|
93
|
+
bucket_name=bucket,
|
|
94
|
+
connect_timeout=_oss_time_out,
|
|
95
|
+
)
|
|
96
|
+
return oss_bucket
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def oss_exists(path: path_type):
|
|
100
|
+
bucket, key, access_key_id, access_key_secret, end_point = parse_osspath(path)
|
|
101
|
+
oss_bucket = _get_oss_bucket(bucket, access_key_id, access_key_secret, end_point)
|
|
102
|
+
return oss_bucket.object_exists(key) or oss_isdir(path)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def oss_isdir(path: path_type):
|
|
106
|
+
"""
|
|
107
|
+
OSS has no concept of directories, but we define
|
|
108
|
+
a ossurl is dir, When there is at least one object
|
|
109
|
+
at the ossurl that is the prefix(end with char "/"),
|
|
110
|
+
it is considered as a directory.
|
|
111
|
+
"""
|
|
112
|
+
dirname = stringify_path(path)
|
|
113
|
+
if not dirname.endswith("/"):
|
|
114
|
+
dirname = dirname + "/"
|
|
115
|
+
bucket, key, access_key_id, access_key_secret, end_point = parse_osspath(dirname)
|
|
116
|
+
oss_bucket = _get_oss_bucket(bucket, access_key_id, access_key_secret, end_point)
|
|
117
|
+
isdir = False
|
|
118
|
+
for obj in oss2.ObjectIteratorV2(oss_bucket, prefix=key, max_keys=2):
|
|
119
|
+
if obj.key == key:
|
|
120
|
+
continue
|
|
121
|
+
isdir = True
|
|
122
|
+
break
|
|
123
|
+
return isdir
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def oss_stat(path: path_type):
|
|
127
|
+
path = stringify_path(path)
|
|
128
|
+
bucket, key, access_key_id, access_key_secret, end_point = parse_osspath(path)
|
|
129
|
+
oss_bucket = _get_oss_bucket(bucket, access_key_id, access_key_secret, end_point)
|
|
130
|
+
if oss_isdir(path):
|
|
131
|
+
stat = dict(name=path, size=0, modified_time=-1)
|
|
132
|
+
stat["type"] = "directory"
|
|
133
|
+
else:
|
|
134
|
+
meta = oss_bucket.get_object_meta(key)
|
|
135
|
+
stat = dict(
|
|
136
|
+
name=path,
|
|
137
|
+
size=int(meta.headers["Content-Length"]),
|
|
138
|
+
modified_time=meta.headers["Last-Modified"],
|
|
139
|
+
)
|
|
140
|
+
stat["type"] = "file"
|
|
141
|
+
return stat
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def oss_scandir(dirname: path_type):
|
|
145
|
+
dirname = stringify_path(dirname)
|
|
146
|
+
if not dirname.endswith("/"):
|
|
147
|
+
dirname = dirname + "/"
|
|
148
|
+
bucket, key, access_key_id, access_key_secret, end_point = parse_osspath(dirname)
|
|
149
|
+
oss_bucket = _get_oss_bucket(bucket, access_key_id, access_key_secret, end_point)
|
|
150
|
+
dirname_set = set()
|
|
151
|
+
for obj in oss2.ObjectIteratorV2(oss_bucket, prefix=key):
|
|
152
|
+
rel_path = obj.key[len(key) :]
|
|
153
|
+
try:
|
|
154
|
+
inside_dirname, inside_filename = rel_path.split("/", 1)
|
|
155
|
+
except ValueError:
|
|
156
|
+
inside_dirname = None
|
|
157
|
+
inside_filename = rel_path
|
|
158
|
+
if inside_dirname is not None:
|
|
159
|
+
if inside_dirname in dirname_set:
|
|
160
|
+
continue
|
|
161
|
+
dirname_set.add(inside_dirname)
|
|
162
|
+
yield OSSFileEntry(
|
|
163
|
+
os.path.join(dirname, inside_dirname),
|
|
164
|
+
is_dir=True,
|
|
165
|
+
is_file=False,
|
|
166
|
+
stat={
|
|
167
|
+
"name": os.path.join(dirname, inside_dirname),
|
|
168
|
+
"type": "directory",
|
|
169
|
+
"size": 0,
|
|
170
|
+
"modified_time": -1,
|
|
171
|
+
},
|
|
172
|
+
)
|
|
173
|
+
else:
|
|
174
|
+
yield OSSFileEntry(
|
|
175
|
+
os.path.join(dirname, inside_filename),
|
|
176
|
+
is_dir=False,
|
|
177
|
+
is_file=True,
|
|
178
|
+
stat={
|
|
179
|
+
"name": os.path.join(dirname, inside_filename),
|
|
180
|
+
"type": "file",
|
|
181
|
+
"size": obj.size,
|
|
182
|
+
"modified_time": obj.last_modified,
|
|
183
|
+
},
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def dict_to_url(param: dict):
|
|
188
|
+
# Encode the dictionary with url-safe-base64.
|
|
189
|
+
str_param = json.dumps(param)
|
|
190
|
+
url_param = base64.urlsafe_b64encode(bytes(str_param, encoding="utf8"))
|
|
191
|
+
return bytes.decode(url_param, encoding="utf8")
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def url_to_dict(url_param: str):
|
|
195
|
+
# Decode url-safe-base64 encoded string.
|
|
196
|
+
bytes_param = bytes(url_param, encoding="utf8")
|
|
197
|
+
str_param = bytes.decode(base64.urlsafe_b64decode(bytes_param), encoding="utf8")
|
|
198
|
+
return json.loads(str_param)
|
|
@@ -0,0 +1,147 @@
|
|
|
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
|
+
"""
|
|
16
|
+
Filename globbing utility, modified from python glob.
|
|
17
|
+
|
|
18
|
+
obviously,this implementation is not optimal, it will cause too many
|
|
19
|
+
oss requests. Lately, We can then convert the glob expression into
|
|
20
|
+
a regular expression, and then match the oss key list.
|
|
21
|
+
But before that, we need to figure out how to deal with magic char
|
|
22
|
+
in oss key, such like oss glob: oss://bucket/[key]/*, the key
|
|
23
|
+
oss://bucket/[key]/a exactly exists.
|
|
24
|
+
|
|
25
|
+
Notes:
|
|
26
|
+
OSS need a bucket to specify the file or dir, the "**" pattern is
|
|
27
|
+
not supported. So _isrecursive(pattern) is removed.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import fnmatch
|
|
31
|
+
import os
|
|
32
|
+
import re
|
|
33
|
+
|
|
34
|
+
from .common import oss_exists, oss_isdir, oss_scandir
|
|
35
|
+
|
|
36
|
+
__all__ = ["glob", "iglob", "escape"]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def glob(pathname, *, recursive=False):
|
|
40
|
+
"""Return a list of paths matching a pathname pattern.
|
|
41
|
+
The pattern may contain simple shell-style wildcards a la
|
|
42
|
+
fnmatch. However, unlike fnmatch, filenames starting with a
|
|
43
|
+
dot are special cases that are not matched by '*' and '?'
|
|
44
|
+
patterns.
|
|
45
|
+
"""
|
|
46
|
+
return list(iglob(pathname, recursive=recursive))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def iglob(pathname, *, recursive=False):
|
|
50
|
+
"""Return an iterator which yields the paths matching a pathname pattern.
|
|
51
|
+
The pattern may contain simple shell-style wildcards like
|
|
52
|
+
fnmatch. However, unlike fnmatch, filenames starting with a
|
|
53
|
+
dot are special cases that are not matched by '*' and '?'
|
|
54
|
+
patterns.
|
|
55
|
+
"""
|
|
56
|
+
it = _iglob(pathname, recursive, False)
|
|
57
|
+
return it
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _iglob(pathname, recursive, dironly):
|
|
61
|
+
dirname, basename = os.path.split(pathname)
|
|
62
|
+
if not has_magic(pathname):
|
|
63
|
+
assert not dironly
|
|
64
|
+
if basename:
|
|
65
|
+
if oss_exists(pathname):
|
|
66
|
+
yield pathname
|
|
67
|
+
else:
|
|
68
|
+
# Patterns ending with a slash should match only directories
|
|
69
|
+
if oss_isdir(dirname):
|
|
70
|
+
yield pathname
|
|
71
|
+
return
|
|
72
|
+
# dirname will not be None in oss path.
|
|
73
|
+
# Prevent an infinite recursion if a drive or UNC path
|
|
74
|
+
# contains magic characters (i.e. r'\\?\C:').
|
|
75
|
+
if dirname != pathname and has_magic(dirname):
|
|
76
|
+
dirs = _iglob(dirname, recursive, True)
|
|
77
|
+
else:
|
|
78
|
+
dirs = [dirname]
|
|
79
|
+
if has_magic(basename):
|
|
80
|
+
glob_in_dir = _glob1
|
|
81
|
+
else:
|
|
82
|
+
glob_in_dir = _glob0
|
|
83
|
+
for dirname in dirs:
|
|
84
|
+
for name in glob_in_dir(dirname, basename, dironly):
|
|
85
|
+
yield os.path.join(dirname, name)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# These 2 helper functions non-recursively glob inside a literal directory.
|
|
89
|
+
# They return a list of basenames. _glob1 accepts a pattern while _glob0
|
|
90
|
+
# takes a literal basename (so it only has to check for its existence).
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _glob1(dirname, pattern, dironly):
|
|
94
|
+
names = list(_iterdir(dirname, dironly))
|
|
95
|
+
if not _ishidden(pattern):
|
|
96
|
+
names = (x for x in names if not _ishidden(x))
|
|
97
|
+
return fnmatch.filter(names, pattern)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _glob0(dirname, basename, dironly):
|
|
101
|
+
if not basename:
|
|
102
|
+
# `os.path.split()` returns an empty basename for paths ending with a
|
|
103
|
+
# directory separator. 'q*x/' should match only directories.
|
|
104
|
+
if oss_isdir(dirname):
|
|
105
|
+
return [basename]
|
|
106
|
+
else:
|
|
107
|
+
if oss_exists(os.path.join(dirname, basename)):
|
|
108
|
+
return [basename]
|
|
109
|
+
return []
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# If dironly is false, yields all file names inside a directory.
|
|
113
|
+
# If dironly is true, yields only directory names.
|
|
114
|
+
# An oss path must contain a dirname.
|
|
115
|
+
def _iterdir(dirname, dironly):
|
|
116
|
+
for entry in oss_scandir(dirname):
|
|
117
|
+
if not dironly or entry.is_dir():
|
|
118
|
+
yield entry.name
|
|
119
|
+
return
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
magic_check = re.compile("([*?[])")
|
|
123
|
+
magic_check_bytes = re.compile(b"([*?[])")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def has_magic(s):
|
|
127
|
+
if isinstance(s, bytes):
|
|
128
|
+
match = magic_check_bytes.search(s)
|
|
129
|
+
else:
|
|
130
|
+
match = magic_check.search(s)
|
|
131
|
+
return match is not None
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _ishidden(path):
|
|
135
|
+
return False
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def escape(pathname):
|
|
139
|
+
"""Escape all special characters."""
|
|
140
|
+
# Escaping is done by wrapping any of "*?[" between square brackets.
|
|
141
|
+
# Metacharacters do not work in the drive part and shouldn't be escaped.
|
|
142
|
+
drive, pathname = os.path.splitdrive(pathname)
|
|
143
|
+
if isinstance(pathname, bytes):
|
|
144
|
+
pathname = magic_check_bytes.sub(rb"[\1]", pathname)
|
|
145
|
+
else:
|
|
146
|
+
pathname = magic_check.sub(r"[\1]", pathname)
|
|
147
|
+
return drive + pathname
|
|
@@ -0,0 +1,156 @@
|
|
|
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 io import IOBase
|
|
16
|
+
|
|
17
|
+
from ....utils import lazy_import
|
|
18
|
+
from .common import oss_stat, parse_osspath
|
|
19
|
+
|
|
20
|
+
oss2 = lazy_import("oss2", placeholder=True)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class OSSIOBase(IOBase):
|
|
24
|
+
def __init__(self, path, mode):
|
|
25
|
+
self._path = path
|
|
26
|
+
(
|
|
27
|
+
self._bucket_name,
|
|
28
|
+
self._key_name,
|
|
29
|
+
self._access_key_id,
|
|
30
|
+
self._access_key_secret,
|
|
31
|
+
self._end_point,
|
|
32
|
+
) = parse_osspath(self._path)
|
|
33
|
+
self._bucket = self._get_bucket()
|
|
34
|
+
self._current_pos = 0
|
|
35
|
+
self._size = None
|
|
36
|
+
self._buffer = b""
|
|
37
|
+
self._buffer_size = 1 * 1024
|
|
38
|
+
self._mode = mode
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def mode(self):
|
|
42
|
+
return self._mode
|
|
43
|
+
|
|
44
|
+
def fileno(self) -> int:
|
|
45
|
+
raise AttributeError
|
|
46
|
+
|
|
47
|
+
def _get_bucket(self):
|
|
48
|
+
return oss2.Bucket(
|
|
49
|
+
auth=oss2.Auth(
|
|
50
|
+
access_key_id=self._access_key_id,
|
|
51
|
+
access_key_secret=self._access_key_secret,
|
|
52
|
+
),
|
|
53
|
+
endpoint=self._end_point,
|
|
54
|
+
bucket_name=self._bucket_name,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
def _get_size(self):
|
|
58
|
+
if self._size is None:
|
|
59
|
+
self._size = int(oss_stat(self._path)["size"])
|
|
60
|
+
return self._size
|
|
61
|
+
|
|
62
|
+
def seek(self, pos, whence=0):
|
|
63
|
+
if whence == 0:
|
|
64
|
+
if pos < 0:
|
|
65
|
+
raise OSError("Invalid argument")
|
|
66
|
+
self._current_pos = pos
|
|
67
|
+
elif whence == 2:
|
|
68
|
+
self._current_pos = self._get_size() + pos
|
|
69
|
+
elif whence == 1:
|
|
70
|
+
check_pos = self._current_pos + pos
|
|
71
|
+
if check_pos < 0:
|
|
72
|
+
raise OSError("Invalid argument")
|
|
73
|
+
else:
|
|
74
|
+
self._current_pos = self._current_pos + pos
|
|
75
|
+
else:
|
|
76
|
+
raise ValueError('Parameter "whence" should be 0 or 1 or 2')
|
|
77
|
+
if pos > 0 and self._current_pos > self._get_size() - 1:
|
|
78
|
+
self._current_pos = self._get_size()
|
|
79
|
+
return self._current_pos
|
|
80
|
+
|
|
81
|
+
def seekable(self):
|
|
82
|
+
return True
|
|
83
|
+
|
|
84
|
+
def read(self, size=-1):
|
|
85
|
+
"""
|
|
86
|
+
Read and return up to size bytes, where size is an int.
|
|
87
|
+
|
|
88
|
+
If the argument is omitted, None, or negative, reads and
|
|
89
|
+
returns all data until EOF.
|
|
90
|
+
|
|
91
|
+
If the argument is positive, multiple raw reads may be issued to satisfy
|
|
92
|
+
the byte count (unless EOF is reached first).
|
|
93
|
+
|
|
94
|
+
Returns an empty bytes array on EOF.
|
|
95
|
+
"""
|
|
96
|
+
if self._current_pos == self._get_size() or size == 0:
|
|
97
|
+
return b""
|
|
98
|
+
elif size < 0:
|
|
99
|
+
obj = self._bucket.get_object(
|
|
100
|
+
self._key_name, byte_range=(self._current_pos, None)
|
|
101
|
+
)
|
|
102
|
+
self._current_pos = self._get_size()
|
|
103
|
+
else:
|
|
104
|
+
obj = self._bucket.get_object(
|
|
105
|
+
self._key_name,
|
|
106
|
+
byte_range=(self._current_pos, self._current_pos + size - 1),
|
|
107
|
+
)
|
|
108
|
+
self._current_pos = self._current_pos + size
|
|
109
|
+
content = obj.read()
|
|
110
|
+
return content
|
|
111
|
+
|
|
112
|
+
def readline(self, size=-1):
|
|
113
|
+
# For backwards compatibility, a (slowish) readline().
|
|
114
|
+
def nreadahead():
|
|
115
|
+
# Read to the beginning of the next line
|
|
116
|
+
read_to = min(
|
|
117
|
+
self._get_size() - 1, self._current_pos + self._buffer_size - 1
|
|
118
|
+
)
|
|
119
|
+
buffer = self._bucket.get_object(
|
|
120
|
+
self._key_name, byte_range=(self._current_pos, read_to)
|
|
121
|
+
).read()
|
|
122
|
+
if not buffer:
|
|
123
|
+
return 1
|
|
124
|
+
n = (buffer.find(b"\n") + 1) or len(buffer)
|
|
125
|
+
if size >= 0:
|
|
126
|
+
n = min(n, size)
|
|
127
|
+
return n
|
|
128
|
+
|
|
129
|
+
if size is None:
|
|
130
|
+
size = -1
|
|
131
|
+
else:
|
|
132
|
+
try:
|
|
133
|
+
size_index = size.__index__
|
|
134
|
+
except AttributeError:
|
|
135
|
+
raise TypeError(f"{size!r} is not an integer")
|
|
136
|
+
else:
|
|
137
|
+
size = size_index()
|
|
138
|
+
res = bytearray()
|
|
139
|
+
while size < 0 or len(res) < size:
|
|
140
|
+
b = self.read(nreadahead())
|
|
141
|
+
if not b:
|
|
142
|
+
break
|
|
143
|
+
res += b
|
|
144
|
+
if res.endswith(b"\n"):
|
|
145
|
+
break
|
|
146
|
+
return bytes(res)
|
|
147
|
+
|
|
148
|
+
def readable(self):
|
|
149
|
+
return True
|
|
150
|
+
|
|
151
|
+
def writable(self):
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
def close(self):
|
|
155
|
+
# already closed by oss
|
|
156
|
+
pass
|