summaryrefslogtreecommitdiff
path: root/pylint/config/arguments_manager.py
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2022-04-13 21:45:47 +0200
committerGitHub <noreply@github.com>2022-04-13 21:45:47 +0200
commit443802995bf0cf4921e51a5ef2f2807c22153fab (patch)
tree9743416df8a3dbe58903d9ce45960c3cb495ac7b /pylint/config/arguments_manager.py
parent00321dc4fe3af28541cd24bf8dd3017f7b074dbc (diff)
downloadpylint-git-443802995bf0cf4921e51a5ef2f2807c22153fab.tar.gz
Add a ``--generate-toml-config`` option (#6199)
Diffstat (limited to 'pylint/config/arguments_manager.py')
-rw-r--r--pylint/config/arguments_manager.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/pylint/config/arguments_manager.py b/pylint/config/arguments_manager.py
index 2bdd344b4..a4c865dfa 100644
--- a/pylint/config/arguments_manager.py
+++ b/pylint/config/arguments_manager.py
@@ -10,11 +10,15 @@ import configparser
import copy
import optparse # pylint: disable=deprecated-module
import os
+import re
import sys
+import textwrap
import warnings
from pathlib import Path
from typing import TYPE_CHECKING, Any, Dict, List, Optional, TextIO, Tuple, Union
+import tomlkit
+
from pylint import utils
from pylint.config.argument import (
_Argument,
@@ -595,3 +599,74 @@ class _ArgumentsManager:
def global_set_option(self, opt, value):
"""Set option on the correct option provider."""
self._all_options[opt].set_option(opt, value)
+
+ def _generate_config_file(self) -> None:
+ """Write a configuration file according to the current configuration into stdout."""
+ toml_doc = tomlkit.document()
+ pylint_tool_table = tomlkit.table(is_super_table=True)
+ toml_doc.add(tomlkit.key(["tool", "pylint"]), pylint_tool_table)
+
+ for group in sorted(
+ self._arg_parser._action_groups,
+ key=lambda x: (x.title != "Master", x.title),
+ ):
+ # Skip the options section with the --help option
+ if group.title == "options":
+ continue
+
+ # Skip sections without options such as "positional arguments"
+ if not group._group_actions:
+ continue
+
+ group_table = tomlkit.table()
+ for action in sorted(
+ group._group_actions, key=lambda x: x.option_strings[0][2:]
+ ):
+ optname = action.option_strings[0][2:]
+
+ # We skip old name options that don't have their own optdict
+ try:
+ optdict = self._option_dicts[optname]
+ except KeyError:
+ continue
+
+ if optdict.get("hide_from_config_file"):
+ continue
+
+ # Add help comment
+ help_msg = optdict.get("help", "")
+ assert isinstance(help_msg, str)
+ help_text = textwrap.wrap(help_msg, width=79)
+ for line in help_text:
+ group_table.add(tomlkit.comment(line))
+
+ # Get current value of option
+ value = getattr(self.namespace, optname.replace("-", "_"))
+
+ # Create a comment if the option has no value
+ if not value:
+ group_table.add(tomlkit.comment(f"{optname} ="))
+ group_table.add(tomlkit.nl())
+ continue
+
+ # Tomlkit doesn't support regular expressions
+ if isinstance(value, re.Pattern):
+ value = value.pattern
+ elif isinstance(value, (list, tuple)) and isinstance(
+ value[0], re.Pattern
+ ):
+ value = [i.pattern for i in value]
+
+ # Add to table
+ group_table.add(optname, value)
+ group_table.add(tomlkit.nl())
+
+ assert group.title
+ pylint_tool_table.add(group.title.lower(), group_table)
+
+ toml_string = tomlkit.dumps(toml_doc)
+
+ # Make sure the string we produce is valid toml and can be parsed
+ tomllib.loads(toml_string)
+
+ print(toml_string)