From 7cd76eb8e661820c4e289914a9cf6fd7d83060de Mon Sep 17 00:00:00 2001 From: MGatner Date: Mon, 13 Sep 2021 22:54:49 +0000 Subject: [PATCH] Update toolkit --- .github/workflows/analyze.yml | 11 ++- .github/workflows/compare.yml | 29 ++++++ .github/workflows/deduplicate.yml | 39 ++++++++ .github/workflows/inspect.yml | 79 +++++++++++++++ .github/workflows/test.yml | 12 ++- .php-cs-fixer.dist.php | 34 +++++++ README.md | 5 + SECURITY.md | 26 +++++ composer.json | 123 +++++++++++++----------- depfile.yaml | 153 ++++++++++++++++++++++++++++++ phpunit.xml.dist | 33 ++++++- roave-bc-check.yaml | 3 + 12 files changed, 486 insertions(+), 61 deletions(-) create mode 100644 .github/workflows/compare.yml create mode 100644 .github/workflows/deduplicate.yml create mode 100644 .github/workflows/inspect.yml create mode 100644 .php-cs-fixer.dist.php create mode 100644 SECURITY.md create mode 100644 depfile.yaml create mode 100644 roave-bc-check.yaml diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index bd93b20..12c48c1 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -39,7 +39,9 @@ jobs: with: php-version: ${{ matrix.php-versions }} tools: composer, pecl, phpunit - extensions: intl, json, mbstring, mysqlnd, xdebug, xml, sqlite3 + extensions: intl, json, mbstring, gd, mysqlnd, xdebug, xml, sqlite3 + env: + COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Get composer cache directory id: composer-cache @@ -65,7 +67,12 @@ jobs: key: ${{ runner.os }}-phpstan-${{ github.sha }} restore-keys: ${{ runner.os }}-phpstan- - - name: Install dependencies + - name: Install dependencies (limited) + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name }} + run: composer update --no-progress --no-interaction --prefer-dist --optimize-autoloader + + - name: Install dependencies (authenticated) + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }} run: composer update --no-progress --no-interaction --prefer-dist --optimize-autoloader env: COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }} diff --git a/.github/workflows/compare.yml b/.github/workflows/compare.yml new file mode 100644 index 0000000..c6b5e9b --- /dev/null +++ b/.github/workflows/compare.yml @@ -0,0 +1,29 @@ +# When a PR is opened or a push is made, compare +# code for backwards compatibility. +name: RoaveBC + +on: + pull_request: + branches: + - develop + paths: + - 'src/**' + +jobs: + compare: + name: Compare for Backwards Compatibility + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Run comparison (limited) + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name }} + uses: docker://nyholm/roave-bc-check-ga + + - name: Run comparison (authenticated) + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }} + uses: docker://nyholm/roave-bc-check-ga + env: + COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }} diff --git a/.github/workflows/deduplicate.yml b/.github/workflows/deduplicate.yml new file mode 100644 index 0000000..0b3994c --- /dev/null +++ b/.github/workflows/deduplicate.yml @@ -0,0 +1,39 @@ +# When a PR is opened or a push is made, check code +# for duplication with PHP Copy/Paste Detector. +name: PHPCPD + +on: + pull_request: + branches: + - 'develop' + paths: + - 'src/**' + - 'tests/**' + - '.github/workflows/test-phpcpd.yml' + push: + branches: + - 'develop' + paths: + - 'src/**' + - 'tests/**' + - '.github/workflows/test-phpcpd.yml' + +jobs: + build: + name: Duplicate Code Detection + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.0' + tools: phive + extensions: intl, json, mbstring, xml + + - name: Detect code duplication + run: | + sudo phive --no-progress install --global --trust-gpg-keys 4AA394086372C20A phpcpd + phpcpd src/ tests/ diff --git a/.github/workflows/inspect.yml b/.github/workflows/inspect.yml new file mode 100644 index 0000000..9ad7ee5 --- /dev/null +++ b/.github/workflows/inspect.yml @@ -0,0 +1,79 @@ +# 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' + paths: + - 'src/**' + - 'tests/**' + - 'composer.**' + - 'depfile.yaml' + - '.github/workflows/inspect.yml' + push: + branches: + - 'develop' + paths: + - 'src/**' + - 'tests/**' + - 'composer.**' + - 'depfile.yaml' + - '.github/workflows/inspect.yml' + +jobs: + build: + name: Architectural Inspection + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.0' + tools: composer, pecl, phive + extensions: intl, json, mbstring, xml + env: + COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Create composer cache directory + run: mkdir -p ${{ steps.composer-cache.outputs.dir }} + + - name: Cache composer dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.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@v2 + with: + path: build + key: ${{ runner.os }}-deptrac-${{ github.sha }} + restore-keys: ${{ runner.os }}-deptrac- + + - name: Install dependencies (limited) + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name }} + run: composer update --no-progress --no-interaction --prefer-dist --optimize-autoloader + + - name: Install dependencies (authenticated) + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }} + run: composer update --no-progress --no-interaction --prefer-dist --optimize-autoloader + env: + COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }} + + - name: Run architectural inspection + run: | + sudo phive --no-progress install --global --trust-gpg-keys B8F640134AB1782E,A98E898BB53EB748 qossmic/deptrac + deptrac analyze --cache-file=build/deptrac.cache diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a1cb9a3..561601d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,8 +29,10 @@ jobs: with: php-version: ${{ matrix.php-versions }} tools: composer, pecl, phpunit - extensions: intl, json, mbstring, mysqlnd, xdebug, xml, sqlite3 + extensions: intl, json, mbstring, gd, mysqlnd, xdebug, xml, sqlite3 coverage: xdebug + env: + COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Get composer cache directory id: composer-cache @@ -43,7 +45,12 @@ jobs: key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: ${{ runner.os }}-composer- - - name: Install dependencies + - name: Install dependencies (limited) + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name }} + run: composer update --no-progress --no-interaction --prefer-dist --optimize-autoloader + + - name: Install dependencies (authenticated) + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }} run: composer update --no-progress --no-interaction --prefer-dist --optimize-autoloader env: COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }} @@ -52,6 +59,7 @@ jobs: run: vendor/bin/phpunit --verbose --coverage-text env: TERM: xterm-256color + TACHYCARDIA_MONITOR_GA: enabled - if: matrix.php-versions == '8.0' name: Mutate with Infection diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000..29c0518 --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,34 @@ +files() + ->in(__DIR__) + ->exclude('build') + ->append([__FILE__]); + +// Remove overrides for incremental changes +$overrides = [ + 'array_indentation' => false, + 'braces' => false, + 'indentation_type' => false, +]; + +$options = [ + 'finder' => $finder, + 'cacheFile' => 'build/.php-cs-fixer.cache', +]; + +return Factory::create(new CodeIgniter4(), $overrides, $options)->forProjects(); + +/* Reenable For libraries after incremental changes are applied +return Factory::create(new CodeIgniter4(), $overrides, $options)->forLibrary( + 'Tatter ________', + 'Tatter Software', + '', + 2021 +); + */ diff --git a/README.md b/README.md index aca3b01..6c45f76 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # Tatter\Handlers Cross-module handler registration, for CodeIgniter 4 +[![](https://github.com/tattersoftware/codeigniter4-handlers/workflows/PHPUnit/badge.svg)](https://github.com/tattersoftware/codeigniter4-handlers/actions/workflows/test.yml) +[![](https://github.com/tattersoftware/codeigniter4-handlers/workflows/PHPStan/badge.svg)](https://github.com/tattersoftware/codeigniter4-handlers/actions/workflows/analyze.yml) +[![](https://github.com/tattersoftware/codeigniter4-handlers/workflows/Deptrac/badge.svg)](https://github.com/tattersoftware/codeigniter4-handlers/actions/workflows/inspect.yml) +[![Coverage Status](https://coveralls.io/repos/github/tattersoftware/codeigniter4-handlers/badge.svg?branch=develop)](https://coveralls.io/github/tattersoftware/codeigniter4-handlers?branch=develop) + ## Quick Start 1. Install with Composer: `> composer require tatter/handlers` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..459a5fb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,26 @@ +# Security Policy + +The development team and community take all security issues seriously. **Please do not make public any uncovered flaws.** + +## Reporting a Vulnerability + +Thank you for improving the security of our code! Any assistance in removing security flaws will be acknowledged. + +**Please report security flaws by emailing the development team directly: support@tattersoftware.com**. + +The lead maintainer will acknowledge your email within 48 hours, and will send a more detailed response within 48 hours indicating +the next steps in handling your report. After the initial reply to your report, the security team will endeavor to keep you informed of the +progress towards a fix and full announcement, and may ask for additional information or guidance. + +## Disclosure Policy + +When the security team receives a security bug report, they will assign it to a primary handler. +This person will coordinate the fix and release process, involving the following steps: + +- Confirm the problem and determine the affected versions. +- Audit code to find any potential similar problems. +- Prepare fixes for all releases still under maintenance. These fixes will be released as fast as possible. + +## Comments on this Policy + +If you have suggestions on how this process could be improved please submit a Pull Request. diff --git a/composer.json b/composer.json index 3ab9dc9..86582f2 100644 --- a/composer.json +++ b/composer.json @@ -1,58 +1,69 @@ { - "name": "tatter/handlers", - "type": "library", - "description": "Cross-module handler registration, for CodeIgniter 4", - "keywords": [ - "codeigniter", - "codeigniter4", - "handlers", - "adapters", - "drivers", - "modules", - "autoload" - ], - "homepage": "https://github.com/tattersoftware/codeigniter4-handlers", - "license": "MIT", - "authors": [ - { - "name": "Matthew Gatner", - "email": "mgatner@tattersoftware.com", - "homepage": "https://tattersoftware.com", - "role": "Developer" - } - ], - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "codeigniter4/codeigniter4": "dev-develop", - "tatter/tools": "^1.6" - }, - "autoload": { - "psr-4": { - "Tatter\\Handlers\\": "src" - }, - "exclude-from-classmap": [ - "**/Database/Migrations/**" - ] - }, - "autoload-dev": { - "psr-4": { - "Tests\\Support\\": "tests/_support" - } - }, - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/codeigniter4/CodeIgniter4" - } - ], - "minimum-stability": "dev", - "prefer-stable": true, - "scripts": { - "analyze": "phpstan analyze", - "mutate": "infection --threads=2 --skip-initial-tests --coverage=build/phpunit", - "style": "phpcbf --standard=./vendor/codeigniter4/codeigniter4-standard/CodeIgniter4 tests/ src/", - "test": "phpunit" - } + "name": "tatter/handlers", + "type": "library", + "description": "Cross-module handler registration, for CodeIgniter 4", + "keywords": [ + "codeigniter", + "codeigniter4", + "handlers", + "adapters", + "drivers", + "modules", + "autoload" + ], + "homepage": "https://github.com/tattersoftware/codeigniter4-handlers", + "license": "MIT", + "authors": [ + { + "name": "Matthew Gatner", + "email": "mgatner@tattersoftware.com", + "homepage": "https://tattersoftware.com", + "role": "Developer" + } + ], + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "codeigniter4/codeigniter4": "dev-develop", + "tatter/tools": "^1.12" + }, + "autoload": { + "psr-4": { + "Tatter\\Handlers\\": "src" + }, + "exclude-from-classmap": [ + "**/Database/Migrations/**" + ] + }, + "autoload-dev": { + "psr-4": { + "Tests\\Support\\": "tests/_support" + } + }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/codeigniter4/CodeIgniter4" + } + ], + "minimum-stability": "dev", + "prefer-stable": true, + "scripts": { + "analyze": "phpstan analyze", + "ci": [ + "Composer\\Config::disableProcessTimeout", + "@deduplicate", + "@analyze", + "@test", + "@mutate", + "@inspect", + "@style" + ], + "deduplicate": "phpcpd app/ src/", + "inspect": "deptrac analyze --cache-file=build/deptrac.cache", + "mutate": "infection --threads=2 --skip-initial-tests --coverage=build/phpunit", + "style": "php-cs-fixer fix --verbose --ansi --using-cache=no", + "test": "phpunit" + } } diff --git a/depfile.yaml b/depfile.yaml new file mode 100644 index 0000000..79ec82a --- /dev/null +++ b/depfile.yaml @@ -0,0 +1,153 @@ +paths: + - ./src + - ./vendor/codeigniter4/codeigniter4/system + - ./vendor/tatter +exclude_files: + - '#.*test.*#i' +layers: + - name: Model + collectors: + - type: bool + must: + - type: className + regex: .*[A-Za-z]+Model$ + must_not: + - type: directory + regex: vendor/.* + - name: Vendor Model + collectors: + - type: bool + must: + - type: className + regex: .*[A-Za-z]+Model$ + - type: directory + regex: vendor/.* + - name: Controller + collectors: + - type: bool + must: + - type: className + regex: .*\/Controllers\/.* + must_not: + - type: directory + regex: vendor/.* + - name: Vendor Controller + collectors: + - type: bool + must: + - type: className + regex: .*\/Controllers\/.* + - type: directory + regex: vendor/.* + - name: Config + collectors: + - type: bool + must: + - type: directory + regex: src/Config/.* + must_not: + - type: className + regex: .*Services + - type: directory + regex: vendor/.* + - name: Vendor Config + collectors: + - type: bool + must: + - type: directory + regex: vendor/.*/Config/.* + must_not: + - type: className + regex: .*Services + - name: Entity + collectors: + - type: bool + must: + - type: directory + regex: src/Entities/.* + must_not: + - type: directory + regex: vendor/.* + - name: Vendor Entity + collectors: + - type: bool + must: + - type: directory + regex: vendor/.*/Entities/.* + - name: View + collectors: + - type: bool + must: + - type: directory + regex: src/Views/.* + must_not: + - type: directory + regex: vendor/.* + - name: Vendor View + collectors: + - type: bool + must: + - type: directory + regex: vendor/.*/Views/.* + - name: Service + collectors: + - type: className + regex: .*Services.* +ruleset: + Entity: + - Config + - Model + - Service + - Vendor Config + - Vendor Entity + - Vendor Model + Config: + - Service + - Vendor Config + Model: + - Config + - Entity + - Service + - Vendor Config + - Vendor Model + Service: + - Config + - Vendor Config + + # Ignore anything in the Vendor layers + Vendor Model: + - Service + - Vendor Config + - Vendor Controller + - Vendor Entity + - Vendor Model + - Vendor View + Vendor Controller: + - Service + - Vendor Config + - Vendor Controller + - Vendor Entity + - Vendor Model + - Vendor View + Vendor Config: + - Service + - Vendor Config + - Vendor Controller + - Vendor Entity + - Vendor Model + - Vendor View + Vendor Entity: + - Service + - Vendor Config + - Vendor Controller + - Vendor Entity + - Vendor Model + - Vendor View + Vendor View: + - Service + - Vendor Config + - Vendor Controller + - Vendor Entity + - Vendor Model + - Vendor View +skip_violations: diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 01f689c..a90a1f2 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,17 +1,23 @@ + verbose="true"> @@ -36,6 +42,30 @@ + + + + + + 0.50 + + + 30 + + + 2 + + + true + + + true + + + + + + @@ -59,6 +89,7 @@ +