From aa46ce796f5ca8f0b410d5a8bafdd780b61f1781 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 May 2026 07:54:51 +0700 Subject: [PATCH 1/9] chore: migrate deptrac to structarmed --- structarmed.php | 105 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/structarmed.php b/structarmed.php index 97ad5c018e60..e16f7e267df2 100644 --- a/structarmed.php +++ b/structarmed.php @@ -23,4 +23,107 @@ __DIR__ . '/system/ThirdParty', ]) ->cacheDirectory(is_dir('/tmp') ? '/tmp/structarmed' : null) - ->withPreset(Preset::PSR4()); + ->withPreset(Preset::PSR4()) + // Layers — migrated from deptrac.yaml classNameRegex collectors. + // The following components are exempt due to their global nature: + // - CLI & Commands, Config, Debug, Exception, Service, Validation\FormatRules + ->layerPattern('API', '/^CodeIgniter\\\\API\\\\.*$/') + ->layerPattern('Cache', '/^CodeIgniter\\\\Cache\\\\.*$/') + ->layerPattern('Controller', '/^CodeIgniter\\\\Controller$/') + ->layerPattern('Cookie', '/^CodeIgniter\\\\Cookie\\\\.*$/') + ->layerPattern('Database', '/^CodeIgniter\\\\Database\\\\.*$/') + ->layerPattern('DataCaster', '/^CodeIgniter\\\\DataCaster\\\\.*$/') + ->layerPattern('DataConverter', '/^CodeIgniter\\\\DataConverter\\\\.*$/') + ->layerPattern('Email', '/^CodeIgniter\\\\Email\\\\.*$/') + ->layerPattern('Encryption', '/^CodeIgniter\\\\Encryption\\\\.*$/') + ->layerPattern('Entity', '/^CodeIgniter\\\\Entity\\\\.*$/') + ->layerPattern('Events', '/^CodeIgniter\\\\Events\\\\.*$/') + ->layerPattern('Files', '/^CodeIgniter\\\\Files\\\\.*$/') + ->layerPattern('Filters', '/^CodeIgniter\\\\Filters\\\\Filter.*$/') + ->layerPattern('Format', '/^CodeIgniter\\\\Format\\\\.*$/') + ->layerPattern('Honeypot', '/^CodeIgniter\\\\.*Honeypot.*$/') + ->layerPattern('URI', '/^CodeIgniter\\\\HTTP\\\\URI$/') + ->layerPattern('HTTP', '/^CodeIgniter\\\\HTTP\\\\.*$/', '/(Exception|URI)/') + ->layerPattern('I18n', '/^CodeIgniter\\\\I18n\\\\.*$/') + ->layerPattern('Images', '/^CodeIgniter\\\\Images\\\\.*$/') + ->layerPattern('Language', '/^CodeIgniter\\\\Language\\\\.*$/') + ->layerPattern('Log', '/^CodeIgniter\\\\Log\\\\.*$/') + ->layerPattern('Model', '/^CodeIgniter\\\\.*Model$/') + ->layerPattern('Modules', '/^CodeIgniter\\\\Modules\\\\.*$/') + ->layerPattern('Pager', '/^CodeIgniter\\\\Pager\\\\.*$/') + ->layerPattern('Publisher', '/^CodeIgniter\\\\Publisher\\\\.*$/') + ->layerPattern('RESTful', '/^CodeIgniter\\\\RESTful\\\\.*$/') + ->layerPattern('Router', '/^CodeIgniter\\\\Router\\\\.*$/') + ->layerPattern('Security', '/^CodeIgniter\\\\Security\\\\.*$/') + ->layerPattern('Session', '/^CodeIgniter\\\\Session\\\\.*$/') + ->layerPattern('Throttle', '/^CodeIgniter\\\\Throttle\\\\.*$/') + ->layerPattern('Typography', '/^CodeIgniter\\\\Typography\\\\.*$/') + ->layerPattern('Validation', '/^CodeIgniter\\\\Validation\\\\.*$/', '/^CodeIgniter\\\\Validation\\\\FormatRules$/') + ->layerPattern('View', '/^CodeIgniter\\\\View\\\\.*$/') + ->ruleset([ + 'API' => ['Format', 'HTTP', 'Database', 'Model', 'Pager', 'URI'], + 'Cache' => ['I18n'], + 'Controller' => ['HTTP', 'Validation'], + 'Cookie' => ['I18n'], + 'Database' => ['Entity', 'Events', 'I18n'], + 'DataCaster' => ['I18n', 'URI', 'Database'], + 'DataConverter' => ['DataCaster'], + 'Email' => ['I18n', 'Events'], + 'Entity' => ['DataCaster', 'I18n'], + 'Files' => ['I18n'], + 'Filters' => ['HTTP'], + 'Honeypot' => ['Filters', 'HTTP'], + 'HTTP' => ['Cookie', 'Files', 'I18n', 'Security', 'URI'], + 'Images' => ['Files', 'I18n'], + 'Model' => ['Database', 'DataCaster', 'DataConverter', 'Entity', 'I18n', 'Pager', 'Validation'], + 'Pager' => ['URI', 'View'], + 'Publisher' => ['Files', 'URI'], + // +API = API + its allowed layers; +Controller = Controller + its allowed layers + 'RESTful' => ['API', 'Controller', 'Database', 'Format', 'HTTP', 'Model', 'Pager', 'URI', 'Validation'], + 'Router' => ['HTTP', 'I18n'], + 'Security' => ['Cookie', 'HTTP', 'I18n', 'Session'], + 'Session' => ['Cookie', 'Database', 'HTTP', 'I18n'], + 'Throttle' => ['Cache', 'I18n'], + 'Validation' => ['Database', 'HTTP'], + 'View' => ['Cache'], + ]) + ->skipPathsForRuleset(['*test*', '*Test*']) + // Individual class exemptions + ->skipClassViolation('CodeIgniter\\Cache\\ResponseCache', [ + 'CodeIgniter\\HTTP\\CLIRequest', + 'CodeIgniter\\HTTP\\Header', + 'CodeIgniter\\HTTP\\IncomingRequest', + 'CodeIgniter\\HTTP\\ResponseInterface', + ]) + ->skipClassViolation('CodeIgniter\\DataCaster\\DataCaster', [ + 'CodeIgniter\\Entity\\Cast\\CastInterface', + 'CodeIgniter\\Entity\\Exceptions\\CastException', + ]) + ->skipClassViolation('CodeIgniter\\DataCaster\\Exceptions\\CastException', [ + 'CodeIgniter\\Entity\\Exceptions\\CastException', + ]) + ->skipClassViolation('CodeIgniter\\DataConverter\\DataConverter', [ + 'CodeIgniter\\Entity\\Entity', + ]) + ->skipClassViolation('CodeIgniter\\Entity\\Cast\\URICast', [ + 'CodeIgniter\\HTTP\\URI', + ]) + ->skipClassViolation('CodeIgniter\\Log\\Handlers\\ChromeLoggerHandler', [ + 'CodeIgniter\\HTTP\\ResponseInterface', + ]) + ->skipClassViolation('CodeIgniter\\Security\\CheckPhpIni', [ + 'CodeIgniter\\View\\Table', + ]) + ->skipClassViolation('CodeIgniter\\View\\Table', [ + 'CodeIgniter\\Database\\BaseResult', + ]) + ->skipClassViolation('CodeIgniter\\View\\Plugins', [ + 'CodeIgniter\\HTTP\\URI', + ]) + // BC changes that should be fixed + ->skipClassViolation('CodeIgniter\\HTTP\\ResponseTrait', ['CodeIgniter\\Pager\\PagerInterface']) + ->skipClassViolation('CodeIgniter\\HTTP\\ResponseInterface', ['CodeIgniter\\Pager\\PagerInterface']) + ->skipClassViolation('CodeIgniter\\HTTP\\Response', ['CodeIgniter\\Pager\\PagerInterface']) + ->skipClassViolation('CodeIgniter\\HTTP\\RedirectResponse', ['CodeIgniter\\Pager\\PagerInterface']) + ->skipClassViolation('CodeIgniter\\HTTP\\DownloadResponse', ['CodeIgniter\\Pager\\PagerInterface']) + ->skipClassViolation('CodeIgniter\\Validation\\Validation', ['CodeIgniter\\View\\RendererInterface']); From ee057f15fba159d0bbde769c7438a6f82fefd8b0 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 May 2026 08:34:46 +0700 Subject: [PATCH 2/9] chore: migrate deptrac to structarmed --- .gitattributes | 1 - .github/workflows/test-deptrac.yml | 81 -------- admin/RELEASE.md | 2 +- composer.json | 2 +- deptrac.yaml | 285 ----------------------------- structarmed.php | 9 +- 6 files changed, 6 insertions(+), 374 deletions(-) delete mode 100644 .github/workflows/test-deptrac.yml delete mode 100644 deptrac.yaml diff --git a/.gitattributes b/.gitattributes index c2b4bb0759c9..2e8ae5426332 100644 --- a/.gitattributes +++ b/.gitattributes @@ -22,7 +22,6 @@ utils/ export-ignore .php-cs-fixer.no-header.php export-ignore .php-cs-fixer.tests.php export-ignore .php-cs-fixer.user-guide.php export-ignore -deptrac.yaml export-ignore phpmetrics.json export-ignore phpstan-baseline.php export-ignore phpstan-bootstrap.php export-ignore diff --git a/.github/workflows/test-deptrac.yml b/.github/workflows/test-deptrac.yml deleted file mode 100644 index 887a0a29ec6d..000000000000 --- a/.github/workflows/test-deptrac.yml +++ /dev/null @@ -1,81 +0,0 @@ -# When a PR is opened or a push is made, perform an -# architectural inspection on the code using Deptrac. -name: Deptrac - -on: - pull_request: - branches: - - 'develop' - - '4.*' - paths: - - 'app/**.php' - - 'system/**.php' - - 'composer.json' - - 'depfile.yaml' - - '.github/workflows/test-deptrac.yml' - push: - branches: - - 'develop' - - '4.*' - paths: - - 'app/**.php' - - 'system/**.php' - - 'composer.json' - - 'depfile.yaml' - - '.github/workflows/test-deptrac.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -permissions: - contents: read - -jobs: - build: - name: Architectural Inspection - runs-on: ubuntu-24.04 - steps: - - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - - name: Setup PHP - uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # 2.37.0 - with: - php-version: '8.2' - tools: composer - extensions: intl, json, mbstring, gd, mysqlnd, xdebug, xml, sqlite3 - - - name: Validate composer.json - run: composer validate --strict - - - name: Get composer cache directory - id: composer-cache - run: echo "COMPOSER_CACHE_FILES_DIR=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 - with: - path: ${{ steps.composer-cache.outputs.COMPOSER_CACHE_FILES_DIR }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Create Deptrac cache directory - run: mkdir -p build/ - - - name: Cache Deptrac results - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 - with: - path: build - key: ${{ runner.os }}-deptrac-${{ github.sha }} - restore-keys: ${{ runner.os }}-deptrac- - - - name: Install dependencies - run: composer update --ansi --no-interaction - - - name: Run architectural inspection - run: | - composer require --dev deptrac/deptrac - vendor/bin/deptrac analyze --cache-file=build/deptrac.cache - env: - GITHUB_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/admin/RELEASE.md b/admin/RELEASE.md index 4116520297e9..e9a0e71a13f0 100644 --- a/admin/RELEASE.md +++ b/admin/RELEASE.md @@ -107,7 +107,7 @@ the existing content. ``` git diff --name-status upstream/master -- . ':!.github/' ':!admin/' ':!changelogs/' ':!contributing/' \ ':!system/' ':!tests/' ':!user_guide_src/' ':!utils/' \ - ':!*.json' ':!*.xml' ':!*.dist' ':!rector.php' ':!deptrac.yml' \ + ':!*.json' ':!*.xml' ':!*.dist' ':!rector.php' \ ':!phpstan*' ':!psalm*' ':!.php-cs-fixer.*' ':!LICENSE' ':!CHANGELOG.md' ``` * Note: `tests/` is not used for distribution repos. See `admin/starter/tests/`. diff --git a/composer.json b/composer.json index c9cb78318d4d..8db08dd49904 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "psr/log": "^3.0" }, "require-dev": { - "boundwize/structarmed": "0.4.5", + "boundwize/structarmed": "0.5.0", "codeigniter/phpstan-codeigniter": "^1.5", "fakerphp/faker": "^1.24", "kint-php/kint": "^6.1", diff --git a/deptrac.yaml b/deptrac.yaml deleted file mode 100644 index 4f7d8367bae6..000000000000 --- a/deptrac.yaml +++ /dev/null @@ -1,285 +0,0 @@ -# Defines the layers for each framework -# component and their allowed interactions. -# The following components are exempt -# due to their global nature: -# - CLI & Commands -# - Config -# - Debug -# - Exception -# - Service -# - Validation\FormatRules -deptrac: - paths: - - ./app - - ./system - exclude_files: - - '#.*test.*#i' - layers: - - name: API - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\API\\.*$/' - - name: Cache - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Cache\\.*$/' - - name: Controller - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Controller$/' - - name: Cookie - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Cookie\\.*$/' - - name: Database - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Database\\.*$/' - - name: DataCaster - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\DataCaster\\.*$/' - - name: DataConverter - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\DataConverter\\.*$/' - - name: Email - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Email\\.*$/' - - name: Encryption - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Encryption\\.*$/' - - name: Entity - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Entity\\.*$/' - - name: Events - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Events\\.*$/' - - name: Files - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Files\\.*$/' - - name: Filters - collectors: - - type: bool - must: - - type: classNameRegex - value: '/^CodeIgniter\\Filters\\Filter.*$/' - - name: Format - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Format\\.*$/' - - name: Honeypot - collectors: - - type: classNameRegex - # includes the Filter - value: '/^CodeIgniter\\.*Honeypot.*$/' - - name: HTTP - collectors: - - type: bool - must: - - type: classNameRegex - value: '/^CodeIgniter\\HTTP\\.*$/' - must_not: - - type: classNameRegex - value: '(Exception|URI)' - - name: I18n - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\I18n\\.*$/' - - name: Images - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Images\\.*$/' - - name: Language - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Language\\.*$/' - - name: Log - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Log\\.*$/' - - name: Model - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\.*Model$/' - - name: Modules - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Modules\\.*$/' - - name: Pager - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Pager\\.*$/' - - name: Publisher - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Publisher\\.*$/' - - name: RESTful - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\RESTful\\.*$/' - - name: Router - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Router\\.*$/' - - name: Security - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Security\\.*$/' - - name: Session - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Session\\.*$/' - - name: Throttle - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Throttle\\.*$/' - - name: Typography - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\Typography\\.*$/' - - name: URI - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\HTTP\\URI$/' - - name: Validation - collectors: - - type: bool - must: - - type: classNameRegex - value: '/^CodeIgniter\\Validation\\.*$/' - must_not: - - type: classNameRegex - value: '/^CodeIgniter\\Validation\\FormatRules$/' - - name: View - collectors: - - type: classNameRegex - value: '/^CodeIgniter\\View\\.*$/' - ruleset: - API: - - Format - - HTTP - - Database - - Model - - Pager - - URI - Cache: - - I18n - Controller: - - HTTP - - Validation - Cookie: - - I18n - Database: - - Entity - - Events - - I18n - DataCaster: - - I18n - - URI - - Database - DataConverter: - - DataCaster - Email: - - I18n - - Events - Entity: - - DataCaster - - I18n - Files: - - I18n - Filters: - - HTTP - Honeypot: - - Filters - - HTTP - HTTP: - - Cookie - - Files - - I18n - - Security - - URI - Images: - - Files - - I18n - Model: - - Database - - DataCaster - - DataConverter - - Entity - - I18n - - Pager - - Validation - Pager: - - URI - - View - Publisher: - - Files - - URI - RESTful: - - +API - - +Controller - Router: - - HTTP - - I18n - Security: - - Cookie - - I18n - - Session - - HTTP - Session: - - Cookie - - HTTP - - Database - - I18n - Throttle: - - Cache - - I18n - Validation: - - HTTP - - Database - View: - - Cache - skip_violations: - # Individual class exemptions - CodeIgniter\Cache\ResponseCache: - - CodeIgniter\HTTP\CLIRequest - - CodeIgniter\HTTP\Header - - CodeIgniter\HTTP\IncomingRequest - - CodeIgniter\HTTP\ResponseInterface - CodeIgniter\DataCaster\DataCaster: - - CodeIgniter\Entity\Cast\CastInterface - - CodeIgniter\Entity\Exceptions\CastException - CodeIgniter\DataCaster\Exceptions\CastException: - - CodeIgniter\Entity\Exceptions\CastException - CodeIgniter\DataConverter\DataConverter: - - CodeIgniter\Entity\Entity - CodeIgniter\Entity\Cast\URICast: - - CodeIgniter\HTTP\URI - CodeIgniter\Log\Handlers\ChromeLoggerHandler: - - CodeIgniter\HTTP\ResponseInterface - CodeIgniter\Security\CheckPhpIni: - - CodeIgniter\View\Table - CodeIgniter\View\Table: - - CodeIgniter\Database\BaseResult - CodeIgniter\View\Plugins: - - CodeIgniter\HTTP\URI - - # BC changes that should be fixed - CodeIgniter\HTTP\ResponseTrait: - - CodeIgniter\Pager\PagerInterface - CodeIgniter\HTTP\ResponseInterface: - - CodeIgniter\Pager\PagerInterface - CodeIgniter\HTTP\Response: - - CodeIgniter\Pager\PagerInterface - CodeIgniter\HTTP\RedirectResponse: - - CodeIgniter\Pager\PagerInterface - CodeIgniter\HTTP\DownloadResponse: - - CodeIgniter\Pager\PagerInterface - CodeIgniter\Validation\Validation: - - CodeIgniter\View\RendererInterface diff --git a/structarmed.php b/structarmed.php index e16f7e267df2..15d4345b3d94 100644 --- a/structarmed.php +++ b/structarmed.php @@ -24,9 +24,7 @@ ]) ->cacheDirectory(is_dir('/tmp') ? '/tmp/structarmed' : null) ->withPreset(Preset::PSR4()) - // Layers — migrated from deptrac.yaml classNameRegex collectors. - // The following components are exempt due to their global nature: - // - CLI & Commands, Config, Debug, Exception, Service, Validation\FormatRules + ->layerPattern('API', '/^CodeIgniter\\\\API\\\\.*$/') ->layerPattern('Cache', '/^CodeIgniter\\\\Cache\\\\.*$/') ->layerPattern('Controller', '/^CodeIgniter\\\\Controller$/') @@ -87,8 +85,8 @@ 'Validation' => ['Database', 'HTTP'], 'View' => ['Cache'], ]) - ->skipPathsForRuleset(['*test*', '*Test*']) - // Individual class exemptions + ->skipPathsForRuleset(['*test*']) + ->skipClassViolation('CodeIgniter\\Cache\\ResponseCache', [ 'CodeIgniter\\HTTP\\CLIRequest', 'CodeIgniter\\HTTP\\Header', @@ -120,6 +118,7 @@ ->skipClassViolation('CodeIgniter\\View\\Plugins', [ 'CodeIgniter\\HTTP\\URI', ]) + // BC changes that should be fixed ->skipClassViolation('CodeIgniter\\HTTP\\ResponseTrait', ['CodeIgniter\\Pager\\PagerInterface']) ->skipClassViolation('CodeIgniter\\HTTP\\ResponseInterface', ['CodeIgniter\\Pager\\PagerInterface']) From 3a42cf4ce003e035bb4762751208997de4de6292 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 May 2026 08:37:53 +0700 Subject: [PATCH 3/9] chore: run rector on stuctarmed --- structarmed.php | 81 +++++++++++++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/structarmed.php b/structarmed.php index 15d4345b3d94..2f16529ec1b8 100644 --- a/structarmed.php +++ b/structarmed.php @@ -10,7 +10,30 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ - +use CodeIgniter\Cache\ResponseCache; +use CodeIgniter\HTTP\CLIRequest; +use CodeIgniter\HTTP\Header; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\DataCaster\DataCaster; +use CodeIgniter\Entity\Cast\CastInterface; +use CodeIgniter\Entity\Exceptions\CastException; +use CodeIgniter\DataConverter\DataConverter; +use CodeIgniter\Entity\Entity; +use CodeIgniter\Entity\Cast\URICast; +use CodeIgniter\HTTP\URI; +use CodeIgniter\Log\Handlers\ChromeLoggerHandler; +use CodeIgniter\Security\CheckPhpIni; +use CodeIgniter\View\Table; +use CodeIgniter\Database\BaseResult; +use CodeIgniter\View\Plugins; +use CodeIgniter\HTTP\ResponseTrait; +use CodeIgniter\Pager\PagerInterface; +use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\DownloadResponse; +use CodeIgniter\Validation\Validation; +use CodeIgniter\View\RendererInterface; use Boundwize\StructArmed\Architecture; use Boundwize\StructArmed\Preset\Preset; use Boundwize\StructArmed\Preset\Presets\Psr4Preset; @@ -87,42 +110,42 @@ ]) ->skipPathsForRuleset(['*test*']) - ->skipClassViolation('CodeIgniter\\Cache\\ResponseCache', [ - 'CodeIgniter\\HTTP\\CLIRequest', - 'CodeIgniter\\HTTP\\Header', - 'CodeIgniter\\HTTP\\IncomingRequest', - 'CodeIgniter\\HTTP\\ResponseInterface', + ->skipClassViolation(ResponseCache::class, [ + CLIRequest::class, + Header::class, + IncomingRequest::class, + ResponseInterface::class, ]) - ->skipClassViolation('CodeIgniter\\DataCaster\\DataCaster', [ - 'CodeIgniter\\Entity\\Cast\\CastInterface', - 'CodeIgniter\\Entity\\Exceptions\\CastException', + ->skipClassViolation(DataCaster::class, [ + CastInterface::class, + CastException::class, ]) - ->skipClassViolation('CodeIgniter\\DataCaster\\Exceptions\\CastException', [ - 'CodeIgniter\\Entity\\Exceptions\\CastException', + ->skipClassViolation(\CodeIgniter\DataCaster\Exceptions\CastException::class, [ + CastException::class, ]) - ->skipClassViolation('CodeIgniter\\DataConverter\\DataConverter', [ - 'CodeIgniter\\Entity\\Entity', + ->skipClassViolation(DataConverter::class, [ + Entity::class, ]) - ->skipClassViolation('CodeIgniter\\Entity\\Cast\\URICast', [ - 'CodeIgniter\\HTTP\\URI', + ->skipClassViolation(URICast::class, [ + URI::class, ]) - ->skipClassViolation('CodeIgniter\\Log\\Handlers\\ChromeLoggerHandler', [ - 'CodeIgniter\\HTTP\\ResponseInterface', + ->skipClassViolation(ChromeLoggerHandler::class, [ + ResponseInterface::class, ]) - ->skipClassViolation('CodeIgniter\\Security\\CheckPhpIni', [ - 'CodeIgniter\\View\\Table', + ->skipClassViolation(CheckPhpIni::class, [ + Table::class, ]) - ->skipClassViolation('CodeIgniter\\View\\Table', [ - 'CodeIgniter\\Database\\BaseResult', + ->skipClassViolation(Table::class, [ + BaseResult::class, ]) - ->skipClassViolation('CodeIgniter\\View\\Plugins', [ - 'CodeIgniter\\HTTP\\URI', + ->skipClassViolation(Plugins::class, [ + URI::class, ]) // BC changes that should be fixed - ->skipClassViolation('CodeIgniter\\HTTP\\ResponseTrait', ['CodeIgniter\\Pager\\PagerInterface']) - ->skipClassViolation('CodeIgniter\\HTTP\\ResponseInterface', ['CodeIgniter\\Pager\\PagerInterface']) - ->skipClassViolation('CodeIgniter\\HTTP\\Response', ['CodeIgniter\\Pager\\PagerInterface']) - ->skipClassViolation('CodeIgniter\\HTTP\\RedirectResponse', ['CodeIgniter\\Pager\\PagerInterface']) - ->skipClassViolation('CodeIgniter\\HTTP\\DownloadResponse', ['CodeIgniter\\Pager\\PagerInterface']) - ->skipClassViolation('CodeIgniter\\Validation\\Validation', ['CodeIgniter\\View\\RendererInterface']); + ->skipClassViolation(ResponseTrait::class, [PagerInterface::class]) + ->skipClassViolation(ResponseInterface::class, [PagerInterface::class]) + ->skipClassViolation(Response::class, [PagerInterface::class]) + ->skipClassViolation(RedirectResponse::class, [PagerInterface::class]) + ->skipClassViolation(DownloadResponse::class, [PagerInterface::class]) + ->skipClassViolation(Validation::class, [RendererInterface::class]); From c072e75c7ac7d414ccdac217f9b670422cea44cd Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 May 2026 09:22:27 +0700 Subject: [PATCH 4/9] chore: replace deptrac with structarmed in configs --- .gitattributes | 1 + admin/RELEASE.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 2e8ae5426332..b1d0822c10d5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -22,6 +22,7 @@ utils/ export-ignore .php-cs-fixer.no-header.php export-ignore .php-cs-fixer.tests.php export-ignore .php-cs-fixer.user-guide.php export-ignore +structarmed.php export-ignore phpmetrics.json export-ignore phpstan-baseline.php export-ignore phpstan-bootstrap.php export-ignore diff --git a/admin/RELEASE.md b/admin/RELEASE.md index e9a0e71a13f0..75b4e26b2b31 100644 --- a/admin/RELEASE.md +++ b/admin/RELEASE.md @@ -107,7 +107,7 @@ the existing content. ``` git diff --name-status upstream/master -- . ':!.github/' ':!admin/' ':!changelogs/' ':!contributing/' \ ':!system/' ':!tests/' ':!user_guide_src/' ':!utils/' \ - ':!*.json' ':!*.xml' ':!*.dist' ':!rector.php' \ + ':!*.json' ':!*.xml' ':!*.dist' ':!rector.php' ':!structarmed.php' \ ':!phpstan*' ':!psalm*' ':!.php-cs-fixer.*' ':!LICENSE' ':!CHANGELOG.md' ``` * Note: `tests/` is not used for distribution repos. See `admin/starter/tests/`. From e2bfabbc037626caede2bdd59549eb6823b86946 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 May 2026 09:23:16 +0700 Subject: [PATCH 5/9] chore: cs fix --- structarmed.php | 1 + 1 file changed, 1 insertion(+) diff --git a/structarmed.php b/structarmed.php index 2f16529ec1b8..80a4cc25c486 100644 --- a/structarmed.php +++ b/structarmed.php @@ -10,6 +10,7 @@ * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ + use CodeIgniter\Cache\ResponseCache; use CodeIgniter\HTTP\CLIRequest; use CodeIgniter\HTTP\Header; From 645832af204f69976a168473735683fd7deb301c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 13 May 2026 23:58:23 +0700 Subject: [PATCH 6/9] chore: bump to latest 0.5.1 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8db08dd49904..1eb98324a161 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "psr/log": "^3.0" }, "require-dev": { - "boundwize/structarmed": "0.5.0", + "boundwize/structarmed": "0.5.1", "codeigniter/phpstan-codeigniter": "^1.5", "fakerphp/faker": "^1.24", "kint-php/kint": "^6.1", From 4e8e4f3fed1aa495ecf38247bdc05d50c28ceff8 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 May 2026 11:47:10 +0700 Subject: [PATCH 7/9] chore: bump to structarmed 0.5.2 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1eb98324a161..5b3b2552b008 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "psr/log": "^3.0" }, "require-dev": { - "boundwize/structarmed": "0.5.1", + "boundwize/structarmed": "0.5.2", "codeigniter/phpstan-codeigniter": "^1.5", "fakerphp/faker": "^1.24", "kint-php/kint": "^6.1", From 893112bdbc8b089bff92e06c105105135e09a326 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 May 2026 20:28:57 +0700 Subject: [PATCH 8/9] chore: bump to structarmed 0.5.3 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5b3b2552b008..2284f64576b8 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "psr/log": "^3.0" }, "require-dev": { - "boundwize/structarmed": "0.5.2", + "boundwize/structarmed": "0.5.3", "codeigniter/phpstan-codeigniter": "^1.5", "fakerphp/faker": "^1.24", "kint-php/kint": "^6.1", From 8e5532ff49ad4ab962fe8d07dc3e19ea3b76e0bb Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 14 May 2026 22:31:34 +0700 Subject: [PATCH 9/9] chore: bump to structarmed 0.5.4 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2284f64576b8..aed3cb6cb38c 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "psr/log": "^3.0" }, "require-dev": { - "boundwize/structarmed": "0.5.3", + "boundwize/structarmed": "0.5.4", "codeigniter/phpstan-codeigniter": "^1.5", "fakerphp/faker": "^1.24", "kint-php/kint": "^6.1",