Repository navigation
Releases
Releases · rasuvaeff/understudy-psalm
v1.1.0
- Support Psalm 7:
TKeyedArray's constructor is private there, so shapes are
built throughTKeyedArray::make()(which Psalm 6 has from 6.19). The
vimeo/psalmconstraint widens to^6.19 || ^7.0. The Returns integration
fixture now acceptsInvalidScalarArgument, which is what Psalm 7 calls the
wrong-callback-return case Psalm 6 filed asInvalidArgument.
v1.0.0
The stability release, following rasuvaeff/understudy 1.0.0. The plugin's
diagnostic contract is unchanged from 0.8.5; a project on the 0.x bridge
upgrades by changing its engine constraint to ^1.0.
- Requires
rasuvaeff/understudy^1.0, following the family policy: the
engine is released first and satellites follow it on the same major.
v0.8.5
- Changed. Accepts
rasuvaeff/understudy^0.12alongside^0.9 || ^0.10 || ^0.11: the engine's 0.12.0 runs a specification closure exactly once (the nested-call probe that re-ran it is gone) and refuses two calls side by side as it does a nested pair; this package reads neither, so the bridge is widened, not moved.
v0.8.4
- Changed. Accepts
rasuvaeff/understudy^0.11alongside^0.9 || ^0.10: the engine's 0.11.0 adds a refusal where there was a fatal, a nested-call check and areturns()type check, none of which this package reads; the bridge is widened, not moved.
v0.8.3
- Requires
rasuvaeff/understudy^0.9 || ^0.10. The engine's 0.10 closes six
defects of the 1.0 review, the widest of them being that an optional
parameter no longer has to be spelled in a specification:when(fn () => $repository->find(1))now matches a contract whose remaining parameters
carry defaults, and an unspelled position is rendered as…in reports so
it is never mistaken for a writtenany(). Nothing this plugin does changes
— the arity suppression it carries is aboutArg::rest(), which still
covers the contract's required parameters and only those. - Drops the
^0.8term, as 0.8.2 said it would in the release that
follows the engine's.
v0.8.2
- Guards the plugin's load list with a regression test and completes the
plugin's public summary in the generated family reference. - Removes the stale 1.0 wording from
llms.txtwhile the engine family remains
on its 0.x compatibility line.
v0.8.1
- Allows
rasuvaeff/understudy^0.8 || ^0.9. A bridge, not a widening for
its own sake: the engine's 0.9 is the 1.0 candidate — every contract decision
of the 1.0 review lands there, and 1.0 follows once it has been driven by real
packages — and a project taking it must be able to keep this plugin without a
window in whichcomposer requiresilently installs the 0.8 engine beside
it. The^0.8term is dropped in the release that follows the engine's. - Rector is green again, which it had not been since 0.5.0:
rector.php
skips the fixture projects — they are the test input, and
SortCallLikeNamedArgsRectorwould have rewritten theMisusefixture
that pins named bounds in either order into the order that never showed the
bug — and the remaining suggestions are applied.composer release-check
is what gates a tag, and it had been red under green builds. infection/infectionmoves to^0.35, the monorepo's single-major form.- Documentation no longer dates the
Arg::rest()andArg::captor()idioms to
«understudy 0.4»: with a floor of^0.8every engine this plugin installs
beside has them.AGENTS.mdno longer cites a section of the retired plan.
v0.8.0
- Requires
rasuvaeff/understudy^0.8, and requires it as a single term. The
accumulating union it carried (^0.4 || ^0.5 || …) had to be widened by hand
on every core release, and a package that misses one becomes uninstallable
beside its own engine. - The plugin no longer crashes Psalm on
foo(...). A first-class callable
carries aVariadicPlaceholderwhere its arguments would be, and php-parser
asserts against reading them; thebeforehook read them on every call it
saw, so a singlestrlen(...)anywhere in the analysed code took the whole
run down — no diagnostics, on any file, at any level. That is PHP 8.1 syntax
and this package declares 8.3–8.5. ->returns(...)->times(5, 2)is reported as impossible again. The
cardinality rule read only the immediate receiver oftimes(), so it fired
onexpect(...)->times(5, 2)and stayed silent on every spelling with a
link in between — including the one the engine's own README recommends for a
repeated call.times(maximum: 5, minimum: 1)is no longer reported as impossible. The
bounds were read positionally, so a named call with the arguments in the
other order looked like(5, 1). Correct code turned red, with no way around
it but removing the plugin.- A specification that reaches its double through a helper is silent.
when(fn () => $this->gate()->find(1)),$double->find($this->id())and
$this->passThrough($double->find(1))were all reported as "the closure
makes 2 calls". The engine throws on the first call that lands on a double
and never sees the rest, so a call that is the receiver of another, or one
made on$this, is not a second specified call. The total is still what
answers "no call at all", so a specification that only reaches its double
through a helper is not accused of specifying nothing either. - A matcher whose kind cannot fit is described as matching "a value of type
int" rather than "a int" — the wordingunderstudy-phpstanalready used. - README ×2 and
llms.txtnow say that a leaked matcher is reported by Psalm's
ownMixedArgumentand therefore only aterrorLevel="1", and why this
plugin has no rule of its own for it.
v0.7.0
- Matcher argument suppression is now scoped to real matcher calls.
Arg::captor()builds a captor and is no longer mistaken for a matcher, so
Psalm keeps reporting an invalid captor value passed directly to a typed
parameter. TooFewArgumentssuppression now uses file offsets for every scope. A
validArg::rest()specification and a real under-arity call on the same
source line are distinguished, so the real call keeps Psalm's diagnostics.- Added control-run integration coverage for both boundaries.
v0.6.1
- Documentation review fixes. Added the missing
make test-integration
target — README and AGENTS referenced it, the Makefile did not define it.
Both READMEs gained the Security and Examples sections; themake build
comment now lists everything the script runs.