Repository navigation
Conversation
Signed-off-by: Fred Myerscough <oniice@gmail.com>
- Add declare(strict_types=1) to all files - Add #[Override] attributes to overriding methods/properties - Finalize test case classes - Improve variable naming to match types - Use first-class callable syntax - Remove redundant parent constructor delegation - Modernise PHPUnit assertions
…treated as misses
- Replace terminal()->run('rm -f ...') with native unlink()
- Add guard for empty/null cache location
- Add tests verifying file deletion and graceful handling
- Config cache now writes JSON instead of executable PHP - Eliminates code injection vector via var_export - Cache file changed from config.php to config.json - Uses LOCK_EX for atomic writes - Update test to verify JSON output and no PHP in cache
- FileCacheDriver now creates the cache directory if missing - Prevents errors when writing to a nonexistent path - Add test verifying directory auto-creation
- Add is_subclass_of check in createLayer() as defence-in-depth - Document that only trusted class names should be used as pipes - setPipes() already filters invalid pipes; this adds a second barrier
- Add isWithinPackage() guard to prevent path traversal - Skip packages whose command/provider paths escape their root - Protects against malicious composer.json extra metadata
- Strip CR/LF from message and context before writing - Prevents log forging attacks via injected newlines - Add tests verifying single-line output for multi-line input
- New runSafe() method accepts array of arguments - Bypasses shell interpretation using Process array constructor - Prevents injection of metacharacters in command arguments - Add tests verifying safe handling of shell metacharacters
- Was extending AbstractServiceProvider directly, bypassing the is_subclass_of(ServiceProvider) check in Container::addServiceProvider() - Remove duplicate $provides and register() declarations (inherited) - Bootable providers can now be registered in the container
- Move provider registration, package discovery, event binding, and command loading into explicit bootstrap() method - Constructor now calls parent first, then bootstraps - Makes boot sequence testable and boot order explicit
- Add detailed docblock to bindCommandEvents() explaining the Symfony/Acorn dispatcher relationship and bridging mechanism - Note that future Console events require manual bridging - Reference future consolidation path
- Callable listeners now tracked per-Dispatcher instance - Eliminates static memory leak across process lifetime - Dispatcher exposes callableListeners(), findCallableListener(), clearCallableListeners(), createCallableListener() - CallableEventManager retained for backward compat, marked deprecated - Add tests for instance-scoped callable listener tracking
- Add file-level docblock warning against use in library code - Explain hidden coupling, testability, and isolation concerns - Recommend constructor injection for framework internals
- Wrap listener execution in try/catch so one failing listener does not prevent subsequent listeners from executing - Add test proving third listener runs after second throws
- Container::add() now respects the $shared parameter - Previously the parameter was accepted but silently ignored - Add tests verifying shared/non-shared behaviour
- FileCacheDriver::has() now checks expiration, not just file existence
- RuntimeCache::has() now checks expiry timestamp
- Fix DateInterval TTL conversion in both drivers — use proper
total seconds calculation instead of broken format('%s')
- Add tests for expiry behaviour and DateInterval intervals
- Change abstract handle() from void to int return type - Commands can now signal non-zero exit codes without throwing - Update all framework and test commands to return 0
- Changed from dev to stable to prevent unstable transitive deps - dev-main constraint on acorn-testing is inherently dev-stability and Composer allows it specifically without global dev stability
- Add strict types to Application, Kernel, Container, Dispatcher, Pipeline, Command, Event, ListenerQueue, ServiceProvider - Fix SubCommandFailedException constructor call exposed by strict mode
- Throw InvalidArgumentException for unrecognised log levels - Add test verifying invalid level throws
- boot() already guarantees application is set or throws - Use application() accessor which has the same guard
- Replaces new self() with new static() for correct covariance - Removes @PHPStan-Ignore suppression comment
- Document O(n) rebuild cost in ListenerQueue::remove() - Note filesystem scanning performance in loadCommands()
- DependencyManager can now be injected for testability - Defaults to creating its own instance if none provided - Remove readonly modifier to support conditional assignment
- Forces subclasses to explicitly declare which events they handle - Removes silent no-op when property was accidentally left empty - Update all framework and test listeners to implement the method
- Use addShared() instead of add() to ensure the same Dispatcher instance is returned on every container resolution
- Dispatcher now implements Symfony EventDispatcherInterface - Eliminates need for separate Symfony EventDispatcher in Application - bindCommandEvents() uses Acorn Dispatcher directly with setDispatcher() - Add getListenerPriority(), hasListeners(), getPriority() methods - Rename addSubscriber/removeSubscriber for Symfony compat, add addAcornSubscriber/removeAcornSubscriber for Acorn subscribers - dispatch() now returns the event object per Symfony contract - Accepts non-Acorn events (Symfony Console events) natively - Update tests for new behaviour and remove outdated assertions
- Add proper docblock explaining single vs multi-pipeline behaviour - Use ARRAY_FILTER_USE_BOTH for clearer key filtering - Type-hint the filter callback parameter as PipeCollection
- commands.md: document handle() int return type and exit codes - events.md: document unified dispatcher, Symfony interface, emit() - listeners.md: update to abstract listensFor() method pattern, add exception isolation and queueable listener docs - terminal.md: add runSafe() documentation for safe execution - logging.md: add log level validation, sanitisation, PSR-3 notes - cache.md: add TTL formats, driver details, helper methods
…ntainer union type issue
…onsole from intercepting exceptions
Normalise CI to shared reusable workflows (@v1) on develop.
oniice
force-pushed
the
ci/use-shared-workflows
branch
from
October 30, 2026 16:27
60a92ed to
48ec05b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Migrates CI to the shared myerscode/workflows reusable workflows (
@v1), normalising filenames toci.yml/release.yml/update-changelog.ymland removing standalone/outlier workflows. Preserves php8.5, extensionsctype, iconv, json, mbstring, schemecalver. Adds Pint+PHPStan via php-lint (not previously in CI).