@@ -42,26 +42,26 @@ optional-dependencies.dev = [
4242 " check-manifest==0.51" ,
4343 " deptry==0.24.0" ,
4444 " doc8==2.0.0" ,
45- " doccmd==2026.1.28 " ,
45+ " doccmd==2026.1.31.3 " ,
4646 " freezegun==1.5.5" ,
4747 " furo==2025.12.19" ,
4848 " interrogate==1.7.0" ,
4949 " mypy[faster-cache]==1.19.1" ,
5050 " mypy-strict-kwargs==2026.1.12" ,
51- " prek==0.3.0 " ,
51+ " prek==0.3.2 " ,
5252 " pydocstringformatter==0.7.5" ,
5353 " pydocstyle==6.3" ,
5454 " pygments==2.19.2" ,
5555 " pylint[spelling]==4.0.4" ,
5656 " pylint-per-file-ignores==3.2.0" ,
57- " pyproject-fmt==2.11.1 " ,
58- " pyrefly==0.50.1 " ,
57+ " pyproject-fmt==2.16.0 " ,
58+ " pyrefly==0.52.0 " ,
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" ,
64- " ruff==0.14.14 " ,
64+ " ruff==0.15.1 " ,
6565 # We add shellcheck-py not only for shell scripts and shell code blocks,
6666 # but also because having it installed means that ``actionlint-py`` will
6767 # use it to lint shell commands in GitHub workflow files.
@@ -74,7 +74,7 @@ optional-dependencies.dev = [
7474 " sphinx-substitution-extensions==2026.1.12" ,
7575 " sphinxcontrib-spelling==8.0.2" ,
7676 " sybil==9.3.0" ,
77- " ty==0.0.14 " ,
77+ " ty==0.0.16 " ,
7878 " types-requests==2.32.4.20260107" ,
7979 " vulture==2.14" ,
8080 " vws-python-mock==2026.2.15" ,
@@ -88,22 +88,17 @@ urls.Source = "https://github.com/VWS-Python/vws-python"
8888
8989[tool .setuptools ]
9090zip-safe = false
91-
92- [tool .setuptools .packages .find ]
93- where = [
94- " src" ,
95- ]
96-
97- [tool .setuptools .package-data ]
98- vws = [
91+ package-data.vws = [
9992 " py.typed" ,
10093]
94+ packages.find.where = [
95+ " src" ,
96+ ]
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,7 +108,6 @@ version_scheme = "post-release"
113108
114109[tool .ruff ]
115110line-length = 79
116-
117111lint.select = [
118112 " ALL" ,
119113]
@@ -126,26 +120,22 @@ lint.ignore = [
126120 " D212" ,
127121 # Ruff warns that this conflicts with the formatter.
128122 " ISC001" ,
129- # Ignore " too-many-*" errors as they seem to get in the way more than
123+ # Ignore ' too-many-*' errors as they seem to get in the way more than
130124 # helping.
131125 " PLR0913" ,
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,15 +145,13 @@ lint.unfixable = [
155145lint.pydocstyle.convention = " google"
156146
157147[tool .pylint ]
158-
159- [ tool . pylint . 'MASTER' ]
160-
148+ # Allow the body of an if to be on the same line as the test if there is no
149+ # else.
150+ "FORMAT".single-line-if-stmt = false
161151# Pickle collected data for later comparisons.
162- persistent = true
163-
152+ "MASTER".persistent = true
164153# Use multiple processes to speed up Pylint.
165- jobs = 0
166-
154+ "MASTER".jobs = 0
167155# List of plugins (as comma separated values of python modules names) to load,
168156# usually to register additional checkers.
169157# See https://chezsoi.org/lucas/blog/pylint-strict-base-configuration.html.
@@ -173,44 +161,39 @@ jobs = 0
173161# - pylint.extensions.magic_value
174162# - pylint.extensions.while_used
175163# as they seemed to get in the way.
176- load-plugins = [
164+ "MASTER". load-plugins = [
177165 " pylint_per_file_ignores" ,
178- ' pylint.extensions.bad_builtin' ,
179- ' pylint.extensions.comparison_placement' ,
180- ' pylint.extensions.consider_refactoring_into_while_condition' ,
181- ' pylint.extensions.docparams' ,
182- ' pylint.extensions.dunder' ,
183- ' pylint.extensions.eq_without_hash' ,
184- ' pylint.extensions.for_any_all' ,
185- ' pylint.extensions.mccabe' ,
186- ' pylint.extensions.no_self_use' ,
187- ' pylint.extensions.overlapping_exceptions' ,
188- ' pylint.extensions.private_import' ,
189- ' pylint.extensions.redefined_loop_name' ,
190- ' pylint.extensions.redefined_variable_type' ,
191- ' pylint.extensions.set_membership' ,
192- ' 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" ,
193181]
194-
195182# Allow loading of arbitrary C extensions. Extensions are imported into the
196183# active Python interpreter and may run arbitrary code.
197- unsafe-load-any-extension = false
198-
199- [tool .pylint .'MESSAGES CONTROL' ]
200-
184+ "MASTER".unsafe-load-any-extension = false
201185# Enable the message, report, category or checker with the given id(s). You can
202186# either give multiple identifier separated by comma (,) or put this option
203187# multiple time (only on the command line, not in the configuration file where
204188# it should appear only once). See also the "--disable" option for examples.
205- enable = [
206- ' bad-inline-option' ,
207- ' deprecated-pragma' ,
208- ' file-ignored' ,
209- ' spelling' ,
210- ' use-symbolic-message-instead' ,
211- ' 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" ,
212196]
213-
214197# Disable the message, report, category or checker with the given id(s). You
215198# can either give multiple identifiers separated by comma (,) or put this
216199# option multiple times (only on the command line, not in the configuration
@@ -220,63 +203,49 @@ enable = [
220203# --enable=similarities". If you want to run only the classes checker, but have
221204# no Warning level messages displayed, use"--disable=all --enable=classes
222205# --disable=W"
223-
224- disable = [
225- ' too-few-public-methods' ,
226- ' too-many-locals' ,
227- ' too-many-arguments' ,
228- ' too-many-instance-attributes' ,
229- ' too-many-return-statements' ,
230- ' too-many-lines' ,
231- ' 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" ,
232214 # Let ruff handle long lines
233- ' line-too-long' ,
215+ " line-too-long" ,
234216 # Let ruff handle unused imports
235- ' unused-import' ,
217+ " unused-import" ,
236218 # Let ruff deal with sorting
237- ' ungrouped-imports' ,
219+ " ungrouped-imports" ,
238220 # We don't need everything to be documented because of mypy
239- ' missing-type-doc' ,
240- ' missing-return-type-doc' ,
221+ " missing-type-doc" ,
222+ " missing-return-type-doc" ,
241223 # Too difficult to please
242- ' duplicate-code' ,
224+ " duplicate-code" ,
243225 # Let ruff handle imports
244- ' wrong-import-order' ,
226+ " wrong-import-order" ,
245227 # mypy does not want untyped parameters.
246- ' useless-type-doc' ,
228+ " useless-type-doc" ,
247229]
248-
249230# We ignore invalid names because:
250231# - We want to use generated module names, which may not be valid, but are never seen.
251232# - We want to use global variables in documentation, which may not be uppercase.
252233# - conf.py is a Sphinx configuration file which requires lowercase global variable names.
253- per-file-ignores = [
234+ "MESSAGES CONTROL". per-file-ignores = [
254235 " docs/source/conf.py:invalid-name" ,
255236 " docs/source/doccmd_*.py:invalid-name" ,
256237 " doccmd_README_rst_*.py:invalid-name" ,
257238]
258-
259- [tool .pylint .'FORMAT' ]
260-
261- # Allow the body of an if to be on the same line as the test if there is no
262- # else.
263- single-line-if-stmt = false
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
321-
322- [tool .coverage .run ]
286+ [tool .pytest ]
287+ ini_options.xfail_strict = true
288+ ini_options.log_cli = true
323289
324- branch = true
325-
326- [tool .coverage .report ]
327- exclude_also = [
290+ [tool .coverage ]
291+ run.branch = true
292+ report.exclude_also = [
328293 " if TYPE_CHECKING:" ,
329294]
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