onerom-desktop 1.0.0__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 (34) hide show
  1. onerom_desktop-1.0.0/.gitignore +50 -0
  2. onerom_desktop-1.0.0/LICENSE +21 -0
  3. onerom_desktop-1.0.0/PKG-INFO +178 -0
  4. onerom_desktop-1.0.0/README.md +131 -0
  5. onerom_desktop-1.0.0/onerom_desktop/__init__.py +86 -0
  6. onerom_desktop-1.0.0/onerom_desktop/app.py +366 -0
  7. onerom_desktop-1.0.0/onerom_desktop/dpi.py +52 -0
  8. onerom_desktop-1.0.0/onerom_desktop/engines/__init__.py +13 -0
  9. onerom_desktop-1.0.0/onerom_desktop/engines/ocr.py +197 -0
  10. onerom_desktop-1.0.0/onerom_desktop/engines/sap.py +272 -0
  11. onerom_desktop-1.0.0/onerom_desktop/engines/template.py +230 -0
  12. onerom_desktop-1.0.0/onerom_desktop/engines/uia.py +273 -0
  13. onerom_desktop-1.0.0/onerom_desktop/engines/windows.py +144 -0
  14. onerom_desktop-1.0.0/onerom_desktop/errors.py +140 -0
  15. onerom_desktop-1.0.0/onerom_desktop/geometry.py +47 -0
  16. onerom_desktop-1.0.0/onerom_desktop/keyboard.py +86 -0
  17. onerom_desktop-1.0.0/onerom_desktop/locators.py +281 -0
  18. onerom_desktop-1.0.0/onerom_desktop/optional.py +70 -0
  19. onerom_desktop-1.0.0/onerom_desktop/pointer.py +63 -0
  20. onerom_desktop-1.0.0/onerom_desktop/screen.py +91 -0
  21. onerom_desktop-1.0.0/onerom_desktop/strategies/__init__.py +94 -0
  22. onerom_desktop-1.0.0/onerom_desktop/strategies/backend.py +81 -0
  23. onerom_desktop-1.0.0/onerom_desktop/strategies/base.py +151 -0
  24. onerom_desktop-1.0.0/onerom_desktop/strategies/coordinate.py +90 -0
  25. onerom_desktop-1.0.0/onerom_desktop/strategies/image.py +37 -0
  26. onerom_desktop-1.0.0/onerom_desktop/strategies/ocr.py +63 -0
  27. onerom_desktop-1.0.0/onerom_desktop/strategies/sap.py +89 -0
  28. onerom_desktop-1.0.0/pyproject.toml +110 -0
  29. onerom_desktop-1.0.0/tests/test_app.py +226 -0
  30. onerom_desktop-1.0.0/tests/test_backend.py +310 -0
  31. onerom_desktop-1.0.0/tests/test_engines.py +155 -0
  32. onerom_desktop-1.0.0/tests/test_locators.py +131 -0
  33. onerom_desktop-1.0.0/tests/test_sap.py +223 -0
  34. onerom_desktop-1.0.0/tests/test_strategies.py +164 -0
@@ -0,0 +1,50 @@
1
+ # Local Netlify folder
2
+ .netlify
3
+
4
+ # Binarios e artefatos de build
5
+ *.exe
6
+ *.pkg
7
+ *.pyz
8
+ *.zip
9
+ *.tar
10
+ *.tar.gz
11
+ *.toc
12
+ *.html
13
+ *.txt
14
+
15
+ # Diretorios de build do PyInstaller
16
+ runner/build/
17
+ runner/dist/
18
+ runner/installer/build/
19
+ runner/installer/dist/
20
+
21
+ # Artefatos de deploy
22
+ rebuild/backend/dist/
23
+ rebuild/frontend/dist/
24
+
25
+ # Execucoes locais do runner
26
+ runner/executions/
27
+
28
+ # Dependencias Python
29
+ **/__pycache__/
30
+ **/.venv/
31
+ *.pyc
32
+ *.pyo
33
+
34
+ # Node
35
+ frontend/node_modules/
36
+
37
+ # Env local do monorepo / compose
38
+ .env
39
+ .env.*.local
40
+
41
+ # Deploy images (apenas o deploy/ da RAIZ; nao os deploy/ de subprojetos)
42
+ /deploy/
43
+ deployimages*
44
+
45
+ # Scripts venv
46
+ scripts/.venv/
47
+
48
+ # Distribuicoes de pacotes
49
+ onerom_core/dist/
50
+ .DS_Store
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Onerom
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,178 @@
1
+ Metadata-Version: 2.5
2
+ Name: onerom-desktop
3
+ Version: 1.0.0
4
+ Summary: Runtime de automacao desktop da plataforma ONEROM (UIA, OCR, imagem, coordenadas e SAP GUI)
5
+ Project-URL: Homepage, https://onerom.dev.br
6
+ Author: ONEROM Team
7
+ License: MIT
8
+ License-File: LICENSE
9
+ Keywords: automation,desktop,ocr,onerom,rpa,sap,uia
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: Microsoft :: Windows
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Software Development :: Libraries
20
+ Requires-Python: >=3.9
21
+ Requires-Dist: mss>=9.0.0
22
+ Requires-Dist: pillow>=10.0.0
23
+ Requires-Dist: psutil>=5.9.0
24
+ Requires-Dist: pyautogui>=0.9.54
25
+ Requires-Dist: pyperclip>=1.9.0
26
+ Provides-Extra: all
27
+ Requires-Dist: comtypes>=1.4.16; (sys_platform == 'win32') and extra == 'all'
28
+ Requires-Dist: numpy>=1.24; extra == 'all'
29
+ Requires-Dist: opencv-python-headless<5,>=4.9.0; extra == 'all'
30
+ Requires-Dist: pytesseract>=0.3.10; extra == 'all'
31
+ Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'all'
32
+ Requires-Dist: pywinauto>=0.6.9; (sys_platform == 'win32') and extra == 'all'
33
+ Provides-Extra: backend
34
+ Requires-Dist: comtypes>=1.4.16; (sys_platform == 'win32') and extra == 'backend'
35
+ Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'backend'
36
+ Requires-Dist: pywinauto>=0.6.9; (sys_platform == 'win32') and extra == 'backend'
37
+ Provides-Extra: image
38
+ Requires-Dist: numpy>=1.24; extra == 'image'
39
+ Requires-Dist: opencv-python-headless<5,>=4.9.0; extra == 'image'
40
+ Provides-Extra: ocr
41
+ Requires-Dist: numpy>=1.24; extra == 'ocr'
42
+ Requires-Dist: opencv-python-headless<5,>=4.9.0; extra == 'ocr'
43
+ Requires-Dist: pytesseract>=0.3.10; extra == 'ocr'
44
+ Provides-Extra: sap
45
+ Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'sap'
46
+ Description-Content-Type: text/markdown
47
+
48
+ # onerom-desktop
49
+
50
+ Runtime de automação desktop da plataforma ONEROM.
51
+
52
+ É a biblioteca que os bots gerados pelo **ONEROM Inspector** importam para clicar,
53
+ preencher e ler telas — de aplicações Windows nativas a SAP GUI, passando por
54
+ janelas que não expõem nenhuma árvore de automação.
55
+
56
+ ```bash
57
+ pip install "onerom-desktop[all]"
58
+ ```
59
+
60
+ ## Uma classe, cinco estratégias
61
+
62
+ ```python
63
+ from onerom_desktop import App
64
+
65
+ app = App(strategy="backend", automation_id="btnLogin", window_title="Login")
66
+ app.wait_visible()
67
+ app.click()
68
+ ```
69
+
70
+ O que você passa no construtor vira padrão para todas as ações; o que passa na
71
+ ação vale só para aquela chamada. É isso que deixa o script curto sem esconder o
72
+ que ele está mirando.
73
+
74
+ | `strategy=` | Como localiza | Quando usar |
75
+ |---|---|---|
76
+ | `backend` | UIAutomation via pywinauto | **Padrão.** Sobrevive a janela movida, resolução diferente e troca de tema |
77
+ | `ocr` | Texto lido da tela (Tesseract) | Citrix, RDP, canvas Java/Delphi — quando não há árvore de automação |
78
+ | `image` | Template matching (OpenCV + ORB) | Ícones e controles desenhados, sem identidade nem rótulo |
79
+ | `coordinate` | Ponto fixo na tela | Último recurso: não verifica nada |
80
+ | `sap` | SAP GUI Scripting (COM) | Sempre, quando o alvo é SAP |
81
+ | `auto` | `backend` → `ocr` → `image` → `coordinate` | Degrada sozinho quando a aplicação muda |
82
+
83
+ ```python
84
+ app.fill(strategy="ocr", text="Usuário", value="admin")
85
+ app.click(strategy="image", image="botao.png", confidence=0.9)
86
+ app.press(strategy="sap", sap_id="wnd[0]/tbar[0]/btn[0]")
87
+ app.click(strategy="auto")
88
+ ```
89
+
90
+ ## Ações
91
+
92
+ `click` · `double_click` · `right_click` · `hover` · `fill` · `click_and_fill` ·
93
+ `type_text` · `get_text` · `wait_visible` · `exists` · `screenshot`
94
+
95
+ Para SAP, também: `find` · `set_text` · `press` · `submit`.
96
+
97
+ ```python
98
+ if app.exists(strategy="backend", automation_id="dlgErro", window_title="Erro"):
99
+ app.click(automation_id="btnFechar")
100
+
101
+ total = app.get_text(strategy="ocr", x=800, y=440, width=160, height=28)
102
+ app.screenshot("evidencia.png")
103
+ ```
104
+
105
+ ## Erros dizem o que fazer
106
+
107
+ Tudo herda de `OneromDesktopError`, e as classes existem para separar os três
108
+ casos que pedem tratamento diferente:
109
+
110
+ ```python
111
+ from onerom_desktop import (
112
+ OneromDesktopError, # base de tudo
113
+ DesktopLocatorError, # bug no bot — repetir não adianta
114
+ DesktopBackendUnavailableError, # ambiente quebrado — avisar o operador
115
+ ElementNotFoundError, # não achou agora — repetir pode funcionar
116
+ WaitTimeoutError,
117
+ MissingDependencyError, # traz o comando de instalação na mensagem
118
+ )
119
+ ```
120
+
121
+ `exists()` responde `False` para ausência de verdade, mas **levanta** exceção
122
+ quando a verificação em si não pôde ser feita — dependência faltando, backend
123
+ indisponível, imagem de template ausente, SAP fechado. Responder `False` nesses
124
+ casos é como um bot acaba entrando no branch errado.
125
+
126
+ ## Dependências opcionais
127
+
128
+ O `import onerom_desktop` é barato: OpenCV, Tesseract, pywinauto e pywin32 só
129
+ são carregados quando a estratégia correspondente é usada.
130
+
131
+ ```bash
132
+ pip install onerom-desktop # coordenadas, teclado, screenshot
133
+ pip install "onerom-desktop[backend]" # + UIAutomation (Windows)
134
+ pip install "onerom-desktop[image]" # + OpenCV
135
+ pip install "onerom-desktop[ocr]" # + Tesseract (o binário também é necessário)
136
+ pip install "onerom-desktop[sap]" # + SAP GUI Scripting (Windows)
137
+ pip install "onerom-desktop[all]" # tudo
138
+ ```
139
+
140
+ Faltando uma delas, a mensagem já traz o `pip install` certo em vez de um
141
+ `ModuleNotFoundError` cru no log do bot.
142
+
143
+ ## Coordenadas são pixels FÍSICOS
144
+
145
+ Toda coordenada nesta biblioteca é pixel físico da mesa virtual (a união de
146
+ todos os monitores) — o mesmo espaço em que o Inspector captura, o `mss`
147
+ fotografa e o `pyautogui` clica.
148
+
149
+ O processo é marcado como *per-monitor DPI aware* no import. Sem isso, o Windows
150
+ reescala silenciosamente as coordenadas de um processo DPI-unaware e todo clique
151
+ erra o alvo em tela a 125%/150% — o clássico "funciona na minha tela".
152
+
153
+ ## Arquitetura
154
+
155
+ ```
156
+ onerom_desktop/
157
+ ├── app.py App: defaults, dispatch e a cadeia auto
158
+ ├── locators.py kwargs soltos -> locators validados
159
+ ├── strategies/ interface uniforme de ações (base + 5 estratégias)
160
+ ├── engines/ uia · ocr · template · sap · windows
161
+ ├── pointer.py mouse screen.py captura de tela
162
+ ├── keyboard.py texto geometry.py Region
163
+ ├── errors.py hierarquia optional.py deps sob demanda
164
+ └── dpi.py invariante de pixel físico
165
+ ```
166
+
167
+ `strategies/base.py` concentra o caminho comum: as três estratégias que acabam
168
+ clicando um ponto (`ocr`, `image`, `coordinate`) só implementam `locate()` e
169
+ herdam todas as ações.
170
+
171
+ ## Desenvolvimento
172
+
173
+ ```bash
174
+ uv sync --group dev
175
+ ./check.sh
176
+ ```
177
+
178
+ MIT.
@@ -0,0 +1,131 @@
1
+ # onerom-desktop
2
+
3
+ Runtime de automação desktop da plataforma ONEROM.
4
+
5
+ É a biblioteca que os bots gerados pelo **ONEROM Inspector** importam para clicar,
6
+ preencher e ler telas — de aplicações Windows nativas a SAP GUI, passando por
7
+ janelas que não expõem nenhuma árvore de automação.
8
+
9
+ ```bash
10
+ pip install "onerom-desktop[all]"
11
+ ```
12
+
13
+ ## Uma classe, cinco estratégias
14
+
15
+ ```python
16
+ from onerom_desktop import App
17
+
18
+ app = App(strategy="backend", automation_id="btnLogin", window_title="Login")
19
+ app.wait_visible()
20
+ app.click()
21
+ ```
22
+
23
+ O que você passa no construtor vira padrão para todas as ações; o que passa na
24
+ ação vale só para aquela chamada. É isso que deixa o script curto sem esconder o
25
+ que ele está mirando.
26
+
27
+ | `strategy=` | Como localiza | Quando usar |
28
+ |---|---|---|
29
+ | `backend` | UIAutomation via pywinauto | **Padrão.** Sobrevive a janela movida, resolução diferente e troca de tema |
30
+ | `ocr` | Texto lido da tela (Tesseract) | Citrix, RDP, canvas Java/Delphi — quando não há árvore de automação |
31
+ | `image` | Template matching (OpenCV + ORB) | Ícones e controles desenhados, sem identidade nem rótulo |
32
+ | `coordinate` | Ponto fixo na tela | Último recurso: não verifica nada |
33
+ | `sap` | SAP GUI Scripting (COM) | Sempre, quando o alvo é SAP |
34
+ | `auto` | `backend` → `ocr` → `image` → `coordinate` | Degrada sozinho quando a aplicação muda |
35
+
36
+ ```python
37
+ app.fill(strategy="ocr", text="Usuário", value="admin")
38
+ app.click(strategy="image", image="botao.png", confidence=0.9)
39
+ app.press(strategy="sap", sap_id="wnd[0]/tbar[0]/btn[0]")
40
+ app.click(strategy="auto")
41
+ ```
42
+
43
+ ## Ações
44
+
45
+ `click` · `double_click` · `right_click` · `hover` · `fill` · `click_and_fill` ·
46
+ `type_text` · `get_text` · `wait_visible` · `exists` · `screenshot`
47
+
48
+ Para SAP, também: `find` · `set_text` · `press` · `submit`.
49
+
50
+ ```python
51
+ if app.exists(strategy="backend", automation_id="dlgErro", window_title="Erro"):
52
+ app.click(automation_id="btnFechar")
53
+
54
+ total = app.get_text(strategy="ocr", x=800, y=440, width=160, height=28)
55
+ app.screenshot("evidencia.png")
56
+ ```
57
+
58
+ ## Erros dizem o que fazer
59
+
60
+ Tudo herda de `OneromDesktopError`, e as classes existem para separar os três
61
+ casos que pedem tratamento diferente:
62
+
63
+ ```python
64
+ from onerom_desktop import (
65
+ OneromDesktopError, # base de tudo
66
+ DesktopLocatorError, # bug no bot — repetir não adianta
67
+ DesktopBackendUnavailableError, # ambiente quebrado — avisar o operador
68
+ ElementNotFoundError, # não achou agora — repetir pode funcionar
69
+ WaitTimeoutError,
70
+ MissingDependencyError, # traz o comando de instalação na mensagem
71
+ )
72
+ ```
73
+
74
+ `exists()` responde `False` para ausência de verdade, mas **levanta** exceção
75
+ quando a verificação em si não pôde ser feita — dependência faltando, backend
76
+ indisponível, imagem de template ausente, SAP fechado. Responder `False` nesses
77
+ casos é como um bot acaba entrando no branch errado.
78
+
79
+ ## Dependências opcionais
80
+
81
+ O `import onerom_desktop` é barato: OpenCV, Tesseract, pywinauto e pywin32 só
82
+ são carregados quando a estratégia correspondente é usada.
83
+
84
+ ```bash
85
+ pip install onerom-desktop # coordenadas, teclado, screenshot
86
+ pip install "onerom-desktop[backend]" # + UIAutomation (Windows)
87
+ pip install "onerom-desktop[image]" # + OpenCV
88
+ pip install "onerom-desktop[ocr]" # + Tesseract (o binário também é necessário)
89
+ pip install "onerom-desktop[sap]" # + SAP GUI Scripting (Windows)
90
+ pip install "onerom-desktop[all]" # tudo
91
+ ```
92
+
93
+ Faltando uma delas, a mensagem já traz o `pip install` certo em vez de um
94
+ `ModuleNotFoundError` cru no log do bot.
95
+
96
+ ## Coordenadas são pixels FÍSICOS
97
+
98
+ Toda coordenada nesta biblioteca é pixel físico da mesa virtual (a união de
99
+ todos os monitores) — o mesmo espaço em que o Inspector captura, o `mss`
100
+ fotografa e o `pyautogui` clica.
101
+
102
+ O processo é marcado como *per-monitor DPI aware* no import. Sem isso, o Windows
103
+ reescala silenciosamente as coordenadas de um processo DPI-unaware e todo clique
104
+ erra o alvo em tela a 125%/150% — o clássico "funciona na minha tela".
105
+
106
+ ## Arquitetura
107
+
108
+ ```
109
+ onerom_desktop/
110
+ ├── app.py App: defaults, dispatch e a cadeia auto
111
+ ├── locators.py kwargs soltos -> locators validados
112
+ ├── strategies/ interface uniforme de ações (base + 5 estratégias)
113
+ ├── engines/ uia · ocr · template · sap · windows
114
+ ├── pointer.py mouse screen.py captura de tela
115
+ ├── keyboard.py texto geometry.py Region
116
+ ├── errors.py hierarquia optional.py deps sob demanda
117
+ └── dpi.py invariante de pixel físico
118
+ ```
119
+
120
+ `strategies/base.py` concentra o caminho comum: as três estratégias que acabam
121
+ clicando um ponto (`ocr`, `image`, `coordinate`) só implementam `locate()` e
122
+ herdam todas as ações.
123
+
124
+ ## Desenvolvimento
125
+
126
+ ```bash
127
+ uv sync --group dev
128
+ ./check.sh
129
+ ```
130
+
131
+ MIT.
@@ -0,0 +1,86 @@
1
+ """onerom-desktop -- runtime de automacao desktop da plataforma ONEROM.
2
+
3
+ Uma classe, cinco estrategias:
4
+
5
+ from onerom_desktop import App
6
+
7
+ app = App(strategy="backend", automation_id="btnLogin", window_title="Login")
8
+ app.wait_visible()
9
+ app.click()
10
+
11
+ app.fill(strategy="ocr", text="Usuario", value="admin")
12
+ app.click(strategy="image", image="botao.png", confidence=0.9)
13
+ app.click(strategy="coordinate", x=500, y=300)
14
+ app.press(strategy="sap", sap_id="wnd[0]/tbar[0]/btn[0]")
15
+ app.click(strategy="auto") # backend -> ocr -> imagem -> coordenada
16
+
17
+ Todas as dependencias pesadas (OpenCV, Tesseract, pywinauto, pywin32) sao
18
+ opcionais e carregadas apenas quando a estrategia correspondente e usada --
19
+ instale com o extra que precisar: ``pip install "onerom-desktop[all]"``.
20
+ """
21
+ from __future__ import annotations
22
+
23
+ from .app import App
24
+ from .dpi import set_process_dpi_aware
25
+ from .errors import (
26
+ AllStrategiesFailedError,
27
+ DesktopAutomationError,
28
+ DesktopBackendUnavailableError,
29
+ DesktopElementNotFoundError,
30
+ DesktopLocatorError,
31
+ ElementNotFoundError,
32
+ MissingDependencyError,
33
+ OneromDesktopError,
34
+ SAPAutomationError,
35
+ SAPConnectionError,
36
+ SAPGuiNotOpenError,
37
+ SAPLocatorError,
38
+ SAPScriptingUnavailableError,
39
+ SAPSessionUnavailableError,
40
+ StrategyError,
41
+ TemplateImageNotFoundError,
42
+ WaitTimeoutError,
43
+ )
44
+ from .geometry import Region
45
+ from .locators import (
46
+ STRATEGY_AUTO,
47
+ STRATEGY_BACKEND,
48
+ STRATEGY_COORDINATE,
49
+ STRATEGY_IMAGE,
50
+ STRATEGY_OCR,
51
+ STRATEGY_SAP,
52
+ )
53
+ from .strategies import available_strategies
54
+
55
+ __version__ = "1.0.0"
56
+
57
+ __all__ = [
58
+ "AllStrategiesFailedError",
59
+ "App",
60
+ "DesktopAutomationError",
61
+ "DesktopBackendUnavailableError",
62
+ "DesktopElementNotFoundError",
63
+ "DesktopLocatorError",
64
+ "ElementNotFoundError",
65
+ "MissingDependencyError",
66
+ "OneromDesktopError",
67
+ "Region",
68
+ "SAPAutomationError",
69
+ "SAPConnectionError",
70
+ "SAPGuiNotOpenError",
71
+ "SAPLocatorError",
72
+ "SAPScriptingUnavailableError",
73
+ "SAPSessionUnavailableError",
74
+ "STRATEGY_AUTO",
75
+ "STRATEGY_BACKEND",
76
+ "STRATEGY_COORDINATE",
77
+ "STRATEGY_IMAGE",
78
+ "STRATEGY_OCR",
79
+ "STRATEGY_SAP",
80
+ "StrategyError",
81
+ "TemplateImageNotFoundError",
82
+ "WaitTimeoutError",
83
+ "__version__",
84
+ "available_strategies",
85
+ "set_process_dpi_aware",
86
+ ]