wlc 2.2.0__tar.gz → 3.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. wlc-2.2.0/CHANGES.rst → wlc-3.0.0/CHANGES.md +81 -84
  2. {wlc-2.2.0 → wlc-3.0.0}/MANIFEST.in +1 -1
  3. {wlc-2.2.0 → wlc-3.0.0}/PKG-INFO +19 -11
  4. {wlc-2.2.0 → wlc-3.0.0}/README.md +13 -8
  5. {wlc-2.2.0 → wlc-3.0.0}/THREAT_MODEL.md +8 -6
  6. {wlc-2.2.0 → wlc-3.0.0}/pyproject.toml +31 -50
  7. {wlc-2.2.0 → wlc-3.0.0}/tests/test_base.py +71 -43
  8. wlc-3.0.0/tests/test_category.py +191 -0
  9. wlc-3.0.0/tests/test_client.py +255 -0
  10. {wlc-2.2.0 → wlc-3.0.0}/tests/test_config.py +99 -22
  11. {wlc-2.2.0 → wlc-3.0.0}/tests/test_download.py +151 -12
  12. {wlc-2.2.0 → wlc-3.0.0}/tests/test_errors.py +64 -9
  13. {wlc-2.2.0 → wlc-3.0.0}/tests/test_insecure_http.py +1 -1
  14. {wlc-2.2.0 → wlc-3.0.0}/tests/test_insecure_ssl.py +4 -4
  15. wlc-3.0.0/tests/test_lazy_object.py +287 -0
  16. {wlc-2.2.0 → wlc-3.0.0}/tests/test_main.py +174 -398
  17. wlc-3.0.0/tests/test_output.py +345 -0
  18. wlc-3.0.0/tests/test_signatures.py +100 -0
  19. {wlc-2.2.0 → wlc-3.0.0}/tests/test_urls.py +13 -2
  20. {wlc-2.2.0 → wlc-3.0.0}/tests/test_utils.py +6 -5
  21. {wlc-2.2.0 → wlc-3.0.0}/tests/test_wlc.py +167 -334
  22. wlc-3.0.0/wlc/base.py +260 -0
  23. {wlc-2.2.0 → wlc-3.0.0}/wlc/client.py +116 -59
  24. {wlc-2.2.0 → wlc-3.0.0}/wlc/config.py +39 -46
  25. {wlc-2.2.0 → wlc-3.0.0}/wlc/const.py +1 -1
  26. {wlc-2.2.0 → wlc-3.0.0}/wlc/exceptions.py +4 -2
  27. {wlc-2.2.0 → wlc-3.0.0}/wlc/http_debug.py +8 -7
  28. {wlc-2.2.0 → wlc-3.0.0}/wlc/main.py +134 -88
  29. {wlc-2.2.0 → wlc-3.0.0}/wlc/models.py +93 -53
  30. {wlc-2.2.0 → wlc-3.0.0}/wlc/output.py +6 -1
  31. {wlc-2.2.0 → wlc-3.0.0}/wlc.egg-info/PKG-INFO +19 -11
  32. {wlc-2.2.0 → wlc-3.0.0}/wlc.egg-info/SOURCES.txt +6 -1
  33. wlc-3.0.0/wlc.egg-info/requires.txt +7 -0
  34. wlc-2.2.0/wlc/base.py +0 -198
  35. wlc-2.2.0/wlc.egg-info/requires.txt +0 -5
  36. {wlc-2.2.0 → wlc-3.0.0}/LICENSE +0 -0
  37. {wlc-2.2.0 → wlc-3.0.0}/LICENSES/CC0-1.0.txt +0 -0
  38. {wlc-2.2.0 → wlc-3.0.0}/LICENSES/GPL-3.0-or-later.txt +0 -0
  39. {wlc-2.2.0 → wlc-3.0.0}/SECURITY.md +0 -0
  40. {wlc-2.2.0 → wlc-3.0.0}/completion/wlc +0 -0
  41. {wlc-2.2.0 → wlc-3.0.0}/setup.cfg +0 -0
  42. {wlc-2.2.0 → wlc-3.0.0}/tests/__init__.py +0 -0
  43. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/.weblate +0 -0
  44. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/categories +0 -0
  45. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/categories-1 +0 -0
  46. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/changes +0 -0
  47. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components +0 -0
  48. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-android +0 -0
  49. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-android-file +0 -0
  50. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-android-file--GET--format=zip +0 -0
  51. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-olderweblate +0 -0
  52. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate +0 -0
  53. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate--DELETE-- +0 -0
  54. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate--PATCH--priority=80 +0 -0
  55. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-changes +0 -0
  56. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-file +0 -0
  57. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-file--GET--format=zip +0 -0
  58. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-lock +0 -0
  59. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-lock--POST--lock=0 +0 -0
  60. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-lock--POST--lock=1 +0 -0
  61. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-lock--POST--lock=false +0 -0
  62. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-lock--POST--lock=true +0 -0
  63. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-repository +0 -0
  64. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-repository--POST--operation=cleanup +0 -0
  65. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-repository--POST--operation=commit +0 -0
  66. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-repository--POST--operation=pull +0 -0
  67. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-repository--POST--operation=push +0 -0
  68. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-repository--POST--operation=reset +0 -0
  69. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-statistics +0 -0
  70. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-statistics--GET--page=2 +0 -0
  71. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-statistics--GET--page=3 +0 -0
  72. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-translations +0 -0
  73. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-translations--GET--page=2 +0 -0
  74. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/components-hello-weblate-translations--POST--language_code=nl_BE +0 -0
  75. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/languages +0 -0
  76. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/languages--GET--page=2 +0 -0
  77. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/languages--GET--page=3 +0 -0
  78. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/languages--POST--code=tst--name=Test-Language--direction=rtl--plural=number=2--formula=n-!=-1 +0 -0
  79. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects +0 -0
  80. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects--POST--name=Hello--slug=hello--web=http---example.com---source_language=name=Malayalam--code=ml +0 -0
  81. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects--POST--name=denied_json--slug=denide_json--web=http---some-weblate-app.com- +0 -0
  82. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-acl +0 -0
  83. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-empty +0 -0
  84. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-empty-components +0 -0
  85. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello +0 -0
  86. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello--DELETE-- +0 -0
  87. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-categories +0 -0
  88. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-changes +0 -0
  89. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-components +0 -0
  90. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-components--POST--3fcd0ab4 +0 -0
  91. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-components--POST--c9c26539 +0 -0
  92. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-languages +0 -0
  93. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-repository +0 -0
  94. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-repository--POST--operation=cleanup +0 -0
  95. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-repository--POST--operation=commit +0 -0
  96. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-repository--POST--operation=pull +0 -0
  97. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-repository--POST--operation=push +0 -0
  98. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-repository--POST--operation=reset +0 -0
  99. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-hello-statistics +0 -0
  100. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/projects-invalid +0 -0
  101. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations +0 -0
  102. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations--GET--page=2 +0 -0
  103. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations--GET--page=3 +0 -0
  104. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-android-en-units +0 -0
  105. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-android-en-units--POST--key=test-monolingual--value=-test-me- +0 -0
  106. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs +0 -0
  107. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs--DELETE-- +0 -0
  108. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-changes +0 -0
  109. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file +0 -0
  110. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file--GET--format=csv +0 -0
  111. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file--POST--3748506a +0 -0
  112. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file--POST--5c6a101f +0 -0
  113. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file--POST--85762547 +0 -0
  114. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file--POST--90a4957d +0 -0
  115. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file--POST--f8672b4c +0 -0
  116. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-file--POST--fe040a0c +0 -0
  117. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-repository +0 -0
  118. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-repository--POST--operation=cleanup +0 -0
  119. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-repository--POST--operation=commit +0 -0
  120. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-repository--POST--operation=pull +0 -0
  121. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-repository--POST--operation=push +0 -0
  122. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-repository--POST--operation=reset +0 -0
  123. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-statistics +0 -0
  124. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-units +0 -0
  125. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/translations-hello-weblate-cs-units--GET--q=source%3A%3D%22mr%22 +0 -0
  126. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/units +0 -0
  127. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/units-123 +0 -0
  128. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/units-123--DELETE-- +0 -0
  129. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/units-123--PATCH--target=-foo---state=30 +0 -0
  130. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/api/units-123--PUT--target=-foo---state=30 +0 -0
  131. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/mock/project-local-file.pot +0 -0
  132. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/section +0 -0
  133. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/weblate.ini +0 -0
  134. {wlc-2.2.0 → wlc-3.0.0}/tests/test_data/wlc +0 -0
  135. {wlc-2.2.0 → wlc-3.0.0}/tests/test_package.py +0 -0
  136. {wlc-2.2.0 → wlc-3.0.0}/tests/test_statistics.py +0 -0
  137. {wlc-2.2.0 → wlc-3.0.0}/wl +0 -0
  138. {wlc-2.2.0 → wlc-3.0.0}/wlc/__init__.py +0 -0
  139. {wlc-2.2.0 → wlc-3.0.0}/wlc/py.typed +0 -0
  140. {wlc-2.2.0 → wlc-3.0.0}/wlc/utils.py +0 -0
  141. {wlc-2.2.0 → wlc-3.0.0}/wlc.egg-info/dependency_links.txt +0 -0
  142. {wlc-2.2.0 → wlc-3.0.0}/wlc.egg-info/entry_points.txt +0 -0
  143. {wlc-2.2.0 → wlc-3.0.0}/wlc.egg-info/top_level.txt +0 -0
@@ -1,8 +1,39 @@
1
- 2.2.0
2
- -----
1
+ # Changelog
2
+
3
+ ## 3.0.0
4
+
5
+ * Released on 8th October 2026.
6
+ * Breaking Python API changes:
7
+
8
+ * Require keyword arguments for client construction, request options,
9
+ project and language creation, source string creation, upload and download
10
+ options, throttling error construction, and CLI entry point options.
11
+ * API model objects now inherit from `UserDict` and are no longer `dict`
12
+ instances. Use `get_data()` or `dict(obj.items())` when a plain dictionary
13
+ is required.
14
+ * `WeblateConfig.find_config()` and `WeblateConfig.find_project_config()` now
15
+ return `pathlib.Path` objects instead of strings when a file is found.
16
+ * Reject cyclic category hierarchies and category nesting deeper than three
17
+ levels.
18
+ * Raised minimum dependency versions to exclude vulnerable releases.
19
+ * Added testing with Python 3.15 and improved type annotations.
20
+ * Updated development dependencies, CI actions, and Docker base images.
21
+
22
+ ## 2.2.1
23
+
24
+ * Released on 24th September 2026.
25
+ * Prevented API keys from appearing in CLI request errors and rejected API keys
26
+ containing line breaks.
27
+ * Fixed component downloads when a slug contains `repository` and avoided
28
+ relisting an already resolved component.
29
+ * Reported local filesystem failures as CLI errors and validated component
30
+ download output paths before fetching data.
31
+ * Updated development dependencies, CI actions, and Docker base images.
32
+
33
+ ## 2.2.0
3
34
 
4
35
  * Released on 1st September 2026.
5
- * Hardened authentication by disabling automatic ``netrc`` credentials,
36
+ * Hardened authentication by disabling automatic `netrc` credentials,
6
37
  rejecting credentials embedded in URLs, and redacting credentials from HTTP
7
38
  failure logs.
8
39
  * Scoped insecure HTTP and TLS exceptions to explicitly trusted origins and
@@ -14,8 +45,7 @@
14
45
  * Added a threat model and clarified configuration discovery and precedence.
15
46
  * Updated development dependencies, CI actions, and Docker base images.
16
47
 
17
- 2.1.1
18
- -----
48
+ ## 2.1.1
19
49
 
20
50
  * Released on 25th July 2026.
21
51
  * Prevented URL parser differential SSRF in server-provided URLs by validating
@@ -23,80 +53,71 @@
23
53
  * Improved type annotations.
24
54
  * Updated development dependencies, CI actions, and Docker base images.
25
55
 
26
- 2.1.0
27
- -----
56
+ ## 2.1.0
28
57
 
29
58
  * Released on 30th June 2026.
30
- * Refuse sending API keys over non-local ``http://`` URLs by default, while
59
+ * Refuse sending API keys over non-local `http://` URLs by default, while
31
60
  keeping loopback HTTP supported for local development and adding explicit
32
- opt-in via ``--allow-insecure-http``, ``WLC_ALLOW_INSECURE_HTTP``, or trusted
61
+ opt-in via `--allow-insecure-http`, `WLC_ALLOW_INSECURE_HTTP`, or trusted
33
62
  configuration.
34
63
  * Fixed paginated listings with query parameters to avoid duplicating
35
- parameters from API-provided ``next`` URLs.
36
- * Updated minimum supported ``requests`` and ``urllib3`` versions.
64
+ parameters from API-provided `next` URLs.
65
+ * Updated minimum supported `requests` and `urllib3` versions.
37
66
  * Improved inline API documentation and output handling internals.
38
67
  * Updated development dependencies, CI actions, and Docker base images.
39
68
 
40
- 2.0.1
41
- -----
69
+ ## 2.0.1
42
70
 
43
71
  * Released on 26th June 2026.
44
72
  * Require explicit URL pinning for unscoped API keys when the API URL comes
45
- from automatically discovered project configuration: ``WLC_KEY`` requires
46
- ``WLC_URL`` and ``--key`` requires ``--url``.
47
- * Removed ``TRACE`` from the default retryable HTTP methods.
73
+ from automatically discovered project configuration: `WLC_KEY` requires
74
+ `WLC_URL` and `--key` requires `--url`.
75
+ * Removed `TRACE` from the default retryable HTTP methods.
48
76
  * Added package and container provenance attestations and SBOM publishing for
49
77
  release artifacts.
50
78
  * Updated development dependencies, CI actions, and Docker base images.
51
79
 
52
- 2.0.0
53
- -----
80
+ ## 2.0.0
54
81
 
55
82
  * Released on 21st April 2026.
56
83
  * Possibly breaking changes:
57
84
 
58
- * Renamed the retry configuration option from ``method_whitelist`` to ``allowed_methods``.
59
- * Tightened configuration loading: explicit ``--config`` is authoritative, missing explicit config files fail, and project discovery uses the nearest config file.
85
+ * Renamed the retry configuration option from `method_whitelist` to `allowed_methods`.
86
+ * Tightened configuration loading: explicit `--config` is authoritative, missing explicit config files fail, and project discovery uses the nearest config file.
60
87
  * Tightened URL, download, and output safety: invalid or cross-origin URLs are rejected, binary downloads to terminals are refused, and text, CSV, and HTML output is escaped.
61
-
62
- * Added ``WLC_URL`` and ``WLC_KEY`` environment variable support.
88
+ * Added `WLC_URL` and `WLC_KEY` environment variable support.
63
89
  * Added unit-level CLI commands.
64
90
  * Updated models and statistics for the current Weblate API while preserving older statistics responses.
65
91
  * Fixed retry configuration and request adapter wiring.
66
- * Escaped generated HTML output (`GHSA-gx2m-mcc2-r4p3 <https://github.com/WeblateOrg/wlc/security/advisories/GHSA-gx2m-mcc2-r4p3>`__), hardened CSV and terminal output, and redacted authorization headers from debug logs.
92
+ * Escaped generated HTML output ([GHSA-gx2m-mcc2-r4p3](https://github.com/WeblateOrg/wlc/security/advisories/GHSA-gx2m-mcc2-r4p3)), hardened CSV and terminal output, and redacted authorization headers from debug logs.
67
93
  * Improved nested category handling, unit editing, help texts, and error messages.
68
94
  * Split implementation modules, moved tests out of the installed package, and updated packaging, dependencies, Docker images, and CI.
69
95
 
70
- 1.17.2
71
- ------
96
+ ## 1.17.2
72
97
 
73
98
  * Released on 16th January 2026.
74
99
  * Fixes path traversal: Unsanitized API slugs in download command (CVE-2026-23535).
75
100
 
76
- 1.17.1
77
- ------
101
+ ## 1.17.1
78
102
 
79
103
  * Released on 13th January 2026.
80
- * Unscoped ``key`` in configuration triggers error.
104
+ * Unscoped `key` in configuration triggers error.
81
105
 
82
- 1.17.0
83
- ------
106
+ ## 1.17.0
84
107
 
85
108
  * Released on 12th January 2026.
86
- * Configuration change might be needed to move API keys to a new location, see https://docs.weblate.org/en/latest/wlc.html#legacy-configuration.
87
- * Dropped support for unscoped ``key`` in configuration (CVE-2026-22251).
109
+ * Configuration change might be needed to move API keys to a new location, see <https://docs.weblate.org/en/latest/wlc.html#legacy-configuration>.
110
+ * Dropped support for unscoped `key` in configuration (CVE-2026-22251).
88
111
  * Tightened hostname-based SSL verification skip (CVE-2026-22250).
89
112
  * Modernized packaging.
90
113
  * Improved type annotations.
91
114
 
92
- 1.16.1
93
- ------
115
+ ## 1.16.1
94
116
 
95
117
  * Released on 10th October 2025.
96
118
  * Fixed packages publishing.
97
119
 
98
- 1.16
99
- ----
120
+ ## 1.16
100
121
 
101
122
  * Released on 10th October 2025.
102
123
  * Fixed downloading components based on configuration.
@@ -105,14 +126,12 @@
105
126
  * Dropped support for Python 3.8 and 3.9.
106
127
  * Added support for Python 3.13 and 3.14.
107
128
 
108
- 1.15
109
- ----
129
+ ## 1.15
110
130
 
111
131
  * Released on 3rd September 2024.
112
132
  * Fixed installation on certain filesystems.
113
133
 
114
- 1.14
115
- ----
134
+ ## 1.14
116
135
 
117
136
  * Released on 23rd February 2024.
118
137
  * Dropped support for Python 3.6 and 3.7.
@@ -120,8 +139,7 @@
120
139
  * Added support for categories.
121
140
  * Added support for the linked_component field.
122
141
 
123
- 1.13
124
- ----
142
+ ## 1.13
125
143
 
126
144
  * Released on 24th March 2022.
127
145
  * Support all wlc upload methods.
@@ -129,23 +147,20 @@
129
147
  * Allow uploading files when creating a component.
130
148
  * Allow downloading at component, project, and site level.
131
149
 
132
- 1.12
133
- ----
150
+ ## 1.12
134
151
 
135
152
  * Released on 19th May 2021.
136
153
  * Improved error messages when permission was denied.
137
154
  * Added type hints to the codebase.
138
155
 
139
- 1.11
140
- ----
156
+ ## 1.11
141
157
 
142
158
  * Released on 17th March 2021.
143
159
  * Fixed long filenames in test fixtures.
144
160
  * Updated base docker image.
145
161
  * Add support for specifying format when uploading files.
146
162
 
147
- 1.10
148
- ----
163
+ ## 1.10
149
164
 
150
165
  * Released on 11th February 2021.
151
166
  * Added ability to create new projects, components, and translations
@@ -158,46 +173,39 @@
158
173
  * Using requests.session to keep a single http request open instead of reinitializing them.
159
174
  * Added timeout config variable
160
175
 
161
- 1.9
162
- ---
176
+ ## 1.9
163
177
 
164
178
  * Released on 21st December 2020.
165
179
  * Added Docker image published as weblate/wlc on Docker Hub.
166
180
 
167
- 1.8
168
- ---
181
+ ## 1.8
169
182
 
170
183
  * Released on 11th September 2020.
171
184
  * Compatibility with Weblate 4.3 which moves source language from component to a project.
172
185
 
173
- 1.7
174
- ---
186
+ ## 1.7
175
187
 
176
188
  * Released on 3rd September 2020.
177
189
  * Fixed installation of wlc command-line.
178
190
 
179
- 1.6
180
- ---
191
+ ## 1.6
181
192
 
182
193
  * Released on 1st September 2020.
183
194
  * Post payload as JSON to allow handling complex data structures.
184
195
  * Added support for finding configuration file on Windows in AppData dir.
185
196
  * Improved error reporting.
186
197
 
187
- 1.5
188
- ---
198
+ ## 1.5
189
199
 
190
200
  * Released on 19th June 2020.
191
201
  * Fixed compatibility of some API calls with Weblate 4.1.
192
202
 
193
- 1.4
194
- ---
203
+ ## 1.4
195
204
 
196
205
  * Released on 3rd June 2020.
197
206
  * Fixed compatibility of some API calls with Weblate 4.1.
198
207
 
199
- 1.3
200
- ---
208
+ ## 1.3
201
209
 
202
210
  * Released on 6th May 2020.
203
211
  * Mark Python 3.8 as supported, dropped support for Python 3.5.
@@ -207,8 +215,7 @@
207
215
  * Added support for filtering components and translations.
208
216
  * Better report errors when accessing API.
209
217
 
210
- 1.2
211
- ---
218
+ ## 1.2
212
219
 
213
220
  * Released on 15th October 2019.
214
221
  * Fix stats invocation.
@@ -216,42 +223,36 @@
216
223
  * Added support for replace upload.
217
224
  * Added support for project, component and translation removal.
218
225
 
219
- 1.1
220
- ---
226
+ ## 1.1
221
227
 
222
228
  * Released on 1st February, 2019.
223
229
  * Fixed listing of language objects.
224
230
 
225
- 1.0
226
- ---
231
+ ## 1.0
227
232
 
228
233
  * Released on 31st January, 2019.
229
234
  * Added support for more parameters on file upload.
230
235
 
231
- 0.10
232
- ----
236
+ ## 0.10
233
237
 
234
238
  * Released on 21th October, 2018.
235
239
  * Fixed POST operations in the API.
236
240
  * Added --debug parameter to diagnose HTTP problems.
237
241
 
238
- 0.9
239
- ---
242
+ ## 0.9
240
243
 
241
244
  * Released on 17th October, 2018.
242
245
  * Switched to requests
243
246
  * Added support for cleanup command.
244
247
  * Added support for upload command.
245
248
 
246
- 0.8
247
- ---
249
+ ## 0.8
248
250
 
249
251
  * Released on 3rd March, 2017.
250
252
  * Various code cleanups.
251
253
  * Tested with Python 3.6.
252
254
 
253
- 0.7
254
- ---
255
+ ## 0.7
255
256
 
256
257
  * Released on 16th December, 2016.
257
258
  * Added reset operation.
@@ -259,27 +260,23 @@
259
260
  * Added changes listing.
260
261
  * Added file downloads.
261
262
 
262
- 0.6
263
- ---
263
+ ## 0.6
264
264
 
265
265
  * Released on 20th September, 2016.
266
266
  * Fixed error when invoked without command.
267
267
  * Tested on Windows and OS X (in addition to Linux).
268
268
 
269
- 0.5
270
- ---
269
+ ## 0.5
271
270
 
272
271
  * Released on 11th July, 2016.
273
272
  * Added locking commands.
274
273
 
275
- 0.4
276
- ---
274
+ ## 0.4
277
275
 
278
276
  * Released on 8th July, 2016.
279
277
  * Moved Git repository.
280
278
 
281
- 0.3
282
- ---
279
+ ## 0.3
283
280
 
284
281
  * Released on 19th May, 2016.
285
282
  * First version for general usage.
@@ -4,7 +4,7 @@ include SECURITY.md
4
4
  include LICENSE
5
5
  include wl
6
6
  recursive-include LICENSES *
7
- include CHANGES.rst
7
+ include CHANGES.md
8
8
  include MANIFEST.in
9
9
  include completion/wlc
10
10
  graft tests
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wlc
3
- Version: 2.2.0
3
+ Version: 3.0.0
4
4
  Summary: A command-line utility for Weblate, translation tool with tight version control integration
5
5
  Author-email: Michal Čihař <michal@weblate.org>
6
6
  License-Expression: GPL-3.0-or-later
@@ -24,6 +24,7 @@ Classifier: Programming Language :: Python :: 3.11
24
24
  Classifier: Programming Language :: Python :: 3.12
25
25
  Classifier: Programming Language :: Python :: 3.13
26
26
  Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Programming Language :: Python :: 3.15
27
28
  Classifier: Topic :: Software Development :: Internationalization
28
29
  Classifier: Topic :: Software Development :: Localization
29
30
  Classifier: Topic :: Utilities
@@ -31,28 +32,35 @@ Requires-Python: >=3.10
31
32
  Description-Content-Type: text/markdown
32
33
  License-File: LICENSE
33
34
  Requires-Dist: argcomplete
35
+ Requires-Dist: certifi>=2026.7.22
36
+ Requires-Dist: idna>=3.15
34
37
  Requires-Dist: python-dateutil
35
- Requires-Dist: pyxdg
38
+ Requires-Dist: pyxdg>=0.26
36
39
  Requires-Dist: requests>=2.33.0
37
- Requires-Dist: urllib3>=2.7.0
40
+ Requires-Dist: urllib3>=2.8.0
38
41
  Dynamic: license-file
39
42
 
40
- <a href="https://weblate.org/"><img alt="Weblate" src="https://s.weblate.org/cdn/Logo-Darktext-borders.png" height="80px" /></a>
41
-
42
- **Weblate is libre software web-based continuous localization system,
43
- used by over 2500 libre projects and companies in more than 165 countries.**
44
-
45
43
  # wlc
46
44
 
47
- wlc is a [Weblate](https://weblate.org/) command-line client and Python library
48
- using [Weblate's REST API](https://docs.weblate.org/en/latest/api.html).
49
-
50
45
  [![Website](https://img.shields.io/badge/website-weblate.org-blue.svg)](https://weblate.org/)
51
46
  [![Translation status](https://hosted.weblate.org/widgets/weblate/-/svg-badge.svg)](https://hosted.weblate.org/engage/weblate/?utm_source=widget)
52
47
  [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/552/badge)](https://bestpractices.coreinfrastructure.org/projects/552)
53
48
  [![PyPI package](https://img.shields.io/pypi/v/wlc.svg)](https://pypi.org/project/wlc/)
54
49
  [![Documentation](https://readthedocs.org/projects/weblate/badge/)](https://docs.weblate.org/en/latest/wlc.html)
55
50
 
51
+ wlc is a [Weblate](https://weblate.org/) command-line client and Python library
52
+ using [Weblate's REST API](https://docs.weblate.org/en/latest/api.html).
53
+
54
+ <p>
55
+ <a href="https://weblate.org/">
56
+ <img alt="Weblate"
57
+ src="https://s.weblate.org/cdn/Logo-Darktext-borders.png"
58
+ height="55">
59
+ </a>
60
+ </p>
61
+
62
+ Part of [Weblate](https://weblate.org/) — a privacy-respecting localization platform built on open-source foundations.
63
+
56
64
  ## Installation
57
65
 
58
66
  Install wlc from PyPI:
@@ -1,19 +1,24 @@
1
- <a href="https://weblate.org/"><img alt="Weblate" src="https://s.weblate.org/cdn/Logo-Darktext-borders.png" height="80px" /></a>
2
-
3
- **Weblate is libre software web-based continuous localization system,
4
- used by over 2500 libre projects and companies in more than 165 countries.**
5
-
6
1
  # wlc
7
2
 
8
- wlc is a [Weblate](https://weblate.org/) command-line client and Python library
9
- using [Weblate's REST API](https://docs.weblate.org/en/latest/api.html).
10
-
11
3
  [![Website](https://img.shields.io/badge/website-weblate.org-blue.svg)](https://weblate.org/)
12
4
  [![Translation status](https://hosted.weblate.org/widgets/weblate/-/svg-badge.svg)](https://hosted.weblate.org/engage/weblate/?utm_source=widget)
13
5
  [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/552/badge)](https://bestpractices.coreinfrastructure.org/projects/552)
14
6
  [![PyPI package](https://img.shields.io/pypi/v/wlc.svg)](https://pypi.org/project/wlc/)
15
7
  [![Documentation](https://readthedocs.org/projects/weblate/badge/)](https://docs.weblate.org/en/latest/wlc.html)
16
8
 
9
+ wlc is a [Weblate](https://weblate.org/) command-line client and Python library
10
+ using [Weblate's REST API](https://docs.weblate.org/en/latest/api.html).
11
+
12
+ <p>
13
+ <a href="https://weblate.org/">
14
+ <img alt="Weblate"
15
+ src="https://s.weblate.org/cdn/Logo-Darktext-borders.png"
16
+ height="55">
17
+ </a>
18
+ </p>
19
+
20
+ Part of [Weblate](https://weblate.org/) — a privacy-respecting localization platform built on open-source foundations.
21
+
17
22
  ## Installation
18
23
 
19
24
  Install wlc from PyPI:
@@ -2,11 +2,11 @@
2
2
 
3
3
  Project: wlc (Weblate command-line client and Python API client)
4
4
 
5
- Last reviewed for wlc 2.2.0 at base commit
6
- `1e63ad96951734ba26ba240f1ccfa80be4a8c645`, including the accompanying
7
- changes in this revision.
5
+ Last reviewed for wlc 3.0.0 at base commit
6
+ `3f09f18c634b8925b90df518f6fbd56af42d3381`, including the accompanying
7
+ release changes in this revision.
8
8
 
9
- Date: 2026-09-01.
9
+ Date: 2026-10-08.
10
10
 
11
11
  Status: Accepted, 2026-09-01.
12
12
 
@@ -276,12 +276,13 @@ code, Python runtime, or operating system. *(maintainer)*
276
276
  | Server-provided request targets remain on the configured API origin after normalization by the parser used by the HTTP transport. | The request goes through the `Weblate` client. Origin means scheme, normalized host, and effective port. | Pagination, refresh, repository, upload, download, or another response-derived URL causes a request to a different origin. | High when credentials or user data are sent; otherwise Medium. | *(documented)* (source: [client implementation](wlc/client.py), [URL tests](tests/test_urls.py)) |
277
277
  | HTTP redirects are not followed automatically. | The request goes through the `Weblate` client. | A 3xx response causes a follow-up request, or is accepted as a successful API response. | High when credentials or user data cross a boundary; otherwise Medium. | *(documented)* (source: [client implementation](wlc/client.py), [URL tests](tests/test_urls.py)) |
278
278
  | API keys are not sent over non-loopback cleartext HTTP by default. | A key is present and no trusted source explicitly enabled insecure HTTP. The request goes through the `Weblate` client. | The client sends the key to a non-loopback `http://` destination. | High. | *(documented)* (source: [client implementation](wlc/client.py), [HTTP tests](tests/test_insecure_http.py)) |
279
+ | API keys containing carriage returns or line feeds are rejected before HTTP request construction. | The request goes through the `Weblate` client. | A key containing a line break reaches Requests header processing. | High. | *(documented)* (source: [client implementation](wlc/client.py), [client tests](tests/test_wlc.py), [CLI tests](tests/test_main.py)) |
279
280
  | TLS certificates are verified by default and verification exceptions are scoped to the selected origin. | The destination is HTTPS and no trusted source supplied a matching origin or explicit transient exception under the configuration rules. | Verification is disabled for an unrelated origin, or without an explicit trusted opt-in. | High. | *(documented)* (source: [configuration implementation](wlc/config.py), [client implementation](wlc/client.py), [TLS tests](tests/test_insecure_ssl.py)) |
280
281
  | Automatically discovered project configuration cannot enable authenticated insecure HTTP, disable TLS verification, or supply insecure origin entries. | The project file is discovered automatically rather than supplied as explicit configuration. | A project-only setting weakens HTTP or TLS transport, or a CLI/environment exception is accepted without a URL from the same source. | High. | *(documented)* (source: [configuration implementation](wlc/config.py), [configuration tests](tests/test_config.py)) |
281
282
  | An unscoped CLI or environment key cannot be paired with a project-selected URL unless that same source also pins the URL. | Automatic project discovery supplied the otherwise-effective URL. | `--key` is accepted without `--url`, or `WLC_KEY` is accepted without `WLC_URL`. | High. | *(documented)* (source: [configuration implementation](wlc/config.py), [configuration tests](tests/test_config.py)) |
282
283
  | Authentication is accepted only from configured API-key sources; Requests does not automatically add credentials from `.netrc` or the file named by `NETRC`, and credentials embedded in URLs are rejected. | The request goes through the `Weblate` client. | A repository-selected host causes Requests to add or replace authentication using a netrc file, or a URL containing userinfo produces an HTTP request. | High. | *(documented)* (source: [configuration documentation][configuration-docs], [client implementation](wlc/client.py), [client tests](tests/test_wlc.py), [URL tests](tests/test_urls.py)) |
283
284
  | An explicit `--config` file prevents automatic user and project configuration discovery. | The CLI successfully reads the explicit file. CLI/environment overrides still apply normally. | Settings from a discovered user or project file affect the configuration. | Medium. | *(documented)* (source: [configuration implementation](wlc/config.py), [configuration tests](tests/test_config.py)) |
284
- | wlc debug logging redacts authorization and proxy-authorization headers, scrubs their values from request-failure messages, and does not log request bodies or uploaded file contents. | Logging uses wlc's debug helpers. Parameter values can still be logged and must not be used for secrets. | A generated debug entry contains an API token, JSON/body values, or uploaded contents supplied only through the corresponding request fields. | High for credentials; otherwise Medium. | *(documented)* (source: [debug implementation](wlc/http_debug.py), [debug tests](tests/test_errors.py), [CLI debug tests](tests/test_main.py)) |
285
+ | wlc CLI request errors and debug logging redact authorization values, and debug logging does not include request bodies or uploaded file contents. | Requests use the `Weblate` client and errors are rendered by the wlc CLI or debug helpers. Parameter values can still be logged and must not be used for secrets. | A CLI request error or generated debug entry contains an API token, JSON/body values, or uploaded contents supplied only through the corresponding request fields. | High for credentials; otherwise Medium. | *(documented)* (source: [CLI implementation](wlc/main.py), [debug implementation](wlc/http_debug.py), [debug tests](tests/test_errors.py), [CLI tests](tests/test_main.py)) |
285
286
  | Automatically generated component archive filenames cannot use server-provided slugs for path traversal. | wlc chooses the project/component download filename inside a user-selected directory. | A server-provided project or component slug writes outside that directory. | High. | *(documented)* (source: [filename helper](wlc/utils.py), [CLI implementation](wlc/main.py), [download tests](tests/test_download.py)) |
286
287
  | Download writes do not follow destination symlinks or overwrite non-regular or multiply linked targets, and destination replacement is checked against races. | The CLI writes a downloaded translation or automatically named archive through its download helper. The containing directory remains under local-user control. | A preplanted or racing symlink, hard link, changed inode, or non-regular destination redirects downloaded bytes to another file or device. | High. | *(documented)* (source: [CLI implementation](wlc/main.py), [download tests](tests/test_download.py)) |
287
288
  | Raw translation bytes are not written to an interactive terminal. | A translation download would use standard output and that stream reports itself as a TTY. | Binary translation data is emitted to the interactive terminal instead of being refused. | Medium. | *(documented)* (source: [CLI implementation](wlc/main.py), [CLI tests](tests/test_main.py)) |
@@ -308,7 +309,8 @@ code, Python runtime, or operating system. *(maintainer)*
308
309
  - Debug output is diagnostic data rather than a supported structured renderer.
309
310
  Header and request-body redaction does not imply terminal-control escaping or
310
311
  secrecy for request parameter values, URLs, response reason phrases, or error
311
- messages included in diagnostics. *(maintainer)*
312
+ messages included in diagnostics other than configured authorization values.
313
+ *(maintainer)*
312
314
  - wlc does not enforce a response-size, pagination-count, aggregate-time,
313
315
  memory, disk-usage, or retry-cost limit against the selected server. The
314
316
  configured per-request timeout and retry policy are operational controls, not
@@ -1,22 +1,22 @@
1
1
  [build-system]
2
2
  build-backend = "setuptools.build_meta"
3
- requires = ["setuptools>=78.0.2"]
3
+ requires = ["setuptools>=83.0.0"]
4
4
 
5
5
  [dependency-groups]
6
6
  dev = [
7
- {include-group = "lint"},
8
- {include-group = "test"},
9
- {include-group = "types"}
7
+ { include-group = "lint" },
8
+ { include-group = "test" },
9
+ { include-group = "types" }
10
10
  ]
11
11
  lint = [
12
- {include-group = "pre-commit"},
13
- {include-group = "pylint"}
12
+ { include-group = "pre-commit" },
13
+ { include-group = "pylint" }
14
14
  ]
15
15
  pre-commit = [
16
- "prek==0.5.0"
16
+ "prek==0.5.4"
17
17
  ]
18
18
  pylint = [
19
- "pylint==4.0.8"
19
+ "pylint==4.1.2"
20
20
  ]
21
21
  test = [
22
22
  "pytest-cov==7.1.0",
@@ -25,11 +25,11 @@ test = [
25
25
  "responses==0.26.3"
26
26
  ]
27
27
  types = [
28
- "ty==0.0.77",
29
- "mypy==2.3.1",
30
- "types-pyxdg==0.28.0.20260518",
28
+ "ty==0.0.85",
29
+ "mypy==2.4.0",
30
+ "types-pyxdg==0.28.0.20261008",
31
31
  "types-python-dateutil==2.9.0.20260807",
32
- "types-requests==2.33.0.20260712"
32
+ "types-requests==2.33.0.20261006"
33
33
  ]
34
34
 
35
35
  [project]
@@ -45,16 +45,19 @@ classifiers = [
45
45
  "Programming Language :: Python :: 3.12",
46
46
  "Programming Language :: Python :: 3.13",
47
47
  "Programming Language :: Python :: 3.14",
48
+ "Programming Language :: Python :: 3.15",
48
49
  "Topic :: Software Development :: Internationalization",
49
50
  "Topic :: Software Development :: Localization",
50
51
  "Topic :: Utilities"
51
52
  ]
52
53
  dependencies = [
53
54
  "argcomplete",
55
+ "certifi>=2026.7.22",
56
+ "idna>=3.15",
54
57
  "python-dateutil",
55
- "pyxdg",
58
+ "pyxdg>=0.26",
56
59
  "requests>=2.33.0",
57
- "urllib3>=2.7.0"
60
+ "urllib3>=2.8.0"
58
61
  ]
59
62
  description = "A command-line utility for Weblate, translation tool with tight version control integration"
60
63
  dynamic = ["version"]
@@ -105,7 +108,7 @@ ignore = [
105
108
 
106
109
  [tool.check-wheel-contents]
107
110
  ignore = [
108
- "W002" # Triggered by API mocks
111
+ "W002" # Triggered by API mocks
109
112
  ]
110
113
 
111
114
  [tool.coverage.paths]
@@ -134,15 +137,6 @@ exclude_also = [
134
137
  [tool.isort]
135
138
  profile = "black"
136
139
 
137
- [tool.pylint.main]
138
- disable = [
139
- "too-many-instance-attributes",
140
- "too-many-positional-arguments",
141
- "too-many-arguments",
142
- "missing-function-docstring",
143
- "too-many-public-methods"
144
- ]
145
-
146
140
  [tool.pytest.ini_options]
147
141
  testpaths = ["tests"]
148
142
 
@@ -155,30 +149,16 @@ docstring-code-format = true
155
149
  [tool.ruff.lint]
156
150
  future-annotations = true
157
151
  ignore = [
158
- "D10", # TODO: we are missing many docstrings
159
- "incorrect-blank-line-before-class", # CONFIG: incompatible with D211
160
- "multi-line-summary-first-line", # CONFIG: incompatible with D213
161
- "line-too-long", # CONFIG: formatter
162
- "non-imperative-mood", # TODO: many strings need rephrasing
163
- "print", # WONTFIX: using print() (maybe add noqa)
164
- "raise-vanilla-args", # WONTFIX: Avoid specifying long messages outside the exception class
165
- "too-many-arguments", # WONTFIX: Too many arguments to function call
166
- "magic-value-comparison", # TODO: Magic value used in comparison, consider replacing 201 with a constant variable
167
- "docstring-missing-returns", # WONTFIX
168
- "docstring-missing-yields", # WONTFIX
169
- "docstring-missing-exception", # WONTFIX
170
- "too-many-statements-in-try-clause", # TODO
171
- "subclass-builtin", # TODO
172
- "no-self-use", # TODO
173
- "too-many-public-methods", # TODO
174
- "read-whole-file", # TODO
175
- "COM", # CONFIG: No trailing commas
176
- "PT", # CONFIG: Not using pytest
177
- "PTH", # TODO: Not using pathlib
178
- "EM", # TODO: Exception strings
179
- "FBT", # TODO: Boolean in function definition
180
- "ANN", # TODO: type annotations
181
- "error-suffix-on-exception-name" # TODO: exception naming
152
+ "incorrect-blank-line-before-class", # CONFIG: incompatible with D211
153
+ "multi-line-summary-first-line", # CONFIG: incompatible with D213
154
+ "line-too-long", # CONFIG: formatter
155
+ "raise-vanilla-args", # WONTFIX: Avoid specifying long messages outside the exception class
156
+ "too-many-arguments", # WONTFIX: Too many arguments to function call
157
+ "docstring-missing-returns", # WONTFIX
158
+ "docstring-missing-yields", # WONTFIX
159
+ "docstring-missing-exception", # WONTFIX
160
+ "COM", # CONFIG: No trailing commas
161
+ "PT" # CONFIG: Not using pytest
182
162
  ]
183
163
  preview = true
184
164
  select = ["ALL"]
@@ -188,8 +168,9 @@ min-file-size = 2
188
168
  # Copyright without a year, see https://github.com/astral-sh/ruff/issues/10062
189
169
  notice-rgx = "(?i)Copyright\\s+©\\s+"
190
170
 
191
- [tool.ruff.lint.mccabe]
192
- max-complexity = 16
171
+ [tool.ruff.lint.per-file-ignores]
172
+ # Test names describe their behavior and self might not be used there
173
+ "tests/**" = ["D", "no-self-use"]
193
174
 
194
175
  [tool.rumdl]
195
176
  disable = [