@@ -54,18 +54,14 @@ optional-dependencies.dev = [
5454 " pygments==2.19.2" ,
5555 " pylint[spelling]==4.0.4" ,
5656 " pylint-per-file-ignores==3.2.0" ,
57- " pyproject-fmt==2.12.1 " ,
57+ " pyproject-fmt==2.14.0 " ,
5858 " pyrefly==0.51.1" ,
5959 " pyright==1.1.408" ,
6060 " pyroma==5.0.1" ,
6161 " pytest==9.0.2" ,
6262 " pytest-cov==7.0.0" ,
6363 " pyyaml==6.0.3" ,
6464 " ruff==0.15.0" ,
65- # We add shellcheck-py not only for shell scripts and shell code blocks,
66- # but also because having it installed means that ``actionlint-py`` will
67- # use it to lint shell commands in GitHub workflow files.
68- " shellcheck-py==0.11.0.1" ,
6965 " shfmt-py==3.12.0.2" ,
7066 " sphinx==9.1.0" ,
7167 " sphinx-copybutton==0.5.2" ,
@@ -79,6 +75,10 @@ optional-dependencies.dev = [
7975 " vulture==2.14" ,
8076 " vws-python-mock==2025.3.10.1" ,
8177 " vws-test-fixtures==2023.3.5" ,
78+ # We add shellcheck-py not only for shell scripts and shell code blocks,
79+ # but also because having it installed means that ``actionlint-py`` will
80+ # use it to lint shell commands in GitHub workflow files.
81+ " shellcheck-py==0.11.0.1" ,
8282 " yamlfix==1.19.1" ,
8383 " zizmor==1.22.0" ,
8484]
@@ -88,22 +88,17 @@ urls.Source = "https://github.com/VWS-Python/vws-python"
8888
8989[tool .setuptools ]
9090zip-safe = false
91-
92- [tool .setuptools .package-data ]
93- vws = [
91+ package-data.vws = [
9492 " py.typed" ,
9593]
96-
97- [tool .setuptools .packages .find ]
98- where = [
94+ packages.find.where = [
9995 " src" ,
10096]
10197
102- [tool .distutils . bdist_wheel ]
103- universal = true
98+ [tool .distutils ]
99+ bdist_wheel. universal = true
104100
105101[tool .setuptools_scm ]
106-
107102# This keeps the start of the version the same as the last release.
108103# This is useful for our documentation to include e.g. binary links
109104# to the latest released binary.
@@ -113,39 +108,34 @@ version_scheme = "post-release"
113108
114109[tool .ruff ]
115110line-length = 79
116-
117111lint.select = [
118112 " ALL" ,
119113]
120114lint.ignore = [
121- # Ruff warns that this conflicts with the formatter.
122- " COM812" ,
123115 # Allow our chosen docstring line-style - pydocstringformatter handles formatting
124116 # but doesn't enforce D205 (blank line after summary) or D212 (summary on first line).
125117 " D205" ,
126- " D212" ,
127- # Ruff warns that this conflicts with the formatter.
128- " ISC001" ,
129- # Ignore "too-many-*" errors as they seem to get in the way more than
118+ # Ignore 'too-many-*' errors as they seem to get in the way more than
130119 # helping.
131120 " PLR0913" ,
121+ # Ruff warns that this conflicts with the formatter.
122+ " COM812" ,
123+ # Ruff warns that this conflicts with the formatter.
124+ " ISC001" ,
125+ " D212" ,
132126]
133-
134127lint.per-file-ignores."doccmd_*.py" = [
135128 # Allow asserts in docs.
136129 " S101" ,
137130]
138-
139131lint.per-file-ignores."docs/source/*.py" = [
140132 # Allow asserts in docs.
141133 " S101" ,
142134]
143-
144135lint.per-file-ignores."tests/*.py" = [
145136 # Allow asserts in tests.
146137 " S101" ,
147138]
148-
149139# Do not automatically remove commented out code.
150140# We comment out code during development, and with VSCode auto-save, this code
151141# is sometimes annoyingly removed.
@@ -155,21 +145,13 @@ lint.unfixable = [
155145lint.pydocstyle.convention = " google"
156146
157147[tool .pylint ]
158-
159- [tool .pylint .'FORMAT' ]
160-
161148# Allow the body of an if to be on the same line as the test if there is no
162149# else.
163- single-line-if-stmt = false
164-
165- [tool .pylint .'MASTER' ]
166-
150+ "FORMAT".single-line-if-stmt = false
167151# Pickle collected data for later comparisons.
168- persistent = true
169-
152+ "MASTER".persistent = true
170153# Use multiple processes to speed up Pylint.
171- jobs = 0
172-
154+ "MASTER".jobs = 0
173155# List of plugins (as comma separated values of python modules names) to load,
174156# usually to register additional checkers.
175157# See https://chezsoi.org/lucas/blog/pylint-strict-base-configuration.html.
@@ -179,44 +161,39 @@ jobs = 0
179161# - pylint.extensions.magic_value
180162# - pylint.extensions.while_used
181163# as they seemed to get in the way.
182- load-plugins = [
164+ "MASTER". load-plugins = [
183165 " pylint_per_file_ignores" ,
184- ' pylint.extensions.bad_builtin' ,
185- ' pylint.extensions.comparison_placement' ,
186- ' pylint.extensions.consider_refactoring_into_while_condition' ,
187- ' pylint.extensions.docparams' ,
188- ' pylint.extensions.dunder' ,
189- ' pylint.extensions.eq_without_hash' ,
190- ' pylint.extensions.for_any_all' ,
191- ' pylint.extensions.mccabe' ,
192- ' pylint.extensions.no_self_use' ,
193- ' pylint.extensions.overlapping_exceptions' ,
194- ' pylint.extensions.private_import' ,
195- ' pylint.extensions.redefined_loop_name' ,
196- ' pylint.extensions.redefined_variable_type' ,
197- ' pylint.extensions.set_membership' ,
198- ' pylint.extensions.typing' ,
166+ " pylint.extensions.bad_builtin" ,
167+ " pylint.extensions.comparison_placement" ,
168+ " pylint.extensions.consider_refactoring_into_while_condition" ,
169+ " pylint.extensions.docparams" ,
170+ " pylint.extensions.dunder" ,
171+ " pylint.extensions.eq_without_hash" ,
172+ " pylint.extensions.for_any_all" ,
173+ " pylint.extensions.mccabe" ,
174+ " pylint.extensions.no_self_use" ,
175+ " pylint.extensions.overlapping_exceptions" ,
176+ " pylint.extensions.private_import" ,
177+ " pylint.extensions.redefined_loop_name" ,
178+ " pylint.extensions.redefined_variable_type" ,
179+ " pylint.extensions.set_membership" ,
180+ " pylint.extensions.typing" ,
199181]
200-
201182# Allow loading of arbitrary C extensions. Extensions are imported into the
202183# active Python interpreter and may run arbitrary code.
203- unsafe-load-any-extension = false
204-
205- [tool .pylint .'MESSAGES CONTROL' ]
206-
184+ "MASTER".unsafe-load-any-extension = false
207185# Enable the message, report, category or checker with the given id(s). You can
208186# either give multiple identifier separated by comma (,) or put this option
209187# multiple time (only on the command line, not in the configuration file where
210188# it should appear only once). See also the "--disable" option for examples.
211- enable = [
212- ' bad-inline-option' ,
213- ' deprecated-pragma' ,
214- ' file-ignored' ,
215- ' spelling' ,
216- ' use-symbolic-message-instead' ,
217- ' useless-suppression' ,
189+ "MESSAGES CONTROL". enable = [
190+ " bad-inline-option" ,
191+ " deprecated-pragma" ,
192+ " file-ignored" ,
193+ " spelling" ,
194+ " use-symbolic-message-instead" ,
195+ " useless-suppression" ,
218196]
219-
220197# Disable the message, report, category or checker with the given id(s). You
221198# can either give multiple identifiers separated by comma (,) or put this
222199# option multiple times (only on the command line, not in the configuration
@@ -226,57 +203,49 @@ enable = [
226203# --enable=similarities". If you want to run only the classes checker, but have
227204# no Warning level messages displayed, use"--disable=all --enable=classes
228205# --disable=W"
229-
230- disable = [
231- ' too-few-public-methods' ,
232- ' too-many-locals' ,
233- ' too-many-arguments' ,
234- ' too-many-instance-attributes' ,
235- ' too-many-return-statements' ,
236- ' too-many-lines' ,
237- ' locally-disabled' ,
206+ "MESSAGES CONTROL".disable = [
207+ " too-few-public-methods" ,
208+ " too-many-locals" ,
209+ " too-many-arguments" ,
210+ " too-many-instance-attributes" ,
211+ " too-many-return-statements" ,
212+ " too-many-lines" ,
213+ " locally-disabled" ,
238214 # Let ruff handle long lines
239- ' line-too-long' ,
215+ " line-too-long" ,
240216 # Let ruff handle unused imports
241- ' unused-import' ,
217+ " unused-import" ,
242218 # Let ruff deal with sorting
243- ' ungrouped-imports' ,
219+ " ungrouped-imports" ,
244220 # We don't need everything to be documented because of mypy
245- ' missing-type-doc' ,
246- ' missing-return-type-doc' ,
221+ " missing-type-doc" ,
222+ " missing-return-type-doc" ,
247223 # Too difficult to please
248- ' duplicate-code' ,
224+ " duplicate-code" ,
249225 # Let ruff handle imports
250- ' wrong-import-order' ,
226+ " wrong-import-order" ,
251227 # mypy does not want untyped parameters.
252- ' useless-type-doc' ,
228+ " useless-type-doc" ,
253229]
254-
255230# We ignore invalid names because:
256231# - We want to use generated module names, which may not be valid, but are never seen.
257232# - We want to use global variables in documentation, which may not be uppercase.
258233# - conf.py is a Sphinx configuration file which requires lowercase global variable names.
259- per-file-ignores = [
234+ "MESSAGES CONTROL". per-file-ignores = [
260235 " docs/source/conf.py:invalid-name" ,
261236 " docs/source/doccmd_*.py:invalid-name" ,
262237 " doccmd_README_rst_*.py:invalid-name" ,
263238]
264-
265- [tool .pylint .'SPELLING' ]
266-
267239# Spelling dictionary name. Available dictionaries: none. To make it working
268240# install python-enchant package.
269- spelling-dict = ' en_US'
270-
241+ "SPELLING".spelling-dict = " en_US"
271242# A path to a file that contains private dictionary; one word per line.
272- spelling-private-dict-file = ' spelling_private_dict.txt'
273-
243+ "SPELLING".spelling-private-dict-file = " spelling_private_dict.txt"
274244# Tells whether to store unknown words to indicated private dictionary in
275245# --spelling-private-dict-file option instead of raising a message.
276- spelling-store-unknown-words = ' no '
246+ "SPELLING". spelling-store-unknown-words = " no "
277247
278248[tool .check-manifest ]
279-
280249ignore = [
281250 " .checkmake-config.ini" ,
282251 " .prettierrc" ,
@@ -314,22 +283,17 @@ indent = 4
314283keep_full_version = true
315284max_supported_python = " 3.14"
316285
317- [tool .pytest .ini_options ]
318-
319- xfail_strict = true
320- log_cli = true
286+ [tool .pytest ]
287+ ini_options.xfail_strict = true
288+ ini_options.log_cli = true
321289
322- [tool .coverage . report ]
323- exclude_also = [
290+ [tool .coverage ]
291+ report. exclude_also = [
324292 " if TYPE_CHECKING:" ,
325293]
326-
327- [tool .coverage .run ]
328-
329- branch = true
294+ run.branch = true
330295
331296[tool .mypy ]
332-
333297strict = true
334298files = [ " ." ]
335299exclude = [ " build" ]
@@ -339,7 +303,6 @@ plugins = [
339303]
340304
341305[tool .pyright ]
342-
343306enableTypeIgnoreComments = false
344307reportUnnecessaryTypeIgnoreComment = true
345308typeCheckingMode = " strict"
@@ -359,7 +322,6 @@ omit-covered-files = true
359322verbose = 2
360323
361324[tool .doc8 ]
362-
363325max_line_length = 2000
364326ignore_path = [
365327 " ./.eggs" ,
@@ -408,7 +370,6 @@ ignore_names = [
408370 " templates_path" ,
409371 " warning_is_error" ,
410372]
411-
412373# Duplicate some of .gitignore
413374exclude = [ " .venv" ]
414375
0 commit comments