示例#1
0
    def submit_input_text(self, proc_view=None):
        if not self.nlp:
            self.nlp = ModuleSelector()
            self.nlp.automate.response_callback = self.handle_response

        self.proc_view = proc_view
        self.process_text_edit.save_cursor_pos()
        query = self.process_text_edit.get_text()
        query_parts = query.split(".")
        if query == "":
            return

        try:
            for query_part in query_parts:
                task = self.nlp.prepare(query_part)[0]
                if task is None:
                    modal.ModalMessageWindow(
                        self.main_window,
                        "Failed to understand what task you wanted to perform. Please check spelling mistakes "
                        + "or simplify your sentence and try again!",
                        "Error",
                        modal.MSG_ERROR,
                    )
                    return
        except Exception:
            traceback.print_exc()
            self.process_text_edit.restore_cursor_pos()
            modal.ModalMessageWindow(self.main_window, str(sys.exc_info()[1]),
                                     "Oops! Something went wrong!",
                                     modal.MSG_ERROR)
            return

        self.process_text_edit.set_cursor_pos(0)
        self.process_text_edit.clear()
示例#2
0
def load_selector(spinner):
    click.secho("· Loading models... ", bold=True)
    with spinner:
        n = ModuleSelector()
    print("", end="\x1b[1K\r")
    click.secho("---> DONE", fg="green", bold=True)
    click.secho("· Natural language processing ready!", bold=True)

    return n
示例#3
0
def selector(monkeymodule, session_user_with_config):
    """
    Yields a module selector

    This fixture will only be executed once since the scope is
    session, this prevents having to load the models for every test.
    """

    # mock settings everywhere
    monkeymodule.setattr("lib.selector.selector.SETTINGS", session_user_with_config)
    monkeymodule.setattr("lib.automate.SETTINGS", session_user_with_config)
    monkeymodule.setattr("lib.automate.modules.schedule.SETTINGS", session_user_with_config)
    selector = ModuleSelector()
    yield selector
import sys

sys.path.append(".")
sys.path.append("..")

from lib import Error  # noqa: E402
from lib.selector.selector import ModuleSelector  # noqa: E402
from lib.settings import load_settings  # noqa: E402

load_settings()
n = ModuleSelector()

# Enable the CalDav server before running the following
try:
    text = "Reschedule meeting with John to 21:00"
    response = n.run(text)

    print(response)
except Error as err:
    print(err, file=sys.stdout)
示例#5
0
class DesignView(QtWidgets.QWidget):
    def __init__(self, main_window, *args, **kwargs):
        super(DesignView, self).__init__(*args, **kwargs)
        self.main_window = main_window
        self.model = self.main_window.model

        layout = QtWidgets.QGridLayout()
        layout.setVerticalSpacing(8)
        layout.setHorizontalSpacing(8)

        # TODO(alexander): should all models be loaded before application starts instead?
        self.nlp = None

        self.title = QtWidgets.QLabel("Design")
        self.title.setObjectName("viewTitle")
        self.title.setMaximumHeight(48)
        layout.addWidget(self.title)

        self.process_text_edit = ProcessTextEditView(self, "")
        self.process_text_edit.setMaximumHeight(180)

        self.main_process = proc_models.EntryPointModel()
        self.model.append_process(self.main_process)
        self.process_editor = ProcessEditorView(self, self.model)

        layout.addWidget(self.process_text_edit)
        layout.addWidget(self.process_editor)

        self.setLayout(layout)

        self.save_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+S"),
                                                 self)
        self.save_shortcut.activated.connect(self.save_model)

        self.load_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+F"),
                                                 self)
        self.load_shortcut.activated.connect(self.load_model)

        self.select_all_shortcut = QtWidgets.QShortcut(
            QtGui.QKeySequence("Ctrl+A"), self)
        self.select_all_shortcut.activated.connect(
            self.process_editor.select_all_processes)

        self.copy_all_shortcut = QtWidgets.QShortcut(
            QtGui.QKeySequence("Ctrl+C"), self)
        self.copy_all_shortcut.activated.connect(
            self.process_editor.copy_selection)

        self.paste_all_shortcut = QtWidgets.QShortcut(
            QtGui.QKeySequence("Ctrl+V"), self)
        self.paste_all_shortcut.activated.connect(
            self.process_editor.paste_selection)

        self.delete_selected_shortcut = QtWidgets.QShortcut(
            QtGui.QKeySequence("Delete"), self)
        self.delete_selected_shortcut.activated.connect(
            self.process_editor.remove_selected_processes)

        self.cancel_actions_shortcut = QtWidgets.QShortcut(
            QtGui.QKeySequence("Escape"), self)
        self.cancel_actions_shortcut.activated.connect(self.cancel_actions)

    def save_model(self):
        if self.model.absolute_path:
            self.model.save()
            self.main_window.set_info_message("Wrote " +
                                              self.model.absolute_path)
        else:
            self.main_window.content.save_view.filename_view.setFocus()
            self.main_window.content.save_view.filename_view.selectAll()
            self.main_window.set_active_view(1)

    def load_model(self):
        self.main_window.content.load_view.filename_view.setFocus()
        self.main_window.content.load_view.filename_view.selectAll()
        self.main_window.set_active_view(2)

    def rebuild_from_loaded_model(self):
        for view in self.process_editor.process_views.values():
            view.close()
        self.process_editor.process_views.clear()

        for id, proc in self.model.processes.items():
            view = self.process_editor.create_process_view(proc)
            self.process_editor.process_views[id] = view
            view.show()

        for view in self.process_editor.process_views.values():
            try:
                other_view = self.process_editor.process_views[
                    view.model.out_next]
                view.out_connector.connect(other_view.in_connector)
            except Exception:
                pass

        self.update()
        self.main_window.set_info_message("Loaded " + self.model.absolute_path)

    def cancel_actions(self):
        self.process_editor.deselect_all_processes()
        self.process_text_edit.cancel_editing()

    def handle_response(self, query, task, followup):
        def callback(followup, cancel=False):  # welcome to callback hell!
            try:
                if cancel:
                    self.handle_response(query, task, None)
                    return

                followup = followup.callback()
                self.handle_response(query, task, followup)
            except Exception:
                if self.main_window.modal:
                    self.main_window.modal.close_window()
                traceback.print_exc()
                self.process_text_edit.restore_cursor_pos()
                modal.ModalMessageWindow(self.main_window,
                                         str(sys.exc_info()[1]),
                                         "Oops! Something went wrong!",
                                         modal.MSG_ERROR)

        if followup:
            if self.main_window.modal:
                self.main_window.modal.close_window()
                folloup_modal = None  # noqa: F841 it is used to setup callbacks!
            if isinstance(followup, MultiFollowup):
                followup_modal = modal.ModalMultiFollowupWindow(
                    self.main_window, followup)
                followup_modal.choices.setFocus()
            elif isinstance(followup, StringFollowup):
                followup_modal = modal.ModalStringFollowupWindow(
                    self.main_window, followup)
                followup_modal.answer_input.setFocus()
            elif isinstance(followup, BooleanFollowup):
                followup_modal = modal.ModalBooleanFollowupWindow(
                    self.main_window, followup)
                followup_modal.setFocus()
            if followup_modal:
                followup_modal.callback = callback
        else:
            self.create_process_block_from_task(query, task)
        return task

    def create_process_block_from_task(self, query, task):
        model = None
        view = None
        query = query.strip()
        if isinstance(task, Send):
            model = proc_models.SendModel()
            model.recipients = ", ".join(task.to)
            model.when = str(task.when)
            model.body = str(task.body)
        elif isinstance(task, Reminder):
            model = proc_models.ReminderModel()
            model.recipients = ", ".join(task.to)
            model.when = str(task.when)
            model.body = str(task.body)
        elif isinstance(task, Schedule):
            model = proc_models.ScheduleModel()
            model.recipients = ", ".join(task.to)
            model.when = str(task.when)
            model.body = str(task.body)
        else:
            modal.ModalMessageWindow(
                self.main_window,
                "Failed to understand what task you wanted to perform. Please check spelling mistakes "
                + "or simplify your sentence and try again!",
                "Error",
                modal.MSG_ERROR,
            )
            return
        if model:
            model.query = query
        # FIXME(alexander): uses same views for all tasks!!!
        view = SendEmailView(model)

        if not self.proc_view:
            self.proc_view = ProcessView(self.process_editor, view, model)
            self.proc_view.show()
            self.process_editor.append_process(self.proc_view, model)
            self.proc_view = None
        else:
            self.proc_view.title.setText(model.name)
            self.proc_view.layout.replaceWidget(self.proc_view.view, view)
            self.proc_view.view.close()
            self.proc_view.view = view
            self.model.remove_process(self.proc_view.model)
            self.model.append_process(model)
            model.id = self.proc_view.model.id
            self.proc_view.model = model
        self.update()

    def submit_input_text(self, proc_view=None):
        if not self.nlp:
            self.nlp = ModuleSelector()
            self.nlp.automate.response_callback = self.handle_response

        self.proc_view = proc_view
        self.process_text_edit.save_cursor_pos()
        query = self.process_text_edit.get_text()
        query_parts = query.split(".")
        if query == "":
            return

        try:
            for query_part in query_parts:
                task = self.nlp.prepare(query_part)[0]
                if task is None:
                    modal.ModalMessageWindow(
                        self.main_window,
                        "Failed to understand what task you wanted to perform. Please check spelling mistakes "
                        + "or simplify your sentence and try again!",
                        "Error",
                        modal.MSG_ERROR,
                    )
                    return
        except Exception:
            traceback.print_exc()
            self.process_text_edit.restore_cursor_pos()
            modal.ModalMessageWindow(self.main_window, str(sys.exc_info()[1]),
                                     "Oops! Something went wrong!",
                                     modal.MSG_ERROR)
            return

        self.process_text_edit.set_cursor_pos(0)
        self.process_text_edit.clear()