aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Lehmann <Patrick.Lehmann@plc2.de>2021-01-04 23:06:29 +0100
committertgingold <tgingold@users.noreply.github.com>2021-01-05 18:50:44 +0100
commitf885f0794e77e0a6e8e0bd884dd4ec57890a5ddf (patch)
tree70e4430e3b7769b194992dd46bc90d275a8e5b4c
parent22f1fbdd25b7927dc1aa235ee047cc698590f026 (diff)
downloadghdl-f885f0794e77e0a6e8e0bd884dd4ec57890a5ddf.tar.gz
ghdl-f885f0794e77e0a6e8e0bd884dd4ec57890a5ddf.tar.bz2
ghdl-f885f0794e77e0a6e8e0bd884dd4ec57890a5ddf.zip
Extract CLI parameters from ghdl-ls.
-rw-r--r--doc/LSP-AutoProgram.py35
-rw-r--r--doc/using/pyGHDL/index.rst25
-rw-r--r--pyGHDL/cli/lsp.py43
-rw-r--r--setup.py1
4 files changed, 89 insertions, 15 deletions
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",