diff --git a/openadapt/app/dashboard/api/recordings.py b/openadapt/app/dashboard/api/recordings.py
index 217024992..074e99f95 100644
--- a/openadapt/app/dashboard/api/recordings.py
+++ b/openadapt/app/dashboard/api/recordings.py
@@ -4,9 +4,9 @@
from fastapi import APIRouter, WebSocket
-from openadapt.app import cards
from openadapt.custom_logger import logger
from openadapt.db import crud
+from openadapt.deprecated.app import cards
from openadapt.events import get_events
from openadapt.models import Recording
from openadapt.plotting import display_event
diff --git a/openadapt/deprecated/app/cards.py b/openadapt/deprecated/app/cards.py
index b0ae3b498..18f11e69a 100644
--- a/openadapt/deprecated/app/cards.py
+++ b/openadapt/deprecated/app/cards.py
@@ -1,4 +1,4 @@
-"""openadapt.app.cards module.
+"""openadapt.deprecated.app.cards module.
This module provides functions for managing UI cards in the OpenAdapt application.
"""
@@ -7,10 +7,6 @@
import multiprocessing
import time
-from nicegui import ui
-
-from openadapt.app.objects.local_file_picker import LocalFilePicker
-from openadapt.app.util import get_scrub, set_dark, set_scrub, sync_switch
from openadapt.record import record
from openadapt.utils import WrapStdout
@@ -67,55 +63,6 @@ def start(self, func: callable, args: tuple, kwargs: dict) -> None:
record_proc = RecordProc()
-def settings(dark_mode: bool) -> None:
- """Display the settings dialog.
-
- Args:
- dark_mode (bool): Current dark mode setting.
- """
- with ui.dialog() as settings, ui.card():
- dark_switch = ui.switch(
- "Dark mode", on_change=lambda: set_dark(dark_mode, dark_switch.value)
- )
- sync_switch(dark_switch, dark_mode)
-
- scrub_switch = ui.switch(
- "Scrubbing", on_change=lambda: set_scrub(scrub_switch.value)
- )
- sync_switch(scrub_switch, get_scrub())
-
- ui.button("Close", on_click=lambda: settings.close())
- settings.open()
-
-
-def select_import(f: callable) -> None:
- """Display the import file selection dialog.
-
- Args:
- f (callable): Function to call when import button is clicked.
- """
-
- async def pick_file() -> None:
- result = await LocalFilePicker(".")
- ui.notify(f"Selected {result[0]}" if result else "No file selected.")
- selected_file.text = result[0] if result else ""
- import_button.enabled = True if result else False
-
- with ui.dialog() as import_dialog, ui.card():
- with ui.column():
- ui.button("Select File", on_click=pick_file).props("icon=folder")
- selected_file = ui.label("")
- selected_file.visible = False
- import_button = ui.button(
- "Import",
- on_click=lambda: f(selected_file.text, delete.value),
- )
- import_button.enabled = False
- delete = ui.checkbox("Delete file after import")
-
- import_dialog.open()
-
-
def stop_record() -> None:
"""Stop the current recording session."""
global record_proc
@@ -152,60 +99,3 @@ def quick_record(
"log_memory": False,
},
)
-
-
-def recording_prompt(options: list[str], record_button: ui.button) -> None:
- """Display the recording prompt dialog.
-
- Args:
- options (list): List of autocomplete options.
- record_button (nicegui.widgets.Button): Record button widget.
- """
- if not record_proc.is_running():
- with ui.dialog() as dialog, ui.card():
- ui.label("Enter a name for the recording: ")
- ui.input(
- label="Name",
- placeholder="test",
- autocomplete=options,
- on_change=lambda e: result.set_text(e),
- )
- result = ui.label()
-
- with ui.row():
- ui.button("Close", on_click=dialog.close)
- ui.button("Enter", on_click=lambda: on_record())
-
- dialog.open()
-
- def terminate() -> None:
- global record_proc
- record_proc.set_terminate_processing()
-
- # wait for process to terminate
- record_proc.wait()
- ui.notify("Stopped recording")
- record_button._props["name"] = "radio_button_checked"
- record_button.on("click", lambda: recording_prompt(options, record_button))
-
- record_proc.reset()
-
- def begin() -> None:
- name = result.text.__getattribute__("value")
-
- ui.notify(
- f"Recording {name}... Press CTRL + C in terminal window to cancel",
- )
- global record_proc
- record_proc.start(
- record,
- (name, record_proc.terminate_processing, record_proc.terminate_recording),
- )
- record_button._props["name"] = "stop"
- record_button.on("click", lambda: terminate())
- record_button.update()
-
- def on_record() -> None:
- global record_proc
- dialog.close()
- begin()
diff --git a/openadapt/deprecated/app/main.py b/openadapt/deprecated/app/main.py
deleted file mode 100644
index de4ff8211..000000000
--- a/openadapt/deprecated/app/main.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""openadapt.app.main module.
-
-This module provides the main entry point for running the OpenAdapt application.
-
-Example usage:
- from openadapt.app import run_app
-
- run_app()
-"""
-
-from functools import partial
-from subprocess import Popen
-import base64
-import os
-import pathlib
-
-from nicegui import app, ui
-
-from openadapt import replay
-from openadapt.app.cards import recording_prompt, select_import, settings
-from openadapt.app.objects.console import Console
-from openadapt.app.util import clear_db, on_export, on_import
-from openadapt.config import config
-
-SERVER = "127.0.0.1:8000/upload"
-FPATH = pathlib.Path(__file__).parent
-
-# Recording description autocomplete
-OPTIONS = ["test"]
-
-app.native.start_args["debug"] = False
-
-dark = ui.dark_mode()
-dark.value = config.APP_DARK_MODE
-
-logger = None
-
-
-def start(fullscreen: bool = False) -> None:
- """Start the OpenAdapt application."""
- with ui.row().classes("w-full justify-right"):
- with ui.avatar(color="white" if dark else "black", size=128):
- logo_base64 = base64.b64encode(
- open(os.path.join(FPATH, "assets/logo.png"), "rb").read()
- )
- img = bytes(
- f"data:image/png;base64,{(logo_base64.decode('utf-8'))}",
- encoding="utf-8",
- )
- ui.image(img.decode("utf-8"))
- ui.icon("settings").tooltip("Settings").on("click", lambda: settings(dark))
- ui.icon("delete").on("click", lambda: clear_db(log=logger)).tooltip(
- "Clear all recorded data"
- )
- ui.icon("upload").tooltip("Export Data").on("click", lambda: on_export(SERVER))
- ui.icon("download").tooltip("Import Data").on(
- "click", lambda: select_import(on_import)
- )
- ui.icon("share").tooltip("Share").on(
- "click", lambda: (_ for _ in ()).throw(Exception(NotImplementedError))
- )
-
- with ui.splitter(value=20) as splitter:
- splitter.classes("w-full h-full")
- with splitter.before:
- with ui.column().classes("w-full h-full"):
- record_button = (
- ui.icon("radio_button_checked", size="64px")
- .on(
- "click",
- lambda: recording_prompt(OPTIONS, record_button),
- )
- .tooltip("Record a new replay / Stop recording")
- )
- ui.icon("visibility", size="64px").on(
- "click", partial(Popen, ["python", "-m", "openadapt.visualize"])
- ).tooltip("Visualize the latest replay")
-
- ui.icon("play_arrow", size="64px").on(
- "click",
- lambda: replay.replay("NaiveReplayStrategy"),
- ).tooltip("Play the latest replay")
- with splitter.after:
- logger = Console()
- logger.log.style("height: 250px;, width: 300px;")
-
- splitter.enabled = False
-
- ui.run(
- title="OpenAdapt Client",
- native=True,
- window_size=(400, 400),
- fullscreen=fullscreen,
- reload=False,
- show=False,
- )
-
-
-if __name__ == "__main__":
- start()
diff --git a/openadapt/deprecated/app/objects/console.py b/openadapt/deprecated/app/objects/console.py
deleted file mode 100644
index 5334a8e0c..000000000
--- a/openadapt/deprecated/app/objects/console.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""openadapt.app.objects.console module.
-
-This module provides the Console class for redirecting stderr to a NiceGUI log.
-
-Example usage:
- logger = Console()
- logger.write("Error message")
-"""
-
-import sys
-
-from nicegui import ui
-
-
-class Console(object):
- """Console class for redirecting stderr to a NiceGUI log."""
-
- def __init__(self) -> None:
- """Initialize the Console object."""
- self.log = ui.log().classes("w-full h-20")
- self.old_stderr = sys.stderr
- self.buffer = ""
-
- def write(self, data: str) -> None:
- """Write data to the log.
-
- Args:
- data (str): Data to be written.
- """
- self.log.push(data[:-1])
- self.log.update()
- self.old_stderr.write(data)
-
- def flush(self) -> None:
- """Flush the log."""
- self.log.update()
- self.old_stderr.flush()
-
- def reset(self) -> None:
- """Reset the log and restore stderr."""
- self.log.clear()
- sys.stderr = self.old_stderr
diff --git a/openadapt/deprecated/app/objects/local_file_picker.py b/openadapt/deprecated/app/objects/local_file_picker.py
deleted file mode 100644
index d01a6aae0..000000000
--- a/openadapt/deprecated/app/objects/local_file_picker.py
+++ /dev/null
@@ -1,132 +0,0 @@
-"""openadapt.app.objects.local_file_picker module.
-
-This module provides the LocalFilePicker class for selecting
- a file from the local filesystem.
-# retrieved from
-https://github.com/zauberzeug/nicegui/tree/main/examples/local_file_picker
-
-Example usage:
- from openadapt.app.objects.local_file_picker import LocalFilePicker
-
- async def pick_file():
- result = await LocalFilePicker("~", multiple=True)
- ui.notify(f"You chose {result}")
-"""
-
-from pathlib import Path
-from typing import Dict, Optional
-
-from nicegui import ui
-
-
-class LocalFilePicker(ui.dialog):
- """LocalFilePicker class for selecting a file from the local filesystem."""
-
- def __init__(
- self,
- directory: str,
- *,
- upper_limit: Optional[str] = ...,
- multiple: bool = False,
- show_hidden_files: bool = False,
- dark_mode: bool = False,
- ) -> None:
- """Initialize the LocalFilePicker object.
-
- Args:
- directory (str): The directory to start in.
- upper_limit (Optional[str]): The directory to stop at
- (None: no limit, default: same as the starting directory).
- multiple (bool): Whether to allow multiple files to be selected.
- show_hidden_files (bool): Whether to show hidden files.
- dark_mode (bool): Whether to use dark mode for the file picker.
- """
- super().__init__()
-
- self.path = Path(directory).expanduser()
- if upper_limit is None:
- self.upper_limit = None
- else:
- self.upper_limit = Path(
- directory if upper_limit == ... else upper_limit
- ).expanduser()
- self.show_hidden_files = show_hidden_files
-
- with self, ui.card():
- self.grid = (
- ui.aggrid(
- {
- "columnDefs": [{"field": "name", "headerName": "File"}],
- "rowSelection": "multiple" if multiple else "single",
- },
- html_columns=[0],
- )
- .classes("w-96")
- .on("cellDoubleClicked", self.handle_double_click)
- )
- with ui.row().classes("w-full justify-end"):
- ui.button("Cancel", on_click=self.close).props("outline")
- ui.button("Ok", on_click=self._handle_ok)
- self.update_grid()
-
- def update_grid(self) -> None:
- """Update the grid with file data."""
- paths = list(self.path.glob("*"))
- if not self.show_hidden_files:
- paths = [p for p in paths if not p.name.startswith(".")]
- paths.sort(key=lambda p: p.name.lower())
- paths.sort(key=lambda p: not p.is_dir())
-
- self.grid.options["rowData"] = [
- {
- "name": f"📁 {p.name}" if p.is_dir() else p.name,
- "path": str(p),
- }
- for p in paths
- ]
- if (
- self.upper_limit is None
- and self.path != self.path.parent
- or self.upper_limit is not None
- and self.path != self.upper_limit
- ):
- self.grid.options["rowData"].insert(
- 0,
- {
- "name": "📁 ..",
- "path": str(self.path.parent),
- },
- )
-
- self.grid.update()
-
- async def handle_double_click(self, msg: Dict) -> None:
- """Handle the double-click event on a cell in the grid.
-
- Args:
- msg (Dict): Message containing the event data.
- """
- self.path = Path(msg["args"]["data"]["path"])
- if self.path.is_dir():
- self.update_grid()
- else:
- self.submit([str(self.path)])
-
- async def _handle_ok(self) -> None:
- """Handle the Ok button click event."""
- rows = await ui.run_javascript(
- f"getElement({self.grid.id}).gridOptions.api.getSelectedRows()"
- )
- self.submit([r["path"] for r in rows])
-
-
-async def pick_file() -> None:
- """Async function for picking a file using LocalFilePicker."""
- result = await LocalFilePicker("~", multiple=True)
- ui.notify(f"You chose {result}")
-
-
-if __name__ in {"__main__", "__mp_main__"}:
- ui.button("Choose file", on_click=pick_file).props("icon=folder")
-
- ui.run(native=True)
diff --git a/openadapt/deprecated/app/util.py b/openadapt/deprecated/app/util.py
deleted file mode 100644
index 978a2b104..000000000
--- a/openadapt/deprecated/app/util.py
+++ /dev/null
@@ -1,134 +0,0 @@
-"""openadapt.app.util module.
-
-This module provides utility functions for the OpenAdapt application.
-
-Example usage:
- from openadapt.app.util import clear_db, on_import, on_export, sync_switch, set_dark
-
- clear_db()
- on_import(selected_file, delete=False, src="openadapt.db")
- on_export(dest)
- sync_switch(switch, prop)
- set_dark(dark_mode, value)
-"""
-
-from shutil import copyfileobj
-import bz2
-import os
-import sys
-
-from nicegui import elements, ui
-
-from openadapt.app.objects import console
-from openadapt.config import config
-from openadapt.scripts.reset_db import reset_db
-
-
-def clear_db(log: console.Console) -> None:
- """Clear the database.
-
- Args:
- log: Optional NiceGUI log object.
- """
- if log:
- log.log.clear()
- o = sys.stdout
- sys.stdout = sys.stderr
-
- reset_db()
- ui.notify("Cleared database.")
- sys.stdout = o
-
-
-def on_import(
- selected_file: str,
- delete: bool = False,
- src: str = "openadapt.db",
-) -> None:
- """Import data from a selected file.
-
- Args:
- selected_file (str): The path of the selected file.
- delete (bool): Whether to delete the selected file after import.
- src (str): The source file name to save the imported data.
- """
- with open(src, "wb") as f:
- with bz2.BZ2File(selected_file, "rb") as f2:
- copyfileobj(f2, f)
-
- if delete:
- os.remove(selected_file)
-
- ui.notify("Imported data.")
-
-
-def on_export(dest: str) -> None:
- """Export data to a destination.
-
- Args:
- dest (str): The destination to export the data to.
- """
- # TODO: add ui card for configuration
- ui.notify("Exporting data...")
-
- # compress db with bz2
- with open("openadapt.db", "rb") as f:
- with bz2.BZ2File("openadapt.db.bz2", "wb", compresslevel=9) as f2:
- copyfileobj(f, f2)
-
- # TODO: magic wormhole
- # # upload to server with requests, and keep file name
- # files = {
- # "files": open("openadapt.db.bz2", "rb"),
- # }
- # #requests.post(dest, files=files)
-
- # delete compressed db
- os.remove("openadapt.db.bz2")
-
- ui.notify("Exported data.")
-
-
-def sync_switch(
- switch: elements.switch.Switch, prop: elements.mixins.value_element.ValueElement
-) -> None:
- """Synchronize the value of a switch with a property.
-
- Args:
- switch: The switch object.
- prop: The property object.
- """
- switch.value = prop.value if hasattr(prop, "value") else prop
-
-
-def set_scrub(value: bool) -> None:
- """Set the scrubbing value.
-
- Args:
- value: The value to set.
- """
- if config.SCRUB_ENABLED != value:
- config.SCRUB_ENABLED = value
- ui.notify("Scrubbing enabled." if value else "Scrubbing disabled.")
- ui.notify("You may need to restart the app for this to take effect.")
-
-
-def get_scrub() -> bool:
- """Get the scrubbing value.
-
- Returns:
- bool: The scrubbing value.
- """
- return config.SCRUB_ENABLED
-
-
-def set_dark(dark_mode: ui.dark_mode, value: bool) -> None:
- """Set the dark mode.
-
- Args:
- dark_mode: The dark mode object.
- value: The value to set.
- """
- if dark_mode.value != value:
- dark_mode.value = value
- config.APP_DARK_MODE = value
diff --git a/openadapt/deprecated/app/visualize.py b/openadapt/deprecated/app/visualize.py
deleted file mode 100644
index 44f86b42c..000000000
--- a/openadapt/deprecated/app/visualize.py
+++ /dev/null
@@ -1,409 +0,0 @@
-"""Implements visualization utilities for OpenAdapt."""
-
-from base64 import b64encode
-from functools import partial
-from os import path, sep
-from pprint import pformat
-
-from nicegui import events, ui
-
-from openadapt.build_utils import redirect_stdout_stderr
-from openadapt.custom_logger import logger
-
-with redirect_stdout_stderr():
- from tqdm import tqdm
-
-import click
-
-from openadapt.config import config
-from openadapt.db import crud
-from openadapt.events import get_events
-from openadapt.plotting import display_event, plot_performance
-from openadapt.utils import EMPTY, configure_logging, image2utf8, row2dict, rows2dicts
-
-SCRUB = config.SCRUB_ENABLED
-
-if SCRUB:
- # too many warnings from scrubbing
- __import__("warnings").filterwarnings("ignore", category=DeprecationWarning)
- from openadapt.privacy.providers.presidio import PresidioScrubbingProvider
-
- scrub = PresidioScrubbingProvider()
-
-
-LOG_LEVEL = "INFO"
-MAX_EVENTS = None
-PROCESS_EVENTS = True
-
-performance_plot_img: ui.interactive_image = None
-
-
-def create_tree(
- tree_dict: dict, max_children: str = config.VISUALIZE_MAX_TABLE_CHILDREN
-) -> list[dict]:
- """Recursively creates a tree from a dictionary.
-
- Args:
- tree_dict (dict): The dictionary to create a tree from.
- max_children (str, optional): The maximum number of children to display.
- Defaults to MAX_TABLE_CHILDREN.
-
- Returns:
- list[dict]: Data for a Quasar Tree.
- """
- tree_data = []
- for key, value in tree_dict.items():
- if value in EMPTY:
- continue
- node = {
- "id": (
- str(key)
- + f"{(': ' + str(value)) if not isinstance(value, (dict, list)) else ''}" # noqa
- )
- }
- if isinstance(value, dict):
- node["children"] = create_tree(value)
- elif isinstance(value, list):
- if max_children is not None and len(value) > max_children:
- node["children"] = create_tree(
- {i: v for i, v in enumerate(value[:max_children])}
- )
- node["children"].append({"id": "..."})
- else:
- node["children"] = create_tree({i: v for i, v in enumerate(value)})
- tree_data.append(node)
- return tree_data
-
-
-def set_tree_props(tree: ui.tree) -> None:
- """Sets properties for a UI tree based on values from config.
-
- Args:
- tree (ui.tree): A Quasar Tree.
- """
- tree._props["dense"] = config.VISUALIZE_DENSE_TREES
- tree._props["no-transition"] = not config.VISUALIZE_ANIMATIONS
- tree._props["default-expand-all"] = config.VISUALIZE_EXPAND_ALL
- tree._props["filter"] = ""
-
-
-def set_filter(
- text: str,
- tree: ui.tree,
-) -> None:
- """Sets filter for UI trees.
-
- Args:
- tree (ui.tree): A Quasar Tree.
- text (str): The text to filter by.
- """
- tree._props["filter"] = text
- tree.update()
-
-
-def toggle_dark_mode(
- ui_dark: ui.dark_mode, plots: tuple[str], curr_logo: ui.image, images: tuple[str]
-) -> None:
- """Handles dark mode toggle.
-
- Args:
- ui_dark (ui.dark_mode): The dark mode switch.
- plots (tuple[str]): The performance plots.
- curr_logo (ui.image): The current logo.
- images (tuple[str]): The light and dark mode logos (decoded)
- """
- global performance_plot_img
- ui_dark.toggle()
- ui_dark.update()
- config.VISUALIZE_DARK_MODE = ui_dark.value
- curr_logo.source = images[int(ui_dark.value)]
- curr_logo.update()
- performance_plot_img.source = plots[int(ui_dark.value)]
- performance_plot_img.update()
-
-
-@logger.catch
-@click.command()
-@click.option(
- "--timestamp",
- type=str,
- help="The timestamp of the recording to visualize.",
-)
-def main(timestamp: str) -> None:
- """Visualize a recording."""
- configure_logging(logger, LOG_LEVEL)
-
- ui_dark = ui.dark_mode(config.VISUALIZE_DARK_MODE)
- session = crud.get_new_session(read_only=True)
-
- if timestamp is None:
- recording = crud.get_latest_recording(session)
- else:
- recording = crud.get_recording(session, timestamp)
-
- if SCRUB:
- scrub.scrub_text(recording.task_description)
- logger.debug(f"{recording=}")
-
- meta = {}
- action_events = get_events(session, recording, process=PROCESS_EVENTS, meta=meta)
- event_dicts = rows2dicts(action_events)
-
- if SCRUB:
- event_dicts = scrub.scrub_list_dicts(event_dicts)
- logger.info(f"event_dicts=\n{pformat(event_dicts)}")
-
- recording_dict = row2dict(recording)
-
- if SCRUB:
- recording_dict = scrub.scrub_dict(recording_dict)
-
- # setup tables for recording / metadata
- recording_column = [
- (
- {
- "name": key,
- "field": key,
- "label": key,
- "sortable": False,
- "required": False,
- "align": "left",
- }
- )
- for key in recording_dict.keys()
- ]
-
- meta_col = [
- {
- "name": key,
- "field": key,
- "label": key,
- "sortable": False,
- "required": False,
- "align": "left",
- }
- for key in meta.keys()
- ]
-
- plots = (
- plot_performance(recording, save_file=False, view_file=False),
- plot_performance(recording, save_file=False, view_file=False, dark_mode=True),
- )
-
- with ui.row():
- with ui.avatar(color="auto", size=128):
- images = ()
-
- # generate base64 encoded images for light and dark mode
- for i in range(2):
- fp = f"{path.dirname(__file__)}{sep}assets{sep}logo"
- logo_base64 = b64encode(
- open(
- f"{fp}{'_inverted' if i > 0 else ''}.png",
- "rb",
- ).read()
- )
- images += (
- bytes(
- f"data:image/png;base64,{(logo_base64.decode('utf-8'))}",
- encoding="utf-8",
- ).decode("utf-8"),
- )
- curr_logo = ui.image(images[int(ui_dark.value)])
- ui.switch(
- text="Dark Mode",
- value=ui_dark.value,
- on_change=partial(toggle_dark_mode, ui_dark, plots, curr_logo, images),
- )
-
- # create splitter with recording info on left and performance plot on right
- with ui.splitter(value=20).style("flex-wrap: nowrap;") as splitter:
- splitter._props["limits"] = [20, 80]
-
- # TODO: find a way to set "overflow: hidden;" for the splitter
- with splitter.before:
- ui.table(rows=[meta], columns=meta_col).style("min-width: 50em;")._props[
- "grid"
- ] = True
- with splitter.after:
- global performance_plot_img
- performance_plot_img = ui.interactive_image(
- source=plots[int(ui_dark.value)]
- )
- with performance_plot_img:
- # ui.button(
- # on_click=lambda: plot_performance(
- # recording.timestamp, view_file=True, save_file=False
- # ),
- # icon="visibility",
- # ).props("flat fab").tooltip("View")
-
- ui.button(
- on_click=lambda: plot_performance(
- recording,
- save_file=True,
- view_file=False,
- dark_mode=ui_dark.value,
- ),
- icon="save",
- ).props("flat fab").tooltip("Save as PNG")
-
- ui.table(rows=[recording_dict], columns=recording_column)
-
- interactive_images = []
- action_event_trees = []
- window_event_trees = []
- text_inputs = []
-
- logger.info(f"{len(action_events)=}")
-
- num_events = (
- min(MAX_EVENTS, len(action_events))
- if MAX_EVENTS is not None
- else len(action_events)
- )
-
- # global search
- def on_change_closure(e: events.ValueChangeEventArguments) -> None:
- for tree in range(len(action_event_trees)):
- set_filter(
- e.value,
- action_event_trees[tree],
- )
- set_filter(
- e.value,
- window_event_trees[tree],
- )
-
- text_inputs.append(
- ui.input(
- label="search all",
- placeholder="filter all",
- on_change=partial(on_change_closure),
- ).tooltip(
- "this will search all trees, but can be overridden by individual filters"
- )
- )
-
- with redirect_stdout_stderr():
- with tqdm(
- total=num_events,
- desc="Generating Visualization" if not SCRUB else "Scrubbing Visualization",
- unit="event",
- colour="green",
- dynamic_ncols=True,
- ) as progress:
- for idx, action_event in enumerate(action_events):
- if idx == MAX_EVENTS:
- break
-
- image = display_event(action_event)
- # diff = display_event(action_event, diff=True)
- # mask = action_event.screenshot.diff_mask
-
- if SCRUB:
- image = scrub.scrub_image(image)
- # diff = scrub.scrub_image(diff)
- # mask = scrub.scrub_image(mask)
-
- image_utf8 = image2utf8(image)
- # diff_utf8 = image2utf8(diff)
- # mask_utf8 = image2utf8(mask)
- width, height = image.size
-
- action_event_dict = row2dict(action_event)
- window_event_dict = row2dict(action_event.window_event)
-
- if SCRUB:
- action_event_dict = scrub.scrub_dict(action_event_dict)
- window_event_dict = scrub.scrub_dict(window_event_dict)
-
- with ui.column():
- with ui.row():
- interactive_images.append(
- ui.interactive_image(
- source=image_utf8,
- ).classes("drop-shadow-md rounded")
- )
- with ui.splitter(value=60) as splitter:
- splitter.classes("w-full h-full")
- with splitter.after:
- ui.label("action_event_dict").style("font-weight: bold;")
-
- def on_change_closure(
- e: events.ValueChangeEventArguments, idx: int
- ) -> None:
- return set_filter(
- e.value,
- action_event_trees[idx],
- )
-
- text_inputs.append(
- ui.input(
- label="search",
- placeholder="filter",
- on_change=partial(
- on_change_closure,
- idx=idx,
- ),
- )
- )
- ui.html("
")
- action_event_tree = create_tree(action_event_dict)
- action_event_trees.append(
- ui.tree(
- action_event_tree,
- label_key="id",
- # on_select=lambda e: ui.notify(e.value),
- )
- )
- set_tree_props(action_event_trees[idx])
- with splitter.before:
- ui.label("window_event_dict").style("font-weight: bold;")
-
- def on_change_closure(
- e: events.ValueChangeEventArguments, idx: int
- ) -> None:
- return set_filter(
- e.value,
- window_event_trees[idx],
- )
-
- text_inputs.append(
- ui.input(
- label="search",
- placeholder="filter",
- on_change=partial(
- on_change_closure,
- idx=idx,
- ),
- )
- )
- ui.html("
")
- window_event_tree = create_tree(window_event_dict, None)
-
- window_event_trees.append(
- ui.tree(
- window_event_tree,
- label_key="id",
- # on_select=lambda e: ui.notify(e.value),
- )
- )
-
- set_tree_props(window_event_trees[idx])
-
- progress.update()
-
- progress.close()
-
- ui.run(
- reload=False,
- title=f"OpenAdapt: recording-{recording.id}",
- favicon="📊",
- native=config.VISUALIZE_RUN_NATIVELY,
- fullscreen=config.VISUALIZE_RUN_NATIVELY,
- )
-
-
-if __name__ == "__main__":
- main()
diff --git a/openadapt/start.py b/openadapt/start.py
index d6493983f..af22ef99d 100644
--- a/openadapt/start.py
+++ b/openadapt/start.py
@@ -6,7 +6,6 @@
import subprocess
-from openadapt.app.main import run_app
from openadapt.custom_logger import logger
@@ -24,8 +23,6 @@ def main() -> None:
subprocess.run(["git", "pull", "-q"])
logger.info("Updated the OpenAdapt App")
- run_app() # start gui
-
if __name__ == "__main__":
main()
diff --git a/poetry.lock b/poetry.lock
index 212af2995..9cf91a77a 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
[[package]]
name = "aiohappyeyeballs"
@@ -554,47 +554,6 @@ files = [
[package.dependencies]
numpy = {version = ">=1.19.0", markers = "python_version >= \"3.9\""}
-[[package]]
-name = "blis"
-version = "1.0.1"
-description = "The Blis BLAS-like linear algebra library, as a self-contained C-extension."
-optional = false
-python-versions = "*"
-files = [
- {file = "blis-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:232f68f78fd9ab2f8bf01424cd6a265edd97e14e26186ef48eca1b6f212e928f"},
- {file = "blis-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90a796d8311b6439d63c91ed09163be995173a1ca5bedc510c1b45cbdbb7886c"},
- {file = "blis-1.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:388b0b0c55df884eb5853292d53c7c3daaa009b3d991e7a95413e46e82e88058"},
- {file = "blis-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c89149eed90c3b76f50c88d8d68661ca07d8b4bfaa517eedf5b77ddf640bb1"},
- {file = "blis-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f23cff163c0a256b580c33364f1598a4f49f532074c673a734d9b02a101adce1"},
- {file = "blis-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d4d403d4b4979d5b1e6f12637ed25fb3bd4e260440997d9ba9e752f9e9c91cb"},
- {file = "blis-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:a6440bed28f405ab81d1d57b3fb96b7ea8b5b1f3d3a0d29860b0a814fe4ece27"},
- {file = "blis-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5076b33c04b864709d0d22c40e9f57dc06ee9c2bd2f7ab72b10ffa74a470d9e6"},
- {file = "blis-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6b1f791fa3eeb267b97f5877a6bdcc09c868603b84422acf7fd138ec9b96c3c"},
- {file = "blis-1.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c249649c0f7c06b2368a9d5c6b12209255981e96304c6140a3beffaff6cae62"},
- {file = "blis-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632580f1d3ff44fb36e8a21a9457f23aeaff5d35d108bd2ef0393b9f6d85de93"},
- {file = "blis-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:64393297304712818020734fa75735f4543243eefc44858ef3c99375d5bb029a"},
- {file = "blis-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d3b3293c795007dbf4ba8ceaf3184a6bf510ca3252d0229607792f52e8702bb2"},
- {file = "blis-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:60e1b03663bee7a37b4b3131b4179d283868ccb10a3260fed01dd980866bc49f"},
- {file = "blis-1.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e031b6cf0dcc026d697a860bf53bc02b5f26ddb5a3ecd23933c51cf22803825b"},
- {file = "blis-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f860c1723928c40d4920a05130d21a600dcb5fbf07aa1fe8f4bdff2c4a5238a5"},
- {file = "blis-1.0.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:399196506829c278836028511f351f32f2c992263e91ef876c6bc41dc2483d3d"},
- {file = "blis-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce20590af2c6ff02d66ffed4148ea8ea1e3f772febb8471e3e58614e71d428c1"},
- {file = "blis-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e6ad60d9cd81523429f46109b31e3c4bbdd0dc28a328d6dbdcdff8447a53a61e"},
- {file = "blis-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb553b233fc815957c5bbb5d2fc2f6d2b199c123ec15c5000db935662849e543"},
- {file = "blis-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:376188493f590c4310ca534b687ef96c21c8224eb1ef4a0420703eebe175d6fa"},
- {file = "blis-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:136eae35dd9fd6c1923b95d5623aa174abd43d5b764bed79fd37bf6ad40282e7"},
- {file = "blis-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:16b5a418c55825d0d7912f63befee865da7522ce8f388b8ef76224050c5f8386"},
- {file = "blis-1.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:806ab0838efa5e434e6fcdce86542601d0263256d483623bc86e91728a645de4"},
- {file = "blis-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ad60cde863a7cf8e69fcf0c3b965ab0f804f0332adb35552788bb76660c97f"},
- {file = "blis-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:40459f37f430de0c6059631cc9f7588c3bccb6ade074571015ea09856b91cb69"},
- {file = "blis-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f0977eaba2d3f64df649201aa281cf3216e7bec18929a7374c3f3f36100db029"},
- {file = "blis-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:5b4c8298c49b25058462731139b711e35e73623280cee03c3b0804cbdee50c0d"},
- {file = "blis-1.0.1.tar.gz", hash = "sha256:91739cd850ca8100dcddbd8ad66942cab20c9473cdea9a35b165b11d7b8d91e4"},
-]
-
-[package.dependencies]
-numpy = ">=2.0.0,<3.0.0"
-
[[package]]
name = "bokeh"
version = "2.4.3"
@@ -4169,60 +4128,6 @@ files = [
{file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
]
-[[package]]
-name = "numpy"
-version = "2.0.2"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"},
- {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"},
- {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"},
- {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"},
- {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"},
- {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"},
- {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"},
- {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"},
- {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"},
- {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"},
- {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"},
- {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"},
- {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"},
- {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"},
- {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"},
- {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"},
- {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"},
- {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"},
- {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"},
- {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"},
- {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"},
- {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"},
- {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"},
- {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"},
- {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"},
- {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"},
- {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"},
- {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"},
- {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"},
- {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"},
- {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"},
- {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"},
- {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"},
- {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"},
- {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"},
- {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"},
- {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"},
- {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"},
- {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"},
- {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"},
- {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"},
- {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"},
- {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"},
- {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"},
- {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"},
-]
-
[[package]]
name = "oa-atomacos"
version = "3.2.0"
@@ -5142,6 +5047,7 @@ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs
optional = false
python-versions = ">=3.8"
files = [
+ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"},
{file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"},
]
@@ -5152,6 +5058,7 @@ description = "A collection of ASN.1-based protocols modules"
optional = false
python-versions = ">=3.8"
files = [
+ {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"},
{file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"},
]
@@ -7405,84 +7312,6 @@ lookups = ["spacy-lookups-data (>=1.0.3,<1.1.0)"]
th = ["pythainlp (>=2.0)"]
transformers = ["spacy-transformers (>=1.1.2,<1.4.0)"]
-[[package]]
-name = "spacy"
-version = "3.8.2"
-description = "Industrial-strength Natural Language Processing (NLP) in Python"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "spacy-3.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:795e74493036dda0a576093b797a4fdc1aaa83d66f6c9af0e5b6b1c640dc2222"},
- {file = "spacy-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d432e78fe2a7424aba9a741db07ce58487d3b74fae4e20a779142828e61bc402"},
- {file = "spacy-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536a8ba17359540de502285934bf357805d978128d7bd5e84ba53d28b32a0ffb"},
- {file = "spacy-3.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6a0d0d39baa1cb9f5bb82874cbe1067bf494f76277a383f1f7b29f7a855d41a9"},
- {file = "spacy-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:9dcfcfda558b3e47946b2041c7a4203b78e542d0de20997a7c0a6d11b58b2522"},
- {file = "spacy-3.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5d48918028cff6d69d9915dad64f0e32ebd5f1e4f1fa81a2e17e56a6f61e05"},
- {file = "spacy-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:455f845b88ed795d7e595070ee84b65b3ea382357811e09fc744789a20b7b5f7"},
- {file = "spacy-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05d8a4cbfdb90049053564790a0d12fa790c9471580cb6a1f8bdc2b6e74703dd"},
- {file = "spacy-3.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e3c3e67f786f1410d08420ffcaba0f80dc58387ab6172dcdac1a73353d3a85c7"},
- {file = "spacy-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cfe0c4558f635c67677e36d9a315f51d51f824870589c4846c95e880042a2ceb"},
- {file = "spacy-3.8.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0ce56f3c46dd4cebb5aaa3a40966e813b7fc6a540d547788a7d00cca10cd60a9"},
- {file = "spacy-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09faa873cf23d5136b1c1ce6378054a885f650fda96e1655a3ab49e2e7fdd15b"},
- {file = "spacy-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e992a11de9b727c61288541945c0ffc37ed998aca76bfd557937c2c195d7d4"},
- {file = "spacy-3.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be962a8188fb20d6c2065e1e865d1799ebbf544c1af67ab8c75cb279bf5448c7"},
- {file = "spacy-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:04546c5f5ed607387d4e9ecf57614e90c5784866a10a3c6dbe5b06e9b18a2f29"},
- {file = "spacy-3.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7c5fb8b804ebf1c2791b384d61391e9d0227bcfdecd6c861291690813b8a6eb1"},
- {file = "spacy-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3647233b2454e8e7bae94232563c9bff849db9e26bf61ef51122ef723de009fe"},
- {file = "spacy-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca20e2d9b4aeaedd7068d6419762d66cfad82bc8b1e63e36714601686d67f163"},
- {file = "spacy-3.8.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:be3aa3e7d456627acbcb7f585156ee463c01d006a07aeb20b43a8543a02cd047"},
- {file = "spacy-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:54c63d31ef410ebb5b0fd72729afaf50f876bf2bc29f73c6c5fc3676ae4158a1"},
- {file = "spacy-3.8.2.tar.gz", hash = "sha256:4b37ebd25ada4059b0dc9e0893e70dde5df83485329a068ef04580e70892a65d"},
-]
-
-[package.dependencies]
-catalogue = ">=2.0.6,<2.1.0"
-cymem = ">=2.0.2,<2.1.0"
-jinja2 = "*"
-langcodes = ">=3.2.0,<4.0.0"
-murmurhash = ">=0.28.0,<1.1.0"
-numpy = {version = ">=1.19.0", markers = "python_version >= \"3.9\""}
-packaging = ">=20.0"
-preshed = ">=3.0.2,<3.1.0"
-pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0"
-requests = ">=2.13.0,<3.0.0"
-setuptools = "*"
-spacy-legacy = ">=3.0.11,<3.1.0"
-spacy-loggers = ">=1.0.0,<2.0.0"
-srsly = ">=2.4.3,<3.0.0"
-thinc = ">=8.3.0,<8.4.0"
-tqdm = ">=4.38.0,<5.0.0"
-typer = ">=0.3.0,<1.0.0"
-wasabi = ">=0.9.1,<1.2.0"
-weasel = ">=0.1.0,<0.5.0"
-
-[package.extras]
-apple = ["thinc-apple-ops (>=1.0.0,<2.0.0)"]
-cuda = ["cupy (>=5.0.0b4,<13.0.0)"]
-cuda-autodetect = ["cupy-wheel (>=11.0.0,<13.0.0)"]
-cuda100 = ["cupy-cuda100 (>=5.0.0b4,<13.0.0)"]
-cuda101 = ["cupy-cuda101 (>=5.0.0b4,<13.0.0)"]
-cuda102 = ["cupy-cuda102 (>=5.0.0b4,<13.0.0)"]
-cuda110 = ["cupy-cuda110 (>=5.0.0b4,<13.0.0)"]
-cuda111 = ["cupy-cuda111 (>=5.0.0b4,<13.0.0)"]
-cuda112 = ["cupy-cuda112 (>=5.0.0b4,<13.0.0)"]
-cuda113 = ["cupy-cuda113 (>=5.0.0b4,<13.0.0)"]
-cuda114 = ["cupy-cuda114 (>=5.0.0b4,<13.0.0)"]
-cuda115 = ["cupy-cuda115 (>=5.0.0b4,<13.0.0)"]
-cuda116 = ["cupy-cuda116 (>=5.0.0b4,<13.0.0)"]
-cuda117 = ["cupy-cuda117 (>=5.0.0b4,<13.0.0)"]
-cuda11x = ["cupy-cuda11x (>=11.0.0,<13.0.0)"]
-cuda12x = ["cupy-cuda12x (>=11.5.0,<13.0.0)"]
-cuda80 = ["cupy-cuda80 (>=5.0.0b4,<13.0.0)"]
-cuda90 = ["cupy-cuda90 (>=5.0.0b4,<13.0.0)"]
-cuda91 = ["cupy-cuda91 (>=5.0.0b4,<13.0.0)"]
-cuda92 = ["cupy-cuda92 (>=5.0.0b4,<13.0.0)"]
-ja = ["sudachidict-core (>=20211220)", "sudachipy (>=0.5.2,!=0.6.1)"]
-ko = ["natto-py (>=0.9.0)"]
-lookups = ["spacy-lookups-data (>=1.0.3,<1.1.0)"]
-th = ["pythainlp (>=2.0)"]
-transformers = ["spacy-transformers (>=1.1.2,<1.4.0)"]
-
[[package]]
name = "spacy-alignments"
version = "0.9.1"
@@ -8082,76 +7911,6 @@ mxnet = ["mxnet (>=1.5.1,<1.6.0)"]
tensorflow = ["tensorflow (>=2.0.0,<2.6.0)"]
torch = ["torch (>=1.6.0)"]
-[[package]]
-name = "thinc"
-version = "8.3.2"
-description = "A refreshing functional take on deep learning, compatible with your favorite libraries"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "thinc-8.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6af5b1b57fb1874079f7e84cd99c983c3dcb234a55845d8585d7e066b09755fb"},
- {file = "thinc-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f8b753b63714d38f36e951241466c650afe3177b0c8b220e180ebf4888f09f5e"},
- {file = "thinc-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d471e1261e5e650f93cfae9880928c2ee68ad0426656f02da4490dd24716a93b"},
- {file = "thinc-8.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8b46786063787a60a0d732a5d43d0196f632d3d35780c8fe1232d1378b1b5980"},
- {file = "thinc-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:f96c274c4119c92fb8fd8a708381080d47ad92994ef3041c791ed6d4b5c27761"},
- {file = "thinc-8.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:12e998780f40d36d4d5f3b760ef60ac60637643f2965ebe1948801ba44261a03"},
- {file = "thinc-8.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:54a5411daaca1718a73982767b714c1d0a5e142de73c916367baf1c13d79e8f0"},
- {file = "thinc-8.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed88275031dcaadd85d3deeb8eb12d1ec0ee6b4679e24cc893c81a30409ac4ee"},
- {file = "thinc-8.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef0868e55108f05300f4508e6896ae4e9492f3415220e3da65579f693225816e"},
- {file = "thinc-8.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:813942d59881c4e4165ce95fef37ba30ce3366dac43289697d13a952a8208854"},
- {file = "thinc-8.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bce8ca6a62ab82f4595210ba7f18bbdb6e33561277c59060f2f04bdb93ac4fbc"},
- {file = "thinc-8.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b014a282e9ea6330a678b472d74f479c7a38168cbf570bdc740e50d960dd78a1"},
- {file = "thinc-8.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80384c228ac6bbaf4ab7f7c9ca4a53c6053f2fb37b2b50c4730b9057f07e9fd"},
- {file = "thinc-8.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ae309b0788478984eafeac4e3c33a2de84a6ea251fd1e3528d8018d4b4347247"},
- {file = "thinc-8.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:fe8dac2749db23f8ebf09d7a7f29e1b99d67e7d7b183e106aa2b6c9b570f3015"},
- {file = "thinc-8.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e4b1e4149a3bfdeb308cee4b53b07d234e5b35495a7f35241b80acf7cb4a33d3"},
- {file = "thinc-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a6b507b1fecd1771fc448aa27dc42d024e5799d10f1ddad6abc6353ae72ef540"},
- {file = "thinc-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4edb20939c3a157beb386aee221a5e1bbfb7ffb90d63d22c80047ca0fa4d026d"},
- {file = "thinc-8.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d701de93d6d6bb029d24088d7f8cb8200f486658fd08dd859767b5eda6eba268"},
- {file = "thinc-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:2977c4811b7612984ded795dce182419b9f3058a1a55c191f75024ec2f4cb218"},
- {file = "thinc-8.3.2.tar.gz", hash = "sha256:3e8ef69eac89a601e11d47fc9e43d26ffe7ef682dcf667c94ff35ff690549aeb"},
-]
-
-[package.dependencies]
-blis = ">=1.0.0,<1.1.0"
-catalogue = ">=2.0.4,<2.1.0"
-confection = ">=0.0.1,<1.0.0"
-cymem = ">=2.0.2,<2.1.0"
-murmurhash = ">=1.0.2,<1.1.0"
-numpy = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3.9\""}
-packaging = ">=20.0"
-preshed = ">=3.0.2,<3.1.0"
-pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0"
-setuptools = "*"
-srsly = ">=2.4.0,<3.0.0"
-wasabi = ">=0.8.1,<1.2.0"
-
-[package.extras]
-apple = ["thinc-apple-ops (>=1.0.0,<2.0.0)"]
-cuda = ["cupy (>=5.0.0b4)"]
-cuda-autodetect = ["cupy-wheel (>=11.0.0)"]
-cuda100 = ["cupy-cuda100 (>=5.0.0b4)"]
-cuda101 = ["cupy-cuda101 (>=5.0.0b4)"]
-cuda102 = ["cupy-cuda102 (>=5.0.0b4)"]
-cuda110 = ["cupy-cuda110 (>=5.0.0b4)"]
-cuda111 = ["cupy-cuda111 (>=5.0.0b4)"]
-cuda112 = ["cupy-cuda112 (>=5.0.0b4)"]
-cuda113 = ["cupy-cuda113 (>=5.0.0b4)"]
-cuda114 = ["cupy-cuda114 (>=5.0.0b4)"]
-cuda115 = ["cupy-cuda115 (>=5.0.0b4)"]
-cuda116 = ["cupy-cuda116 (>=5.0.0b4)"]
-cuda117 = ["cupy-cuda117 (>=5.0.0b4)"]
-cuda11x = ["cupy-cuda11x (>=11.0.0)"]
-cuda12x = ["cupy-cuda12x (>=11.5.0)"]
-cuda80 = ["cupy-cuda80 (>=5.0.0b4)"]
-cuda90 = ["cupy-cuda90 (>=5.0.0b4)"]
-cuda91 = ["cupy-cuda91 (>=5.0.0b4)"]
-cuda92 = ["cupy-cuda92 (>=5.0.0b4)"]
-datasets = ["ml-datasets (>=0.2.0,<0.3.0)"]
-mxnet = ["mxnet (>=1.5.1,<1.6.0)"]
-tensorflow = ["tensorflow (>=2.0.0,<2.6.0)"]
-torch = ["torch (>=1.6.0)"]
-
[[package]]
name = "threadpoolctl"
version = "3.5.0"