From 7b304358b81376cd4c361c1bfa53a94f57c40430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20S=C4=85gol?= Date: Mon, 18 Dec 2023 17:54:22 +0100 Subject: [PATCH] #44 WIP: Add automatic github action to run unit tests and php-cs-fixer on every PR --- .github/workflows/ci.yml | 97 ++++++++++++++++++++++++++++ .php-cs-fixer.dist.php | 136 +++++++++++---------------------------- composer.json | 4 ++ 3 files changed, 138 insertions(+), 99 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..902e220 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,97 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + schedule: + - cron: '15 3 * * 1' +jobs: + php-lint: + name: PHP linter + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + coverage: none + tools: composer:v2 + - name: Run PHP lint + run: composer ci:php:lint + strategy: + fail-fast: false + matrix: + php-version: + - 8.2 + code-quality: + name: Code quality checks + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + coverage: none + tools: composer:v2 + - name: Show composer version + run: composer --version + - name: Cache composer dependencies + uses: actions/cache@v3 + with: + path: ~/.composer/cache + key: ${{ runner.os }}-php-${{ matrix.php-versions }}-composer-${{ hashFiles('composer.json', 'composer.lock') }} + restore-keys: | + ${{ runner.os }}-php-${{ matrix.php-versions }}-composer- + - name: Install composer dependencies + run: composer install --no-progress + - name: Run command + run: composer ${{ matrix.command }} + strategy: + fail-fast: false + matrix: + command: + - ci:php:cs-fixer + php-version: + - 8.2 + tests: + runs-on: ubuntu-latest + strategy: + max-parallel: 2 + matrix: + php-versions: [8.2] + + name: Run tests with PHP ${{ matrix.php-versions }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up PHP ${{ matrix.php-versions }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + tools: composer:v2 + + - name: Validate composer.json and composer.lock + run: composer validate --strict + + - name: Cache composer dependencies + uses: actions/cache@v3 + with: + path: ~/.composer/cache + key: ${{ runner.os }}-php-${{ matrix.php-versions }}-composer-${{ hashFiles('composer.json', 'composer.lock') }} + restore-keys: | + ${{ runner.os }}-php-${{ matrix.php-versions }}-composer- + + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run Unit tests + run: composer ci:test:unit \ No newline at end of file diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index ca305b4..c21a69d 100755 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -1,105 +1,43 @@ exclude('vendor') - ->exclude('typo3conf') - ->exclude('typo3temp') - ->exclude('typo3/sysext/core/Tests/Acceptance/Support/_generated') - ->notName('install.php') - ->notName('index.php') - ->in(__DIR__ . '/../'); -// Return a Code Sniffing configuration using -// all sniffers needed for PSR-2 -// and additionally: -// - Remove leading slashes in use clauses. -// - PHP single-line arrays should not have trailing comma. -// - Single-line whitespace before closing semicolon are prohibited. -// - Remove unused use statements in the PHP source code -// - Ensure Concatenation to have at least one whitespace around -// - Remove trailing whitespace at the end of blank lines. + +$fileHeaderComment = << + +For the full copyright and license information, please view the LICENSE +file that was distributed with this source code. +COMMENT; + +$finder = PhpCsFixer\Finder::create() + ->in(__DIR__) + ->exclude('config') + ->exclude('var') + ->exclude('public/bundles') + ->exclude('public/build') + // exclude files generated by Symfony Flex recipes + ->notPath('bin/console') + ->notPath('public/index.php') + ->notPath('importmap.php') +; + return (new PhpCsFixer\Config()) ->setRiskyAllowed(true) ->setRules([ - '@DoctrineAnnotation' => true, - '@PSR2' => true, - 'array_syntax' => ['syntax' => 'short'], - 'blank_line_after_opening_tag' => true, - 'braces' => ['allow_single_line_closure' => true], - 'cast_spaces' => ['space' => 'none'], - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'declare_equal_normalize' => ['space' => 'none'], - 'dir_constant' => true, - 'function_typehint_space' => true, - 'single_line_comment_style' => ['comment_types' => ['hash']], - 'lowercase_cast' => true, - 'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'], - 'modernize_types_casting' => true, - 'native_function_casing' => true, - 'new_with_braces' => true, - 'no_alias_functions' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_null_property_initialization' => true, - 'no_short_bool_cast' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_superfluous_elseif' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unused_imports' => true, + '@Symfony' => true, + '@Symfony:risky' => true, + 'header_comment' => ['header' => $fileHeaderComment, 'separate' => 'both'], + 'linebreak_after_opening_tag' => true, + 'mb_str_functions' => true, + 'no_php4_constructor' => true, + 'no_unreachable_default_argument_value' => true, 'no_useless_else' => true, - 'no_whitespace_in_blank_line' => true, - 'ordered_imports' => true, - 'php_unit_construct' => ['assertions' => ['assertEquals', 'assertSame', 'assertNotEquals', 'assertNotSame']], - 'php_unit_mock_short_will_return' => true, - 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_scalar' => true, - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], - 'return_type_declaration' => ['space_before' => 'none'], - 'single_quote' => true, - 'single_trait_insert_per_statement' => true, - 'whitespace_after_comma_in_array' => true, + 'no_useless_return' => true, + 'php_unit_strict' => true, + 'phpdoc_order' => true, + 'strict_comparison' => true, + 'strict_param' => true, + 'blank_line_between_import_groups' => false, ]) - ->setFinder($finder); + ->setFinder($finder) + ->setCacheFile(__DIR__.'/var/.php-cs-fixer.cache'); \ No newline at end of file diff --git a/composer.json b/composer.json index 63024f9..c949ab5 100644 --- a/composer.json +++ b/composer.json @@ -70,6 +70,10 @@ "post-update-cmd": [ "@auto-scripts" ], + "ci:php:cs-fixer": [ + "php-cs-fixer fix -v --dry-run --using-cache no --diff ." + ], + "ci:php:lint": "find *.php src tests -name '*.php' -print0 | xargs -0 -n 1 -P 4 php -l", "ci:test:unit": [ "php bin/phpunit -c phpunit.xml.dist" ],