oagi-core 0.13.1__tar.gz → 0.13.2__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.
- {oagi_core-0.13.1 → oagi_core-0.13.2}/PKG-INFO +1 -1
- {oagi_core-0.13.1 → oagi_core-0.13.2}/examples/openai_agent_loop_example.py +3 -3
- {oagi_core-0.13.1 → oagi_core-0.13.2}/metapackage/pyproject.toml +2 -2
- {oagi_core-0.13.1 → oagi_core-0.13.2}/metapackage/uv.lock +5 -5
- {oagi_core-0.13.1 → oagi_core-0.13.2}/pyproject.toml +1 -1
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/pyautogui_action_handler.py +17 -4
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_pyautogui_action_handler.py +16 -8
- {oagi_core-0.13.1 → oagi_core-0.13.2}/uv.lock +1 -1
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.github/workflows/ci.yml +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.github/workflows/release.yml +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.gitignore +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/.python-version +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/CONTRIBUTING.md +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/LICENSE +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/Makefile +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/README.md +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/examples/async_google_weather.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/examples/execute_task_auto.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/examples/execute_task_manual.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/examples/google_weather.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/examples/screenshot_with_config.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/examples/tasker_agent_example.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/actor/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/actor/async_.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/actor/async_short.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/actor/base.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/actor/short.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/actor/sync.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/default.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/factories.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/observer/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/observer/agent_observer.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/observer/events.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/observer/exporters.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/observer/protocol.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/observer/report_template.html +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/protocol.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/registry.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/tasker/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/tasker/memory.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/tasker/models.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/tasker/planner.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/tasker/taskee_agent.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/agent/tasker/tasker_agent.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/cli/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/cli/agent.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/cli/display.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/cli/main.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/cli/server.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/cli/tracking.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/cli/utils.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/client/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/client/async_.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/client/base.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/client/sync.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/constants.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/exceptions.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/_macos.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/_windows.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/_ydotool.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/async_pyautogui_action_handler.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/async_screenshot_maker.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/async_ydotool_action_handler.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/capslock_manager.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/pil_image.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/screenshot_maker.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/utils.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/wayland_support.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/handler/ydotool_action_handler.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/logging.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/platform_info.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/server/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/server/agent_wrappers.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/server/config.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/server/main.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/server/models.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/server/session_store.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/server/socketio_server.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/task/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/action_handler.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/async_action_handler.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/async_image_provider.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/image.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/image_provider.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/models/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/models/action.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/models/client.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/models/image_config.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/models/step.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/step_observer.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/types/url.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/utils/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/utils/output_parser.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/src/oagi/utils/prompt_builder.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/conftest.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_action_parsing.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_actor.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_agent/test_agent_wrappers.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_agent/test_default_agent.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_agent_registry.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_async_actor.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_async_client.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_async_handlers.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_cli.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_logging.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_mac_double_click.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_observer.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_pil_image.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_planner.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_planner_memory.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_screenshot_maker.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_server/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_server/test_config.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_server/test_session_store.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_server/test_socketio_integration.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_sync_client.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_taskee_agent.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/test_tasker_agent.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/utils/__init__.py +0 -0
- {oagi_core-0.13.1 → oagi_core-0.13.2}/tests/utils/test_output_parser.py +0 -0
|
@@ -28,10 +28,10 @@ from oagi.utils.output_parser import parse_raw_output
|
|
|
28
28
|
from oagi.utils.prompt_builder import build_prompt
|
|
29
29
|
|
|
30
30
|
DEFAULT_BASE_URL = "https://api.agiopen.org"
|
|
31
|
-
DEFAULT_MODEL = "lux-
|
|
31
|
+
DEFAULT_MODEL = "lux-thinker-1"
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def agent_loop(task_description: str, max_steps: int =
|
|
34
|
+
def agent_loop(task_description: str, max_steps: int = 100) -> bool:
|
|
35
35
|
"""
|
|
36
36
|
Run an agent loop to complete a task.
|
|
37
37
|
|
|
@@ -114,5 +114,5 @@ if __name__ == "__main__":
|
|
|
114
114
|
# Example task
|
|
115
115
|
task = "Find some shoes on amazon"
|
|
116
116
|
|
|
117
|
-
success = agent_loop(task, max_steps=
|
|
117
|
+
success = agent_loop(task, max_steps=100)
|
|
118
118
|
print(f"\nFinal result: {'Success' if success else 'Failed'}")
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "oagi"
|
|
7
|
-
version = "0.13.
|
|
7
|
+
version = "0.13.2"
|
|
8
8
|
description = "Official API of OpenAGI Foundation (metapackage with all features)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -16,7 +16,7 @@ authors = [
|
|
|
16
16
|
requires-python = ">= 3.10"
|
|
17
17
|
|
|
18
18
|
dependencies = [
|
|
19
|
-
"oagi-core[desktop,server]==0.13.
|
|
19
|
+
"oagi-core[desktop,server]==0.13.2",
|
|
20
20
|
]
|
|
21
21
|
|
|
22
22
|
[project.urls]
|
|
@@ -518,18 +518,18 @@ sdist = { url = "https://files.pythonhosted.org/packages/28/fa/b2ba8229b9381e8f6
|
|
|
518
518
|
|
|
519
519
|
[[package]]
|
|
520
520
|
name = "oagi"
|
|
521
|
-
version = "0.13.
|
|
521
|
+
version = "0.13.2"
|
|
522
522
|
source = { editable = "." }
|
|
523
523
|
dependencies = [
|
|
524
524
|
{ name = "oagi-core", extra = ["desktop", "server"] },
|
|
525
525
|
]
|
|
526
526
|
|
|
527
527
|
[package.metadata]
|
|
528
|
-
requires-dist = [{ name = "oagi-core", extras = ["desktop", "server"], specifier = "==0.13.
|
|
528
|
+
requires-dist = [{ name = "oagi-core", extras = ["desktop", "server"], specifier = "==0.13.1" }]
|
|
529
529
|
|
|
530
530
|
[[package]]
|
|
531
531
|
name = "oagi-core"
|
|
532
|
-
version = "0.13.
|
|
532
|
+
version = "0.13.1"
|
|
533
533
|
source = { registry = "https://pypi.org/simple" }
|
|
534
534
|
dependencies = [
|
|
535
535
|
{ name = "httpx" },
|
|
@@ -537,9 +537,9 @@ dependencies = [
|
|
|
537
537
|
{ name = "pydantic" },
|
|
538
538
|
{ name = "rich" },
|
|
539
539
|
]
|
|
540
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
540
|
+
sdist = { url = "https://files.pythonhosted.org/packages/62/b0/6006c57afc693a4afdc5389f1c93e83654745ec2b25d33c091621aec7d15/oagi_core-0.13.1.tar.gz", hash = "sha256:8dcbf45c6eb7203573d04122ebb53c67d7c955bb6bbfe8332fe2e641e7cb689f", size = 304385, upload-time = "2026-01-12T04:14:18.758Z" }
|
|
541
541
|
wheels = [
|
|
542
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
542
|
+
{ url = "https://files.pythonhosted.org/packages/6e/78/0a04d5a28313ab6dc783a5c4d8b32c1871fa2a140f75dfe42f56024c8865/oagi_core-0.13.1-py3-none-any.whl", hash = "sha256:b29637ca080fa7092224231b113b35c07f09657bed203e8e26e13e2c2a65665f", size = 110049, upload-time = "2026-01-12T04:14:17.645Z" },
|
|
543
543
|
]
|
|
544
544
|
|
|
545
545
|
[package.optional-dependencies]
|
|
@@ -51,6 +51,10 @@ class PyautoguiConfig(BaseModel):
|
|
|
51
51
|
default=True,
|
|
52
52
|
description="Replace 'ctrl' with 'command' in hotkey combinations on macOS",
|
|
53
53
|
)
|
|
54
|
+
click_pre_delay: float = Field(
|
|
55
|
+
default=0.1,
|
|
56
|
+
description="Delay in seconds after moving to position before clicking",
|
|
57
|
+
)
|
|
54
58
|
|
|
55
59
|
|
|
56
60
|
class PyautoguiActionHandler:
|
|
@@ -158,6 +162,11 @@ class PyautoguiActionHandler:
|
|
|
158
162
|
keys = [self._normalize_key(key) for key in args_str.split("+")]
|
|
159
163
|
return keys
|
|
160
164
|
|
|
165
|
+
def _move_and_wait(self, x: int, y: int) -> None:
|
|
166
|
+
"""Move cursor to position and wait before clicking."""
|
|
167
|
+
pyautogui.moveTo(x, y)
|
|
168
|
+
time.sleep(self.config.click_pre_delay)
|
|
169
|
+
|
|
161
170
|
def _execute_single_action(self, action: Action) -> None:
|
|
162
171
|
"""Execute a single action once."""
|
|
163
172
|
arg = action.argument.strip("()") # Remove outer parentheses if present
|
|
@@ -165,25 +174,29 @@ class PyautoguiActionHandler:
|
|
|
165
174
|
match action.type:
|
|
166
175
|
case ActionType.CLICK:
|
|
167
176
|
x, y = self._parse_coords(arg)
|
|
168
|
-
|
|
177
|
+
self._move_and_wait(x, y)
|
|
178
|
+
pyautogui.click()
|
|
169
179
|
|
|
170
180
|
case ActionType.LEFT_DOUBLE:
|
|
171
181
|
x, y = self._parse_coords(arg)
|
|
182
|
+
self._move_and_wait(x, y)
|
|
172
183
|
if sys.platform == "darwin":
|
|
173
184
|
_macos.macos_click(x, y, clicks=2)
|
|
174
185
|
else:
|
|
175
|
-
pyautogui.doubleClick(
|
|
186
|
+
pyautogui.doubleClick()
|
|
176
187
|
|
|
177
188
|
case ActionType.LEFT_TRIPLE:
|
|
178
189
|
x, y = self._parse_coords(arg)
|
|
190
|
+
self._move_and_wait(x, y)
|
|
179
191
|
if sys.platform == "darwin":
|
|
180
192
|
_macos.macos_click(x, y, clicks=3)
|
|
181
193
|
else:
|
|
182
|
-
pyautogui.tripleClick(
|
|
194
|
+
pyautogui.tripleClick()
|
|
183
195
|
|
|
184
196
|
case ActionType.RIGHT_SINGLE:
|
|
185
197
|
x, y = self._parse_coords(arg)
|
|
186
|
-
|
|
198
|
+
self._move_and_wait(x, y)
|
|
199
|
+
pyautogui.rightClick()
|
|
187
200
|
|
|
188
201
|
case ActionType.DRAG:
|
|
189
202
|
x1, y1, x2, y2 = self._parse_drag_coords(arg)
|
|
@@ -54,9 +54,9 @@ def test_coordinate_based_actions(
|
|
|
54
54
|
action = Action(type=action_type, argument=argument, count=1)
|
|
55
55
|
handler([action])
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
)
|
|
57
|
+
# Click actions now use moveTo first, then click without coordinates
|
|
58
|
+
mock_pyautogui.moveTo.assert_called_with(*expected_coords)
|
|
59
|
+
getattr(mock_pyautogui, expected_method).assert_called_once_with()
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
def test_drag_action(handler, mock_pyautogui, config):
|
|
@@ -262,7 +262,9 @@ class TestCornerCoordinatesHandling:
|
|
|
262
262
|
handler = PyautoguiActionHandler()
|
|
263
263
|
action = Action(type=ActionType.CLICK, argument=input_coords, count=1)
|
|
264
264
|
handler([action])
|
|
265
|
-
|
|
265
|
+
# Click actions now use moveTo first, then click without coordinates
|
|
266
|
+
mock_pyautogui.moveTo.assert_called_with(*expected_coords)
|
|
267
|
+
mock_pyautogui.click.assert_called_once_with()
|
|
266
268
|
|
|
267
269
|
def test_drag_with_corner_coordinates(self, mock_pyautogui, config):
|
|
268
270
|
"""Test drag operations with corner coordinates."""
|
|
@@ -300,10 +302,16 @@ class TestCornerCoordinatesHandling:
|
|
|
300
302
|
with patch.object(sys, "platform", "linux"):
|
|
301
303
|
handler(actions)
|
|
302
304
|
|
|
303
|
-
# All
|
|
304
|
-
|
|
305
|
-
mock_pyautogui.
|
|
306
|
-
|
|
305
|
+
# All click actions now use moveTo first, then click without coordinates
|
|
306
|
+
# Check moveTo was called with the adjusted corner coordinates
|
|
307
|
+
moveTo_calls = mock_pyautogui.moveTo.call_args_list
|
|
308
|
+
assert (1, 1) in [call[0] for call in moveTo_calls]
|
|
309
|
+
assert (1919, 1) in [call[0] for call in moveTo_calls]
|
|
310
|
+
assert (1, 1079) in [call[0] for call in moveTo_calls]
|
|
311
|
+
# Click methods called without coordinates
|
|
312
|
+
mock_pyautogui.doubleClick.assert_called_once_with()
|
|
313
|
+
mock_pyautogui.tripleClick.assert_called_once_with()
|
|
314
|
+
mock_pyautogui.rightClick.assert_called_once_with()
|
|
307
315
|
|
|
308
316
|
|
|
309
317
|
class TestCapsLockIntegration:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|