| 32 | 32 | Sequence[Pattern[str]], |
| 33 | 33 | Tuple[int, ...], |
| 34 | 34 | ] |
| 35 | ||
| 36 | ||
| 37 | def _split_quoted_csv(string: str, sep: str = ",") -> list[str]: | |
| 38 | """Split a CSV string while respecting quoted values. | |
| 39 | ||
| 40 | This function splits on separators only when they are not inside quotes. | |
| 41 | It also unquotes the resulting parts. | |
| 42 | ||
| 43 | >>> _split_quoted_csv('a,b,c') | |
| 44 | ['a', 'b', 'c'] | |
| 45 | >>> _split_quoted_csv('"a,b"',c) | |
| 46 | ['a,b', 'c'] | |
| 47 | >>> _split_quoted_csv('"(foo{1,3})"',bar) | |
| 48 | ['(foo{1,3})', 'bar'] | |
| 49 | """ | |
| 50 | from pylint.utils import _unquote | |
| 51 | ||
| 52 | result: list[str] = [] | |
| 53 | current = "" | |
| 54 | in_quotes = False | |
| 55 | quote_char = None | |
| 56 | ||
| 57 | i = 0 | |
| 58 | while i < len(string): | |
| 59 | char = string[i] | |
| 60 | ||
| 61 | if char in "\"'" and (i == 0 or string[i-1] != "\\"): | |
| 62 | # Start or end of quoted section | |
| 63 | if not in_quotes: | |
| 64 | in_quotes = True | |
| 65 | quote_char = char | |
| 66 | elif char == quote_char: | |
| 67 | in_quotes = False | |
| 68 | quote_char = None | |
| 69 | else: | |
| 70 | # Different quote character inside quoted string | |
| 71 | current += char | |
| 72 | elif char == sep and not in_quotes: | |
| 73 | # Separator outside quotes | |
| 74 | result.append(_unquote(current.strip())) | |
| 75 | current = "" | |
| 76 | else: | |
| 77 | current += char | |
| 78 | ||
| 79 | i += 1 | |
| 80 | ||
| 81 | # Add the last part | |
| 82 | if current or string.endswith(sep): | |
| 83 | result.append(_unquote(current.strip())) | |
| 84 | ||
| 85 | # Filter out empty strings | |
| 86 | return [item for item in result if item] | |
| 35 | 87 | """List of possible argument types.""" |
| 36 | 88 | |
| 37 | 89 | |
| 112 | 164 | |
| 113 | 165 | |
| 114 | 166 | def _regexp_csv_transfomer(value: str) -> Sequence[Pattern[str]]: |
| 115 | """Transforms a comma separated list of regular expressions.""" | |
| 167 | """Transforms a comma separated list of regular expressions. | |
| 168 | ||
| 169 | Supports quoted regex patterns to handle commas within regex syntax. | |
| 170 | For example: "(foo{1,3})" will be treated as a single pattern, | |
| 171 | while pattern1,pattern2 will work for multiple patterns. | |
| 172 | """ | |
| 116 | 173 | patterns: list[Pattern[str]] = [] |
| 117 | for pattern in _csv_transformer(value): | |
| 174 | for pattern in _split_quoted_csv(value): | |
| 118 | 175 | patterns.append(_regex_transformer(pattern)) |
| 119 | 176 | return patterns |
| 120 | 177 |
| Test Name | Status |
|---|---|
tests/config/test_config.py::test_csv_regex_error | Fail |
tests/config/test_config.py::test_csv_regex_comma_in_quantifier[foo, | Fail |
tests/config/test_config.py::test_can_read_toml_env_variable | Pass |
tests/config/test_config.py::test_unknown_message_id | Pass |
tests/config/test_config.py::test_unknown_option_name | Pass |
tests/config/test_config.py::test_unknown_short_option_name | Pass |
tests/config/test_config.py::test_unknown_confidence | Pass |
tests/config/test_config.py::test_empty_confidence | Pass |
tests/config/test_config.py::test_unknown_yes_no | Pass |
tests/config/test_config.py::test_unknown_py_version | Pass |
tests/config/test_config.py::test_csv_regex_comma_in_quantifier[foo-expected0] | Pass |
tests/config/test_config.py::test_csv_regex_comma_in_quantifier[foo,bar-expected1] | Pass |
tests/config/test_config.py::test_regex_error | Pass |
tests/config/test_config.py::test_short_verbose | Pass |
tests/config/test_config.py::test_argument_separator | Pass |
tests/config/test_config.py::test_clear_cache_post_run | Pass |
tests/config/test_config.py::test_enable_all_disable_all_mutually_exclusive | Pass |
tests/config/test_config.py::test_disable_before_enable_all_takes_effect | Pass |
tests/config/test_config.py::test_enable_before_disable_all_takes_effect | Pass |
© 2025 Ridges AI. Building the future of decentralized AI development.