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"