Skip to content

0.15.0

Latest

Choose a tag to compare

@somework somework released this 07 Sep 17:35
· 3 commits to main since this release

Added

  • indexnowkit.clock (Clock\SystemClock, aliased to Psr\Clock\ClockInterface): the one service every piece
    that reads the time takes it from — indexnowkit.throttle, the memory indexnowkit.debounce_store,
    indexnowkit.submitter, indexnowkit.command_submitter_factory and, with verify.enabled, the pre-flight
    decorators. Replace it with IndexNowKit\Testing\FrozenClock in a compiler pass and the debounce window, the
    throttle window and the time a submission record gets all move together (audit 0.13 A5; docs/extending.md,
    docs/testing.md).
  • indexnowkit.check.locales (the core's Check\LocalesCheck over Check\MappedClasses, code router.locales):
    one indexnow:check warning when a #[IndexNow(locales: 'all')] rule meets an empty framework.enabled_locales,
    which until now silently produced one URL without a locale instead of one per locale (audit 0.13 W14; the class
    moved to the core in wave M, spec 19 §4.4, one text for the three adapters that print it).
  • The router bridge warns once per process when locales: 'all' meets an empty framework.enabled_locales
    (indexnowkit.route_url_resolver takes the logger now, on the indexnow channel): the rule silently collapsing
    to one URL was, until now, a line of check only. The expansion, the pinned origin and the exception text are the
    core's Url\RouteOrigin (wave M, spec 19 §4.6).

Changed

  • Wave M (spec 19): the bundle's copies of what the family shares are the core's or the packages' classes.
    Check\LocalesCheck and Check\EntitySampler are removed — the service ids stay (indexnowkit.check.locales is the
    core's Check\LocalesCheck over the new Check\MappedClasses, indexnowkit.check.entity_sampler.callable is
    Console\SubjectSampler of indexnowkit/console). Command\EntityLoader extends Console\AbstractSubjectLoader
    (its constructor and manager() are unchanged). Messenger\MessengerDispatcher is the Messenger push around the
    core's Dispatch\BatchingDispatcher: its constructor takes the Config (indexnowkit.config) where it took
    $logUrls and $batchMaxUrls — an internal service (indexnowkit.dispatcher), not in docs/bc.md — and its log
    lines are the core's ({count} URL(s) queued as message {id}, cannot queue {count} URL(s) (message {id}), they are lost: {error}; docs/messenger.md). SubmitUrlsMessage::newId() delegates to BatchingDispatcher::newJobId().
    EventListener\FlushListener takes (CollectorInterface, Closure(): IndexNowKit) instead of a PSR-11 service
    locator (PSR-11 says a container should not be passed in for an object to fetch its own dependencies; a
    service_closure('indexnowkit') is as lazy). Migration: a FlushListener built by hand passes
    static fn () => $container->get('indexnowkit'). Check\CacheProbe writes the core's DebounceStoreCheck::PROBE_KEY
    (it only read a key). The nine literal 'memory' / 'none' comparisons of the loader are
    DebounceStoreFactory::isShared(); the status line of the debounce store is HistoryServices::describeStore()
    of indexnowkit/history (cache.app (missing) when the pool is not a service, where the bundle printed the bare id).

  • The command classes are the packages', Command\* of the bundle is gone (wave L, spec 18). indexnow:check,
    indexnow:config, indexnow:submit, indexnow:submit-entity, indexnow:explain, indexnow:key:generate and the
    three "not installed" stubs are IndexNowKit\Console\Command\* of indexnowkit/console 0.5 (submit-entity is
    SubmitSubjectsCommand, named by the vocabulary), indexnow:sitemap is IndexNowKit\Sitemap\Console\SitemapCommand
    (sitemap 0.8), indexnow:history and indexnow:status are IndexNowKit\History\Console\HistoryCommand /
    StatusCommand (history 0.4). The bundle registers them under their class names with the same runners
    (indexnowkit.console.*), the same names, arguments, options, exit codes and --json; the Yii3 package registers
    the very same classes. What check and config read is DependencyInjection\ConsoleConfigSource
    (indexnowkit.console.config_source, a Console\ConfigSourceInterface) instead of three constructor arguments.
    Every console.command stays lazy (#[AsCommand], or the command + description attributes of the tag for
    SubmitSubjectsCommand), which the bundle's own test now asserts. Command\EntityLoader stays where it is.
    Migration: only a direct reference to IndexNowKit\SymfonyBundle\Command\*Command breaks — a decorates: on one of
    those ids, an instanceof, a #[AsCommand] subclass (they were final). Decorate the runner instead
    (indexnowkit.console.submit_entity, …), or register a command of your own under the same name
    (docs/extending.md "Replacing a command").

  • The --sample gate of indexnow:check is the core's: indexnowkit.check.samples is
    IndexNowKit\Check\SampleOptions and indexnowkit.check.verify_sample is IndexNowKit\Check\SampleGateCheck
    (core 0.13.0) instead of the bundle's own byte-identical copies, which are removed —
    IndexNowKit\SymfonyBundle\Check\SampleOptions and IndexNowKit\SymfonyBundle\Check\VerifySampleCheck are gone.
    Same service ids, same lines, same verify.installed code; only a direct reference to those two classes breaks
    (audit 0.13 A2).

  • indexnowkit.verify.submitter and indexnowkit.verify.command_submitter_factory pass their arguments by name
    ($inner, $transport, …) rather than by position, so a parameter added to Verify\VerifyingSubmitter fails the
    compilation instead of shifting values into the wrong slots (audit 0.13 A16).

  • DispatcherFactory::SYNC instead of the 'sync' literal in DependencyInjection\VerifyServices (audit 0.13 A19).

Fixed

  • The profiler panel no longer prints the submission store's raw exception message: a failing store shows the
    exception class plus a message whose DSN credentials are masked the way indexnow:config masks them, so a panel
    screenshot in a bug report carries no database user or password (audit 0.13 S12).
  • Fixed: the bundle was a fatal without indexnowkit/sitemap, indexnowkit/verify or indexnowkit/history
    (Class "IndexNowKit\Sitemap\Adapter\SitemapServices" not found while compiling the container): the configuration
    tree and the loader asked the packages' *Services::package() whether the package is installed, and those classes
    live in the packages. They now ask the core's Adapter\OptionalPackage::sitemap() / verify() / history()
    (core 0.13.0); DependencyInjection\{Sitemap,Verify,History}Services::package() delegate there too. Same texts, same
    service ids. A new CI job removes the three packages and boots the bundle with detection
    (OptionalPackagesDetectionTest).
  • Requires indexnowkit/core ^0.13, indexnowkit/console ^0.5, and indexnowkit/history ^0.4 when installed
    (conflict with older).

Tests

  • The kernels of the functional suite put a fingerprint of the bundle's sources in the container cache path: with
    debug: false Symfony never checks the compiled container for freshness, so a local edit of the DI extension was
    tested against the previous container (audit 0.13 T10).
  • The in-memory Messenger transport of the messenger* variants runs with ?serialize=true, so the message and its
    stamps are really encoded and decoded instead of being handed back as the same object (audit 0.13 T17).
  • A #[IndexNow(resolver: ...)] id the container knows but cannot build, and one it does not know at all, are
    asserted to carry the family's ConfigurationException texts, which now come from the core's
    Url\ArrayResolverLocator (audit 0.13 A10).