diff --git a/plugins/code/ui/lsp_manager/__init__.py b/plugins/code/language_server_clients/java_lsp_client/__init__.py similarity index 100% rename from plugins/code/ui/lsp_manager/__init__.py rename to plugins/code/language_server_clients/java_lsp_client/__init__.py diff --git a/plugins/code/ui/lsp_manager/__main__.py b/plugins/code/language_server_clients/java_lsp_client/__main__.py similarity index 100% rename from plugins/code/ui/lsp_manager/__main__.py rename to plugins/code/language_server_clients/java_lsp_client/__main__.py diff --git a/plugins/code/language_server_clients/java_lsp_client/config/lsp-server-config.json b/plugins/code/language_server_clients/java_lsp_client/config/lsp-server-config.json new file mode 100644 index 0000000..59531f7 --- /dev/null +++ b/plugins/code/language_server_clients/java_lsp_client/config/lsp-server-config.json @@ -0,0 +1,214 @@ +{ + "info": "https://download.eclipse.org/jdtls/", + "info-init-options": "https://github.com/eclipse-jdtls/eclipse.jdt.ls/wiki/Running-the-JAVA-LS-server-from-the-command-line", + "info-import-build": "https://www.javahotchocolate.com/tutorials/build-path.html", + "info-external-class-paths": "https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3291", + "link": "https://download.eclipse.org/jdtls/milestones/?d", + "command": "lsp-ws-proxy --listen 4114 -- jdtls", + "alt-command": "lsp-ws-proxy -- jdtls", + "alt-command2": "java-language-server", + "socket": "ws://127.0.0.1:9999/java", + "socket-two": "ws://127.0.0.1:9999/?name=jdtls", + "alt-socket": "ws://127.0.0.1:9999/?name=java-language-server", + "initialization-options": { + "bundles": [ + "intellicode-core.jar" + ], + "workspaceFolders": [ + "file://{workspace.folder}" + ], + "extendedClientCapabilities": { + "classFileContentsSupport": true, + "executeClientCommandSupport": false + }, + "settings": { + "java": { + "autobuild": { + "enabled": true + }, + "jdt": { + "ls": { + "javac": { + "enabled": true + }, + "java": { + "home": "{user.home}/Portable_Apps/sdks/javasdk/jdk-22.0.2" + }, + "lombokSupport": { + "enabled": true + }, + "protobufSupport":{ + "enabled": true + }, + "androidSupport": { + "enabled": true + } + } + }, + "configuration": { + "updateBuildConfiguration": "automatic", + "maven": { + "userSettings": "{user.home}/.config/jdtls/settings.xml", + "globalSettings": "{user.home}/.config/jdtls/settings.xml" + }, + "runtimes": [ + { + "name": "JavaSE-17", + "path": "/usr/lib/jvm/java-17-openjdk", + "javadoc": "https://docs.oracle.com/en/java/javase/17/docs/api/", + "default": false + }, + { + "name": "JavaSE-22", + "path": "{user.home}/Portable_Apps/sdks/javasdk/jdk-22.0.2", + "javadoc": "https://docs.oracle.com/en/java/javase/22/docs/api/", + "default": true + } + ] + }, + "classPath": [ + "{user.home}/.config/jdtls/m2/repository/**/*-sources.jar", + "lib/**/*-sources.jar" + ], + "docPath": [ + "{user.home}/.config/jdtls/m2/repository/**/*-javadoc.jar", + "lib/**/*-javadoc.jar" + ], + "project": { + "encoding": "ignore", + "outputPath": "bin", + "referencedLibraries": [ + "{user.home}/.config/jdtls/m2/repository/**/*.jar", + "lib/**/*.jar" + ], + "importOnFirstTimeStartup": "automatic", + "importHint": true, + "resourceFilters": [ + "node_modules", + "\\.git" + ], + "sourcePaths": [ + "src", + "{user.home}/.config/jdtls/m2/repository/**/*.jar" + ] + }, + "sources": { + "organizeImports": { + "starThreshold": 99, + "staticStarThreshold": 99 + } + }, + "imports": { + "gradle": { + "wrapper": { + "checksums": [] + } + } + }, + "import": { + "maven": { + "enabled": true, + "offline": { + "enabled": false + }, + "disableTestClasspathFlag": false + }, + "gradle": { + "enabled": false, + "wrapper": { + "enabled": true + }, + "version": "", + "home": "abs(static/gradle-7.3.3)", + "java": { + "home": "abs(static/launch_jres/17.0.6-linux-x86_64)" + }, + "offline": { + "enabled": false + }, + "arguments": [], + "jvmArguments": [], + "user": { + "home": "" + }, + "annotationProcessing": { + "enabled": true + } + }, + "exclusions": [ + "**/node_modules/**", + "**/.metadata/**", + "**/archetype-resources/**", + "**/META-INF/maven/**" + ], + "generatesMetadataFilesAtProjectRoot": false + }, + "maven": { + "downloadSources": true, + "updateSnapshots": true + }, + "silentNotification": true, + "contentProvider": { + "preferred": "fernflower" + }, + "signatureHelp": { + "enabled": true, + "description": { + "enabled": true + } + }, + "completion": { + "enabled": true, + "engine": "ecj", + "matchCase": "firstletter", + "maxResults": 25, + "guessMethodArguments": true, + "lazyResolveTextEdit": { + "enabled": true + }, + "postfix": { + "enabled": true + }, + "favoriteStaticMembers": [ + "org.junit.Assert.*", + "org.junit.Assume.*", + "org.junit.jupiter.api.Assertions.*", + "org.junit.jupiter.api.Assumptions.*", + "org.junit.jupiter.api.DynamicContainer.*", + "org.junit.jupiter.api.DynamicTest.*" + ], + "importOrder": [ + "#", + "java", + "javax", + "org", + "com" + ] + }, + "references": { + "includeAccessors": true, + "includeDecompiledSources": true + }, + "codeGeneration": { + "toString": { + "template": "${object.className}{${member.name()}=${member.value}, ${otherMembers}}" + }, + "insertionLocation": "afterCursor", + "useBlocks": true + }, + "implementationsCodeLens": { + "enabled": true + }, + "referencesCodeLens": { + "enabled": true + }, + "progressReports": { + "enabled": false + }, + "saveActions": { + "organizeImports": true + } + } + } + } +} diff --git a/plugins/code/language_server_clients/java_lsp_client/manifest.json b/plugins/code/language_server_clients/java_lsp_client/manifest.json new file mode 100644 index 0000000..93f7049 --- /dev/null +++ b/plugins/code/language_server_clients/java_lsp_client/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Java LSP Client", + "author": "ITDominator", + "version": "0.0.1", + "support": "", + "requests": {} +} diff --git a/plugins/code/language_server_clients/java_lsp_client/plugin.py b/plugins/code/language_server_clients/java_lsp_client/plugin.py new file mode 100644 index 0000000..e7dd8c2 --- /dev/null +++ b/plugins/code/language_server_clients/java_lsp_client/plugin.py @@ -0,0 +1,37 @@ +# Python imports +from os import path + +# Lib imports +import gi + +from gi.repository import GLib + +# Application imports +from libs.event_factory import Event_Factory, Code_Event_Types + +from plugins.plugin_types import PluginCode + +from .response_handler import JavaHandler + + +class Plugin(PluginCode): + def __init__(self): + super(Plugin, self).__init__() + + + def _controller_message(self, event: Code_Event_Types.CodeEvent): + ... + + def load(self): + dirPth = path.dirname( path.realpath(__file__) ) + with open(f"{dirPth}/config/lsp-server-config.json", "r") as f: + config = f.read() + event = Event_Factory.create_event("register_lsp_client", + lang_id = "java", + lang_config = config, + handler = JavaHandler + ) + self.emit_to("lsp_manager", event) + + def run(self): + ... diff --git a/plugins/code/language_server_clients/java_lsp_client/response_handler/__init__.py b/plugins/code/language_server_clients/java_lsp_client/response_handler/__init__.py new file mode 100644 index 0000000..5c43090 --- /dev/null +++ b/plugins/code/language_server_clients/java_lsp_client/response_handler/__init__.py @@ -0,0 +1 @@ +from .java import JavaHandler \ No newline at end of file diff --git a/plugins/code/ui/lsp_manager/response_handlers/java.py b/plugins/code/language_server_clients/java_lsp_client/response_handler/java.py similarity index 95% rename from plugins/code/ui/lsp_manager/response_handlers/java.py rename to plugins/code/language_server_clients/java_lsp_client/response_handler/java.py index 8b6f638..c408d76 100644 --- a/plugins/code/ui/lsp_manager/response_handlers/java.py +++ b/plugins/code/language_server_clients/java_lsp_client/response_handler/java.py @@ -9,7 +9,7 @@ from gi.repository import GtkSource # Application imports from libs.event_factory import Event_Factory, Code_Event_Types -from .default import DefaultHandler +from lsp_manager.response_handlers.default import DefaultHandler diff --git a/plugins/code/language_server_clients/lsp_manager/__init__.py b/plugins/code/language_server_clients/lsp_manager/__init__.py new file mode 100644 index 0000000..d36fa8c --- /dev/null +++ b/plugins/code/language_server_clients/lsp_manager/__init__.py @@ -0,0 +1,3 @@ +""" + Pligin Module +""" diff --git a/plugins/code/language_server_clients/lsp_manager/__main__.py b/plugins/code/language_server_clients/lsp_manager/__main__.py new file mode 100644 index 0000000..a576329 --- /dev/null +++ b/plugins/code/language_server_clients/lsp_manager/__main__.py @@ -0,0 +1,3 @@ +""" + Pligin Package +""" diff --git a/plugins/code/ui/lsp_manager/client/__init__.py b/plugins/code/language_server_clients/lsp_manager/client/__init__.py similarity index 100% rename from plugins/code/ui/lsp_manager/client/__init__.py rename to plugins/code/language_server_clients/lsp_manager/client/__init__.py diff --git a/plugins/code/ui/lsp_manager/client/lsp_client.py b/plugins/code/language_server_clients/lsp_manager/client/lsp_client.py similarity index 93% rename from plugins/code/ui/lsp_manager/client/lsp_client.py rename to plugins/code/language_server_clients/lsp_manager/client/lsp_client.py index d593807..816e711 100644 --- a/plugins/code/ui/lsp_manager/client/lsp_client.py +++ b/plugins/code/language_server_clients/lsp_manager/client/lsp_client.py @@ -8,8 +8,9 @@ import gi from gi.repository import GLib # Application imports -from libs.dto.code.lsp.lsp_messages import get_message_str -from libs.dto.code.lsp.lsp_message_structs import LSPResponseTypes, ClientRequest, ClientNotification +from ..dto.code.lsp.lsp_messages import get_message_str +from ..dto.code.lsp.lsp_message_structs import \ + LSPResponseTypes, ClientRequest, ClientNotification from .lsp_client_websocket import LSPClientWebsocket diff --git a/plugins/code/ui/lsp_manager/client/lsp_client_base.py b/plugins/code/language_server_clients/lsp_manager/client/lsp_client_base.py similarity index 81% rename from plugins/code/ui/lsp_manager/client/lsp_client_base.py rename to plugins/code/language_server_clients/lsp_manager/client/lsp_client_base.py index 4305270..73bdf19 100644 --- a/plugins/code/ui/lsp_manager/client/lsp_client_base.py +++ b/plugins/code/language_server_clients/lsp_manager/client/lsp_client_base.py @@ -3,8 +3,9 @@ # Lib imports # Application imports +from ..dto.code.lsp.lsp_message_structs import ClientRequest, ClientNotification + from .lsp_client_events import LSPClientEvents -from libs.dto.code.lsp.lsp_message_structs import ClientRequest, ClientNotification diff --git a/plugins/code/ui/lsp_manager/client/lsp_client_events.py b/plugins/code/language_server_clients/lsp_manager/client/lsp_client_events.py similarity index 88% rename from plugins/code/ui/lsp_manager/client/lsp_client_events.py rename to plugins/code/language_server_clients/lsp_manager/client/lsp_client_events.py index 69fadf6..a4f2bac 100644 --- a/plugins/code/ui/lsp_manager/client/lsp_client_events.py +++ b/plugins/code/language_server_clients/lsp_manager/client/lsp_client_events.py @@ -4,15 +4,15 @@ import os # Lib imports # Application imports -from libs.dto.code.lsp.lsp_messages import get_message_obj -from libs.dto.code.lsp.lsp_messages import didopen_notification -from libs.dto.code.lsp.lsp_messages import didsave_notification -from libs.dto.code.lsp.lsp_messages import didclose_notification -from libs.dto.code.lsp.lsp_messages import didchange_notification -from libs.dto.code.lsp.lsp_messages import completion_request -from libs.dto.code.lsp.lsp_messages import definition_request -from libs.dto.code.lsp.lsp_messages import references_request -from libs.dto.code.lsp.lsp_messages import symbols_request +from ..dto.code.lsp.lsp_messages import get_message_obj +from ..dto.code.lsp.lsp_messages import didopen_notification +from ..dto.code.lsp.lsp_messages import didsave_notification +from ..dto.code.lsp.lsp_messages import didclose_notification +from ..dto.code.lsp.lsp_messages import didchange_notification +from ..dto.code.lsp.lsp_messages import completion_request +from ..dto.code.lsp.lsp_messages import definition_request +from ..dto.code.lsp.lsp_messages import references_request +from ..dto.code.lsp.lsp_messages import symbols_request diff --git a/plugins/code/ui/lsp_manager/client/lsp_client_websocket.py b/plugins/code/language_server_clients/lsp_manager/client/lsp_client_websocket.py similarity index 89% rename from plugins/code/ui/lsp_manager/client/lsp_client_websocket.py rename to plugins/code/language_server_clients/lsp_manager/client/lsp_client_websocket.py index 46a31ff..7b8fe57 100644 --- a/plugins/code/ui/lsp_manager/client/lsp_client_websocket.py +++ b/plugins/code/language_server_clients/lsp_manager/client/lsp_client_websocket.py @@ -5,8 +5,8 @@ from gi.repository import GLib # Application imports # from libs import websockets -from libs.dto.code.lsp.lsp_messages import get_message_str, get_message_obj -from libs.dto.code.lsp.lsp_message_structs import \ +from ..dto.code.lsp.lsp_messages import get_message_str, get_message_obj +from ..dto.code.lsp.lsp_message_structs import \ LSPResponseTypes, ClientRequest, ClientNotification, \ LSPResponseRequest, LSPResponseNotification, LSPIDResponseNotification diff --git a/plugins/code/ui/lsp_manager/client/websocket_client.py b/plugins/code/language_server_clients/lsp_manager/client/websocket_client.py similarity index 100% rename from plugins/code/ui/lsp_manager/client/websocket_client.py rename to plugins/code/language_server_clients/lsp_manager/client/websocket_client.py diff --git a/plugins/code/ui/lsp_manager/configs/initialize-params-slim.json b/plugins/code/language_server_clients/lsp_manager/configs/initialize-params-slim.json similarity index 100% rename from plugins/code/ui/lsp_manager/configs/initialize-params-slim.json rename to plugins/code/language_server_clients/lsp_manager/configs/initialize-params-slim.json diff --git a/plugins/code/ui/lsp_manager/configs/lsp-servers-config.json b/plugins/code/language_server_clients/lsp_manager/configs/lsp-servers-config.json similarity index 100% rename from plugins/code/ui/lsp_manager/configs/lsp-servers-config.json rename to plugins/code/language_server_clients/lsp_manager/configs/lsp-servers-config.json diff --git a/plugins/code/language_server_clients/lsp_manager/dto/code/events/__init__.py b/plugins/code/language_server_clients/lsp_manager/dto/code/events/__init__.py new file mode 100644 index 0000000..ddb9886 --- /dev/null +++ b/plugins/code/language_server_clients/lsp_manager/dto/code/events/__init__.py @@ -0,0 +1,8 @@ +""" + Libs Code DTO(s) Events Package +""" + +from .lsp_event import LspEvent + +from .register_lsp_client_event import RegisterLspClientEvent +from .unregister_lsp_client_event import UnregisterLspClientEvent diff --git a/plugins/code/language_server_clients/lsp_manager/dto/code/events/lsp_event.py b/plugins/code/language_server_clients/lsp_manager/dto/code/events/lsp_event.py new file mode 100644 index 0000000..77d516e --- /dev/null +++ b/plugins/code/language_server_clients/lsp_manager/dto/code/events/lsp_event.py @@ -0,0 +1,13 @@ +# Python imports +from dataclasses import dataclass, field + +# Lib imports + +# Application imports +from libs.dto.code.events import CodeEvent + + + +@dataclass +class LspEvent(CodeEvent): + ... diff --git a/plugins/code/language_server_clients/lsp_manager/dto/code/events/register_lsp_client_event.py b/plugins/code/language_server_clients/lsp_manager/dto/code/events/register_lsp_client_event.py new file mode 100644 index 0000000..f641c64 --- /dev/null +++ b/plugins/code/language_server_clients/lsp_manager/dto/code/events/register_lsp_client_event.py @@ -0,0 +1,17 @@ +# Python imports +from dataclasses import dataclass, field + +# Lib imports + +# Application imports +from ....response_handlers.base_handler import BaseHandler + +from .lsp_event import LspEvent + + + +@dataclass +class RegisterLspClientEvent(LspEvent): + lang_id: str = "" + lang_config: str = "{}" + handler: BaseHandler = None diff --git a/plugins/code/language_server_clients/lsp_manager/dto/code/events/unregister_lsp_client_event.py b/plugins/code/language_server_clients/lsp_manager/dto/code/events/unregister_lsp_client_event.py new file mode 100644 index 0000000..c2a6f25 --- /dev/null +++ b/plugins/code/language_server_clients/lsp_manager/dto/code/events/unregister_lsp_client_event.py @@ -0,0 +1,13 @@ +# Python imports +from dataclasses import dataclass, field + +# Lib imports + +# Application imports +from .lsp_event import LspEvent + + + +@dataclass +class UnregisterLspClientEvent(LspEvent): + lang_id: str = "" diff --git a/src/libs/dto/code/lsp/lsp_message_structs.py b/plugins/code/language_server_clients/lsp_manager/dto/code/lsp/lsp_message_structs.py similarity index 100% rename from src/libs/dto/code/lsp/lsp_message_structs.py rename to plugins/code/language_server_clients/lsp_manager/dto/code/lsp/lsp_message_structs.py diff --git a/src/libs/dto/code/lsp/lsp_messages.py b/plugins/code/language_server_clients/lsp_manager/dto/code/lsp/lsp_messages.py similarity index 100% rename from src/libs/dto/code/lsp/lsp_messages.py rename to plugins/code/language_server_clients/lsp_manager/dto/code/lsp/lsp_messages.py diff --git a/src/libs/dto/code/lsp/lsp_structs.py b/plugins/code/language_server_clients/lsp_manager/dto/code/lsp/lsp_structs.py similarity index 100% rename from src/libs/dto/code/lsp/lsp_structs.py rename to plugins/code/language_server_clients/lsp_manager/dto/code/lsp/lsp_structs.py diff --git a/plugins/code/ui/lsp_manager/libs/__init__.py b/plugins/code/language_server_clients/lsp_manager/libs/__init__.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/__init__.py rename to plugins/code/language_server_clients/lsp_manager/libs/__init__.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/__init__.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/__init__.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/__init__.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/__init__.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_abnf.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_abnf.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_abnf.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_abnf.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_app.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_app.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_app.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_app.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_cookiejar.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_cookiejar.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_cookiejar.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_cookiejar.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_core.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_core.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_core.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_core.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_exceptions.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_exceptions.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_exceptions.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_exceptions.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_handshake.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_handshake.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_handshake.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_handshake.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_http.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_http.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_http.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_http.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_logging.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_logging.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_logging.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_logging.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_socket.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_socket.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_socket.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_socket.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_ssl_compat.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_ssl_compat.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_ssl_compat.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_ssl_compat.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_url.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_url.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_url.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_url.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_utils.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_utils.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_utils.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_utils.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/_wsdump.py b/plugins/code/language_server_clients/lsp_manager/libs/websocket/_wsdump.py similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/_wsdump.py rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/_wsdump.py diff --git a/plugins/code/ui/lsp_manager/libs/websocket/py.typed b/plugins/code/language_server_clients/lsp_manager/libs/websocket/py.typed similarity index 100% rename from plugins/code/ui/lsp_manager/libs/websocket/py.typed rename to plugins/code/language_server_clients/lsp_manager/libs/websocket/py.typed diff --git a/plugins/code/ui/lsp_manager/lsp_manager.py b/plugins/code/language_server_clients/lsp_manager/lsp_manager.py similarity index 76% rename from plugins/code/ui/lsp_manager/lsp_manager.py rename to plugins/code/language_server_clients/lsp_manager/lsp_manager.py index d18d20c..0245478 100644 --- a/plugins/code/ui/lsp_manager/lsp_manager.py +++ b/plugins/code/language_server_clients/lsp_manager/lsp_manager.py @@ -3,7 +3,13 @@ # Lib imports # Application imports -from libs.dto.code.lsp.lsp_message_structs import LSPResponseTypes, LSPResponseRequest, LSPResponseNotification +from libs.controllers.controller_base import ControllerBase +from libs.event_factory import Event_Factory, Code_Event_Types + +from .dto.code.events import \ + RegisterLspClientEvent, UnregisterLspClientEvent +from .dto.code.lsp.lsp_message_structs import \ + LSPResponseTypes, LSPResponseRequest, LSPResponseNotification from .provider import Provider from .provider_response_cache import ProviderResponseCache @@ -13,7 +19,7 @@ from .response_handlers.response_registry import ResponseRegistry -class LSPManager: +class LSPManager(ControllerBase): def __init__(self): super(LSPManager, self).__init__() @@ -37,6 +43,20 @@ class LSPManager: self.response_cache.set_lsp_client(self.lsp_manager_client) self.provider.response_cache = self.response_cache + def _controller_message(self, event: Code_Event_Types.CodeEvent): + if isinstance(event, RegisterLspClientEvent): + self.response_registry.register_handler(event.lang_id, event.handler) + self.lsp_manager_ui.add_client_listing(event.lang_id, event.lang_config) + elif isinstance(event, UnregisterLspClientEvent): + self.response_registry.unregister_handler(event.lang_id) + +# if isinstance(event, Code_Event_Types.RegisterLspClientEvent): +# self.response_registry.register_handler(event.lang_id, event.handler) +# self.lsp_manager_ui.add_client_listing(event.lang_id, event.lang_config) +# elif isinstance(event, Code_Event_Types.UnregisterLspClientEvent): +# self.response_registry.unregister_handler(event.lang_id) + + def _on_create_client(self, ui, lang_id: str, workspace_uri: str) -> bool: init_opts = ui.get_init_opts(lang_id) result = self.create_client(lang_id, workspace_uri, init_opts) diff --git a/plugins/code/ui/lsp_manager/lsp_manager_client.py b/plugins/code/language_server_clients/lsp_manager/lsp_manager_client.py similarity index 100% rename from plugins/code/ui/lsp_manager/lsp_manager_client.py rename to plugins/code/language_server_clients/lsp_manager/lsp_manager_client.py diff --git a/plugins/code/ui/lsp_manager/lsp_manager_ui.py b/plugins/code/language_server_clients/lsp_manager/lsp_manager_ui.py similarity index 74% rename from plugins/code/ui/lsp_manager/lsp_manager_ui.py rename to plugins/code/language_server_clients/lsp_manager/lsp_manager_ui.py index 6530ab1..79f6db5 100644 --- a/plugins/code/ui/lsp_manager/lsp_manager_ui.py +++ b/plugins/code/language_server_clients/lsp_manager/lsp_manager_ui.py @@ -1,5 +1,4 @@ # Python imports -from os import path import json # Lib imports @@ -25,12 +24,8 @@ class LSPManagerUI(Gtk.Dialog): def __init__(self): super(LSPManagerUI, self).__init__() - self._SCRIPT_PTH: str = path.dirname( path.realpath(__file__) ) - self._USER_HOME: str = path.expanduser('~') - self._LSP_SERVERS_CONFIG: str = "" - self.servers_config: dict = {} + self.client_configs: dict[str, str] = {} - self.parent = None self.source_view = None self._setup_styling() @@ -69,9 +64,10 @@ class LSPManagerUI(Gtk.Dialog): self.path_entry.set_can_focus(False) self.path_entry.set_placeholder_text("Workspace Folder...") self.path_entry.connect("changed", self._path_changed, bttn_box) + self.path_bttn.set_halign(Gtk.Align.FILL) self.path_bttn.connect("file-set", self._file_set) - self.path_bttn.set_halign(Gtk.Align.FILL) + self.combo_box.connect("changed", self._on_combo_changed) self.hide_bttn.connect("clicked", lambda widget: self.hide()) self.create_client_bttn.connect("clicked", self._create_client, self.close_client_bttn) self.close_client_bttn.connect("clicked", self._close_client, self.create_client_bttn) @@ -115,16 +111,56 @@ class LSPManagerUI(Gtk.Dialog): def _path_changed(self, widget, buttons_widget): if not widget.get_text(): + self.path_bttn.unselect_all() + self.path_bttn.emit("file-set") buttons_widget.hide() return + self.set_source_view_text( self.path_entry.get_text() ) buttons_widget.show() def _file_set(self, widget): - self.path_entry.set_text( - widget.get_filename() + fname = widget.get_filename() + fname = "" if not fname else fname + self.path_entry.set_text(fname) + + lang_id = self.combo_box.get_active_text() + if not lang_id or lang_id not in self.client_configs: return + + self.set_source_view_text( + "{workspace.folder}" if not fname else fname ) - self.load_lsp_servers_config_placeholders() + + def _create_client(self, widget, sibling): + if not self.source_view: return + + buffer = self.source_view.get_buffer() + lang_id = self.combo_box.get_active_text() + + if not lang_id: return + + workspace_dir = self.path_entry.get_text() + self.emit('create-client', lang_id, workspace_dir) + + def _close_client(self, widget, sibling): + lang_id = self.combo_box.get_active_text() + + if not lang_id: return + self.emit('close-client', lang_id) + + def _on_combo_changed(self, combo: Gtk.ComboBoxText): + lang_id = combo.get_active_text() + self.set_source_view_text( self.path_entry.get_text() ) + + + def set_source_view_text(self, workspace_dir: str): + lang_id = self.combo_box.get_active_text() + if not lang_id: return + + json_str = self.client_configs[lang_id].replace("{workspace.folder}", workspace_dir) + buffer = self.source_view.get_buffer() + + buffer.set_text(json_str, -1) def map_parent_resize_event(self, parent): parent.connect("size-allocate", lambda w, r: self._map_resize(self, parent)) @@ -147,68 +183,20 @@ class LSPManagerUI(Gtk.Dialog): scrolled_win.show_all() - def load_lsp_servers_config(self): - try: - with open(f"{self._SCRIPT_PTH}/configs/lsp-servers-config.json") as file: - self._LSP_SERVERS_CONFIG = file.read() - except FileNotFoundError: - logger.error(f"Config file not found: {self._SCRIPT_PTH}/configs/lsp-servers-config.json") - - def load_lsp_servers_config_placeholders(self): - if not self._LSP_SERVERS_CONFIG: return - if not self.source_view: return - - data = self._LSP_SERVERS_CONFIG \ - .replace("{user.home}", self._USER_HOME) \ - .replace("{workspace.folder}", self.path_entry.get_text()) - - self.servers_config = json.loads(data) - - buffer = self.source_view.get_buffer() - start_itr, \ - end_itr = buffer.get_bounds() - - buffer.delete(start_itr, end_itr) - buffer.insert(start_itr, data, -1) - - self.set_language_combo_box( list(self.servers_config.keys()) ) - - def set_language_combo_box(self, lang_ids: list[str]): - self.combo_box.remove_all() - - for lang_id in lang_ids: - self.combo_box.append_text(lang_id) + def add_client_listing(self, lang_id: str, lang_config: str): + self.combo_box.append_text(lang_id) + self.client_configs[lang_id] = lang_config def get_init_opts(self, lang_id: str) -> dict: - buffer = self.source_view.get_buffer() + if not lang_id or lang_id not in self.client_configs: return {} + try: - self.servers_config = json.loads( - buffer.get_text( *buffer.get_bounds() ) - ) + lang_config = json.loads(self.client_configs[lang_id]) except json.JSONDecodeError as e: - logger.error(f"Invalid JSON: {e}") + logger.error(f"Invalid JSON for {lang_id}: {e}") return {} - if not lang_id or not lang_id in self.servers_config: return {} - - return self.servers_config[lang_id].get("initialization-options", {}) - - def _create_client(self, widget, sibling): - if not self.source_view: return - - buffer = self.source_view.get_buffer() - lang_id = self.combo_box.get_active_text() - - if not lang_id: return - - workspace_dir = self.path_entry.get_text() - self.emit('create-client', lang_id, workspace_dir) - - def _close_client(self, widget, sibling): - lang_id = self.combo_box.get_active_text() - - if not lang_id: return - self.emit('close-client', lang_id) + return lang_config.get("initialization-options", {}) def toggle_client_buttons(self, show_close: bool): self.create_client_bttn.set_visible(not show_close) diff --git a/plugins/code/ui/lsp_manager/manifest.json b/plugins/code/language_server_clients/lsp_manager/manifest.json similarity index 83% rename from plugins/code/ui/lsp_manager/manifest.json rename to plugins/code/language_server_clients/lsp_manager/manifest.json index c0b82bc..830009d 100644 --- a/plugins/code/ui/lsp_manager/manifest.json +++ b/plugins/code/language_server_clients/lsp_manager/manifest.json @@ -3,5 +3,6 @@ "author": "ITDominator", "version": "0.0.1", "support": "", + "pre_launch": true, "requests": {} } diff --git a/plugins/code/ui/lsp_manager/mixins/__init__.py b/plugins/code/language_server_clients/lsp_manager/mixins/__init__.py similarity index 100% rename from plugins/code/ui/lsp_manager/mixins/__init__.py rename to plugins/code/language_server_clients/lsp_manager/mixins/__init__.py diff --git a/plugins/code/ui/lsp_manager/mixins/lsp_client_events_mixin.py b/plugins/code/language_server_clients/lsp_manager/mixins/lsp_client_events_mixin.py similarity index 100% rename from plugins/code/ui/lsp_manager/mixins/lsp_client_events_mixin.py rename to plugins/code/language_server_clients/lsp_manager/mixins/lsp_client_events_mixin.py diff --git a/plugins/code/ui/lsp_manager/plugin.py b/plugins/code/language_server_clients/lsp_manager/plugin.py similarity index 89% rename from plugins/code/ui/lsp_manager/plugin.py rename to plugins/code/language_server_clients/lsp_manager/plugin.py index 1db147b..eb5b8ea 100644 --- a/plugins/code/ui/lsp_manager/plugin.py +++ b/plugins/code/language_server_clients/lsp_manager/plugin.py @@ -11,6 +11,7 @@ from libs.dto.states import SourceViewStates from plugins.plugin_types import PluginCode +from .dto.code import events as lsp_events from .lsp_manager import LSPManager @@ -28,6 +29,10 @@ class Plugin(PluginCode): ... def load(self): + Event_Factory.register_events( lsp_events.__dict__.items() ) + + self.register_controller("lsp_manager", lsp_manager) + window = self.request_ui_element("main-window") lsp_manager.lsp_manager_ui.map_parent_resize_event(window) @@ -55,11 +60,11 @@ class Plugin(PluginCode): self.emit_to("source_views", event) source_view = event.response - lsp_manager.lsp_manager_ui.load_lsp_servers_config() lsp_manager.lsp_manager_ui.set_source_view(source_view) - lsp_manager.lsp_manager_ui.load_lsp_servers_config_placeholders() - lsp_manager.response_registry.set_event_hub(self.emit, self.emit_to, lsp_manager.provider) + lsp_manager.response_registry.set_event_hub( + self.emit, self.emit_to, lsp_manager.provider + ) def run(self): ... diff --git a/plugins/code/ui/lsp_manager/provider/__init__.py b/plugins/code/language_server_clients/lsp_manager/provider/__init__.py similarity index 100% rename from plugins/code/ui/lsp_manager/provider/__init__.py rename to plugins/code/language_server_clients/lsp_manager/provider/__init__.py diff --git a/plugins/code/ui/lsp_manager/provider/provider.py b/plugins/code/language_server_clients/lsp_manager/provider/provider.py similarity index 100% rename from plugins/code/ui/lsp_manager/provider/provider.py rename to plugins/code/language_server_clients/lsp_manager/provider/provider.py diff --git a/plugins/code/ui/lsp_manager/provider/provider_response_cache.py b/plugins/code/language_server_clients/lsp_manager/provider/provider_response_cache.py similarity index 100% rename from plugins/code/ui/lsp_manager/provider/provider_response_cache.py rename to plugins/code/language_server_clients/lsp_manager/provider/provider_response_cache.py diff --git a/plugins/code/language_server_clients/lsp_manager/response_handlers/__init__.py b/plugins/code/language_server_clients/lsp_manager/response_handlers/__init__.py new file mode 100644 index 0000000..f4d1842 --- /dev/null +++ b/plugins/code/language_server_clients/lsp_manager/response_handlers/__init__.py @@ -0,0 +1,3 @@ +from .base_handler import BaseHandler +from .default import DefaultHandler +from .response_registry import ResponseRegistry diff --git a/plugins/code/ui/lsp_manager/response_handlers/base.py b/plugins/code/language_server_clients/lsp_manager/response_handlers/base_handler.py similarity index 100% rename from plugins/code/ui/lsp_manager/response_handlers/base.py rename to plugins/code/language_server_clients/lsp_manager/response_handlers/base_handler.py diff --git a/plugins/code/ui/lsp_manager/response_handlers/default.py b/plugins/code/language_server_clients/lsp_manager/response_handlers/default.py similarity index 99% rename from plugins/code/ui/lsp_manager/response_handlers/default.py rename to plugins/code/language_server_clients/lsp_manager/response_handlers/default.py index d555b3a..f936310 100644 --- a/plugins/code/ui/lsp_manager/response_handlers/default.py +++ b/plugins/code/language_server_clients/lsp_manager/response_handlers/default.py @@ -8,7 +8,7 @@ from gi.repository import GLib # Application imports from libs.event_factory import Event_Factory, Code_Event_Types -from .base import BaseHandler +from .base_handler import BaseHandler diff --git a/plugins/code/ui/lsp_manager/response_handlers/response_registry.py b/plugins/code/language_server_clients/lsp_manager/response_handlers/response_registry.py similarity index 82% rename from plugins/code/ui/lsp_manager/response_handlers/response_registry.py rename to plugins/code/language_server_clients/lsp_manager/response_handlers/response_registry.py index 20c25d1..c871486 100644 --- a/plugins/code/ui/lsp_manager/response_handlers/response_registry.py +++ b/plugins/code/language_server_clients/lsp_manager/response_handlers/response_registry.py @@ -3,10 +3,8 @@ # Lib imports # Application imports -from .base import BaseHandler +from .base_handler import BaseHandler from .default import DefaultHandler -from .python import PythonHandler -from .java import JavaHandler @@ -15,12 +13,11 @@ class ResponseRegistry: self._instances: dict = {} self._lang_handlers: dict = { - "default": DefaultHandler, - "python": PythonHandler, - "java": JavaHandler, + "default": DefaultHandler } - def set_event_hub(self, emit, emit_to, provider=None): + + def set_event_hub(self, emit, emit_to, provider = None): self.emit = emit self.emit_to = emit_to self._provider = provider @@ -36,6 +33,9 @@ class ResponseRegistry: def register_handler(self, lang_id: str, handler_cls: type[BaseHandler]): self._lang_handlers[lang_id] = handler_cls + def unregister_handler(self, lang_id: str, handler_cls: type[BaseHandler]): + del self._lang_handlers[lang_id] + def get_handler(self, lang_id: str = "", method: str = ""): handler_cls = self._lang_handlers.get( lang_id, self._lang_handlers.get("default", DefaultHandler) diff --git a/plugins/code/ui/lsp_manager/scripts/CONFIG.sh b/plugins/code/language_server_clients/lsp_manager/scripts/CONFIG.sh similarity index 100% rename from plugins/code/ui/lsp_manager/scripts/CONFIG.sh rename to plugins/code/language_server_clients/lsp_manager/scripts/CONFIG.sh diff --git a/plugins/code/ui/lsp_manager/scripts/start.sh b/plugins/code/language_server_clients/lsp_manager/scripts/start.sh similarity index 100% rename from plugins/code/ui/lsp_manager/scripts/start.sh rename to plugins/code/language_server_clients/lsp_manager/scripts/start.sh diff --git a/plugins/code/ui/lsp_manager/scripts/stop.sh b/plugins/code/language_server_clients/lsp_manager/scripts/stop.sh similarity index 100% rename from plugins/code/ui/lsp_manager/scripts/stop.sh rename to plugins/code/language_server_clients/lsp_manager/scripts/stop.sh diff --git a/plugins/code/language_server_clients/python_lsp_client/__init__.py b/plugins/code/language_server_clients/python_lsp_client/__init__.py new file mode 100644 index 0000000..d36fa8c --- /dev/null +++ b/plugins/code/language_server_clients/python_lsp_client/__init__.py @@ -0,0 +1,3 @@ +""" + Pligin Module +""" diff --git a/plugins/code/language_server_clients/python_lsp_client/__main__.py b/plugins/code/language_server_clients/python_lsp_client/__main__.py new file mode 100644 index 0000000..a576329 --- /dev/null +++ b/plugins/code/language_server_clients/python_lsp_client/__main__.py @@ -0,0 +1,3 @@ +""" + Pligin Package +""" diff --git a/plugins/code/language_server_clients/python_lsp_client/config/lsp-server-config.json b/plugins/code/language_server_clients/python_lsp_client/config/lsp-server-config.json new file mode 100644 index 0000000..2aeb1cc --- /dev/null +++ b/plugins/code/language_server_clients/python_lsp_client/config/lsp-server-config.json @@ -0,0 +1,100 @@ +{ + "info": "https://github.com/python-lsp/python-lsp-server", + "command": "lsp-ws-proxy -- pylsp", + "alt-command": "pylsp", + "alt-command2": "lsp-ws-proxy --listen 4114 -- pylsp", + "alt-command3": "pylsp --ws --port 4114", + "socket": "ws://127.0.0.1:9999/python", + "socket-two": "ws://127.0.0.1:9999/?name=pylsp", + "initialization-options": { + "pylsp": { + "rope": { + "ropeFolder": "{user.home}/.config/newton/lsps/ropeproject" + }, + "plugins": { + "ruff": { + "enabled": true, + "extendSelect": ["I"], + "lineLength": 80 + }, + "pycodestyle": { + "enabled": false + }, + "pyflakes": { + "enabled": false + }, + "pylint": { + "enabled": true + }, + "mccabe": { + "enabled": false + }, + "pylsp_rope": { + "rename": false + }, + "rope_rename": { + "enabled": false + }, + "rope_autoimport": { + "enabled": true + }, + "rope_completion": { + "enabled": false, + "eager": false + }, + "jedi_rename": { + "enabled": true + }, + "jedi_completion": { + "enabled": true, + "include_class_objects": true, + "include_function_objects": true, + "fuzzy": false + }, + "jedi": { + "root_dir": "file://{workspace.folder}", + "extra_paths": [ + "{user.home}/Portable_Apps/py-venvs/pylsp-venv/venv/lib/python3.10/site-packages" + ] + } + } + } + } +}, +"python - jedi-language-server": { + "hidden": true, + "info": "https://pypi.org/project/jedi-language-server/", + "command": "jedi-language-server", + "alt-command": "lsp-ws-proxy --listen 3030 -- jedi-language-server", + "socket": "ws://127.0.0.1:9999/python", + "socket-two": "ws://127.0.0.1:9999/?name=jedi-language-server", + "initialization-options": { + "jediSettings": { + "autoImportModules": [], + "caseInsensitiveCompletion": true, + "debug": false + }, + "completion": { + "disableSnippets": false, + "resolveEagerly": false, + "ignorePatterns": [] + }, + "markupKindPreferred": "markdown", + "workspace": { + "extraPaths": [ + "{user.home}/Portable_Apps/py-venvs/pylsp-venv/venv/lib/python3.10/site-packages" + ], + "environmentPath": "{user.home}/Portable_Apps/py-venvs/gtk-apps-venv/venv/bin/python", + "symbols": { + "ignoreFolders": [ + ".nox", + ".tox", + ".venv", + "__pycache__", + "venv" + ], + "maxSymbols": 20 + } + } + } +} diff --git a/plugins/code/language_server_clients/python_lsp_client/manifest.json b/plugins/code/language_server_clients/python_lsp_client/manifest.json new file mode 100644 index 0000000..beccbb5 --- /dev/null +++ b/plugins/code/language_server_clients/python_lsp_client/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Python LSP Client", + "author": "ITDominator", + "version": "0.0.1", + "support": "", + "requests": {} +} diff --git a/plugins/code/language_server_clients/python_lsp_client/plugin.py b/plugins/code/language_server_clients/python_lsp_client/plugin.py new file mode 100644 index 0000000..a579da6 --- /dev/null +++ b/plugins/code/language_server_clients/python_lsp_client/plugin.py @@ -0,0 +1,37 @@ +# Python imports +from os import path + +# Lib imports +import gi + +from gi.repository import GLib + +# Application imports +from libs.event_factory import Event_Factory, Code_Event_Types + +from plugins.plugin_types import PluginCode + +from .response_handler import PythonHandler + + +class Plugin(PluginCode): + def __init__(self): + super(Plugin, self).__init__() + + + def _controller_message(self, event: Code_Event_Types.CodeEvent): + ... + + def load(self): + dirPth = path.dirname( path.realpath(__file__) ) + with open(f"{dirPth}/config/lsp-server-config.json", "r") as f: + config = f.read() + event = Event_Factory.create_event("register_lsp_client", + lang_id = "python", + lang_config = config, + handler = PythonHandler + ) + self.emit_to("lsp_manager", event) + + def run(self): + ... diff --git a/plugins/code/language_server_clients/python_lsp_client/response_handler/__init__.py b/plugins/code/language_server_clients/python_lsp_client/response_handler/__init__.py new file mode 100644 index 0000000..d5617e6 --- /dev/null +++ b/plugins/code/language_server_clients/python_lsp_client/response_handler/__init__.py @@ -0,0 +1 @@ +from .python import PythonHandler \ No newline at end of file diff --git a/plugins/code/ui/lsp_manager/response_handlers/python.py b/plugins/code/language_server_clients/python_lsp_client/response_handler/python.py similarity index 73% rename from plugins/code/ui/lsp_manager/response_handlers/python.py rename to plugins/code/language_server_clients/python_lsp_client/response_handler/python.py index 776b1af..949621e 100644 --- a/plugins/code/ui/lsp_manager/response_handlers/python.py +++ b/plugins/code/language_server_clients/python_lsp_client/response_handler/python.py @@ -3,7 +3,7 @@ # Lib imports # Application imports -from .default import DefaultHandler +from lsp_manager.response_handlers.default import DefaultHandler diff --git a/plugins/code/ui/lsp_manager/response_handlers/__init__.py b/plugins/code/ui/lsp_manager/response_handlers/__init__.py deleted file mode 100644 index c2946fb..0000000 --- a/plugins/code/ui/lsp_manager/response_handlers/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .base import BaseHandler -from .default import DefaultHandler -from .python import PythonHandler -from .java import JavaHandler -from .response_registry import ResponseRegistry diff --git a/src/libs/dto/code/events/__init__.py b/src/libs/dto/code/events/__init__.py index 96b0d7f..c473d0f 100644 --- a/src/libs/dto/code/events/__init__.py +++ b/src/libs/dto/code/events/__init__.py @@ -1,5 +1,5 @@ """ - Libs Code DTO(s) Code Package + Libs Code DTO(s) Events Package """ diff --git a/src/libs/event_factory.py b/src/libs/event_factory.py index b9d42bf..bff4464 100644 --- a/src/libs/event_factory.py +++ b/src/libs/event_factory.py @@ -23,6 +23,15 @@ class EventFactory(Singleton): def register_event(self, event_type: str, event_class: Type[BaseEvent]): self._event_classes[event_type] = event_class + def register_events(self, events: dict): + for name, obj in events: + if not self._is_valid_event_class(obj): continue + + event_type = self._class_name_to_event_type(name) + self.register_event(event_type, obj) + + logger.debug(f"Registered {len(events)} event types:") + def create_event(self, event_type: str, **kwargs) -> BaseEvent: if event_type not in self._event_classes: raise ValueError(f"Unknown event type: {event_type}") @@ -38,14 +47,9 @@ class EventFactory(Singleton): return event + def _auto_register_events(self, events: dict): - for name, obj in events: - if not self._is_valid_event_class(obj): continue - - event_type = self._class_name_to_event_type(name) - self.register_event(event_type, obj) - - logger.debug(f"Auto-registered {len(self._event_classes)} event types") + self.register_events(events) def _is_valid_event_class(self, obj) -> bool: return ( diff --git a/user_config/bin/ b/user_config/bin/ index c36f8a4..1be4569 100755 --- a/user_config/bin/ +++ b/user_config/bin/ @@ -6,6 +6,8 @@ # set -o errexit ## To exit on error # set -o errunset ## To exit if a variable is referenced but not set +export PYTHONDONTWRITEBYTECODE=1 + function main() { call_path=`pwd`