vools 0.7.2__tar.gz → 0.7.4__tar.gz
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.
- {vools-0.7.2/vools.egg-info → vools-0.7.4}/PKG-INFO +11 -5
- {vools-0.7.2 → vools-0.7.4}/pyproject.toml +10 -52
- {vools-0.7.2 → vools-0.7.4}/vools/__init__.py +21 -17
- vools-0.7.4/vools/config.py +135 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/itor_nim.py +15 -1
- {vools-0.7.2 → vools-0.7.4}/vools/data/table.py +12 -2
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/curry_core.py +19 -0
- {vools-0.7.2 → vools-0.7.4}/vools/security/hash.py +23 -10
- {vools-0.7.2 → vools-0.7.4}/vools/security/safe_eval.py +22 -8
- {vools-0.7.2 → vools-0.7.4/vools.egg-info}/PKG-INFO +11 -5
- {vools-0.7.2 → vools-0.7.4}/vools.egg-info/SOURCES.txt +2 -62
- {vools-0.7.2 → vools-0.7.4}/vools.egg-info/requires.txt +12 -4
- vools-0.7.2/vools/dll32/__init__.py +0 -86
- vools-0.7.2/vools/dll32/_core/__init__.py +0 -14
- vools-0.7.2/vools/dll32/_core/_pipe_comm.py +0 -18
- vools-0.7.2/vools/dll32/_core/_spawn32.py +0 -342
- vools-0.7.2/vools/dll32/_dlls/DirectCOM.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/RC6.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/RC6Widgets.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/VB6MQTT.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/VB6OpenSSL.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/VB6Plus.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/WebView2Loader.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/cairo_sqlite.dll +0 -0
- vools-0.7.2/vools/dll32/_dlls/vbRichClient5.dll +0 -0
- vools-0.7.2/vools/dll32/_lib/__init__.py +0 -9
- vools-0.7.2/vools/dll32/_lib/clr/__init__.py +0 -8
- vools-0.7.2/vools/dll32/_lib/clr/_base.py +0 -89
- vools-0.7.2/vools/dll32/_lib/com/__init__.py +0 -9
- vools-0.7.2/vools/dll32/_lib/com/_base.py +0 -103
- vools-0.7.2/vools/dll32/_lib/com/directcom.py +0 -115
- vools-0.7.2/vools/dll32/_lib/com/rc6.py +0 -228
- vools-0.7.2/vools/dll32/_lib/com/rc6plus.py +0 -344
- vools-0.7.2/vools/dll32/_python32/__init__.py +0 -1
- vools-0.7.2/vools/dll32/_python32/python.exe +0 -0
- vools-0.7.2/vools/dll32/_python32/python3.dll +0 -0
- vools-0.7.2/vools/dll32/_python32/python32_launcher.py +0 -63
- vools-0.7.2/vools/dll32/_python32/python36._pth +0 -5
- vools-0.7.2/vools/dll32/_python32/python36.dll +0 -0
- vools-0.7.2/vools/dll32/_python32/python36.zip +0 -0
- vools-0.7.2/vools/dll32/_python32/pythonw.exe +0 -0
- vools-0.7.2/vools/dll32/_python32/sqlite3.dll +0 -0
- vools-0.7.2/vools/dll32/_python32/vcruntime140.dll +0 -0
- vools-0.7.2/vools/dll32/_signatures/__init__.py +0 -13
- vools-0.7.2/vools/dll32/_signatures/_registry.py +0 -50
- vools-0.7.2/vools/dll32/_signatures/mqtt.py +0 -46
- vools-0.7.2/vools/dll32/_signatures/openssl.py +0 -35
- vools-0.7.2/vools/dll32/_signatures/vb6plus.py +0 -299
- vools-0.7.2/vools/dll32/dll.py +0 -77
- vools-0.7.2/vools/dll32/examples/basic_usage.py +0 -74
- vools-0.7.2/vools/dll32/get-pip.py +0 -27079
- vools-0.7.2/vools/dll32/mqtt.py +0 -83
- vools-0.7.2/vools/dll32/openssl.py +0 -54
- vools-0.7.2/vools/dll32/tests/__init__.py +0 -1
- vools-0.7.2/vools/dll32/tests/test_dll32.py +0 -59
- vools-0.7.2/vools/dll32/vb6plus.py +0 -495
- vools-0.7.2/vools/xl/__init__.py +0 -101
- vools-0.7.2/vools/xl/_core/__init__.py +0 -9
- vools-0.7.2/vools/xl/_core/api.py +0 -836
- vools-0.7.2/vools/xl/_core/loader.py +0 -75
- vools-0.7.2/vools/xl/_dlls/__init__.py +0 -52
- vools-0.7.2/vools/xl/_dlls/libxl.dll +0 -0
- vools-0.7.2/vools/xl/_highlevel/__init__.py +0 -57
- vools-0.7.2/vools/xl/_highlevel/engines.py +0 -284
- vools-0.7.2/vools/xl/_highlevel/pandas_io.py +0 -150
- vools-0.7.2/vools/xl/_highlevel/utils.py +0 -344
- vools-0.7.2/vools/xl/_objects/__init__.py +0 -12
- vools-0.7.2/vools/xl/_objects/book.py +0 -483
- vools-0.7.2/vools/xl/_objects/font.py +0 -99
- vools-0.7.2/vools/xl/_objects/format.py +0 -262
- vools-0.7.2/vools/xl/_objects/sheet.py +0 -840
- vools-0.7.2/vools/xl/_utils/__init__.py +0 -200
- vools-0.7.2/vools/xl/_utils/helpers.py +0 -107
- {vools-0.7.2 → vools-0.7.4}/LICENSE +0 -0
- {vools-0.7.2 → vools-0.7.4}/NOTICE +0 -0
- {vools-0.7.2 → vools-0.7.4}/README.md +0 -0
- {vools-0.7.2 → vools-0.7.4}/setup.cfg +0 -0
- {vools-0.7.2 → vools-0.7.4}/tests/test_functions.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/README.md +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/__main__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/api/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/api/curry_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/api/memoize_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/api/ops_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/api/seq_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/api/typer_app.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/cache/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/cache/memorize.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/cache/once.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/cache/persist.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/cache/sigcache.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/asyncio_mod.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/bridges.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/contextvars_mod.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/delegates.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/futures.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/multiprocessing_mod.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/queues.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/sched_mod.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/spawns.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/subprocess_mod.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/concurrent/threading_mod.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/asyncio_compat.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/base.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/config.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/contextvars_compat.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/dataclass_compat.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/datetime_compat.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/exceptions.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/core/inspect_compat.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/crypto/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/crypto/core.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/collection.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/composition.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/core.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/iteration.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/math.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/predicate.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/curried/string.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/itor.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/qax.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/seq.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/validator.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/vlist.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/data/vtext.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/datetime/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/datetime/dates_format.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/datetime/utils.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/datetime/vdate_class.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/bridge_decorator.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/cache.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/control.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/curried.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/curry_decorator.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/curry_delay.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/flex_pos.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/lazy.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/overcurry.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/overload.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/overloads.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/rself.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/selector.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/shotcut.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/decorators/trd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/encoding/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/encoding/core.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/arrow_func.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/box.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/funcs.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/iif.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/pipe_ops.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/placeholder.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/placeholder_impl.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/functional/result.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/oop/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/oop/calltype.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/oop/extend.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/oop/fusion.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/oop/method_extend.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/oop/mixer.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/oop/selector.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/security/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/security/_constants.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/security/expression_handler.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/backends/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/backends/base.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/backends/json_backend.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/backends/msgpack_backend.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/backends/pickle_backend.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/backends/vb_json_backend.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/callable/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/callable/decorator_handler.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/callable/functional_handler.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/codec.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/config.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/context.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/core.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/decorators.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/sentinel.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/serialize/type_registry.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/builder.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/config.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/connection.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/decorators.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/dialect.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/result.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/core/types.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/manager.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/postgres/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/postgres/connection.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/postgres/dialect.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/spark/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/spark/connection.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/spark/dialect.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/spark/scala_bridge.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/sqlite/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/sqlite/connection.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sql/sqlite/dialect.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/compile_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/dll.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/dll_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/env.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/env_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/exe.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/fire_app.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/sys/run_cmd.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/core/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/core/models.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/core/queue.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/core/storage.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/core/worker.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/decorators/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/decorators/task_decorator.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/rules/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/rules/dag.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/rules/engine.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/rules/rule.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/task/utils/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/utils/__init__.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/utils/hoder.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/utils/stuff.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools/utils/tools.py +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools.egg-info/dependency_links.txt +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools.egg-info/entry_points.txt +0 -0
- {vools-0.7.2 → vools-0.7.4}/vools.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vools
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
4
4
|
Summary: Python 函数式编程工具集
|
|
5
5
|
Author-email: Victor <victortop921129@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -239,12 +239,18 @@ Provides-Extra: serialize
|
|
|
239
239
|
Requires-Dist: msgpack>=1.0; extra == "serialize"
|
|
240
240
|
Requires-Dist: orjson>=3.9; extra == "serialize"
|
|
241
241
|
Provides-Extra: rx
|
|
242
|
-
Requires-Dist: vools-rx==0.7.
|
|
242
|
+
Requires-Dist: vools-rx==0.7.4; extra == "rx"
|
|
243
243
|
Provides-Extra: bridges
|
|
244
|
-
Requires-Dist: vools-bridges==0.7.
|
|
244
|
+
Requires-Dist: vools-bridges==0.7.4; extra == "bridges"
|
|
245
|
+
Provides-Extra: dll32
|
|
246
|
+
Requires-Dist: vools-dll32==0.7.4; extra == "dll32"
|
|
247
|
+
Provides-Extra: xl
|
|
248
|
+
Requires-Dist: vools-xl==0.7.4; extra == "xl"
|
|
245
249
|
Provides-Extra: all
|
|
246
|
-
Requires-Dist: vools-rx==0.7.
|
|
247
|
-
Requires-Dist: vools-bridges==0.7.
|
|
250
|
+
Requires-Dist: vools-rx==0.7.4; extra == "all"
|
|
251
|
+
Requires-Dist: vools-bridges==0.7.4; extra == "all"
|
|
252
|
+
Requires-Dist: vools-dll32==0.7.4; extra == "all"
|
|
253
|
+
Requires-Dist: vools-xl==0.7.4; extra == "all"
|
|
248
254
|
Provides-Extra: cli
|
|
249
255
|
Requires-Dist: typer>=0.12.0; extra == "cli"
|
|
250
256
|
Requires-Dist: typing-extensions>=4.0.0; extra == "cli"
|
|
@@ -46,9 +46,11 @@ serialize = [
|
|
|
46
46
|
"msgpack>=1.0",
|
|
47
47
|
"orjson>=3.9",
|
|
48
48
|
]
|
|
49
|
-
rx = ["vools-rx==0.7.
|
|
50
|
-
bridges = ["vools-bridges==0.7.
|
|
51
|
-
|
|
49
|
+
rx = ["vools-rx==0.7.4"]
|
|
50
|
+
bridges = ["vools-bridges==0.7.4"]
|
|
51
|
+
dll32 = ["vools-dll32==0.7.4"]
|
|
52
|
+
xl = ["vools-xl==0.7.4"]
|
|
53
|
+
all = ["vools-rx==0.7.4", "vools-bridges==0.7.4", "vools-dll32==0.7.4", "vools-xl==0.7.4"]
|
|
52
54
|
cli = [
|
|
53
55
|
"typer>=0.12.0",
|
|
54
56
|
"typing-extensions>=4.0.0",
|
|
@@ -75,10 +77,8 @@ include = ["vools*"]
|
|
|
75
77
|
exclude = [
|
|
76
78
|
"vools.__pycache__",
|
|
77
79
|
"vools.*.__pycache__",
|
|
78
|
-
"vools.dll32
|
|
79
|
-
"vools.
|
|
80
|
-
"vools.dll32._dlls",
|
|
81
|
-
"vools.dll32._dlls.*",
|
|
80
|
+
"vools.dll32*",
|
|
81
|
+
"vools.xl*",
|
|
82
82
|
"vools.bridge*",
|
|
83
83
|
"vools.reactive*",
|
|
84
84
|
]
|
|
@@ -94,50 +94,8 @@ version = { attr = "vools.__version__" }
|
|
|
94
94
|
"lib/*.so",
|
|
95
95
|
"lib/windows/*.dll",
|
|
96
96
|
"lib/linux/*.so",
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
"vools.dll32" = [
|
|
100
|
-
"_dlls/*.dll",
|
|
101
|
-
"_dlls/*.tlb",
|
|
102
|
-
"_dlls/*.ocx",
|
|
103
|
-
"_python32/python.exe",
|
|
104
|
-
"_python32/pythonw.exe",
|
|
105
|
-
"_python32/python3.dll",
|
|
106
|
-
"_python32/python3*.dll",
|
|
107
|
-
"_python32/python3*.pyd",
|
|
108
|
-
"_python32/python3*.zip",
|
|
109
|
-
"_python32/python3*._pth",
|
|
110
|
-
"_python32/vcruntime140.dll",
|
|
111
|
-
"_python32/sqlite3.dll",
|
|
112
|
-
"_python32/pyexpat.pyd",
|
|
113
|
-
"_python32/select.pyd",
|
|
114
|
-
"_python32/unicodedata.pyd",
|
|
115
|
-
"_python32/winsound.pyd",
|
|
116
|
-
"_python32/_asyncio.pyd",
|
|
117
|
-
"_python32/_bz2.pyd",
|
|
118
|
-
"_python32/_ctypes.pyd",
|
|
119
|
-
"_python32/_decimal.pyd",
|
|
120
|
-
"_python32/_distutils_findvs.pyd",
|
|
121
|
-
"_python32/_elementtree.pyd",
|
|
122
|
-
"_python32/_hashlib.pyd",
|
|
123
|
-
"_python32/_lzma.pyd",
|
|
124
|
-
"_python32/_msi.pyd",
|
|
125
|
-
"_python32/_multiprocessing.pyd",
|
|
126
|
-
"_python32/_overlapped.pyd",
|
|
127
|
-
"_python32/_socket.pyd",
|
|
128
|
-
"_python32/_sqlite3.pyd",
|
|
129
|
-
"_python32/_ssl.pyd",
|
|
130
|
-
"_python32/__init__.py",
|
|
131
|
-
"_python32/python32_launcher.py",
|
|
132
|
-
]
|
|
133
|
-
|
|
134
|
-
[tool.setuptools.exclude-package-data]
|
|
135
|
-
"vools.dll32" = [
|
|
136
|
-
"_python32/Lib/**/*",
|
|
137
|
-
"_python32/Lib/*",
|
|
138
|
-
"_python32/**/__pycache__/*",
|
|
139
|
-
"_python32/**/*.pyc",
|
|
140
|
-
"_python32/**/*.pyo",
|
|
97
|
+
"data/*.dll",
|
|
98
|
+
"data/*.so",
|
|
141
99
|
]
|
|
142
100
|
|
|
143
101
|
# ============ pytest ============
|
|
@@ -147,7 +105,7 @@ testpaths = ["tests"]
|
|
|
147
105
|
# 默认不运行(需要外部资源/平台特定):dll32, xl, monitoring, benchmarks, archive, other
|
|
148
106
|
# 如需运行全部测试,使用: pytest --override-ini="addopts=--tb=short -q"
|
|
149
107
|
# 如需运行特定子项目测试,使用: pytest bridges/tests/ 或 pytest rx/tests/
|
|
150
|
-
addopts = "--tb=short -q --ignore=tests/
|
|
108
|
+
addopts = "--tb=short -q --ignore=tests/monitoring --ignore=tests/benchmarks --ignore=tests/archive --ignore=tests/other --ignore=tests/__rust__ --ignore=tests/__persist__ --ignore=tests/__pycache__"
|
|
151
109
|
markers = [
|
|
152
110
|
"integration: 标记集成测试(依赖外部资源,如剪贴板、文件系统、键鼠)",
|
|
153
111
|
"windows_only: 仅在 Windows 上可运行的测试",
|
|
@@ -32,7 +32,7 @@ if not hasattr(subprocess.Popen.__init__, '_vools_patched'):
|
|
|
32
32
|
import importlib
|
|
33
33
|
from typing import Any
|
|
34
34
|
|
|
35
|
-
__version__ = "0.7.
|
|
35
|
+
__version__ = "0.7.4"
|
|
36
36
|
__author__ = "Victor"
|
|
37
37
|
__license__ = "Apache 2.0"
|
|
38
38
|
|
|
@@ -142,7 +142,6 @@ _lazy_modules = {
|
|
|
142
142
|
'trd': '.decorators',
|
|
143
143
|
'proc': '.decorators',
|
|
144
144
|
'extend': '.decorators',
|
|
145
|
-
'smart_partial': '.decorators',
|
|
146
145
|
'delay_curry': '.decorators',
|
|
147
146
|
|
|
148
147
|
'Pipe': '.functional',
|
|
@@ -163,11 +162,9 @@ _lazy_modules = {
|
|
|
163
162
|
'pipe': '.utils',
|
|
164
163
|
|
|
165
164
|
'shotcut': '.decorators',
|
|
166
|
-
'shotcutEx': '.decorators',
|
|
167
165
|
'hoder': '.utils',
|
|
168
166
|
'Hoder': '.utils',
|
|
169
167
|
'timeit': '.decorators',
|
|
170
|
-
'asyncify': '.decorators',
|
|
171
168
|
'safe': '.decorators',
|
|
172
169
|
'throttle': '.decorators',
|
|
173
170
|
'debounce': '.decorators',
|
|
@@ -178,7 +175,6 @@ _lazy_modules = {
|
|
|
178
175
|
'with_timeout': '.decorators',
|
|
179
176
|
'validate': '.decorators',
|
|
180
177
|
'rate_limit': '.decorators',
|
|
181
|
-
'log_calls': '.decorators',
|
|
182
178
|
'cache_with_ttl': '.decorators',
|
|
183
179
|
'hybrid_method': '.decorators',
|
|
184
180
|
'classproperty': '.decorators',
|
|
@@ -190,10 +186,6 @@ _lazy_modules = {
|
|
|
190
186
|
'oop': '.oop',
|
|
191
187
|
'calltype': '.oop',
|
|
192
188
|
|
|
193
|
-
'vicTools': '.vic',
|
|
194
|
-
'vicDate': '.vic',
|
|
195
|
-
'vicText': '.vic',
|
|
196
|
-
'vicList': '.vic',
|
|
197
189
|
|
|
198
190
|
'datetime': '.datetime',
|
|
199
191
|
|
|
@@ -266,6 +258,8 @@ OOP_AVAILABLE = True
|
|
|
266
258
|
DATETIME_AVAILABLE = True
|
|
267
259
|
BRIDGE_AVAILABLE = False
|
|
268
260
|
REACTIVE_AVAILABLE = False
|
|
261
|
+
DLL32_AVAILABLE = False
|
|
262
|
+
XL_AVAILABLE = False
|
|
269
263
|
|
|
270
264
|
VIC_AVAILABLE = True
|
|
271
265
|
|
|
@@ -305,6 +299,24 @@ def __getattr__(name: str) -> Any:
|
|
|
305
299
|
except Exception:
|
|
306
300
|
raise AttributeError("vools.reactive is not installed; use pip install 'vools[rx]' or pip install vools-rx")
|
|
307
301
|
|
|
302
|
+
if name == 'dll32':
|
|
303
|
+
global DLL32_AVAILABLE
|
|
304
|
+
try:
|
|
305
|
+
module = importlib.import_module('.dll32', package='vools')
|
|
306
|
+
DLL32_AVAILABLE = True
|
|
307
|
+
return module
|
|
308
|
+
except Exception:
|
|
309
|
+
raise AttributeError("vools.dll32 is not installed; use pip install 'vools[dll32]' or pip install vools-dll32")
|
|
310
|
+
|
|
311
|
+
if name == 'xl':
|
|
312
|
+
global XL_AVAILABLE
|
|
313
|
+
try:
|
|
314
|
+
module = importlib.import_module('.xl', package='vools')
|
|
315
|
+
XL_AVAILABLE = True
|
|
316
|
+
return module
|
|
317
|
+
except Exception:
|
|
318
|
+
raise AttributeError("vools.xl is not installed; use pip install 'vools[xl]' or pip install vools-xl")
|
|
319
|
+
|
|
308
320
|
if name in _lazy_modules:
|
|
309
321
|
module_path = _lazy_modules[name]
|
|
310
322
|
try:
|
|
@@ -349,7 +361,6 @@ __all__ = [
|
|
|
349
361
|
'trd',
|
|
350
362
|
'proc',
|
|
351
363
|
'extend',
|
|
352
|
-
'smart_partial',
|
|
353
364
|
'delay_curry',
|
|
354
365
|
'overload',
|
|
355
366
|
'OverloadManager', 'OverloadMode', 'reset_registry',
|
|
@@ -390,11 +401,9 @@ __all__ = [
|
|
|
390
401
|
'pipe',
|
|
391
402
|
|
|
392
403
|
'shotcut',
|
|
393
|
-
'shotcutEx',
|
|
394
404
|
'hoder',
|
|
395
405
|
'Hoder',
|
|
396
406
|
'timeit',
|
|
397
|
-
'asyncify',
|
|
398
407
|
'safe',
|
|
399
408
|
'throttle',
|
|
400
409
|
'debounce',
|
|
@@ -405,7 +414,6 @@ __all__ = [
|
|
|
405
414
|
'with_timeout',
|
|
406
415
|
'validate',
|
|
407
416
|
'rate_limit',
|
|
408
|
-
'log_calls',
|
|
409
417
|
'cache_with_ttl',
|
|
410
418
|
'hybrid_method',
|
|
411
419
|
'classproperty',
|
|
@@ -418,10 +426,6 @@ __all__ = [
|
|
|
418
426
|
'calltype',
|
|
419
427
|
'OOP_AVAILABLE',
|
|
420
428
|
|
|
421
|
-
'vicTools',
|
|
422
|
-
'vicDate',
|
|
423
|
-
'vicText',
|
|
424
|
-
'vicList',
|
|
425
429
|
|
|
426
430
|
'vDate',
|
|
427
431
|
'get_week',
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""
|
|
2
|
+
vools 配置模块
|
|
3
|
+
|
|
4
|
+
提供全局配置管理功能,支持数据库连接、缓存策略、线程池等配置项。
|
|
5
|
+
|
|
6
|
+
所有配置项都有详细说明,包括:
|
|
7
|
+
- 配置项用途
|
|
8
|
+
- 默认值
|
|
9
|
+
- 应用模块
|
|
10
|
+
- 可选值范围
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
__all__ = ['DATABASE_CONFIG', 'OTHER_CONFIG', 'PATHS', 'ConfigManager', 'config']
|
|
14
|
+
|
|
15
|
+
# ============================================================================
|
|
16
|
+
# 数据库配置
|
|
17
|
+
# ============================================================================
|
|
18
|
+
# 用于数据库相关功能(如 persist 装饰器的持久化存储)
|
|
19
|
+
# 当前主要作为预留配置,实际使用时需要填写真实连接信息
|
|
20
|
+
# ============================================================================
|
|
21
|
+
|
|
22
|
+
DATABASE_CONFIG = {
|
|
23
|
+
'host': None, # 数据库主机地址,如 'localhost' 或 '127.0.0.1'
|
|
24
|
+
'port': None, # 数据库端口,如 MySQL 默认 3306,PostgreSQL 默认 5432
|
|
25
|
+
'user': None, # 数据库用户名
|
|
26
|
+
'password': None, # 数据库密码
|
|
27
|
+
'database': None, # 数据库名称
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# ============================================================================
|
|
31
|
+
# 运行时配置
|
|
32
|
+
# ============================================================================
|
|
33
|
+
# 控制 vools 库的运行时行为,影响多个模块的默认行为
|
|
34
|
+
# ============================================================================
|
|
35
|
+
|
|
36
|
+
OTHER_CONFIG = {
|
|
37
|
+
# 缓存相关
|
|
38
|
+
'cache_duration': 3, # 缓存持续时间(秒),应用于 memorize 装饰器的默认缓存时长
|
|
39
|
+
'default_force_when': None, # 默认强制刷新条件,应用于 cache.py 的 persist 装饰器
|
|
40
|
+
'default_target_folder': None, # 默认目标文件夹,应用于 cache.py 的 persist 装饰器
|
|
41
|
+
|
|
42
|
+
# 并发相关
|
|
43
|
+
'max_workers': 10, # 最大工作线程数,应用于 TaskQueue 和 WorkerPool 的默认值
|
|
44
|
+
|
|
45
|
+
# 重试相关
|
|
46
|
+
'retry_times': 3, # 默认重试次数,应用于 retry 装饰器的默认值
|
|
47
|
+
|
|
48
|
+
# 数据处理相关
|
|
49
|
+
'NONE_is_None': False, # 是否将 NONE 占位符视为 None,应用于 data/seq.py 的 Seq 类
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# ============================================================================
|
|
53
|
+
# 路径配置
|
|
54
|
+
# ============================================================================
|
|
55
|
+
# 用于文件操作相关功能,指定数据存储和输出的基础路径
|
|
56
|
+
# ============================================================================
|
|
57
|
+
|
|
58
|
+
PATHS = {
|
|
59
|
+
'base_path': None, # 项目基础路径,所有相对路径的基准目录
|
|
60
|
+
'data_path': None, # 数据文件存储路径,如 CSV、JSON 文件的读取位置
|
|
61
|
+
'output_path': None, # 输出文件路径,如生成报告、导出数据的保存位置
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# ============================================================================
|
|
65
|
+
# 配置管理器类
|
|
66
|
+
# ============================================================================
|
|
67
|
+
# 提供统一的配置访问接口,支持属性式访问
|
|
68
|
+
# ============================================================================
|
|
69
|
+
|
|
70
|
+
class ConfigManager:
|
|
71
|
+
"""
|
|
72
|
+
配置管理器
|
|
73
|
+
|
|
74
|
+
提供全局配置的统一访问接口,支持通过属性方式访问各配置项。
|
|
75
|
+
|
|
76
|
+
Example:
|
|
77
|
+
from vools.config import config
|
|
78
|
+
|
|
79
|
+
# 访问配置
|
|
80
|
+
print(config.database.host)
|
|
81
|
+
print(config.other.cache_duration)
|
|
82
|
+
print(config.paths.base_path)
|
|
83
|
+
|
|
84
|
+
# 修改配置
|
|
85
|
+
config.other.cache_duration = 5
|
|
86
|
+
config.paths.base_path = '/data'
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
def do(self, f=print, pre_f=None, sub_f=None):
|
|
90
|
+
"""Apply a function for side effects, return self for chaining.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
f: Function to apply (default print)
|
|
94
|
+
pre_f: Pre-processing function
|
|
95
|
+
sub_f: Post-processing function (no return value expected)
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
self, for chaining
|
|
99
|
+
"""
|
|
100
|
+
rs = self
|
|
101
|
+
if pre_f:
|
|
102
|
+
rs = pre_f(rs)
|
|
103
|
+
rs = f(rs)
|
|
104
|
+
if sub_f:
|
|
105
|
+
sub_f(rs)
|
|
106
|
+
return self
|
|
107
|
+
|
|
108
|
+
def __init__(self):
|
|
109
|
+
self.database = DATABASE_CONFIG
|
|
110
|
+
self.other = OTHER_CONFIG
|
|
111
|
+
self.paths = PATHS
|
|
112
|
+
|
|
113
|
+
# ============================================================================
|
|
114
|
+
# 全局配置实例
|
|
115
|
+
# ============================================================================
|
|
116
|
+
# 推荐使用此实例访问和修改配置
|
|
117
|
+
# ============================================================================
|
|
118
|
+
|
|
119
|
+
config = ConfigManager()
|
|
120
|
+
# Global config instance, unified config access interface.
|
|
121
|
+
# Usage: from vools.config import config
|
|
122
|
+
|
|
123
|
+
# ============================================================================
|
|
124
|
+
# 配置项影响的模块汇总
|
|
125
|
+
# ============================================================================
|
|
126
|
+
# | 配置项 | 影响模块 | 说明 |
|
|
127
|
+
# |--------|----------|------|
|
|
128
|
+
# | cache_duration | decorators/cache.py | memorize 装饰器默认缓存时长 |
|
|
129
|
+
# | max_workers | task/core/queue.py | TaskQueue 和 WorkerPool 默认线程数 |
|
|
130
|
+
# | retry_times | decorators/control.py | retry 装饰器默认重试次数 |
|
|
131
|
+
# | default_force_when | decorators/cache.py | persist 装饰器默认强制刷新条件 |
|
|
132
|
+
# | default_target_folder | decorators/cache.py | persist 装饰器默认目标文件夹 |
|
|
133
|
+
# | NONE_is_None | data/seq.py | Seq 类处理 NONE 占位符的方式 |
|
|
134
|
+
# | database.* | decorators/cache.py | persist 装饰器数据库持久化(预留) |
|
|
135
|
+
# | paths.* | 多个模块 | 文件读写操作的基础路径 |
|
|
@@ -54,6 +54,7 @@ class NimItor:
|
|
|
54
54
|
self._queue = deque()
|
|
55
55
|
self._jump_queue = deque()
|
|
56
56
|
self._source_exhausted = False
|
|
57
|
+
self._started = False
|
|
57
58
|
|
|
58
59
|
self._handle = self._dll.newItor()
|
|
59
60
|
|
|
@@ -61,7 +62,15 @@ class NimItor:
|
|
|
61
62
|
def state(self) -> ItorState:
|
|
62
63
|
if self._handle is None:
|
|
63
64
|
return ItorState.STOPPED
|
|
64
|
-
|
|
65
|
+
dll_state = self._dll.state(self._handle)
|
|
66
|
+
if dll_state == ItorState.STOPPED.value:
|
|
67
|
+
return ItorState.STOPPED
|
|
68
|
+
if dll_state == ItorState.PAUSED.value:
|
|
69
|
+
return ItorState.PAUSED
|
|
70
|
+
# DLL 无法区分 PENDING / ITERRING,由 Python 端维护起始标志
|
|
71
|
+
if self._source_exhausted and not self._queue and not self._jump_queue:
|
|
72
|
+
return ItorState.STOPPED
|
|
73
|
+
return ItorState.ITERRING if self._started else ItorState.PENDING
|
|
65
74
|
|
|
66
75
|
def send(self, jump: Any, jump_when: Optional[Callable[['NimItor'], bool]] = None) -> 'NimItor':
|
|
67
76
|
if jump_when is not None:
|
|
@@ -109,6 +118,10 @@ class NimItor:
|
|
|
109
118
|
|
|
110
119
|
def __next__(self) -> Any:
|
|
111
120
|
while True:
|
|
121
|
+
# 已停止的迭代器立即终止(无论队列中是否还有缓存值)
|
|
122
|
+
if self._handle is not None and self._dll.state(self._handle) == ItorState.STOPPED.value:
|
|
123
|
+
raise StopIteration
|
|
124
|
+
|
|
112
125
|
if self._jump_queue:
|
|
113
126
|
return self._jump_queue.popleft()
|
|
114
127
|
|
|
@@ -120,6 +133,7 @@ class NimItor:
|
|
|
120
133
|
|
|
121
134
|
if self._iterator is None:
|
|
122
135
|
self._iterator = iter(self._iterable)
|
|
136
|
+
self._started = True
|
|
123
137
|
|
|
124
138
|
try:
|
|
125
139
|
item = next(self._iterator)
|
|
@@ -1900,7 +1900,12 @@ class Table(Seq):
|
|
|
1900
1900
|
|
|
1901
1901
|
table = Table.read_excel('data.xlsx')
|
|
1902
1902
|
"""
|
|
1903
|
-
|
|
1903
|
+
try:
|
|
1904
|
+
from ..xl import Book
|
|
1905
|
+
except ImportError as exc:
|
|
1906
|
+
raise ImportError(
|
|
1907
|
+
"vools.xl is not installed; use pip install 'vools[xl]' or pip install vools-xl"
|
|
1908
|
+
) from exc
|
|
1904
1909
|
|
|
1905
1910
|
if not os.path.exists(filename):
|
|
1906
1911
|
raise FileNotFoundError(f'File not found: {filename}')
|
|
@@ -1974,7 +1979,12 @@ class Table(Seq):
|
|
|
1974
1979
|
|
|
1975
1980
|
table.write_excel('output.xlsx')
|
|
1976
1981
|
"""
|
|
1977
|
-
|
|
1982
|
+
try:
|
|
1983
|
+
from ..xl import Book
|
|
1984
|
+
except ImportError as exc:
|
|
1985
|
+
raise ImportError(
|
|
1986
|
+
"vools.xl is not installed; use pip install 'vools[xl]' or pip install vools-xl"
|
|
1987
|
+
) from exc
|
|
1978
1988
|
|
|
1979
1989
|
with Book() as book:
|
|
1980
1990
|
sheet = book.add_sheet(sheet_name)
|
|
@@ -215,6 +215,25 @@ class CurryDescriptor:
|
|
|
215
215
|
Returns:
|
|
216
216
|
如果 instance 为 None 返回 Curried,否则返回绑定后的 Curried
|
|
217
217
|
"""
|
|
218
|
+
# classmethod 委托场景:Python 的 classmethod.__get__ 会把类本身作为
|
|
219
|
+
# instance 传给 descriptor(instance is owner),此时需将第一个参数 (cls)
|
|
220
|
+
# 绑定为 owner 并从 required_args 中剔除。
|
|
221
|
+
is_classmethod_delegation = (
|
|
222
|
+
owner is not None
|
|
223
|
+
and isinstance(instance, type)
|
|
224
|
+
and instance is owner
|
|
225
|
+
and isinstance(getattr(owner, '__dict__', {}).get(self._name), classmethod)
|
|
226
|
+
)
|
|
227
|
+
if is_classmethod_delegation:
|
|
228
|
+
bound_func = self.func.__get__(owner, owner)
|
|
229
|
+
pre_attrs = self.pre_attrs.copy()
|
|
230
|
+
required_args = pre_attrs.get('required_args', [])
|
|
231
|
+
params = pre_attrs.get('params', {})
|
|
232
|
+
if required_args:
|
|
233
|
+
first = required_args[0]
|
|
234
|
+
pre_attrs['required_args'] = required_args[1:]
|
|
235
|
+
pre_attrs['params'] = {k: v for k, v in params.items() if k != first}
|
|
236
|
+
return Curried(bound_func, is_strict=self.is_strict, delaied=self.delaied, **pre_attrs)
|
|
218
237
|
if instance is None:
|
|
219
238
|
return Curried(self.func, is_strict=self.is_strict, delaied=self.delaied, **self.pre_attrs)
|
|
220
239
|
bound_func = self.func.__get__(instance, owner)
|
|
@@ -28,16 +28,29 @@ __all__ = [
|
|
|
28
28
|
|
|
29
29
|
# 优先使用 Nim 桥接库(来自 vools.bridge.nim.crypto)
|
|
30
30
|
# crypto.py 已经正确实现了 _nim_sha256/_py_sha256 的自动切换
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
# 注意:必须延迟导入,避免 import vools 时预加载 vools.bridge 子包,
|
|
32
|
+
# 否则 vools.BRIDGE_AVAILABLE 标志的翻转逻辑永远不执行。
|
|
33
|
+
_nim_available = False
|
|
34
|
+
_nim_sha256_impl = None
|
|
35
|
+
_nim_md5_impl = None
|
|
36
|
+
_nim_sha1_impl = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _load_nim_impls() -> None:
|
|
40
|
+
"""延迟加载 Nim 桥接实现(仅在需要时导入 vools.bridge)。"""
|
|
41
|
+
global _nim_available, _nim_sha256_impl, _nim_md5_impl, _nim_sha1_impl
|
|
42
|
+
if _nim_available:
|
|
43
|
+
return
|
|
44
|
+
try:
|
|
45
|
+
from ..bridge.nim import sha256 as _sha256_impl
|
|
46
|
+
from ..bridge.nim import md5 as _md5_impl
|
|
47
|
+
from ..bridge.nim import sha1 as _sha1_impl
|
|
48
|
+
_nim_sha256_impl = _sha256_impl
|
|
49
|
+
_nim_md5_impl = _md5_impl
|
|
50
|
+
_nim_sha1_impl = _sha1_impl
|
|
51
|
+
_nim_available = True
|
|
52
|
+
except ImportError:
|
|
53
|
+
_nim_available = False
|
|
41
54
|
|
|
42
55
|
|
|
43
56
|
def _py_sha256_hex(data: bytes) -> str:
|
|
@@ -209,10 +209,22 @@ def safe_eval(expr: str, vars: Optional[Dict[str, Any]] = None) -> Any:
|
|
|
209
209
|
|
|
210
210
|
# 导入 shim(shim 不引用 vools 子包,避免循环导入)。
|
|
211
211
|
# 当 vools-bridges 未安装时回退到 None,保证核心 safe_eval 仍然可用。
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
212
|
+
# 注意:必须延迟导入,避免 import vools 时预加载 vools.bridge 子包,
|
|
213
|
+
# 否则 vools.BRIDGE_AVAILABLE 标志的翻转逻辑永远不执行。
|
|
214
|
+
_safe_eval_shim = None
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _load_safe_eval_shim():
|
|
218
|
+
"""延迟加载 Rust safe_eval shim(首次需要时导入 vools.bridge)。"""
|
|
219
|
+
global _safe_eval_shim
|
|
220
|
+
if _safe_eval_shim is not None:
|
|
221
|
+
return _safe_eval_shim
|
|
222
|
+
try:
|
|
223
|
+
from ..bridge.rust import safe_eval_shim as _shim
|
|
224
|
+
_safe_eval_shim = _shim
|
|
225
|
+
except Exception:
|
|
226
|
+
_safe_eval_shim = None
|
|
227
|
+
return _safe_eval_shim
|
|
216
228
|
|
|
217
229
|
|
|
218
230
|
def _safe_eval_rust_impl(expr: str, vars: Optional[Dict[str, Any]] = None, timeout_ms: int = 1000) -> Any:
|
|
@@ -236,16 +248,17 @@ def _safe_eval_rust_impl(expr: str, vars: Optional[Dict[str, Any]] = None, timeo
|
|
|
236
248
|
SafeEvalError: 当表达式包含不安全内容时
|
|
237
249
|
"""
|
|
238
250
|
# 检查 Rust 是否可用
|
|
239
|
-
|
|
251
|
+
_shim = _load_safe_eval_shim()
|
|
252
|
+
if _shim is None or not _shim.is_rust_available():
|
|
240
253
|
raise SafeEvalError("Rust 桥接库不可用")
|
|
241
254
|
|
|
242
255
|
# 编译表达式为 VM 指令
|
|
243
|
-
instructions, compile_err =
|
|
256
|
+
instructions, compile_err = _shim.compile_to_instructions(expr)
|
|
244
257
|
if compile_err:
|
|
245
258
|
raise SafeEvalError(compile_err)
|
|
246
259
|
|
|
247
260
|
# 执行指令
|
|
248
|
-
result =
|
|
261
|
+
result = _shim.eval_instructions(instructions, timeout_ms)
|
|
249
262
|
|
|
250
263
|
if not result.get("ok", False):
|
|
251
264
|
error = result.get("error", {})
|
|
@@ -300,7 +313,8 @@ def safe_eval_rust(expr: str, vars: Optional[Dict[str, Any]] = None, timeout_ms:
|
|
|
300
313
|
|
|
301
314
|
def is_rust_safe_eval_available() -> bool:
|
|
302
315
|
"""检查 Rust 安全沙箱是否可用"""
|
|
303
|
-
|
|
316
|
+
_shim = _load_safe_eval_shim()
|
|
317
|
+
return _shim is not None and _shim.is_rust_available()
|
|
304
318
|
|
|
305
319
|
|
|
306
320
|
DANGEROUS_PATTERNS = [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vools
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
4
4
|
Summary: Python 函数式编程工具集
|
|
5
5
|
Author-email: Victor <victortop921129@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -239,12 +239,18 @@ Provides-Extra: serialize
|
|
|
239
239
|
Requires-Dist: msgpack>=1.0; extra == "serialize"
|
|
240
240
|
Requires-Dist: orjson>=3.9; extra == "serialize"
|
|
241
241
|
Provides-Extra: rx
|
|
242
|
-
Requires-Dist: vools-rx==0.7.
|
|
242
|
+
Requires-Dist: vools-rx==0.7.4; extra == "rx"
|
|
243
243
|
Provides-Extra: bridges
|
|
244
|
-
Requires-Dist: vools-bridges==0.7.
|
|
244
|
+
Requires-Dist: vools-bridges==0.7.4; extra == "bridges"
|
|
245
|
+
Provides-Extra: dll32
|
|
246
|
+
Requires-Dist: vools-dll32==0.7.4; extra == "dll32"
|
|
247
|
+
Provides-Extra: xl
|
|
248
|
+
Requires-Dist: vools-xl==0.7.4; extra == "xl"
|
|
245
249
|
Provides-Extra: all
|
|
246
|
-
Requires-Dist: vools-rx==0.7.
|
|
247
|
-
Requires-Dist: vools-bridges==0.7.
|
|
250
|
+
Requires-Dist: vools-rx==0.7.4; extra == "all"
|
|
251
|
+
Requires-Dist: vools-bridges==0.7.4; extra == "all"
|
|
252
|
+
Requires-Dist: vools-dll32==0.7.4; extra == "all"
|
|
253
|
+
Requires-Dist: vools-xl==0.7.4; extra == "all"
|
|
248
254
|
Provides-Extra: cli
|
|
249
255
|
Requires-Dist: typer>=0.12.0; extra == "cli"
|
|
250
256
|
Requires-Dist: typing-extensions>=4.0.0; extra == "cli"
|