Skip to content

Commit 50e4a3e

Browse files
authored
chore(dependencies): update various libraries; deprecate NiceGUI (#888)
* deprecate nicegui; move app/tray.py dependencies to app/__init__.py * remove bind; update README * Fix: wrap raw SQL queries in `text()` to prevent ArgumentError * black * noqa
1 parent 90ed3c7 commit 50e4a3e

35 files changed

+1373
-969
lines changed

README.md

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -186,18 +186,6 @@ This will start a web server locally, and then open a tab in your browser that l
186186

187187
![image](https://github.com/OpenAdaptAI/OpenAdapt/assets/774615/48d27459-4be8-4b96-beb0-1973953b8a09)
188188

189-
For a desktop app-based visualization, run:
190-
191-
```
192-
python -m openadapt.app.visualize
193-
```
194-
195-
This will open a scrollable window that looks something like this:
196-
197-
<img width="1512" alt="image" src="https://github.com/OpenAdaptAI/OpenAdapt/assets/774615/451dd467-20ae-4ce7-a3b4-f888635afe8c">
198-
199-
<img width="1511" alt="image" src="https://github.com/OpenAdaptAI/OpenAdapt/assets/774615/13264cf6-46c0-4413-a29d-59bdd040a32e">
200-
201189
### Playback
202190

203191
You can play back the recording using the following command:

openadapt/alembic/versions/f9586c10a561_migrate_data_to_new_fks.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"""
88
from alembic import op
99
import sqlalchemy as sa
10+
from sqlalchemy import text
1011

1112
# revision identifiers, used by Alembic.
1213
revision = "f9586c10a561"
@@ -27,19 +28,27 @@ def upgrade() -> None:
2728
"performance_stat",
2829
]:
2930
session.execute(
30-
f"UPDATE {table} SET recording_id = (SELECT id FROM recording WHERE"
31-
f" recording.timestamp = {table}.recording_timestamp)"
31+
text(
32+
f"UPDATE {table} SET recording_id = (SELECT id FROM recording WHERE"
33+
f" recording.timestamp = {table}.recording_timestamp)"
34+
)
3235
)
3336

3437
session.execute(
35-
"UPDATE action_event SET window_event_id = (SELECT id FROM window_event WHERE"
36-
" window_event.timestamp = action_event.window_event_timestamp)"
38+
text(
39+
"UPDATE action_event SET window_event_id = (SELECT id FROM window_event WHERE"
40+
" window_event.timestamp = action_event.window_event_timestamp)"
41+
)
3742
)
3843
session.execute(
39-
"UPDATE action_event SET screenshot_id = (SELECT id FROM screenshot WHERE"
40-
" screenshot.timestamp = action_event.screenshot_timestamp)"
44+
text(
45+
"UPDATE action_event SET screenshot_id = (SELECT id FROM screenshot WHERE"
46+
" screenshot.timestamp = action_event.screenshot_timestamp)"
47+
)
4148
)
4249

50+
session.commit()
51+
4352

4453
def downgrade() -> None:
4554
pass

openadapt/app/__init__.py

Lines changed: 112 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,114 @@
1-
"""Package for the GUI.
1+
"""openadapt.app module.
22
3-
Module: __init__.py
3+
This module provides core functionality for the OpenAdapt application.
44
"""
5+
6+
from datetime import datetime
7+
import multiprocessing
8+
import pathlib
9+
import time
10+
11+
from openadapt.record import record
12+
from openadapt.utils import WrapStdout
13+
14+
__all__ = [
15+
"RecordProc",
16+
"record_proc",
17+
"stop_record",
18+
"is_recording",
19+
"quick_record",
20+
"FPATH",
21+
]
22+
23+
# Define FPATH
24+
FPATH = pathlib.Path(__file__).parent
25+
26+
27+
class RecordProc:
28+
"""Class to manage the recording process."""
29+
30+
def __init__(self) -> None:
31+
"""Initialize the RecordProc class."""
32+
self.terminate_processing = multiprocessing.Event()
33+
self.terminate_recording = multiprocessing.Event()
34+
self.record_proc: multiprocessing.Process = None
35+
self.has_initiated_stop = False
36+
37+
def set_terminate_processing(self) -> multiprocessing.Event:
38+
"""Set the terminate event."""
39+
return self.terminate_processing.set()
40+
41+
def terminate(self) -> None:
42+
"""Terminate the recording process."""
43+
self.record_proc.terminate()
44+
45+
def reset(self) -> None:
46+
"""Reset the recording process."""
47+
self.terminate_processing.clear()
48+
self.terminate_recording.clear()
49+
self.record_proc = None
50+
self.has_initiated_stop = False
51+
52+
def wait(self) -> None:
53+
"""Wait for the recording process to finish."""
54+
while True:
55+
if self.terminate_recording.is_set():
56+
self.record_proc.terminate()
57+
return
58+
time.sleep(0.1)
59+
60+
def is_running(self) -> bool:
61+
"""Check if the recording process is running."""
62+
if self.record_proc is not None and not self.record_proc.is_alive():
63+
self.reset()
64+
return self.record_proc is not None
65+
66+
def start(self, func: callable, args: tuple, kwargs: dict) -> None:
67+
"""Start the recording process."""
68+
self.record_proc = multiprocessing.Process(
69+
target=WrapStdout(func),
70+
args=args,
71+
kwargs=kwargs,
72+
)
73+
self.record_proc.start()
74+
75+
76+
record_proc = RecordProc()
77+
78+
79+
def stop_record() -> None:
80+
"""Stop the current recording session."""
81+
global record_proc
82+
if record_proc.is_running() and not record_proc.has_initiated_stop:
83+
record_proc.set_terminate_processing()
84+
85+
# wait for process to terminate
86+
record_proc.wait()
87+
record_proc.reset()
88+
89+
90+
def is_recording() -> bool:
91+
"""Check if a recording session is currently active."""
92+
global record_proc
93+
return record_proc.is_running()
94+
95+
96+
def quick_record(
97+
task_description: str | None = None,
98+
status_pipe: multiprocessing.connection.Connection | None = None,
99+
) -> None:
100+
"""Run a recording session."""
101+
global record_proc
102+
task_description = task_description or datetime.now().strftime("%d/%m/%Y %H:%M:%S")
103+
record_proc.start(
104+
record,
105+
(
106+
task_description,
107+
record_proc.terminate_processing,
108+
record_proc.terminate_recording,
109+
status_pipe,
110+
),
111+
{
112+
"log_memory": False,
113+
},
114+
)

openadapt/app/dashboard/api/index.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""API endpoints for the dashboard."""
22

3-
43
from pathlib import Path
54
import os
65

openadapt/app/dashboard/run.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""This module contains the functions to run the dashboard web application."""
22

3-
43
from threading import Thread
54
import os
65
import pathlib

openadapt/app/tray.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@
3333
QWidget,
3434
)
3535

36-
from openadapt.app.cards import quick_record, stop_record
36+
from openadapt.app import quick_record, stop_record, FPATH
3737
from openadapt.app.dashboard.run import cleanup as cleanup_dashboard
3838
from openadapt.app.dashboard.run import run as run_dashboard
39-
from openadapt.app.main import FPATH # , start
4039
from openadapt.build_utils import is_running_from_executable
4140
from openadapt.custom_logger import logger
4241
from openadapt.db import crud

openadapt/capture/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
Module: capture.py
44
"""
5+
56
import sys
67

78
if sys.platform == "darwin":

openadapt/capture/_macos.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
55
usage: see bottom of file
66
"""
7+
78
from datetime import datetime
89
from sys import platform
910
import os

openadapt/capture/_windows.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Allows for capturing the screen and audio on Windows."""
2+
23
from datetime import datetime
34
from sys import platform
45
import os

openadapt/config.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""Configuration module for OpenAdapt."""
22

3-
43
from enum import Enum
54
from typing import Any, ClassVar, Type, Union
65
import json

0 commit comments

Comments
 (0)