From f885f0794e77e0a6e8e0bd884dd4ec57890a5ddf Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Mon, 4 Jan 2021 23:06:29 +0100 Subject: Extract CLI parameters from ghdl-ls. --- doc/LSP-AutoProgram.py | 35 +++++++++++++++++++++++++++++++++++ doc/using/pyGHDL/index.rst | 25 ++++++++++++++++++++++++- pyGHDL/cli/lsp.py | 43 +++++++++++++++++++++++++++++-------------- setup.py | 1 + 4 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 doc/LSP-AutoProgram.py diff --git a/doc/LSP-AutoProgram.py b/doc/LSP-AutoProgram.py new file mode 100644 index 000000000..4acca7923 --- /dev/null +++ b/doc/LSP-AutoProgram.py @@ -0,0 +1,35 @@ +# ============================================================================= +# Authors: Patrick Lehmann +# +# Package module: Stub module to extract argparse definitions. +# +# License: +# ============================================================================ +# Copyright (C) 2019-2021 Tristan Gingold +# +# GHDL is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with GHDL; see the file COPYING. If not, write to the Free +# Software Foundation, 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ============================================================================ +# +from sys import path as sys_path + +sys_path.append("..") + +from pyGHDL.cli.lsp import _generateCLIParser + +# entry point +parser = _generateCLIParser() diff --git a/doc/using/pyGHDL/index.rst b/doc/using/pyGHDL/index.rst index fcedb20d2..ed055957a 100644 --- a/doc/using/pyGHDL/index.rst +++ b/doc/using/pyGHDL/index.rst @@ -39,9 +39,32 @@ this is provided from a ``pyGHDL`` packages with four sub-packages: .. toctree:: - :hidden: ../../pyGHDL/pyGHDL.cli ../../pyGHDL/pyGHDL.dom ../../pyGHDL/pyGHDL.libghdl ../../pyGHDL/pyGHDL.lsp + + +.. _CMDREF: + +Scripts and Applications +######################## + +The pyVHDLParser package comes with an executables registered by pip in the +search path. + +* ``VHDLParser`` is a wrapper for ``pyVHDLParser.CLI.VHDLParser:main``. + + +.. # + This files requires a Python module called 'Frontend-AutoProgram' to be + located in the 'doc' root folder. It expects a variable 'parser' of type + ArgumentParser. + +.. _CMDREF-ghdlls: + +.. autoprogram:: LSP-AutoProgram:parser + :prog: ghdl-ls + :groups: + :label: CmdRef:ghdlls: diff --git a/pyGHDL/cli/lsp.py b/pyGHDL/cli/lsp.py index dd1e9d5f5..3245bbfa2 100644 --- a/pyGHDL/cli/lsp.py +++ b/pyGHDL/cli/lsp.py @@ -35,21 +35,24 @@ # from __future__ import absolute_import -import argparse -import logging +from argparse import ArgumentParser +from logging import getLogger, DEBUG, INFO, ERROR, basicConfig import sys import os +from pydecor import export + import pyGHDL.libghdl as libghdl from pyGHDL.libghdl import version, errorout_console from pyGHDL.lsp import LSPConnTrace from pyGHDL.lsp.lsp import LSPConn, LanguageProtocolServer from pyGHDL.lsp.vhdl_ls import VhdlLanguageServer -logger = logging.getLogger("ghdl-ls") +__loggerName = "ghdl-ls" -def rotate_log_files(basename, num): +def __rotate_log_files(basename: str, num: int): + """Rotate existing log files.""" for i in range(num, 0, -1): oldfile = "{}.{}".format(basename, i - 1) if os.path.isfile(oldfile): @@ -58,8 +61,9 @@ def rotate_log_files(basename, num): os.rename(basename, "{}.0".format(basename)) -def main(): - parser = argparse.ArgumentParser(description="VHDL Language Protocol Server") +def _generateCLIParser() -> ArgumentParser: + """Creates an CLI argument parser based on ``argparse``.""" + parser = ArgumentParser(description="VHDL Language Protocol Server") parser.add_argument( "--version", "-V", action="version", version="%(prog)s " + version.__version__ ) @@ -69,7 +73,7 @@ def main(): parser.add_argument( "--log-file", help="Redirect logs to the given file instead of stderr" ) - parser.add_argument("--trace-file", help="Save rpc data to FILE.in and FILE.out (overrides GHDL_LS_TRACE)") + parser.add_argument("--trace-file", help="Save RPC data to FILE.in and FILE.out (overrides :env:`GHDL_LS_TRACE`)") parser.add_argument("--input", "-i", help="Read request from file") parser.add_argument( "--disp-config", @@ -77,6 +81,15 @@ def main(): help="Disp installation configuration and exit", ) + return parser + + +@export +def main(): + """Entrypoint of GHDL's Language Protocol Server.""" + logger = getLogger(__loggerName) + + parser = _generateCLIParser() args = parser.parse_args() if args.disp_config: @@ -86,18 +99,19 @@ def main(): # Setup logging if args.verbose >= 2: - loglevel = logging.DEBUG + loglevel = DEBUG elif args.verbose >= 1: - loglevel = logging.INFO + loglevel = INFO else: - loglevel = logging.ERROR + loglevel = ERROR if args.log_file: - rotate_log_files(args.log_file, 5) + __rotate_log_files(args.log_file, 5) logstream = open(args.log_file, "w") else: logstream = sys.stderr - logging.basicConfig( + + basicConfig( format="%(asctime)-15s [%(levelname)s] %(message)s", stream=logstream, level=loglevel, @@ -122,8 +136,8 @@ def main(): trace_file = os.environ.get("GHDL_LS_TRACE") if trace_file is not None: if args.input is None: - rotate_log_files(trace_file + ".in", 5) - rotate_log_files(trace_file + ".out", 5) + __rotate_log_files(trace_file + ".in", 5) + __rotate_log_files(trace_file + ".out", 5) conn = LSPConnTrace(trace_file, conn) else: logger.info("Traces disabled when -i/--input") @@ -137,5 +151,6 @@ def main(): logger.exception("Uncaught error") sys.exit(1) + if __name__ == '__main__': main() diff --git a/setup.py b/setup.py index c5b24c65b..6a00e3637 100644 --- a/setup.py +++ b/setup.py @@ -105,6 +105,7 @@ setuptools_setup( "Operating System :: Microsoft :: Windows :: Windows 10", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", -- cgit v1.2.3