You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ruff 0.16 ships a curated default rule set, and an explicit `select`
replaces that set rather than extending it -- so the project's naming
linters had silently opted it out of everything ruff enables by
default. Leaving `select` unset and moving the project's own linters
under `extend-select` takes the enabled rule count from 351 to 565,
and this branch resolves every diagnostic that surfaced.
- **Dependencies**: ruff floors at `>=0.16.0` in the `dev` and `lint`
groups, with uv.lock relocked. A floor, not a pin, so contributors
and CI agree on the diagnostics without freezing out patch releases.
- **Rule selection**: `select` gives way to `extend-select`, one entry
per linter, with the reason `select` stays unset recorded in
pyproject.toml.
- **Fixes**: `None` sorts last in type unions (RUF036); exception
`__init__`s call `super().__init__()` as a statement instead of
returning it (PLE0101); progress callbacks receive an aware UTC
datetime rather than a naive local one (DTZ005);
`GitSubmoduleManager._ls` drops a try/except/pass that guarded calls
already passing `check_returncode=False` (S110, BLE001); the unused
private `_TXT` alias is gone (PYI047); the two test `subprocess.run`
calls that assert on `returncode` state `check=False` (PLW1510); and
`libvcs.sync.svn` loses a shebang from a module that is only ever
imported (EXE001).
- **Scoped ignores**: S102 for the Sphinx conf's exec of
`__about__.py`, PLW1509 for `run()`'s `preexec_fn` pass-through, and
BLE001 for QueryList's filtering of caller-supplied objects and
`SvnSync.url_rev`'s `svn info` fallback -- each scoped to its file,
with the justification beside it in pyproject.toml.
- **Formatting**: `ruff format` 0.16 descends into Markdown fences by
default, so the Python blocks in README.md and notes/ are normalized.
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->
22
22
23
+
### Fixes
24
+
25
+
#### Progress callback timestamps carry a time zone (#549)
26
+
27
+
The `timestamp` passed to a
28
+
{class}`~libvcs._internal.run.ProgressCallbackProtocol` is now an aware
29
+
`datetime` in UTC. It was a naive local-time value, so timestamps taken on
30
+
hosts in different zones compared and serialized as though they named the
31
+
same instant, and a DST rollover made them ambiguous on a single host.
32
+
Callbacks that format the value for display are unaffected; callbacks that
33
+
compare, subtract, or serialize it will see the offset.
34
+
23
35
### Documentation
24
36
25
37
#### Class fields describe themselves in the API reference (#548)
@@ -38,6 +50,22 @@ Workflow actions moved to their current major releases: `actions/checkout` v7,
38
50
and `dorny/paths-filter` v4. Workflow behavior is unchanged, though setup-uv no
39
51
longer prunes the uv cache, so the first run after this repopulates it.
40
52
53
+
#### Ruff moves to 0.16 (#549)
54
+
55
+
Minimum `ruff>=0.16.0` (was unpinned). Contributors need the newer formatter:
56
+
`ruff format` descends into Python code blocks inside Markdown, so
57
+
`just ruff-format` now reaches `README.md` and the design notes alongside
58
+
`src/` and `tests/`.
59
+
60
+
Linting also picks up ruff's own default rule set. The project used to name
61
+
its linters with `select`, which replaces the defaults rather than adding to
62
+
them; `extend-select` layers the same list on top instead, so `just ruff` now
63
+
enforces the rules ruff recommends out of the box as well as the ones libvcs
64
+
asks for. Rules that flag a deliberate idiom — the blind excepts that let
65
+
{class}`~libvcs._internal.query_list.QueryList` treat an unresolvable lookup
66
+
as a non-match, `subprocess.Popen`'s `preexec_fn` pass-through — are scoped
67
+
per file with the reason recorded in `pyproject.toml`.
68
+
41
69
## libvcs 0.45.1 (2026-07-11)
42
70
43
71
libvcs 0.45.1 unbreaks test suites that build their documentation before running pytest: the bundled pytest plugin no longer overrides pytest's own collection-ignore rules, so generated `_build/` output stops aborting collection. The documentation now runs every Python example as a doctest against real temporary repositories, which surfaced and corrected examples that had drifted from the API.
0 commit comments