ok-script 2.0.0b2__tar.gz → 2.0.0b4__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.
- {ok_script-2.0.0b2/ok_script.egg-info → ok_script-2.0.0b4}/PKG-INFO +36 -5
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/README.md +13 -3
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/__init__.py +9 -1
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/app.py +3 -3
- ok_script-2.0.0b4/ok/ui/web/requirements.py +13 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/server.py +2 -6
- {ok_script-2.0.0b2 → ok_script-2.0.0b4/ok_script.egg-info}/PKG-INFO +36 -5
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok_script.egg-info/SOURCES.txt +1 -0
- ok_script-2.0.0b4/ok_script.egg-info/requires.txt +42 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/pyproject.toml +38 -10
- ok_script-2.0.0b4/tests/test_package_metadata.py +35 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_runtime_startup.py +36 -3
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_web_app.py +11 -2
- ok_script-2.0.0b2/ok_script.egg-info/requires.txt +0 -17
- ok_script-2.0.0b2/tests/test_package_metadata.py +0 -27
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/LICENSE.txt +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/MANIFEST.in +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/diagnostics/qq_trace.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/__main__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/alas/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/alas/emulator_base.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/alas/emulator_windows.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/alas/platform_windows.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/alas/utils.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/deep.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/minitouch.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/nemu_ipc.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/nemu_utils.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/pool.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/timer.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/adb/util.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/windows/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/windows/d3d11.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/capture/windows/dump.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/cli.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/config_schema.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/downloads.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/events.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/icons.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/notifications.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/screenshot.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/script_editing.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/script_packager.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/script_templates.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/start_controller.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/task_manager.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/template_store.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/translation.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/core/ui_config.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/DeviceManager.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/adb.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/base.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/bitblt.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/bitblt_utils.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/browser.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/desktop_duplication.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/hwnd_window.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/image.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/nemu_ipc.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/types.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/update.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/capture_methods/windows_graphics.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/adb.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/base.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/browser.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/do_nothing.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/foreground_post_message.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/genshin.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/keys.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/post_message.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/pydirect.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/pynput.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/interaction_methods/swipe.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/device/intercation.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/feature/Box.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/feature/Feature.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/feature/FeatureSet.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/feature/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/gui/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/gui/util/pyappify_startup.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/manager.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/messenger_images.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/pipeline.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/ppocr.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/providers.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/system.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/notification/windows_messenger.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ocr/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ocr/download_paddle_model.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Media/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Security/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/Storage/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/UI/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/Windows/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/delegate.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/export.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/idldsl.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/inspectable.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/roapi.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/types.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/rotypes/winstring.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/task/DiagnosisTask.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/task/TaskExecutor.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/task/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/task/exceptions.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/task/task.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/task/web.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/test/OKTestRunner.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/test/RunTests.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/test/TaskTestCase.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/test/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/third_party/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/third_party/paperclip.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/overlay/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/overlay/win32_gdi.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/Communicate.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/MainWindow.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/MessageWindow.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/StartController.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/TabTitles.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/about/AboutTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/about/HttpTextEdit.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/about/LinksBar.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/about/ProjectCard.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/about/VersionCard.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/about/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/common/OKIcon.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/common/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/common/accent_color.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/common/config.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/common/design_system.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/common/icons.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/common/style_sheet.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/debug/DebugTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/debug/OverlayWidget.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/debug/RunCodeTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/debug/Screenshot.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/debug/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/events.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/en_US.qm +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/en_US.ts +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/es_ES.qm +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/es_ES.ts +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/ja_JP.qm +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/ja_JP.ts +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/ko_KR.qm +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/ko_KR.ts +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/path.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/update.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/zh_CN.qm +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/zh_CN.ts +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/zh_TW.qm +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/i18n/zh_TW.ts +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/overlay/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/card.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/discord.svg +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/heart.svg +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/message_window.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/setting_interface.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/status_bar.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/stop.svg +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/dark/tab.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/card.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/discord.svg +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/heart.svg +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/message_window.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/setting_interface.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/status_bar.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/stop.svg +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qss/light/tab.qss +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/qt.qrc +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/resources.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/settings/GlobalConfigCard.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/settings/GlobalConfigTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/settings/SettingTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/settings/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/start/LogWindow.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/start/SelectCaptureListView.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/start/SelectInteractionListView.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/start/StartCard.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/start/StartTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/start/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/ConfigCard.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/ConfigItemFactory.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/ConfigLabelAndWidget.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/EditTaskTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndButtons.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndDoubleSpinBox.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndDropDown.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndFileSelector.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndGlobal.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndLineEdit.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndList.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndMultiSelection.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndSpinBox.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndSwitchButton.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndTextEdit.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/LabelAndWidget.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/MarkUpWindow.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/ModifyListDialog.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/ModifyListItem.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/OneTimeTaskTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/RecordScript.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/ScheduleTaskTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/StartButton.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TaskCard.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TaskManger.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TaskTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TemplateFactory.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TemplateTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TooltipTableWidget.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/TriggerTaskTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/tasks/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/Alert.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/InitWorker.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/app.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/download.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/pip_util.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/pyappify_startup.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/touch_scroll.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/util/windows_thumbnail.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/BaseLoading.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/BaseWindow.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/Card.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/CustomTab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/EmptyCard.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/ExpandCardLayout.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/FlowLayout.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/FramelessDialog.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/ImageWidget.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/ListTableWidgetItem.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/NumericTableWidgetItem.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/OkCompactSpinBox.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/StartLoadingDialog.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/StatusBar.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/Tab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/TabWidget.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/WidgetWithVLabel.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/YesNonWidgetItem.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/qt/widget/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/static/app.js +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/static/chunk-fluent.js +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/static/chunk-react.js +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/static/index.css +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/ui/web/static/index.html +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/update/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/update/copy_ok_folder.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/update/inline_ok_requirements.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/Analytics.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/GlobalConfig.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/__init__.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/blur.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/clazz.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/collection.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/color.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/config.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/explorer.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/file.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/gpu_driver_settings.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/handler.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/i18n.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/logger.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/partial_sync_repo.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/print_hwnd.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/process.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/window.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok/util/windows_schedule.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok_script.egg-info/dependency_links.txt +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok_script.egg-info/entry_points.txt +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok_script.egg-info/not-zip-safe +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/ok_script.egg-info/top_level.txt +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/scripts/generate_web_i18n.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/setup.cfg +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/setup.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_accent_color.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_app.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_base_interaction.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_blur.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_box.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_capture_update.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_cli.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_config_card.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_core_events.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_core_ui_services.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_device_manager.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_expand_card_layout.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_explorer.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_global_config.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_gpu_driver_settings.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_headless_imports.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_inline_ok_requirements.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_logger.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_main_window_notifications.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_main_window_startup_tab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_main_window_system_theme.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_missing_frame.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_navigation_state.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_nemu_ipc_capture.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_notifications.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_ok_mutex.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_overlay_custom_draw.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_process.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_pyappify_startup_update.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_qt_events.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_qt_legacy_imports.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_start_controller.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_task_executor_queue.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_task_ui.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_template_tab.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_touch_scroll.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_translation_fallback.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_ui_config.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_web_i18n.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_web_server.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_web_task_tabs.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_web_ui_pages.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_web_ui_tasks.py +0 -0
- {ok_script-2.0.0b2 → ok_script-2.0.0b4}/tests/test_windows_graphics_capture.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ok-script
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b4
|
|
4
4
|
Summary: Automation with Computer Vision for Python
|
|
5
5
|
Author-email: ok-oldking <firedcto@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/ok-oldking/ok-script
|
|
@@ -23,13 +23,34 @@ Requires-Dist: psutil>=6.0.0
|
|
|
23
23
|
Requires-Dist: pydirectinput==1.0.4
|
|
24
24
|
Requires-Dist: pycaw==20240210
|
|
25
25
|
Requires-Dist: mouse==0.7.1
|
|
26
|
+
Requires-Dist: pynput>=1.8.1
|
|
27
|
+
Provides-Extra: default
|
|
28
|
+
Requires-Dist: numpy>=1.26.4; extra == "default"
|
|
29
|
+
Requires-Dist: Pillow>=10.0; extra == "default"
|
|
30
|
+
Requires-Dist: ok-d3dshot>=0.1.5; extra == "default"
|
|
31
|
+
Requires-Dist: OpenCC==1.2.0; extra == "default"
|
|
26
32
|
Provides-Extra: web
|
|
27
33
|
Requires-Dist: fastapi>=0.115.0; extra == "web"
|
|
28
34
|
Requires-Dist: uvicorn[standard]>=0.30.0; extra == "web"
|
|
29
35
|
Requires-Dist: pywebview>=5.4; extra == "web"
|
|
30
36
|
Provides-Extra: qt
|
|
37
|
+
Requires-Dist: PySide6-Essentials>=6.7.0; extra == "qt"
|
|
38
|
+
Requires-Dist: PySideSix-Frameless-Window>=0.3.12; extra == "qt"
|
|
39
|
+
Requires-Dist: darkdetect>=0.8.0; extra == "qt"
|
|
31
40
|
Requires-Dist: PySide6-Fluent-Widgets>=1.8.3; extra == "qt"
|
|
32
|
-
|
|
41
|
+
Provides-Extra: adb
|
|
42
|
+
Requires-Dist: adbutils>=2.2.1; extra == "adb"
|
|
43
|
+
Provides-Extra: ocr
|
|
44
|
+
Requires-Dist: onnxocr-ppocrv5; extra == "ocr"
|
|
45
|
+
Provides-Extra: dev
|
|
46
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
47
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
48
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
49
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
50
|
+
Requires-Dist: setuptools>=77; extra == "dev"
|
|
51
|
+
Requires-Dist: wheel; extra == "dev"
|
|
52
|
+
Requires-Dist: get-pypi-latest-version; extra == "dev"
|
|
53
|
+
Requires-Dist: mkdocs-material==9.7.7; extra == "dev"
|
|
33
54
|
Dynamic: license-file
|
|
34
55
|
|
|
35
56
|
# ok-script
|
|
@@ -67,17 +88,27 @@ ok-script 支持 Python 3.11 及以上版本,推荐使用 Python 3.12。
|
|
|
67
88
|
python -m pip install ok-script
|
|
68
89
|
```
|
|
69
90
|
|
|
70
|
-
|
|
91
|
+
只安装应用所需的依赖配置。`default` 为无界面模式,Web、Qt、ADB 和 OCR
|
|
92
|
+
能力分别按需安装:
|
|
71
93
|
|
|
72
94
|
```powershell
|
|
95
|
+
python -m pip install "ok-script[default]"
|
|
73
96
|
python -m pip install "ok-script[qt]"
|
|
74
97
|
python -m pip install "ok-script[web]"
|
|
98
|
+
python -m pip install "ok-script[adb]"
|
|
99
|
+
python -m pip install "ok-script[ocr]"
|
|
75
100
|
```
|
|
76
101
|
|
|
77
|
-
|
|
102
|
+
ok-script 不会自动选择 OpenCV。用户必须根据自己的应用选择版本,并且只安装
|
|
103
|
+
一个变体:`opencv-python`、`opencv-contrib-python`、`opencv-python-headless`
|
|
104
|
+
或 `opencv-contrib-python-headless`。
|
|
105
|
+
|
|
106
|
+
以无界面模式开发本仓库时,同时安装 `pyproject.toml` 中的 `default` 和 `dev`
|
|
107
|
+
依赖组;再根据需要添加 `--group web`、`--group qt`、`--group adb` 或
|
|
108
|
+
`--group ocr`:
|
|
78
109
|
|
|
79
110
|
```powershell
|
|
80
|
-
python -m pip install --editable . --group default
|
|
111
|
+
python -m pip install --editable . --group default --group dev
|
|
81
112
|
```
|
|
82
113
|
|
|
83
114
|
如果要创建完整的自动化项目,建议从 [`ok-script-app`](https://github.com/ok-oldking/ok-script-app) 模板开始,而不是直接在本仓库中编写业务脚本。
|
|
@@ -33,17 +33,27 @@ ok-script 支持 Python 3.11 及以上版本,推荐使用 Python 3.12。
|
|
|
33
33
|
python -m pip install ok-script
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
只安装应用所需的依赖配置。`default` 为无界面模式,Web、Qt、ADB 和 OCR
|
|
37
|
+
能力分别按需安装:
|
|
37
38
|
|
|
38
39
|
```powershell
|
|
40
|
+
python -m pip install "ok-script[default]"
|
|
39
41
|
python -m pip install "ok-script[qt]"
|
|
40
42
|
python -m pip install "ok-script[web]"
|
|
43
|
+
python -m pip install "ok-script[adb]"
|
|
44
|
+
python -m pip install "ok-script[ocr]"
|
|
41
45
|
```
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
ok-script 不会自动选择 OpenCV。用户必须根据自己的应用选择版本,并且只安装
|
|
48
|
+
一个变体:`opencv-python`、`opencv-contrib-python`、`opencv-python-headless`
|
|
49
|
+
或 `opencv-contrib-python-headless`。
|
|
50
|
+
|
|
51
|
+
以无界面模式开发本仓库时,同时安装 `pyproject.toml` 中的 `default` 和 `dev`
|
|
52
|
+
依赖组;再根据需要添加 `--group web`、`--group qt`、`--group adb` 或
|
|
53
|
+
`--group ocr`:
|
|
44
54
|
|
|
45
55
|
```powershell
|
|
46
|
-
python -m pip install --editable . --group default
|
|
56
|
+
python -m pip install --editable . --group default --group dev
|
|
47
57
|
```
|
|
48
58
|
|
|
49
59
|
如果要创建完整的自动化项目,建议从 [`ok-script-app`](https://github.com/ok-oldking/ok-script-app) 模板开始,而不是直接在本仓库中编写业务脚本。
|
|
@@ -599,6 +599,12 @@ class OK:
|
|
|
599
599
|
import pyappify
|
|
600
600
|
from ok.util.config import Config
|
|
601
601
|
|
|
602
|
+
self.config = config
|
|
603
|
+
ui_config = resolve_ui_config(config)
|
|
604
|
+
if ui_config is not None and ui_config["type"] == "web":
|
|
605
|
+
from ok.ui.web.requirements import check_web_requirements
|
|
606
|
+
check_web_requirements()
|
|
607
|
+
|
|
602
608
|
check_mutex_fn = _resolve('check_mutex')
|
|
603
609
|
config_logger_fn = _resolve('config_logger')
|
|
604
610
|
global_config_class = _resolve('GlobalConfig')
|
|
@@ -617,7 +623,6 @@ class OK:
|
|
|
617
623
|
if pyappify.app_profile:
|
|
618
624
|
config['profile'] = pyappify.app_profile
|
|
619
625
|
og.config = config
|
|
620
|
-
self.config = config
|
|
621
626
|
config["config_folder"] = config.get("config_folder") or 'configs'
|
|
622
627
|
Config.config_folder = config["config_folder"]
|
|
623
628
|
config['debug'] = config.get("debug", False)
|
|
@@ -723,6 +728,9 @@ class OK:
|
|
|
723
728
|
logger.info("Keyboard interrupt received, exiting script.")
|
|
724
729
|
finally:
|
|
725
730
|
logger.info("Script has terminated.")
|
|
731
|
+
except SystemExit:
|
|
732
|
+
self.quit()
|
|
733
|
+
raise
|
|
726
734
|
except Exception as e:
|
|
727
735
|
logger.error("start error", e)
|
|
728
736
|
self.exit_event.set()
|
|
@@ -17,6 +17,7 @@ from typing import Any
|
|
|
17
17
|
from ok.core.events import EventMessage, communicate
|
|
18
18
|
from ok.core.template_store import CocoTemplateStore
|
|
19
19
|
from ok.task.web import WebTabConfig, call_task_tab_operation, task_tab_operations
|
|
20
|
+
from ok.ui.web.requirements import WEB_REQUIREMENTS_MESSAGE, check_web_requirements
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
LOG_LINE_PATTERN = re.compile(
|
|
@@ -1025,14 +1026,13 @@ class WebRuntime:
|
|
|
1025
1026
|
|
|
1026
1027
|
|
|
1027
1028
|
def create_web_app(config, ok_instance=None):
|
|
1029
|
+
check_web_requirements()
|
|
1028
1030
|
try:
|
|
1029
1031
|
from fastapi import FastAPI, HTTPException, Request, WebSocket, WebSocketDisconnect
|
|
1030
1032
|
from fastapi.responses import FileResponse
|
|
1031
1033
|
from fastapi.staticfiles import StaticFiles
|
|
1032
1034
|
except ImportError as exc:
|
|
1033
|
-
raise
|
|
1034
|
-
"The web UI requires FastAPI and Uvicorn. Install ok-script[web]."
|
|
1035
|
-
) from exc
|
|
1035
|
+
raise SystemExit(WEB_REQUIREMENTS_MESSAGE) from exc
|
|
1036
1036
|
|
|
1037
1037
|
# FastAPI resolves postponed endpoint annotations from module globals.
|
|
1038
1038
|
globals()["WebSocket"] = WebSocket
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
WEB_REQUIREMENTS_MESSAGE = (
|
|
2
|
+
"The web UI requires FastAPI and Uvicorn. Install ok-script[web]."
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def check_web_requirements():
|
|
7
|
+
"""Import required web packages before runtime workers are initialized."""
|
|
8
|
+
try:
|
|
9
|
+
import fastapi # noqa: F401
|
|
10
|
+
import uvicorn
|
|
11
|
+
except ImportError as exc:
|
|
12
|
+
raise SystemExit(WEB_REQUIREMENTS_MESSAGE) from exc
|
|
13
|
+
return uvicorn
|
|
@@ -7,6 +7,7 @@ import webbrowser
|
|
|
7
7
|
|
|
8
8
|
from ok.util.logger import Logger
|
|
9
9
|
from ok.core.ui_config import resolve_window_size
|
|
10
|
+
from ok.ui.web.requirements import check_web_requirements
|
|
10
11
|
|
|
11
12
|
logger = Logger.get_logger("web_server")
|
|
12
13
|
|
|
@@ -612,12 +613,7 @@ def _run_webview(web_config, url, server, server_socket, ui_state=None,
|
|
|
612
613
|
def run_web(config, host="127.0.0.1", port=0, open_browser=True, debug=None,
|
|
613
614
|
launch_mode=None, ok_instance=None):
|
|
614
615
|
"""Run the browser UI, using an OS-assigned port by default."""
|
|
615
|
-
|
|
616
|
-
import uvicorn
|
|
617
|
-
except ImportError as exc:
|
|
618
|
-
raise RuntimeError(
|
|
619
|
-
"The web UI requires FastAPI and Uvicorn. Install ok-script[web]."
|
|
620
|
-
) from exc
|
|
616
|
+
uvicorn = check_web_requirements()
|
|
621
617
|
|
|
622
618
|
from ok.ui.web.app import create_web_app
|
|
623
619
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ok-script
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b4
|
|
4
4
|
Summary: Automation with Computer Vision for Python
|
|
5
5
|
Author-email: ok-oldking <firedcto@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/ok-oldking/ok-script
|
|
@@ -23,13 +23,34 @@ Requires-Dist: psutil>=6.0.0
|
|
|
23
23
|
Requires-Dist: pydirectinput==1.0.4
|
|
24
24
|
Requires-Dist: pycaw==20240210
|
|
25
25
|
Requires-Dist: mouse==0.7.1
|
|
26
|
+
Requires-Dist: pynput>=1.8.1
|
|
27
|
+
Provides-Extra: default
|
|
28
|
+
Requires-Dist: numpy>=1.26.4; extra == "default"
|
|
29
|
+
Requires-Dist: Pillow>=10.0; extra == "default"
|
|
30
|
+
Requires-Dist: ok-d3dshot>=0.1.5; extra == "default"
|
|
31
|
+
Requires-Dist: OpenCC==1.2.0; extra == "default"
|
|
26
32
|
Provides-Extra: web
|
|
27
33
|
Requires-Dist: fastapi>=0.115.0; extra == "web"
|
|
28
34
|
Requires-Dist: uvicorn[standard]>=0.30.0; extra == "web"
|
|
29
35
|
Requires-Dist: pywebview>=5.4; extra == "web"
|
|
30
36
|
Provides-Extra: qt
|
|
37
|
+
Requires-Dist: PySide6-Essentials>=6.7.0; extra == "qt"
|
|
38
|
+
Requires-Dist: PySideSix-Frameless-Window>=0.3.12; extra == "qt"
|
|
39
|
+
Requires-Dist: darkdetect>=0.8.0; extra == "qt"
|
|
31
40
|
Requires-Dist: PySide6-Fluent-Widgets>=1.8.3; extra == "qt"
|
|
32
|
-
|
|
41
|
+
Provides-Extra: adb
|
|
42
|
+
Requires-Dist: adbutils>=2.2.1; extra == "adb"
|
|
43
|
+
Provides-Extra: ocr
|
|
44
|
+
Requires-Dist: onnxocr-ppocrv5; extra == "ocr"
|
|
45
|
+
Provides-Extra: dev
|
|
46
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
47
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
48
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
49
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
50
|
+
Requires-Dist: setuptools>=77; extra == "dev"
|
|
51
|
+
Requires-Dist: wheel; extra == "dev"
|
|
52
|
+
Requires-Dist: get-pypi-latest-version; extra == "dev"
|
|
53
|
+
Requires-Dist: mkdocs-material==9.7.7; extra == "dev"
|
|
33
54
|
Dynamic: license-file
|
|
34
55
|
|
|
35
56
|
# ok-script
|
|
@@ -67,17 +88,27 @@ ok-script 支持 Python 3.11 及以上版本,推荐使用 Python 3.12。
|
|
|
67
88
|
python -m pip install ok-script
|
|
68
89
|
```
|
|
69
90
|
|
|
70
|
-
|
|
91
|
+
只安装应用所需的依赖配置。`default` 为无界面模式,Web、Qt、ADB 和 OCR
|
|
92
|
+
能力分别按需安装:
|
|
71
93
|
|
|
72
94
|
```powershell
|
|
95
|
+
python -m pip install "ok-script[default]"
|
|
73
96
|
python -m pip install "ok-script[qt]"
|
|
74
97
|
python -m pip install "ok-script[web]"
|
|
98
|
+
python -m pip install "ok-script[adb]"
|
|
99
|
+
python -m pip install "ok-script[ocr]"
|
|
75
100
|
```
|
|
76
101
|
|
|
77
|
-
|
|
102
|
+
ok-script 不会自动选择 OpenCV。用户必须根据自己的应用选择版本,并且只安装
|
|
103
|
+
一个变体:`opencv-python`、`opencv-contrib-python`、`opencv-python-headless`
|
|
104
|
+
或 `opencv-contrib-python-headless`。
|
|
105
|
+
|
|
106
|
+
以无界面模式开发本仓库时,同时安装 `pyproject.toml` 中的 `default` 和 `dev`
|
|
107
|
+
依赖组;再根据需要添加 `--group web`、`--group qt`、`--group adb` 或
|
|
108
|
+
`--group ocr`:
|
|
78
109
|
|
|
79
110
|
```powershell
|
|
80
|
-
python -m pip install --editable . --group default
|
|
111
|
+
python -m pip install --editable . --group default --group dev
|
|
81
112
|
```
|
|
82
113
|
|
|
83
114
|
如果要创建完整的自动化项目,建议从 [`ok-script-app`](https://github.com/ok-oldking/ok-script-app) 模板开始,而不是直接在本仓库中编写业务脚本。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
pywin32>=306
|
|
2
|
+
pyappify>=1.0.6
|
|
3
|
+
typing-extensions>=4.11.0
|
|
4
|
+
requests>=2.32.3
|
|
5
|
+
psutil>=6.0.0
|
|
6
|
+
pydirectinput==1.0.4
|
|
7
|
+
pycaw==20240210
|
|
8
|
+
mouse==0.7.1
|
|
9
|
+
pynput>=1.8.1
|
|
10
|
+
|
|
11
|
+
[adb]
|
|
12
|
+
adbutils>=2.2.1
|
|
13
|
+
|
|
14
|
+
[default]
|
|
15
|
+
numpy>=1.26.4
|
|
16
|
+
Pillow>=10.0
|
|
17
|
+
ok-d3dshot>=0.1.5
|
|
18
|
+
OpenCC==1.2.0
|
|
19
|
+
|
|
20
|
+
[dev]
|
|
21
|
+
pytest>=8.0
|
|
22
|
+
mypy>=1.10
|
|
23
|
+
build>=1.2
|
|
24
|
+
twine>=5.0
|
|
25
|
+
setuptools>=77
|
|
26
|
+
wheel
|
|
27
|
+
get-pypi-latest-version
|
|
28
|
+
mkdocs-material==9.7.7
|
|
29
|
+
|
|
30
|
+
[ocr]
|
|
31
|
+
onnxocr-ppocrv5
|
|
32
|
+
|
|
33
|
+
[qt]
|
|
34
|
+
PySide6-Essentials>=6.7.0
|
|
35
|
+
PySideSix-Frameless-Window>=0.3.12
|
|
36
|
+
darkdetect>=0.8.0
|
|
37
|
+
PySide6-Fluent-Widgets>=1.8.3
|
|
38
|
+
|
|
39
|
+
[web]
|
|
40
|
+
fastapi>=0.115.0
|
|
41
|
+
uvicorn[standard]>=0.30.0
|
|
42
|
+
pywebview>=5.4
|
|
@@ -34,17 +34,42 @@ dependencies = [
|
|
|
34
34
|
"pydirectinput==1.0.4",
|
|
35
35
|
"pycaw==20240210",
|
|
36
36
|
"mouse==0.7.1",
|
|
37
|
+
"pynput>=1.8.1",
|
|
37
38
|
]
|
|
38
39
|
|
|
39
40
|
[project.optional-dependencies]
|
|
41
|
+
default = [
|
|
42
|
+
"numpy>=1.26.4",
|
|
43
|
+
"Pillow>=10.0",
|
|
44
|
+
"ok-d3dshot>=0.1.5",
|
|
45
|
+
"OpenCC==1.2.0",
|
|
46
|
+
]
|
|
40
47
|
web = [
|
|
41
48
|
"fastapi>=0.115.0",
|
|
42
49
|
"uvicorn[standard]>=0.30.0",
|
|
43
50
|
"pywebview>=5.4",
|
|
44
51
|
]
|
|
45
52
|
qt = [
|
|
53
|
+
"PySide6-Essentials>=6.7.0",
|
|
54
|
+
"PySideSix-Frameless-Window>=0.3.12",
|
|
55
|
+
"darkdetect>=0.8.0",
|
|
46
56
|
"PySide6-Fluent-Widgets>=1.8.3",
|
|
47
|
-
|
|
57
|
+
]
|
|
58
|
+
adb = [
|
|
59
|
+
"adbutils>=2.2.1",
|
|
60
|
+
]
|
|
61
|
+
ocr = [
|
|
62
|
+
"onnxocr-ppocrv5",
|
|
63
|
+
]
|
|
64
|
+
dev = [
|
|
65
|
+
"pytest>=8.0",
|
|
66
|
+
"mypy>=1.10",
|
|
67
|
+
"build>=1.2",
|
|
68
|
+
"twine>=5.0",
|
|
69
|
+
"setuptools>=77",
|
|
70
|
+
"wheel",
|
|
71
|
+
"get-pypi-latest-version",
|
|
72
|
+
"mkdocs-material==9.7.7",
|
|
48
73
|
]
|
|
49
74
|
|
|
50
75
|
[project.urls]
|
|
@@ -55,6 +80,12 @@ Repository = "https://github.com/ok-oldking/ok-script"
|
|
|
55
80
|
ok = "ok.cli:main"
|
|
56
81
|
|
|
57
82
|
[dependency-groups]
|
|
83
|
+
default = [
|
|
84
|
+
"numpy>=1.26.4",
|
|
85
|
+
"Pillow>=10.0",
|
|
86
|
+
"ok-d3dshot>=0.1.5",
|
|
87
|
+
"OpenCC==1.2.0",
|
|
88
|
+
]
|
|
58
89
|
web = [
|
|
59
90
|
"fastapi>=0.115.0",
|
|
60
91
|
"uvicorn[standard]>=0.30.0",
|
|
@@ -65,17 +96,14 @@ qt = [
|
|
|
65
96
|
"PySideSix-Frameless-Window>=0.3.12",
|
|
66
97
|
"darkdetect>=0.8.0",
|
|
67
98
|
"PySide6-Fluent-Widgets>=1.8.3",
|
|
68
|
-
"pynput>=1.8.1",
|
|
69
99
|
]
|
|
70
|
-
|
|
71
|
-
{ include-group = "web" },
|
|
72
|
-
{ include-group = "qt" },
|
|
73
|
-
"numpy>=1.26.4",
|
|
74
|
-
"opencv-python>=4.9.0.80",
|
|
75
|
-
"Pillow>=10.0",
|
|
100
|
+
adb = [
|
|
76
101
|
"adbutils>=2.2.1",
|
|
77
|
-
|
|
78
|
-
|
|
102
|
+
]
|
|
103
|
+
ocr = [
|
|
104
|
+
"onnxocr-ppocrv5",
|
|
105
|
+
]
|
|
106
|
+
dev = [
|
|
79
107
|
"pytest>=8.0",
|
|
80
108
|
"mypy>=1.10",
|
|
81
109
|
"build>=1.2",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import tomllib
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
ROOT = Path(__file__).parents[1]
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_pyproject_profiles_are_consistent_and_headless_by_default():
|
|
9
|
+
metadata = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
10
|
+
project = metadata["project"]
|
|
11
|
+
extras = project["optional-dependencies"]
|
|
12
|
+
groups = metadata["dependency-groups"]
|
|
13
|
+
|
|
14
|
+
assert set(extras) == {"default", "web", "qt", "adb", "ocr", "dev"}
|
|
15
|
+
assert extras == groups
|
|
16
|
+
assert extras["adb"] == ["adbutils>=2.2.1"]
|
|
17
|
+
assert extras["ocr"] == ["onnxocr-ppocrv5"]
|
|
18
|
+
assert not any(
|
|
19
|
+
requirement.startswith(("fastapi", "PySide6"))
|
|
20
|
+
for requirement in extras["default"]
|
|
21
|
+
)
|
|
22
|
+
assert any(requirement.startswith("pytest") for requirement in extras["dev"])
|
|
23
|
+
assert not any(requirement.startswith("pytest") for requirement in project["dependencies"])
|
|
24
|
+
assert "pynput>=1.8.1" in project["dependencies"]
|
|
25
|
+
|
|
26
|
+
managed_requirements = [
|
|
27
|
+
*project["dependencies"],
|
|
28
|
+
*(requirement for profile in extras.values() for requirement in profile),
|
|
29
|
+
]
|
|
30
|
+
assert not any("opencv" in requirement.lower() for requirement in managed_requirements)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_legacy_requirements_files_are_replaced_by_pyproject_groups():
|
|
34
|
+
assert not (ROOT / "requirements.txt").exists()
|
|
35
|
+
assert not (ROOT / "requirements-docs.txt").exists()
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import sys
|
|
1
2
|
import threading
|
|
2
3
|
from types import SimpleNamespace
|
|
4
|
+
from unittest.mock import Mock, patch
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
3
7
|
|
|
4
8
|
from ok import OK
|
|
5
9
|
from ok.core.events import communicate
|
|
@@ -51,6 +55,22 @@ def make_runtime(*, auto_start=False, task=0, exit_after=False):
|
|
|
51
55
|
return runtime, controller
|
|
52
56
|
|
|
53
57
|
|
|
58
|
+
def test_ok_checks_web_requirements_before_runtime_initialization():
|
|
59
|
+
failure = SystemExit(
|
|
60
|
+
"The web UI requires FastAPI and Uvicorn. Install ok-script[web]."
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
with patch(
|
|
64
|
+
"ok.ui.web.requirements.check_web_requirements", side_effect=failure
|
|
65
|
+
) as check_requirements, patch.object(OK, "do_init") as do_init, \
|
|
66
|
+
pytest.raises(SystemExit) as exit_info:
|
|
67
|
+
OK({"gui": {"type": "web", "launch_mode": "server"}})
|
|
68
|
+
|
|
69
|
+
assert exit_info.value is failure
|
|
70
|
+
check_requirements.assert_called_once_with()
|
|
71
|
+
do_init.assert_not_called()
|
|
72
|
+
|
|
73
|
+
|
|
54
74
|
def test_start_runtime_refreshes_devices_once_and_emits_start_success():
|
|
55
75
|
runtime, controller = make_runtime()
|
|
56
76
|
events = []
|
|
@@ -90,7 +110,6 @@ def test_ok_start_routes_nested_browser_gui_to_web_server():
|
|
|
90
110
|
runtime = object.__new__(OK)
|
|
91
111
|
runtime.config = {"gui": {"type": "web", "launch_mode": "browser"}}
|
|
92
112
|
|
|
93
|
-
from unittest.mock import patch
|
|
94
113
|
with patch("ok.ui.web.server.run_web", return_value=43210) as run_web:
|
|
95
114
|
assert runtime.start() == 43210
|
|
96
115
|
|
|
@@ -103,7 +122,6 @@ def test_ok_start_routes_nested_pywebview_ui_to_pywebview():
|
|
|
103
122
|
runtime = object.__new__(OK)
|
|
104
123
|
runtime.config = {"gui": {"type": "web", "launch_mode": "pywebview"}}
|
|
105
124
|
|
|
106
|
-
from unittest.mock import patch
|
|
107
125
|
with patch("ok.ui.web.server.run_web", return_value=43210) as run_web:
|
|
108
126
|
assert runtime.start() == 43210
|
|
109
127
|
|
|
@@ -116,7 +134,6 @@ def test_ok_start_routes_nested_server_gui_without_opening_window():
|
|
|
116
134
|
runtime = object.__new__(OK)
|
|
117
135
|
runtime.config = {"gui": {"type": "web", "launch_mode": "server"}}
|
|
118
136
|
|
|
119
|
-
from unittest.mock import patch
|
|
120
137
|
with patch("ok.ui.web.server.run_web", return_value=43210) as run_web:
|
|
121
138
|
assert runtime.start() == 43210
|
|
122
139
|
|
|
@@ -125,6 +142,22 @@ def test_ok_start_routes_nested_server_gui_without_opening_window():
|
|
|
125
142
|
)
|
|
126
143
|
|
|
127
144
|
|
|
145
|
+
def test_ok_start_exits_when_web_requirements_are_missing():
|
|
146
|
+
runtime = object.__new__(OK)
|
|
147
|
+
runtime.config = {"gui": {"type": "web", "launch_mode": "server"}}
|
|
148
|
+
runtime.exit_event = threading.Event()
|
|
149
|
+
runtime._app = None
|
|
150
|
+
runtime._headless_app = Mock()
|
|
151
|
+
|
|
152
|
+
with patch.dict(sys.modules, {"uvicorn": None}), \
|
|
153
|
+
pytest.raises(SystemExit, match="Install ok-script\\[web\\]") as exit_info:
|
|
154
|
+
runtime.start()
|
|
155
|
+
|
|
156
|
+
assert exit_info.value.code != 0
|
|
157
|
+
assert runtime.exit_event.is_set()
|
|
158
|
+
runtime._headless_app.quit.assert_called_once_with()
|
|
159
|
+
|
|
160
|
+
|
|
128
161
|
def test_device_refresh_always_publishes_completion_event():
|
|
129
162
|
start_calls = []
|
|
130
163
|
manager = SimpleNamespace(
|
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import sys
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
from types import SimpleNamespace
|
|
4
|
-
from unittest.mock import AsyncMock, Mock
|
|
5
|
+
from unittest.mock import AsyncMock, Mock, patch
|
|
5
6
|
|
|
6
7
|
import pytest
|
|
7
8
|
|
|
8
9
|
from ok import App, HeadlessApp, _create_ok_config
|
|
9
10
|
from ok.ui.web.app import (
|
|
10
|
-
WebRuntime, _color_hex, _copy_web_icon, _device_payload, _read_log,
|
|
11
|
+
WebRuntime, _color_hex, _copy_web_icon, _device_payload, _read_log, create_web_app,
|
|
11
12
|
_EventSessionRegistry, _send_websocket_payload,
|
|
12
13
|
_wait_for_websocket_disconnect,
|
|
13
14
|
)
|
|
14
15
|
from ok.util.config import Config
|
|
15
16
|
|
|
16
17
|
|
|
18
|
+
def test_create_web_app_exits_when_fastapi_is_missing():
|
|
19
|
+
with patch.dict(sys.modules, {"fastapi": None}), \
|
|
20
|
+
pytest.raises(SystemExit, match="Install ok-script\\[web\\]") as exit_info:
|
|
21
|
+
create_web_app({})
|
|
22
|
+
|
|
23
|
+
assert exit_info.value.code != 0
|
|
24
|
+
|
|
25
|
+
|
|
17
26
|
def test_copy_web_icon_prepares_static_asset(tmp_path: Path):
|
|
18
27
|
source = tmp_path / "source" / "app.png"
|
|
19
28
|
source.parent.mkdir()
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
pywin32>=306
|
|
2
|
-
pyappify>=1.0.6
|
|
3
|
-
typing-extensions>=4.11.0
|
|
4
|
-
requests>=2.32.3
|
|
5
|
-
psutil>=6.0.0
|
|
6
|
-
pydirectinput==1.0.4
|
|
7
|
-
pycaw==20240210
|
|
8
|
-
mouse==0.7.1
|
|
9
|
-
|
|
10
|
-
[qt]
|
|
11
|
-
PySide6-Fluent-Widgets>=1.8.3
|
|
12
|
-
pynput>=1.8.1
|
|
13
|
-
|
|
14
|
-
[web]
|
|
15
|
-
fastapi>=0.115.0
|
|
16
|
-
uvicorn[standard]>=0.30.0
|
|
17
|
-
pywebview>=5.4
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import tomllib
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
ROOT = Path(__file__).parents[1]
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def test_pyproject_keeps_runtime_and_development_dependencies_separate():
|
|
9
|
-
metadata = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
10
|
-
project = metadata["project"]
|
|
11
|
-
extras = project["optional-dependencies"]
|
|
12
|
-
groups = metadata["dependency-groups"]
|
|
13
|
-
|
|
14
|
-
assert set(extras) == {"web", "qt"}
|
|
15
|
-
assert {item["include-group"] for item in groups["default"] if isinstance(item, dict)} == {
|
|
16
|
-
"web", "qt",
|
|
17
|
-
}
|
|
18
|
-
assert any(
|
|
19
|
-
isinstance(requirement, str) and requirement.startswith("pytest")
|
|
20
|
-
for requirement in groups["default"]
|
|
21
|
-
)
|
|
22
|
-
assert not any(requirement.startswith("pytest") for requirement in project["dependencies"])
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def test_legacy_requirements_files_are_replaced_by_pyproject_groups():
|
|
26
|
-
assert not (ROOT / "requirements.txt").exists()
|
|
27
|
-
assert not (ROOT / "requirements-docs.txt").exists()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|