diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..b4b31c2 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,38 @@ +name: Release + +on: + push: + branches: + - "master" + +env: + PHP_EXTENSIONS: "zip" + PHP_VERSION: "8.3" + +jobs: + release: + runs-on: ubuntu-latest + + permissions: + contents: write + pull-requests: write + + if: github.ref == 'refs/heads/master' + + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "${{ env.PHP_VERSION }}" + extensions: "${{ env.PHP_EXTENSIONS }}" + tools: humbug/box + + - name: Validate composer.json and composer.lock + run: composer validate --strict + + - uses: google-github-actions/release-please-action@v4 + id: create_release + with: + target-branch: master diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..dd9f724 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,42 @@ +name: Tests + +on: + push: + branches: ["master"] + pull_request: + branches: ["*"] + +permissions: + contents: read + +jobs: + tests: + + strategy: + matrix: + php_version: ["7.4", "8.0", "8.1", "8.2", "8.3"] + + runs-on: ubuntu-latest + container: + image: "lephare/php:${{ matrix.php_version }}" + env: + XDEBUG_MODE: coverage + + steps: + - uses: actions/checkout@v4 + + - name: Validate composer.json and composer.lock + run: composer validate --strict + + - name: Install dependencies (PHP ${{ matrix.php_version }}) + run: | + composer config --global cache-dir .composer + composer install --prefer-dist --no-interaction --no-progress + + - name: Coding Style (PHP ${{ matrix.php_version }}) + run: | + composer run-script lint:ci + composer run-script analyse + + - name: Unit Tests (PHP ${{ matrix.php_version }}) + run: composer run-script test:ci diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..ba67087 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "2.1.0" +} diff --git a/Handler/RotatingFileHandler.php b/Handler/RotatingFileHandler.php index 1fb48de..b9d076e 100644 --- a/Handler/RotatingFileHandler.php +++ b/Handler/RotatingFileHandler.php @@ -3,23 +3,8 @@ namespace LePhare\Import\Handler; use Monolog\Handler\RotatingFileHandler as BaseRotatingFileHandler; -use Monolog\Logger; -if (Logger::API === 1) { - class RotatingFileHandler extends BaseRotatingFileHandler - { - use RotatingFileHandlerTrait { - setFilenameFormat as private typedSetFilenameFormat; - } - - public function setFilenameFormat($filenameFormat, $dateFormat) - { - return $this->typedSetFilenameFormat($filenameFormat, $dateFormat); - } - } -} else { - class RotatingFileHandler extends BaseRotatingFileHandler - { - use RotatingFileHandlerTrait; - } +class RotatingFileHandler extends BaseRotatingFileHandler +{ + use RotatingFileHandlerTrait; } diff --git a/Import.php b/Import.php index 0c56aaa..5323647 100644 --- a/Import.php +++ b/Import.php @@ -41,7 +41,7 @@ public function __construct( StrategyRepositoryInterface $strategyRepository, LoadStrategyRepositoryInterface $loadStrategyRepository, ConfigurationInterface $configuration, - LoggerInterface $logger = null + ?LoggerInterface $logger = null ) { $this->configuration = $configuration; $this->connection = $connection; diff --git a/ImportConfiguration.php b/ImportConfiguration.php index 79a1bf3..b7ff1cf 100644 --- a/ImportConfiguration.php +++ b/ImportConfiguration.php @@ -20,7 +20,7 @@ public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('import'); - /** @var ArrayNodeDefinition */ + /** @var ArrayNodeDefinition $rootNode */ $rootNode = $treeBuilder->getRootNode(); $replaceParameter = function ($string) { diff --git a/Load/CsvLoader.php b/Load/CsvLoader.php index 66723b0..7d3491a 100644 --- a/Load/CsvLoader.php +++ b/Load/CsvLoader.php @@ -4,10 +4,10 @@ use Behat\Transliterator\Transliterator; use Doctrine\DBAL\Connection; +use ForceUTF8\Encoding; use LePhare\Import\Configuration\CredentialsInterface; use LePhare\Import\Exception\ImportException; use LePhare\Import\ImportResource; -use ForceUTF8\Encoding; /** @api */ class CsvLoader implements LoaderInterface diff --git a/Load/ExcelLoader.php b/Load/ExcelLoader.php index ccee34e..e2b14d0 100644 --- a/Load/ExcelLoader.php +++ b/Load/ExcelLoader.php @@ -17,7 +17,7 @@ public function supports(ImportResource $resource, array $context): bool return false; } - if (!class_exists(\PhpOffice\PhpSpreadsheet\IOFactory::class)) { + if (!class_exists(IOFactory::class)) { throw new ImportException('PhpSpreadsheet library is missing. Try "composer require phpoffice/phpspreadsheet"'); } diff --git a/Load/TextLoader.php b/Load/TextLoader.php index b3e0b3b..c91b713 100644 --- a/Load/TextLoader.php +++ b/Load/TextLoader.php @@ -4,10 +4,10 @@ use Behat\Transliterator\Transliterator; use Doctrine\DBAL\Connection; +use ForceUTF8\Encoding; use LePhare\Import\Configuration\CredentialsInterface; use LePhare\Import\Exception\ImportException; use LePhare\Import\ImportResource; -use ForceUTF8\Encoding; /** @api */ class TextLoader implements LoaderInterface diff --git a/Tests/ImportConfigurationTest.php b/Tests/ImportConfigurationTest.php index cd1b43e..a143ff7 100644 --- a/Tests/ImportConfigurationTest.php +++ b/Tests/ImportConfigurationTest.php @@ -134,7 +134,7 @@ public function providerConfigurations(): iterable ]; yield '“delimiter” should be evaluated' => [ - array_merge($defaults, [ + array_merge($defaults, [ 'name' => $config['name'], 'source_dir' => str_replace('%kernel.project_dir%', '/app', $config['source_dir']), 'resources' => [ diff --git a/Tests/ImportTest.php b/Tests/ImportTest.php index 8876366..836b26c 100644 --- a/Tests/ImportTest.php +++ b/Tests/ImportTest.php @@ -18,7 +18,6 @@ use Psr\Log\LoggerInterface; use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\Yaml\Yaml; /** * @covers \LePhare\Import\Import @@ -112,7 +111,7 @@ public function testExecuteWithException(): void 'strategy' => 'load_alphabetically', ], ], - ], ])); + ], ])); $this->assertFalse($this->import->execute()); } @@ -142,7 +141,7 @@ public function testExecuteWithWrongStrategyShouldFail(): void 'strategy' => 'bad_strategy_name', ], ], - ], ])); + ], ])); $this->assertFalse($this->import->execute()); } diff --git a/composer.json b/composer.json index cfa16a3..a3361f4 100644 --- a/composer.json +++ b/composer.json @@ -47,11 +47,20 @@ "php-mock/php-mock-prophecy": "^0.1.1", "phpoffice/phpspreadsheet": "^1.19", "phpspec/prophecy": "^1.10", + "phpspec/prophecy-phpunit": "^2.2", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^9.6", "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" }, + "scripts": { + "analyse": "./vendor/bin/phpstan analyse --no-progress", + "lint": "@lint:fix --dry-run", + "lint:ci": "@lint:fix --using-cache=no --dry-run", + "lint:fix": "./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php", + "test:ci": "@test --colors=never --coverage-text", + "test": "./vendor/bin/phpunit" + }, "suggest": { "phpoffice/phpspreadsheet": "Import XLS files" }, diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 8093026..cd509b7 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -6,4 +6,13 @@ parameters: - . excludePaths: - vendor + ignoreErrors: + - + message: '#Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface::.+\(\)#' + paths: + - ImportConfiguration.php + - + message: '#Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition::.+\(\)#' + paths: + - ImportConfiguration.php tmpDir: .phpstan.cache diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4bc1b0b..fd7b1bd 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,21 +1,19 @@ - - - - - ./Tests/ - - - - - - ./ - - ./ - ./Resources - ./Tests - ./vendor - - - + + + + ./ + + + ./ + ./Resources + ./Tests + ./vendor + + + + + ./Tests/ + + diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..6c048d2 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "php", + "include-component-in-tag": false, + "packages": { + ".": { + "changelog-path": "CHANGELOG.md", + "draft": true, + "package-name": "release-please-action", + "release-type": "php" + } + } +}