ok-script 2.0.3__tar.gz → 2.0.5__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.
Files changed (357) hide show
  1. {ok_script-2.0.3/ok_script.egg-info → ok_script-2.0.5}/PKG-INFO +1 -1
  2. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/DeviceManager.py +4 -0
  3. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/hwnd_window.py +17 -8
  4. {ok_script-2.0.3 → ok_script-2.0.5}/ok/task/TaskExecutor.py +42 -6
  5. {ok_script-2.0.3 → ok_script-2.0.5/ok_script.egg-info}/PKG-INFO +1 -1
  6. {ok_script-2.0.3 → ok_script-2.0.5}/ok_script.egg-info/SOURCES.txt +1 -0
  7. ok_script-2.0.5/tests/test_task_executor_ocr.py +113 -0
  8. {ok_script-2.0.3 → ok_script-2.0.5}/LICENSE.txt +0 -0
  9. {ok_script-2.0.3 → ok_script-2.0.5}/MANIFEST.in +0 -0
  10. {ok_script-2.0.3 → ok_script-2.0.5}/README.md +0 -0
  11. {ok_script-2.0.3 → ok_script-2.0.5}/diagnostics/qq_trace.py +0 -0
  12. {ok_script-2.0.3 → ok_script-2.0.5}/ok/__init__.py +0 -0
  13. {ok_script-2.0.3 → ok_script-2.0.5}/ok/__main__.py +0 -0
  14. {ok_script-2.0.3 → ok_script-2.0.5}/ok/alas/__init__.py +0 -0
  15. {ok_script-2.0.3 → ok_script-2.0.5}/ok/alas/emulator_base.py +0 -0
  16. {ok_script-2.0.3 → ok_script-2.0.5}/ok/alas/emulator_windows.py +0 -0
  17. {ok_script-2.0.3 → ok_script-2.0.5}/ok/alas/platform_windows.py +0 -0
  18. {ok_script-2.0.3 → ok_script-2.0.5}/ok/alas/utils.py +0 -0
  19. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/__init__.py +0 -0
  20. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/__init__.py +0 -0
  21. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/deep.py +0 -0
  22. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/minitouch.py +0 -0
  23. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/nemu_ipc.py +0 -0
  24. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/nemu_utils.py +0 -0
  25. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/pool.py +0 -0
  26. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/timer.py +0 -0
  27. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/adb/util.py +0 -0
  28. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/windows/__init__.py +0 -0
  29. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/windows/d3d11.py +0 -0
  30. {ok_script-2.0.3 → ok_script-2.0.5}/ok/capture/windows/dump.py +0 -0
  31. {ok_script-2.0.3 → ok_script-2.0.5}/ok/cli.py +0 -0
  32. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/__init__.py +0 -0
  33. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/config_schema.py +0 -0
  34. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/downloads.py +0 -0
  35. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/events.py +0 -0
  36. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/icons.py +0 -0
  37. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/notifications.py +0 -0
  38. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/screenshot.py +0 -0
  39. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/script_editing.py +0 -0
  40. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/script_packager.py +0 -0
  41. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/script_templates.py +0 -0
  42. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/start_controller.py +0 -0
  43. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/task_manager.py +0 -0
  44. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/template_store.py +0 -0
  45. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/translation.py +0 -0
  46. {ok_script-2.0.3 → ok_script-2.0.5}/ok/core/ui_config.py +0 -0
  47. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/__init__.py +0 -0
  48. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture.py +0 -0
  49. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/__init__.py +0 -0
  50. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/adb.py +0 -0
  51. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/base.py +0 -0
  52. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/bitblt.py +0 -0
  53. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/bitblt_utils.py +0 -0
  54. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/browser.py +0 -0
  55. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/desktop_duplication.py +0 -0
  56. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/image.py +0 -0
  57. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/nemu_ipc.py +0 -0
  58. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/types.py +0 -0
  59. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/update.py +0 -0
  60. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/capture_methods/windows_graphics.py +0 -0
  61. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction.py +0 -0
  62. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/__init__.py +0 -0
  63. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/adb.py +0 -0
  64. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/base.py +0 -0
  65. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/browser.py +0 -0
  66. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/do_nothing.py +0 -0
  67. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/foreground_post_message.py +0 -0
  68. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/genshin.py +0 -0
  69. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/keys.py +0 -0
  70. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/post_message.py +0 -0
  71. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/pydirect.py +0 -0
  72. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/pynput.py +0 -0
  73. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/interaction_methods/swipe.py +0 -0
  74. {ok_script-2.0.3 → ok_script-2.0.5}/ok/device/intercation.py +0 -0
  75. {ok_script-2.0.3 → ok_script-2.0.5}/ok/feature/Box.py +0 -0
  76. {ok_script-2.0.3 → ok_script-2.0.5}/ok/feature/Feature.py +0 -0
  77. {ok_script-2.0.3 → ok_script-2.0.5}/ok/feature/FeatureSet.py +0 -0
  78. {ok_script-2.0.3 → ok_script-2.0.5}/ok/feature/__init__.py +0 -0
  79. {ok_script-2.0.3 → ok_script-2.0.5}/ok/gui/__init__.py +0 -0
  80. {ok_script-2.0.3 → ok_script-2.0.5}/ok/gui/util/pyappify_startup.py +0 -0
  81. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/__init__.py +0 -0
  82. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/manager.py +0 -0
  83. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/messenger_images.py +0 -0
  84. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/pipeline.py +0 -0
  85. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/ppocr.py +0 -0
  86. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/providers.py +0 -0
  87. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/system.py +0 -0
  88. {ok_script-2.0.3 → ok_script-2.0.5}/ok/notification/windows_messenger.py +0 -0
  89. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ocr/__init__.py +0 -0
  90. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ocr/download_paddle_model.py +0 -0
  91. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
  92. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
  93. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
  94. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
  95. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
  96. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
  97. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
  98. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
  99. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
  100. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Media/__init__.py +0 -0
  101. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
  102. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Security/__init__.py +0 -0
  103. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
  104. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/Storage/__init__.py +0 -0
  105. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/UI/ViewManagement/__init__.py +0 -0
  106. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/UI/__init__.py +0 -0
  107. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/Windows/__init__.py +0 -0
  108. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/__init__.py +0 -0
  109. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/delegate.py +0 -0
  110. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/export.py +0 -0
  111. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/idldsl.py +0 -0
  112. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/inspectable.py +0 -0
  113. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/roapi.py +0 -0
  114. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/types.py +0 -0
  115. {ok_script-2.0.3 → ok_script-2.0.5}/ok/rotypes/winstring.py +0 -0
  116. {ok_script-2.0.3 → ok_script-2.0.5}/ok/task/DiagnosisTask.py +0 -0
  117. {ok_script-2.0.3 → ok_script-2.0.5}/ok/task/__init__.py +0 -0
  118. {ok_script-2.0.3 → ok_script-2.0.5}/ok/task/exceptions.py +0 -0
  119. {ok_script-2.0.3 → ok_script-2.0.5}/ok/task/task.py +0 -0
  120. {ok_script-2.0.3 → ok_script-2.0.5}/ok/task/web.py +0 -0
  121. {ok_script-2.0.3 → ok_script-2.0.5}/ok/test/OKTestRunner.py +0 -0
  122. {ok_script-2.0.3 → ok_script-2.0.5}/ok/test/RunTests.py +0 -0
  123. {ok_script-2.0.3 → ok_script-2.0.5}/ok/test/TaskTestCase.py +0 -0
  124. {ok_script-2.0.3 → ok_script-2.0.5}/ok/test/__init__.py +0 -0
  125. {ok_script-2.0.3 → ok_script-2.0.5}/ok/third_party/__init__.py +0 -0
  126. {ok_script-2.0.3 → ok_script-2.0.5}/ok/third_party/paperclip.py +0 -0
  127. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/__init__.py +0 -0
  128. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/overlay/__init__.py +0 -0
  129. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/overlay/win32_gdi.py +0 -0
  130. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/Communicate.py +0 -0
  131. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/MainWindow.py +0 -0
  132. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/MessageWindow.py +0 -0
  133. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/StartController.py +0 -0
  134. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/TabTitles.py +0 -0
  135. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/__init__.py +0 -0
  136. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/about/AboutTab.py +0 -0
  137. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/about/HttpTextEdit.py +0 -0
  138. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/about/LinksBar.py +0 -0
  139. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/about/ProjectCard.py +0 -0
  140. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/about/UpdateCard.py +0 -0
  141. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/about/VersionCard.py +0 -0
  142. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/about/__init__.py +0 -0
  143. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/common/OKIcon.py +0 -0
  144. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/common/__init__.py +0 -0
  145. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/common/accent_color.py +0 -0
  146. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/common/config.py +0 -0
  147. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/common/design_system.py +0 -0
  148. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/common/icons.py +0 -0
  149. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/common/style_sheet.py +0 -0
  150. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/debug/DebugTab.py +0 -0
  151. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/debug/OverlayWidget.py +0 -0
  152. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/debug/RunCodeTab.py +0 -0
  153. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/debug/Screenshot.py +0 -0
  154. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/debug/__init__.py +0 -0
  155. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/events.py +0 -0
  156. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/GettextTranslator.py +0 -0
  157. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/__init__.py +0 -0
  158. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/en_US.qm +0 -0
  159. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/en_US.ts +0 -0
  160. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/es_ES.qm +0 -0
  161. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/es_ES.ts +0 -0
  162. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/ja_JP.qm +0 -0
  163. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/ja_JP.ts +0 -0
  164. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/ko_KR.qm +0 -0
  165. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/ko_KR.ts +0 -0
  166. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/path.py +0 -0
  167. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/update.py +0 -0
  168. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/zh_CN.qm +0 -0
  169. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/zh_CN.ts +0 -0
  170. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/zh_TW.qm +0 -0
  171. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/i18n/zh_TW.ts +0 -0
  172. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/overlay/OverlayWindow.py +0 -0
  173. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/overlay/__init__.py +0 -0
  174. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/__init__.py +0 -0
  175. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/card.qss +0 -0
  176. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/discord.svg +0 -0
  177. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/heart.svg +0 -0
  178. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/message_window.qss +0 -0
  179. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/setting_interface.qss +0 -0
  180. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/status_bar.qss +0 -0
  181. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/stop.svg +0 -0
  182. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/dark/tab.qss +0 -0
  183. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/card.qss +0 -0
  184. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/discord.svg +0 -0
  185. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/heart.svg +0 -0
  186. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/message_window.qss +0 -0
  187. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/setting_interface.qss +0 -0
  188. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/status_bar.qss +0 -0
  189. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/stop.svg +0 -0
  190. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qss/light/tab.qss +0 -0
  191. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/qt.qrc +0 -0
  192. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/resources.py +0 -0
  193. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/settings/GlobalConfigCard.py +0 -0
  194. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/settings/GlobalConfigTab.py +0 -0
  195. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/settings/SettingTab.py +0 -0
  196. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/settings/__init__.py +0 -0
  197. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/start/LogWindow.py +0 -0
  198. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/start/SelectCaptureListView.py +0 -0
  199. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/start/SelectInteractionListView.py +0 -0
  200. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/start/StartCard.py +0 -0
  201. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/start/StartTab.py +0 -0
  202. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/start/__init__.py +0 -0
  203. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/ConfigCard.py +0 -0
  204. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/ConfigItemFactory.py +0 -0
  205. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/ConfigLabelAndWidget.py +0 -0
  206. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/EditTaskTab.py +0 -0
  207. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndButtons.py +0 -0
  208. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndDoubleSpinBox.py +0 -0
  209. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndDropDown.py +0 -0
  210. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndFileSelector.py +0 -0
  211. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndGlobal.py +0 -0
  212. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndLineEdit.py +0 -0
  213. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndList.py +0 -0
  214. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndMultiSelection.py +0 -0
  215. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndSpinBox.py +0 -0
  216. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndSwitchButton.py +0 -0
  217. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndTextEdit.py +0 -0
  218. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/LabelAndWidget.py +0 -0
  219. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/MarkUpWindow.py +0 -0
  220. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/ModifyListDialog.py +0 -0
  221. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/ModifyListItem.py +0 -0
  222. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/OneTimeTaskTab.py +0 -0
  223. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/PythonHighlighter.py +0 -0
  224. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/RecordScript.py +0 -0
  225. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/ScheduleTaskTab.py +0 -0
  226. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/ScriptPackager.py +0 -0
  227. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/StartButton.py +0 -0
  228. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TaskCard.py +0 -0
  229. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TaskManger.py +0 -0
  230. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TaskOpButton.py +0 -0
  231. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TaskTab.py +0 -0
  232. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TemplateFactory.py +0 -0
  233. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TemplateTab.py +0 -0
  234. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TooltipTableWidget.py +0 -0
  235. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/TriggerTaskTab.py +0 -0
  236. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/tasks/__init__.py +0 -0
  237. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/Alert.py +0 -0
  238. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/InitWorker.py +0 -0
  239. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/__init__.py +0 -0
  240. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/app.py +0 -0
  241. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/download.py +0 -0
  242. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/pip_util.py +0 -0
  243. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/pyappify_startup.py +0 -0
  244. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/touch_scroll.py +0 -0
  245. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/util/windows_thumbnail.py +0 -0
  246. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/BaseLoading.py +0 -0
  247. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/BaseWindow.py +0 -0
  248. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/Card.py +0 -0
  249. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/CustomTab.py +0 -0
  250. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/EmptyCard.py +0 -0
  251. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/ExpandCardLayout.py +0 -0
  252. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/FlowLayout.py +0 -0
  253. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/FramelessDialog.py +0 -0
  254. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/ImageWidget.py +0 -0
  255. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/ListTableWidgetItem.py +0 -0
  256. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/NumericTableWidgetItem.py +0 -0
  257. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/OkCompactSpinBox.py +0 -0
  258. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/SortingTableWidgetItem.py +0 -0
  259. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/StartLoadingDialog.py +0 -0
  260. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/StatusBar.py +0 -0
  261. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/Tab.py +0 -0
  262. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/TabWidget.py +0 -0
  263. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/UpdateConfigWidgetItem.py +0 -0
  264. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/WidgetWithVLabel.py +0 -0
  265. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/YesNonWidgetItem.py +0 -0
  266. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/qt/widget/__init__.py +0 -0
  267. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/__init__.py +0 -0
  268. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/app.py +0 -0
  269. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/requirements.py +0 -0
  270. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/server.py +0 -0
  271. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/static/app.js +0 -0
  272. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/static/chunk-fluent.js +0 -0
  273. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/static/chunk-react.js +0 -0
  274. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/static/index.css +0 -0
  275. {ok_script-2.0.3 → ok_script-2.0.5}/ok/ui/web/static/index.html +0 -0
  276. {ok_script-2.0.3 → ok_script-2.0.5}/ok/update/__init__.py +0 -0
  277. {ok_script-2.0.3 → ok_script-2.0.5}/ok/update/copy_ok_folder.py +0 -0
  278. {ok_script-2.0.3 → ok_script-2.0.5}/ok/update/inline_ok_requirements.py +0 -0
  279. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/Analytics.py +0 -0
  280. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/GlobalConfig.py +0 -0
  281. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/__init__.py +0 -0
  282. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/blur.py +0 -0
  283. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/clazz.py +0 -0
  284. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/collection.py +0 -0
  285. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/color.py +0 -0
  286. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/config.py +0 -0
  287. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/explorer.py +0 -0
  288. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/file.py +0 -0
  289. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/gpu_driver_settings.py +0 -0
  290. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/handler.py +0 -0
  291. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/i18n.py +0 -0
  292. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/logger.py +0 -0
  293. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/partial_sync_repo.py +0 -0
  294. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/print_hwnd.py +0 -0
  295. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/process.py +0 -0
  296. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/window.py +0 -0
  297. {ok_script-2.0.3 → ok_script-2.0.5}/ok/util/windows_schedule.py +0 -0
  298. {ok_script-2.0.3 → ok_script-2.0.5}/ok_script.egg-info/dependency_links.txt +0 -0
  299. {ok_script-2.0.3 → ok_script-2.0.5}/ok_script.egg-info/entry_points.txt +0 -0
  300. {ok_script-2.0.3 → ok_script-2.0.5}/ok_script.egg-info/not-zip-safe +0 -0
  301. {ok_script-2.0.3 → ok_script-2.0.5}/ok_script.egg-info/requires.txt +0 -0
  302. {ok_script-2.0.3 → ok_script-2.0.5}/ok_script.egg-info/top_level.txt +0 -0
  303. {ok_script-2.0.3 → ok_script-2.0.5}/pyproject.toml +0 -0
  304. {ok_script-2.0.3 → ok_script-2.0.5}/scripts/generate_web_i18n.py +0 -0
  305. {ok_script-2.0.3 → ok_script-2.0.5}/setup.cfg +0 -0
  306. {ok_script-2.0.3 → ok_script-2.0.5}/setup.py +0 -0
  307. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_accent_color.py +0 -0
  308. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_app.py +0 -0
  309. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_base_interaction.py +0 -0
  310. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_blur.py +0 -0
  311. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_box.py +0 -0
  312. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_capture_update.py +0 -0
  313. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_cli.py +0 -0
  314. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_config_card.py +0 -0
  315. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_core_events.py +0 -0
  316. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_core_ui_services.py +0 -0
  317. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_device_manager.py +0 -0
  318. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_expand_card_layout.py +0 -0
  319. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_explorer.py +0 -0
  320. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_global_config.py +0 -0
  321. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_gpu_driver_settings.py +0 -0
  322. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_handler.py +0 -0
  323. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_headless_imports.py +0 -0
  324. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_inline_ok_requirements.py +0 -0
  325. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_logger.py +0 -0
  326. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_main_window_notifications.py +0 -0
  327. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_main_window_startup_tab.py +0 -0
  328. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_main_window_system_theme.py +0 -0
  329. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_missing_frame.py +0 -0
  330. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_navigation_state.py +0 -0
  331. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_nemu_ipc_capture.py +0 -0
  332. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_notifications.py +0 -0
  333. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_ok_mutex.py +0 -0
  334. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_overlay_custom_draw.py +0 -0
  335. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_package_metadata.py +0 -0
  336. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_process.py +0 -0
  337. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_process_mutex.py +0 -0
  338. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_pyappify_startup_update.py +0 -0
  339. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_qt_events.py +0 -0
  340. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_qt_legacy_imports.py +0 -0
  341. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_qt_page_layout.py +0 -0
  342. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_runtime_startup.py +0 -0
  343. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_start_controller.py +0 -0
  344. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_start_tab_overlay.py +0 -0
  345. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_task_executor_queue.py +0 -0
  346. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_task_ui.py +0 -0
  347. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_template_tab.py +0 -0
  348. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_touch_scroll.py +0 -0
  349. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_translation_fallback.py +0 -0
  350. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_ui_config.py +0 -0
  351. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_web_app.py +0 -0
  352. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_web_i18n.py +0 -0
  353. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_web_server.py +0 -0
  354. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_web_task_tabs.py +0 -0
  355. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_web_ui_pages.py +0 -0
  356. {ok_script-2.0.3 → ok_script-2.0.5}/tests/test_web_ui_tasks.py +0 -0
  357. {ok_script-2.0.3 → ok_script-2.0.5}/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
3
+ Version: 2.0.5
4
4
  Summary: Automation with Computer Vision for Python
5
5
  Author-email: ok-oldking <firedcto@gmail.com>
6
6
  License: ok-script License
@@ -131,6 +131,10 @@ class DeviceManager:
131
131
 
132
132
  def close(self):
133
133
  """Stop capture resources before Qt/Python teardown begins."""
134
+ hwnd_window = self.hwnd_window
135
+ if hwnd_window is not None:
136
+ hwnd_window.stop()
137
+
134
138
  capture_method = self.capture_method
135
139
  self.capture_method = None
136
140
  if capture_method is not None:
@@ -68,7 +68,7 @@ class HwndWindow:
68
68
  self.global_config = global_config
69
69
  self.mute_option.validator = self.validate_mute_config
70
70
  self.update_window(title, exe_name, frame_width, frame_height, player_id, hwnd_class, top_hwnd_class)
71
- self.thread = threading.Thread(target=self.update_window_size, name="update_window_size")
71
+ self.thread = threading.Thread(target=self.update_window_size, name="update_window_size", daemon=True)
72
72
  self.thread.start()
73
73
 
74
74
  def validate_mute_config(self, key, value):
@@ -82,7 +82,13 @@ class HwndWindow:
82
82
  return True, None
83
83
 
84
84
  def stop(self):
85
- self.stop_event.set()
85
+ try:
86
+ self.stop_event.set()
87
+ window_thread = getattr(self, 'thread', None)
88
+ if window_thread is not None and window_thread is not threading.current_thread():
89
+ window_thread.join(timeout=1)
90
+ except Exception as error:
91
+ logger.error(f'hwnd window close failed: {error}')
86
92
 
87
93
  def _front_hwnd_candidates(self):
88
94
  return list(dict.fromkeys(hwnd for hwnd in (self.top_hwnd, self.hwnd) if hwnd))
@@ -183,12 +189,15 @@ class HwndWindow:
183
189
  self.do_update_window_size()
184
190
 
185
191
  def update_window_size(self):
186
- while not self.app_exit_event.is_set() and not self.stop_event.is_set():
187
- self.do_update_window_size()
188
- time.sleep(0.2)
189
- if self.hwnd and self.mute_option.get('Mute Game while in Background'):
190
- logger.info(f'exit reset mute state to 0')
191
- set_mute_state(self.hwnd, 0)
192
+ try:
193
+ while not self.app_exit_event.is_set() and not self.stop_event.is_set():
194
+ self.do_update_window_size()
195
+ time.sleep(0.2)
196
+ if self.hwnd and self.mute_option.get('Mute Game while in Background'):
197
+ logger.info(f'exit reset mute state to 0')
198
+ set_mute_state(self.hwnd, 0)
199
+ except Exception as error:
200
+ logger.error(f'update_window_size exception: {error}')
192
201
 
193
202
  def get_abs_cords(self, x, y):
194
203
  return self.x + x, self.y + y
@@ -30,6 +30,7 @@ class TaskExecutor:
30
30
  debug: bool
31
31
  global_config: object
32
32
  _ocr_lib: dict
33
+ _ocr_init_results: dict
33
34
  ocr_target_height: int
34
35
  current_task: object
35
36
  config_folder: str
@@ -75,6 +76,7 @@ class TaskExecutor:
75
76
  self.debug = debug
76
77
  self.global_config = global_config
77
78
  self._ocr_lib = {}
79
+ self._ocr_init_results = {}
78
80
  if self.config.get('ocr') and not self.config.get('ocr').get('default', False):
79
81
  self.config['ocr']['default'] = self.config.get('ocr')
80
82
  self.current_task = None
@@ -150,10 +152,21 @@ class TaskExecutor:
150
152
  try:
151
153
  logger.info('start init default ocr')
152
154
  self.ocr_lib()
153
- logger.info(f'default ocr init end, cost: {time.time() - start:.2f}s')
155
+ result = self._ocr_init_results.get('default', 'success')
156
+ logger.info(f'default ocr init end, result: {result}, cost: {time.time() - start:.2f}s')
154
157
  except Exception as e:
155
158
  logger.error(f'init default ocr error, cost: {time.time() - start:.2f}s', e)
156
159
 
160
+ @staticmethod
161
+ def _onnxocr_test_frame():
162
+ import cv2
163
+ import numpy as np
164
+
165
+ frame = np.full((160, 640, 3), 255, dtype=np.uint8)
166
+ cv2.putText(frame, 'okscript', (24, 110), cv2.FONT_HERSHEY_SIMPLEX,
167
+ 2.5, (0, 0, 0), 5, cv2.LINE_AA)
168
+ return frame
169
+
157
170
  def _create_ocr_lib(self, name):
158
171
  ocr_config = self.config.get('ocr').get(name)
159
172
  lib = ocr_config.get('lib')
@@ -188,10 +201,31 @@ class TaskExecutor:
188
201
  elif lib == 'onnxocr':
189
202
  from onnxocr.onnx_paddleocr import ONNXPaddleOcr
190
203
  logger.info(f'init onnxocr {config_params}')
191
- ocr_lib = ONNXPaddleOcr(use_angle_cls=False,
192
- logger=logger,
193
- use_npu=config_params.get('use_npu', True),
194
- use_openvino=config_params.get('use_openvino', False))
204
+ use_npu = config_params.get('use_npu', True)
205
+ use_openvino = config_params.get('use_openvino', False)
206
+ if use_npu:
207
+ test_frame = self._onnxocr_test_frame()
208
+ try:
209
+ ocr_lib = ONNXPaddleOcr(use_angle_cls=False,
210
+ logger=logger,
211
+ use_npu=True,
212
+ use_openvino=use_openvino)
213
+ test_result = ocr_lib.ocr(test_frame)
214
+ self._ocr_init_results[name] = f'use_npu=True, test_ocr={test_result!r}'
215
+ except Exception as error:
216
+ logger.warning(f'onnxocr NPU test failed, falling back to CPU: {error}')
217
+ ocr_lib = ONNXPaddleOcr(use_angle_cls=False,
218
+ logger=logger,
219
+ use_npu=False,
220
+ use_openvino=use_openvino)
221
+ self._ocr_init_results[name] = (
222
+ f'use_npu=False (NPU test failed: {error!r})')
223
+ else:
224
+ ocr_lib = ONNXPaddleOcr(use_angle_cls=False,
225
+ logger=logger,
226
+ use_npu=False,
227
+ use_openvino=use_openvino)
228
+ self._ocr_init_results[name] = 'use_npu=False'
195
229
  elif lib == 'rapidocr':
196
230
  from rapidocr import RapidOCR
197
231
  params = {"Global.use_cls": False, "Global.max_side_len": 100000, "Global.min_side_len": 0,
@@ -201,7 +235,9 @@ class TaskExecutor:
201
235
  ocr_lib = RapidOCR(params=params)
202
236
  else:
203
237
  raise Exception(f'ocr lib not supported: {lib}')
204
- logger.info(f'ocr_lib init {ocr_lib} {lib}')
238
+ if name not in self._ocr_init_results:
239
+ self._ocr_init_results[name] = f'lib={lib}, success'
240
+ logger.info(f'ocr_lib init {ocr_lib} {lib}, result: {self._ocr_init_results[name]}')
205
241
  return ocr_lib
206
242
 
207
243
  def nullable_frame(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ok-script
3
- Version: 2.0.3
3
+ Version: 2.0.5
4
4
  Summary: Automation with Computer Vision for Python
5
5
  Author-email: ok-oldking <firedcto@gmail.com>
6
6
  License: ok-script License
@@ -339,6 +339,7 @@ tests/test_qt_page_layout.py
339
339
  tests/test_runtime_startup.py
340
340
  tests/test_start_controller.py
341
341
  tests/test_start_tab_overlay.py
342
+ tests/test_task_executor_ocr.py
342
343
  tests/test_task_executor_queue.py
343
344
  tests/test_task_ui.py
344
345
  tests/test_template_tab.py
@@ -0,0 +1,113 @@
1
+ import sys
2
+ import threading
3
+ import types
4
+ import unittest
5
+ from unittest.mock import patch
6
+
7
+ import cv2 # Keep OpenCV loaded while patch.dict restores fake OCR modules.
8
+ import numpy as np
9
+
10
+ import ok.task.TaskExecutor as task_executor_module
11
+ from ok.task.TaskExecutor import TaskExecutor
12
+
13
+
14
+ class TestTaskExecutorOCR(unittest.TestCase):
15
+ @staticmethod
16
+ def make_executor(use_npu=True):
17
+ executor = TaskExecutor.__new__(TaskExecutor)
18
+ executor.config = {
19
+ 'ocr': {
20
+ 'default': {
21
+ 'lib': 'onnxocr',
22
+ 'params': {'use_npu': use_npu},
23
+ },
24
+ },
25
+ }
26
+ executor._ocr_lib = {}
27
+ executor._ocr_lib_lock = threading.Lock()
28
+ executor._ocr_init_results = {}
29
+ return executor
30
+
31
+ @staticmethod
32
+ def fake_onnxocr(ocr_side_effect=None):
33
+ instances = []
34
+
35
+ class FakeONNXPaddleOcr:
36
+ def __init__(self, **kwargs):
37
+ self.kwargs = kwargs
38
+ self.frames = []
39
+ instances.append(self)
40
+
41
+ def ocr(self, frame):
42
+ self.frames.append(frame)
43
+ if ocr_side_effect is not None:
44
+ raise ocr_side_effect
45
+ return [[('box', ('okscript', 0.99))]]
46
+
47
+ package = types.ModuleType('onnxocr')
48
+ module = types.ModuleType('onnxocr.onnx_paddleocr')
49
+ module.ONNXPaddleOcr = FakeONNXPaddleOcr
50
+ package.onnx_paddleocr = module
51
+ return instances, {
52
+ 'onnxocr': package,
53
+ 'onnxocr.onnx_paddleocr': module,
54
+ }
55
+
56
+ def test_npu_ocr_runs_generated_frame_smoke_test(self):
57
+ executor = self.make_executor(use_npu=True)
58
+ instances, modules = self.fake_onnxocr()
59
+
60
+ with patch.dict(sys.modules, modules):
61
+ result = executor._create_ocr_lib('default')
62
+
63
+ self.assertIs(result, instances[0])
64
+ self.assertEqual([True], [instance.kwargs['use_npu'] for instance in instances])
65
+ self.assertEqual(1, len(instances[0].frames))
66
+ frame = instances[0].frames[0]
67
+ self.assertIsInstance(frame, np.ndarray)
68
+ self.assertEqual((160, 640, 3), frame.shape)
69
+ self.assertLess(frame.min(), 255)
70
+ self.assertIn('use_npu=True', executor._ocr_init_results['default'])
71
+ self.assertIn('okscript', executor._ocr_init_results['default'])
72
+
73
+ def test_failed_npu_ocr_falls_back_to_non_npu_instance(self):
74
+ executor = self.make_executor(use_npu=True)
75
+ instances, modules = self.fake_onnxocr(RuntimeError('NPU unavailable'))
76
+
77
+ with patch.dict(sys.modules, modules):
78
+ result = executor._create_ocr_lib('default')
79
+
80
+ self.assertIs(result, instances[1])
81
+ self.assertEqual([True, False], [instance.kwargs['use_npu'] for instance in instances])
82
+ self.assertEqual(1, len(instances[0].frames))
83
+ self.assertEqual(0, len(instances[1].frames))
84
+ self.assertIn('use_npu=False', executor._ocr_init_results['default'])
85
+ self.assertIn('NPU unavailable', executor._ocr_init_results['default'])
86
+
87
+ def test_disabled_npu_skips_smoke_test(self):
88
+ executor = self.make_executor(use_npu=False)
89
+ instances, modules = self.fake_onnxocr()
90
+
91
+ with patch.dict(sys.modules, modules):
92
+ result = executor._create_ocr_lib('default')
93
+
94
+ self.assertIs(result, instances[0])
95
+ self.assertEqual([False], [instance.kwargs['use_npu'] for instance in instances])
96
+ self.assertEqual([], instances[0].frames)
97
+ self.assertEqual('use_npu=False', executor._ocr_init_results['default'])
98
+
99
+ def test_default_init_finish_log_includes_npu_test_result(self):
100
+ executor = self.make_executor(use_npu=True)
101
+ executor._ocr_lib['default'] = object()
102
+ executor._ocr_init_results['default'] = 'use_npu=True, test_ocr=okscript'
103
+
104
+ with patch.object(task_executor_module.logger, 'info') as info:
105
+ executor._init_default_ocr()
106
+
107
+ finish_log = info.call_args_list[-1].args[0]
108
+ self.assertIn('default ocr init end', finish_log)
109
+ self.assertIn('use_npu=True, test_ocr=okscript', finish_log)
110
+
111
+
112
+ if __name__ == '__main__':
113
+ unittest.main()
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