Skip to content

ci: use shared myerscode/workflows - #9

Closed
oniice wants to merge 69 commits into
mainfrom
ci/use-shared-workflows
Closed

oniice wants to merge 69 commits into
mainfrom
ci/use-shared-workflows

Conversation

@oniice

@oniice oniice commented Oct 30, 2026

Copy link
Copy Markdown
Member

Migrates CI to the shared myerscode/workflows reusable workflows (@v1), normalising filenames to ci.yml / release.yml / update-changelog.yml and removing standalone/outlier workflows. Preserves php 8.5, extensions ctype, iconv, json, mbstring, scheme calver. Adds Pint+PHPStan via php-lint (not previously in CI).

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
- 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
oniice added 27 commits July 30, 2026 13:59
- 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
Normalise CI to shared reusable workflows (@v1) on develop.
@oniice
oniice force-pushed the ci/use-shared-workflows branch from 60a92ed to 48ec05b Compare October 30, 2026 16:27
@oniice oniice closed this Oct 30, 2026
@oniice
oniice deleted the ci/use-shared-workflows branch October 30, 2026 16:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant