From d3ed860afda4b845c42a82668d8eb213aab6299d Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Mon, 21 Oct 2024 17:45:03 +0200 Subject: [PATCH 01/33] Set dependency "cleverage/process-bundle": "dev-prepare-release" --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4e02f68..c641dec 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ } }, "require": { - "cleverage/process-bundle": "dev-v4-dev", + "cleverage/process-bundle": "dev-prepare-release", "doctrine/orm": "^2", "doctrine/doctrine-bundle": "^2" }, From 7cda8efa85045f82b46d15950430167cc8d39612 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 15:14:20 +0200 Subject: [PATCH 02/33] #3 Update README. Add docs, CHANGELOG & CONTRIBUTING. --- CHANGELOG.md | 67 +++++++++++++++++++ CONTRIBUTING.md | 52 ++++++++++++++ LICENSE | 2 +- README.md | 24 +++++-- docs/index.md | 35 ++++++++++ docs/reference/tasks/_template.md | 44 ++++++++++++ .../reference/tasks/database_reader_task.md | 4 +- .../reference/tasks/doctrine_writer_task.md | 2 +- 8 files changed, 220 insertions(+), 10 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 docs/index.md create mode 100644 docs/reference/tasks/_template.md rename src/Documentation/reference/task/doctrine_reader_task.md => docs/reference/tasks/database_reader_task.md (94%) rename src/Documentation/reference/task/doctrine_updater_task.md => docs/reference/tasks/doctrine_writer_task.md (86%) diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..502025b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,67 @@ +v2.0 +------ + +## BC breaks + +### Changes + +### Fixes + +v2.0-RC1 +------ + +### Changes + +* Miscellaneous changes, show full diff : https://github.com/cleverage/doctrine-process-bundle/compare/v1.0.6...v2.0-RC1 + +v1.0.6 +------ + +### Changes + +* Removing `sidus/base-bundle` dependency + +### Fixes + +* Fixing services.yaml after refactoring + +v1.0.5 +------ + +### Changes + +* Fixed dependencies after removing `sidus/base-bundle` from the base process bundle + +v1.0.4 +------ + +### Fixes + +* Fixed OptionsResolver needing "null" instead of "NULL" +* Fixed backward compatibility break after protected function removal + +v1.0.3 +------ + +### Fixes + +* Fixing update task and allowing to input params properly to both reader and updater tasks + +v1.0.2 +------ + +### Changes + +* Add DoctrineRefresherTask + +v1.0.1 +------ + +### Changes + +* Add "doctrine/doctrine-bundle": "~2.0" dependency + +v1.0.0 +------ + +* Initial release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ef0dbe2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,52 @@ +Contributing +============ + +First of all, **thank you** for contributing, **you are awesome**! + +Here are a few rules to follow in order to ease code reviews, and discussions before +maintainers accept and merge your work. + +You MUST run the quality & test suites. + +You SHOULD write (or update) unit tests. + +You SHOULD write documentation. + +Please, write [commit messages that make sense](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html), +and [rebase your branch](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) before submitting your Pull Request. + +One may ask you to [squash your commits](https://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) +too. This is used to "clean" your Pull Request before merging it (we don't want +commits such as `fix tests`, `fix 2`, `fix 3`, etc.). + +Thank you! + +## Running the quality & test suites + +Tests suite uses Docker environments in order to be idempotent to OS's. More than this +PHP version is written inside the Dockerfile; this assures to test the bundle with +the same resources. No need to have PHP installed. + +You only need Docker set it up. + +To allow testing environments more smooth we implemented **Makefile**. +You have two commands available: + +```bash +make quality +``` + +```bash +make tests +``` + +## Deprecations notices + +When a feature should be deprecated, or when you have a breaking change for a future version, please : +* [Fill an issue](https://github.com/cleverage/flysystem-process-bundle/issues/new) +* Add TODO comments with the following format: `@TODO deprecated v2.0` +* Trigger a deprecation error: `@trigger_error('This feature will be deprecated in v2.0', E_USER_DEPRECATED);` + +You can check which deprecation notice is triggered in tests +* `make bash` +* `SYMFONY_DEPRECATIONS_HELPER=0 ./vendor/bin/phpunit` diff --git a/LICENSE b/LICENSE index d32c6b7..045d824 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2015-2023 Clever-Age +Copyright (c) Clever-Age Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index b9945a4..43050c7 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,22 @@ CleverAge/DoctrineProcessBundle ======================= -See process bundle documentation +This bundle is a part of the [CleverAge/ProcessBundle](https://github.com/cleverage/process-bundle) project. +It provides [Doctrine](https://www.doctrine-project.org/) library integration on Process bundle. -- Reference - - Tasks - - Entities - - [DoctrineReaderTask](src/Documentation/reference/task/doctrine_reader_task.md) - - [DoctrineUpdateTask](src/Documentation/reference/task/doctrine_updater_task.md) +Compatible with [Symfony stable version and latest Long-Term Support (LTS) release](https://symfony.com/releases). + +## Documentation + +For usage documentation, see: +[docs/index.md](doc/index.md) + +## Support & Contribution + +For general support and questions, please use [Github](https://github.com/cleverage/doctrine-process-bundle/issues). +If you think you found a bug or you have a feature idea to propose, feel free to open an issue after looking at the [contributing](CONTRIBUTING.md) guide. + +## License + +This bundle is under the MIT license. +For the whole copyright, see the [LICENSE](LICENSE) file distributed with this source code. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..48e4ee3 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,35 @@ +## Prerequisite + +CleverAge/ProcessBundle must be [installed](https://github.com/cleverage/process-bundle/blob/main/docs/01-quick_start.md#installation. + +## Installation + +Make sure Composer is installed globally, as explained in the [installation chapter](https://getcomposer.org/doc/00-intro.md) +of the Composer documentation. + +Open a command console, enter your project directory and install it using composer: + +```bash +composer require cleverage/doctrine-process-bundle +``` + +Remember to add the following line to config/bundles.php (not required if Symfony Flex is used) + +```php +CleverAge\FlysystemProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' => true], +``` + +## Reference + +- Tasks + - [DatabaseReaderTask](reference/tasks/database_reader_task.md) + - [DatabaseUpdaterTask] + - [ClearEntityManagerTask] + - [DoctrineBatchWriterTask] + - [DoctrineCleanerTask] + - [DoctrineDetacherTask] + - [DoctrineReaderTask] + - [DoctrineRefresherTask] + - [DoctrineRemoverTask] + - [DoctrineWriterTask](reference/tasks/doctrine_writer_task.md) + - [PurgeDoctrineCacheTask] diff --git a/docs/reference/tasks/_template.md b/docs/reference/tasks/_template.md new file mode 100644 index 0000000..ed1d4a5 --- /dev/null +++ b/docs/reference/tasks/_template.md @@ -0,0 +1,44 @@ +TaskName +======== + +_Describe main goal an use cases of the task_ + +Task reference +-------------- + +* **Service**: `ClassName` + +Accepted inputs +--------------- + +_Description of allowed types_ + +Possible outputs +---------------- + +_Description of possible types_ + +Options +------- + +| Code | Type | Required | Default | Description | +| ---- | ---- | :------: | ------- | ----------- | +| `code` | `type` | **X** _or nothing_ | `default value` _if available_ | _description_ | + +Examples +-------- + +_YAML samples and explanations_ + +* Example 1 + - details + - details + +```yaml +# Task configuration level +code: + service: '@service_ref' + options: + a: 1 + b: 2 +``` diff --git a/src/Documentation/reference/task/doctrine_reader_task.md b/docs/reference/tasks/database_reader_task.md similarity index 94% rename from src/Documentation/reference/task/doctrine_reader_task.md rename to docs/reference/tasks/database_reader_task.md index 3cb1bc4..c0ae973 100644 --- a/src/Documentation/reference/task/doctrine_reader_task.md +++ b/docs/reference/tasks/database_reader_task.md @@ -1,4 +1,4 @@ -DoctrineReaderTask +DatabaseReaderTask ================== Reads data from a Doctrine Repository. @@ -33,4 +33,4 @@ Options Example ------- -https://github.com/cleverage/process-bundle-ui-demo/blob/main/config/packages/process/demo.doctrine.read.yaml \ No newline at end of file +https://github.com/cleverage/process-bundle-ui-demo/blob/main/config/packages/process/demo.doctrine.read.yaml diff --git a/src/Documentation/reference/task/doctrine_updater_task.md b/docs/reference/tasks/doctrine_writer_task.md similarity index 86% rename from src/Documentation/reference/task/doctrine_updater_task.md rename to docs/reference/tasks/doctrine_writer_task.md index d0b24b6..6353f0b 100644 --- a/src/Documentation/reference/task/doctrine_updater_task.md +++ b/docs/reference/tasks/doctrine_writer_task.md @@ -6,7 +6,7 @@ Write a Doctrine entity to the database. Task reference -------------- -* **Service**: `CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask` +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask` Accepted inputs --------------- From 5bda80235351e3cec0d375c1388f4d125c8ea607 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 15:36:02 +0200 Subject: [PATCH 03/33] #3 Add Makefile & .docker for local standalone usage. Update rector, phpstan & php-cs-fixer configurations. Add notifications, quality & test github workflows --- .docker/compose.yaml | 14 ++++++ .docker/php/Dockerfile | 29 +++++++++++ .docker/php/conf.d/dev.ini | 5 ++ .github/ISSUE_TEMPLATE.md | 14 ++++++ .github/PULL_REQUEST_TEMPLATE.md | 14 ++++++ .github/workflows/notifications.yml | 23 +++++++++ .github/workflows/quality.yml | 62 ++++++++++++++++++++++++ .github/workflows/test.yml | 74 +++++++++++++++++++++++++++++ .gitignore | 7 ++- .php-cs-fixer.dist.php | 14 +++--- Makefile | 55 +++++++++++++++++++-- composer.json | 31 +++++++----- phpstan.neon | 10 +--- phpunit.xml.dist | 27 +++++++++++ rector.php | 39 ++++++++------- tests/.gitkeep | 0 16 files changed, 370 insertions(+), 48 deletions(-) create mode 100644 .docker/compose.yaml create mode 100644 .docker/php/Dockerfile create mode 100644 .docker/php/conf.d/dev.ini create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/notifications.yml create mode 100644 .github/workflows/quality.yml create mode 100644 .github/workflows/test.yml create mode 100644 phpunit.xml.dist create mode 100644 tests/.gitkeep diff --git a/.docker/compose.yaml b/.docker/compose.yaml new file mode 100644 index 0000000..acab08c --- /dev/null +++ b/.docker/compose.yaml @@ -0,0 +1,14 @@ +x-build-args: &build-args + UID: "${UID:-1000}" + GID: "${GID:-1000}" + +name: cleverage-doctrine-process-bundle + +services: + php: + build: + context: php + args: + <<: *build-args + volumes: + - ../:/var/www diff --git a/.docker/php/Dockerfile b/.docker/php/Dockerfile new file mode 100644 index 0000000..f98c3ba --- /dev/null +++ b/.docker/php/Dockerfile @@ -0,0 +1,29 @@ +FROM php:8.2-fpm-alpine + +ARG UID +ARG GID + +RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" +COPY /conf.d/ "$PHP_INI_DIR/conf.d/" + +RUN apk update && apk add \ + tzdata \ + shadow \ + nano \ + bash \ + icu-dev \ + && docker-php-ext-configure intl \ + && docker-php-ext-install intl opcache \ + && docker-php-ext-enable opcache + +RUN ln -s /usr/share/zoneinfo/Europe/Paris /etc/localtime \ + && sed -i "s/^;date.timezone =.*/date.timezone = Europe\/Paris/" $PHP_INI_DIR/php.ini + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +RUN usermod -u $UID www-data \ + && groupmod -g $GID www-data + +USER www-data:www-data + +WORKDIR /var/www diff --git a/.docker/php/conf.d/dev.ini b/.docker/php/conf.d/dev.ini new file mode 100644 index 0000000..2a141be --- /dev/null +++ b/.docker/php/conf.d/dev.ini @@ -0,0 +1,5 @@ +display_errors = 1 +error_reporting = E_ALL + +opcache.validate_timestamps = 1 +opcache.revalidate_freq = 0 diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..7711713 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,14 @@ +## Description + + + +## Requirements + +* Documentation updates + - [ ] Reference + - [ ] Changelog +* [ ] Unit tests + +## Breaking changes + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..58db37d --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +## Description + + + +## Requirements + +* Documentation updates + - [ ] Reference + - [ ] Changelog +* [ ] Unit tests + +## Breaking changes + + diff --git a/.github/workflows/notifications.yml b/.github/workflows/notifications.yml new file mode 100644 index 0000000..e254116 --- /dev/null +++ b/.github/workflows/notifications.yml @@ -0,0 +1,23 @@ +name: Rocket chat notifications + +# Controls when the action will run. +on: + push: + tags: + - '*' + +jobs: + notification: + runs-on: ubuntu-latest + + steps: + - name: Get the tag short reference + id: get_tag + run: echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT + + - name: Rocket.Chat Notification + uses: madalozzo/Rocket.Chat.GitHub.Action.Notification@master + with: + type: success + job_name: "[cleverage/doctrine-process-bundle](https://github.com/cleverage/doctrine-process-bundle) : ${{ steps.get_tag.outputs.TAG }} has been released" + url: ${{ secrets.CLEVER_AGE_ROCKET_CHAT_WEBOOK_URL }} diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml new file mode 100644 index 0000000..9f1580f --- /dev/null +++ b/.github/workflows/quality.yml @@ -0,0 +1,62 @@ +name: Quality + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +jobs: + phpstan: + name: PHPStan + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + coverage: none + tools: composer:v2 + - name: Install Composer dependencies (locked) + uses: ramsey/composer-install@v3 + - name: PHPStan + run: vendor/bin/phpstan --no-progress --memory-limit=1G analyse --error-format=github + + php-cs-fixer: + name: PHP-CS-Fixer + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + coverage: none + tools: composer:v2 + - name: Install Composer dependencies (locked) + uses: ramsey/composer-install@v3 + - name: PHP-CS-Fixer + run: vendor/bin/php-cs-fixer fix --diff --dry-run --show-progress=none + + rector: + name: Rector + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Install PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + coverage: none + tools: composer:v2 + - name: Install Composer dependencies (locked) + uses: ramsey/composer-install@v3 + - name: Rector + run: vendor/bin/rector --no-progress-bar --dry-run diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..2d7e7a4 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,74 @@ +name: Test + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +jobs: + test: + name: PHP ${{ matrix.php-version }} + ${{ matrix.dependencies }} + ${{ matrix.variant }} + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.allowed-to-fail }} + env: + SYMFONY_REQUIRE: ${{matrix.symfony-require}} + + strategy: + matrix: + php-version: + - '8.2' + - '8.3' + dependencies: [highest] + allowed-to-fail: [false] + symfony-require: [''] + variant: [normal] + include: + - php-version: '8.2' + dependencies: highest + allowed-to-fail: false + symfony-require: 6.4.* + variant: symfony/symfony:"6.4.*" + - php-version: '8.2' + dependencies: highest + allowed-to-fail: false + symfony-require: 7.1.* + variant: symfony/symfony:"7.1.*" + - php-version: '8.3' + dependencies: highest + allowed-to-fail: false + symfony-require: 6.4.* + variant: symfony/symfony:"6.4.*" + - php-version: '8.3' + dependencies: highest + allowed-to-fail: false + symfony-require: 7.1.* + variant: symfony/symfony:"7.1.*" + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install PHP with extensions + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + coverage: pcov + tools: composer:v2, flex + - name: Add PHPUnit matcher + run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + - name: Install variant + if: matrix.variant != 'normal' && !startsWith(matrix.variant, 'symfony/symfony') + run: composer require ${{ matrix.variant }} --no-update + - name: Install Composer dependencies (${{ matrix.dependencies }}) + uses: ramsey/composer-install@v3 + with: + dependency-versions: ${{ matrix.dependencies }} + - name: Run Tests with coverage + run: vendor/bin/phpunit -c phpunit.xml.dist --coverage-clover build/logs/clover.xml + #- name: Send coverage to Codecov + # uses: codecov/codecov-action@v4 + # with: + # files: build/logs/clover.xml diff --git a/.gitignore b/.gitignore index 81bd528..ca08796 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,9 @@ /composer.lock /vendor +.env +.idea +/phpunit.xml +.phpunit.result.cache +.phpunit.cache .php-cs-fixer.cache -.idea \ No newline at end of file +coverage-report diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 86007ad..d248731 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -3,7 +3,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -14,17 +14,18 @@ } $fileHeaderComment = <<<'EOF' -This file is part of the CleverAge/DoctrineProcessBundle package. + This file is part of the CleverAge/DoctrineProcessBundle package. -Copyright (c) 2017-2023 Clever-Age + Copyright (c) Clever-Age -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; + For the full copyright and license information, please view the LICENSE + file that was distributed with this source code. + EOF; return (new PhpCsFixer\Config()) ->setRules([ '@PHP71Migration' => true, + '@PHP82Migration' => true, '@PHPUnit75Migration:risky' => true, '@Symfony' => true, '@Symfony:risky' => true, @@ -38,6 +39,7 @@ ->setFinder( (new PhpCsFixer\Finder()) ->in(__DIR__.'/src') + ->in(__DIR__.'/tests') ->append([__FILE__]) ) ->setCacheFile('.php-cs-fixer.cache') diff --git a/Makefile b/Makefile index 9a2ea98..0a58e32 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,54 @@ .ONESHELL: SHELL := /bin/bash -linter: #[Linter] - vendor/bin/php-cs-fixer fix -phpstan: #[Phpstan] - vendor/bin/phpstan +DOCKER_RUN_PHP = docker compose -f .docker/compose.yaml run --rm php "bash" "-c" +DOCKER_COMPOSE = docker compose -f .docker/compose.yaml + +start: upd #[Global] Start application + +src/vendor: #[Composer] install dependencies + $(DOCKER_RUN_PHP) "composer install --no-interaction" + +upd: #[Docker] Start containers detached + touch .docker/.env + make src/vendor + $(DOCKER_COMPOSE) up --remove-orphans --detach + +up: #[Docker] Start containers + touch .docker/.env + make src/vendor + $(DOCKER_COMPOSE) up --remove-orphans + +stop: #[Docker] Down containers + $(DOCKER_COMPOSE) stop + +down: #[Docker] Down containers + $(DOCKER_COMPOSE) down + +build: #[Docker] Build containers + $(DOCKER_COMPOSE) build + +ps: # [Docker] Show running containers + $(DOCKER_COMPOSE) ps + +bash: #[Docker] Connect to php container with current host user + $(DOCKER_COMPOSE) exec php bash + +logs: #[Docker] Show logs + $(DOCKER_COMPOSE) logs -f + +quality: phpstan php-cs-fixer rector #[Quality] Run all quality checks + +phpstan: #[Quality] Run PHPStan + $(DOCKER_RUN_PHP) "vendor/bin/phpstan --no-progress --memory-limit=1G analyse" + +php-cs-fixer: #[Quality] Run PHP-CS-Fixer + $(DOCKER_RUN_PHP) "vendor/bin/php-cs-fixer fix --diff --verbose" + +rector: #[Quality] Run Rector + $(DOCKER_RUN_PHP) "vendor/bin/rector" + +tests: phpunit #[Tests] Run all tests + +phpunit: #[Tests] Run PHPUnit + $(DOCKER_RUN_PHP) "vendor/bin/phpunit" diff --git a/composer.json b/composer.json index c641dec..b65f8da 100644 --- a/composer.json +++ b/composer.json @@ -39,30 +39,37 @@ } ], "autoload": { - "psr-4": { - "CleverAge\\DoctrineProcessBundle\\": "src/" - } + "psr-4": { + "CleverAge\\FlysystemProcessBundle\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "CleverAge\\FlysystemProcessBundle\\Tests\\": "tests/" + } }, "require": { - "cleverage/process-bundle": "dev-prepare-release", - "doctrine/orm": "^2", - "doctrine/doctrine-bundle": "^2" + "php": ">=8.1", + "cleverage/process-bundle": "dev-prepare-release", + "doctrine/orm": "^2", + "doctrine/doctrine-bundle": "^2" }, "require-dev": { "friendsofphp/php-cs-fixer": "*", - "roave/security-advisories": "dev-latest", - "phpunit/phpunit": "*", + "phpstan/extension-installer": "*", "phpstan/phpstan": "*", "phpstan/phpstan-symfony": "*", - "phpstan/extension-installer": "*", + "phpunit/phpunit": "*", "rector/rector": "*", + "roave/security-advisories": "dev-latest", "symfony/test-pack": "^1.1" }, "config": { - "sort-packages": true, "allow-plugins": { "phpstan/extension-installer": true, - "symfony/flex": true - } + "symfony/flex": true, + "symfony/runtime": true + }, + "sort-packages": true } } diff --git a/phpstan.neon b/phpstan.neon index a9f5c7b..30e9572 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -2,13 +2,7 @@ parameters: level: 6 paths: - src - excludePaths: - - ecs.php - - vendor/* - - tests/* - - rector.php - - var/* - - src/Resources/tests/* + - tests ignoreErrors: - '#type has no value type specified in iterable type#' - '#has parameter .* with no value type specified in iterable type#' @@ -21,4 +15,4 @@ parameters: checkGenericClassInNonGenericObjectType: false reportUnmatchedIgnoredErrors: false inferPrivatePropertyTypeFromConstructor: true - treatPhpDocTypesAsCertain: false \ No newline at end of file + treatPhpDocTypesAsCertain: false diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..766495c --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,27 @@ + + + + + tests + + + + + + src + + + diff --git a/rector.php b/rector.php index 36408f0..72a2408 100644 --- a/rector.php +++ b/rector.php @@ -3,23 +3,28 @@ declare(strict_types=1); use Rector\Config\RectorConfig; -use Rector\Core\ValueObject\PhpVersion; use Rector\Set\ValueObject\LevelSetList; -use Rector\Set\ValueObject\SetList; -use Rector\Symfony\Set\SymfonyLevelSetList; +use Rector\Symfony\Set\SymfonySetList; +use Rector\ValueObject\PhpVersion; -return static function (RectorConfig $rectorConfig): void { - $rectorConfig->parallel(); - $rectorConfig->importNames(); - $rectorConfig->importShortClasses(); - - $rectorConfig->paths([__DIR__.'/src']); - - $rectorConfig->sets([ - SetList::TYPE_DECLARATION, +return RectorConfig::configure() + ->withPhpVersion(PhpVersion::PHP_82) + ->withPaths([ + __DIR__.'/src', + __DIR__.'/tests', + ]) + ->withPhpSets(php82: true) + // here we can define, what prepared sets of rules will be applied + ->withPreparedSets( + deadCode: true, + codeQuality: true + ) + ->withSets([ LevelSetList::UP_TO_PHP_82, - SymfonyLevelSetList::UP_TO_SYMFONY_63, - ]); - - $rectorConfig->phpVersion(PhpVersion::PHP_82); -}; + SymfonySetList::SYMFONY_64, + SymfonySetList::SYMFONY_71, + SymfonySetList::SYMFONY_CODE_QUALITY, + SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION, + SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES, + ]) +; diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29 From 83f39fb0e4873ee8d1e8f2d0499719254d857904 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 15:42:46 +0200 Subject: [PATCH 04/33] #3 Update directory structure --- composer.json | 4 ++-- src/CleverAgeDoctrineProcessBundle.php | 11 ++++------- .../CleverAgeDoctrineProcessExtension.php | 18 ++++++++++++++++-- .../{services.yaml => services/task.yaml} | 0 4 files changed, 22 insertions(+), 11 deletions(-) rename src/Resources/config/{services.yaml => services/task.yaml} (100%) diff --git a/composer.json b/composer.json index b65f8da..0969332 100644 --- a/composer.json +++ b/composer.json @@ -40,12 +40,12 @@ ], "autoload": { "psr-4": { - "CleverAge\\FlysystemProcessBundle\\": "src/" + "CleverAge\\DoctrineProcessBundle\\": "src/" } }, "autoload-dev": { "psr-4": { - "CleverAge\\FlysystemProcessBundle\\Tests\\": "tests/" + "CleverAge\\DoctrineProcessBundle\\Tests\\": "tests/" } }, "require": { diff --git a/src/CleverAgeDoctrineProcessBundle.php b/src/CleverAgeDoctrineProcessBundle.php index 804170e..90bb831 100644 --- a/src/CleverAgeDoctrineProcessBundle.php +++ b/src/CleverAgeDoctrineProcessBundle.php @@ -15,13 +15,10 @@ use Symfony\Component\HttpKernel\Bundle\Bundle; -/** - * Class CleverAgeDoctrineProcessBundle. - * - * @author Valentin Clavreul - * @author Vincent Chalnot - * @author Madeline Veyrenc - */ class CleverAgeDoctrineProcessBundle extends Bundle { + public function getPath(): string + { + return \dirname(__DIR__); + } } diff --git a/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php b/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php index eef3144..bf081ca 100644 --- a/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php +++ b/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php @@ -16,6 +16,7 @@ use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +use Symfony\Component\Finder\Finder; use Symfony\Component\HttpKernel\DependencyInjection\Extension; /** @@ -27,7 +28,20 @@ class CleverAgeDoctrineProcessExtension extends Extension { public function load(array $configs, ContainerBuilder $container): void { - $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); - $loader->load('services.yaml'); + $this->findServices($container, __DIR__.'/../Resources/config/services'); + } + + /** + * Recursively import config files into container. + */ + protected function findServices(ContainerBuilder $container, string $path, string $extension = 'yaml'): void + { + $finder = new Finder(); + $finder->in($path) + ->name('*.'.$extension)->files(); + $loader = new YamlFileLoader($container, new FileLocator($path)); + foreach ($finder as $file) { + $loader->load($file->getFilename()); + } } } diff --git a/src/Resources/config/services.yaml b/src/Resources/config/services/task.yaml similarity index 100% rename from src/Resources/config/services.yaml rename to src/Resources/config/services/task.yaml From 64d5462631c25dc981b73bcac2c0e2992f316333 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 16:06:20 +0200 Subject: [PATCH 05/33] #3 Apply rector, phpstan & php-cs-fixer --- CHANGELOG.md | 3 +++ src/CleverAgeDoctrineProcessBundle.php | 2 +- .../CleverAgeDoctrineProcessExtension.php | 2 +- src/Task/Database/DatabaseReaderTask.php | 14 +++++--------- src/Task/Database/DatabaseUpdaterTask.php | 10 +++------- .../EntityManager/AbstractDoctrineQueryTask.php | 6 +++--- src/Task/EntityManager/AbstractDoctrineTask.php | 13 ++++++++----- src/Task/EntityManager/ClearEntityManagerTask.php | 2 +- src/Task/EntityManager/DoctrineBatchWriterTask.php | 5 +++-- src/Task/EntityManager/DoctrineCleanerTask.php | 3 ++- src/Task/EntityManager/DoctrineDetacherTask.php | 3 ++- src/Task/EntityManager/DoctrineReaderTask.php | 9 +++++---- src/Task/EntityManager/DoctrineRefresherTask.php | 3 ++- src/Task/EntityManager/DoctrineRemoverTask.php | 3 ++- src/Task/EntityManager/DoctrineWriterTask.php | 5 ++++- src/Task/EntityManager/PurgeDoctrineCacheTask.php | 6 +++--- 16 files changed, 48 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 502025b..ca69299 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ v2.0 ### Changes +* [#3](https://github.com/cleverage/flysystem-process-bundle/issues/3) Add Makefile & .docker for local standalone usage +* [#3](https://github.com/cleverage/flysystem-process-bundle/issues/3) Add rector, phpstan & php-cs-fixer configurations & apply it + ### Fixes v2.0-RC1 diff --git a/src/CleverAgeDoctrineProcessBundle.php b/src/CleverAgeDoctrineProcessBundle.php index 90bb831..d013ee1 100644 --- a/src/CleverAgeDoctrineProcessBundle.php +++ b/src/CleverAgeDoctrineProcessBundle.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php b/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php index bf081ca..021c85c 100644 --- a/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php +++ b/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/src/Task/Database/DatabaseReaderTask.php b/src/Task/Database/DatabaseReaderTask.php index e31bdf8..a0d3890 100644 --- a/src/Task/Database/DatabaseReaderTask.php +++ b/src/Task/Database/DatabaseReaderTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -35,7 +35,7 @@ class DatabaseReaderTask extends AbstractConfigurableTask implements IterableTas public function __construct( protected LoggerInterface $logger, - protected ManagerRegistry $doctrine + protected ManagerRegistry $doctrine, ) { } @@ -46,7 +46,7 @@ public function __construct( */ public function next(ProcessState $state): bool { - if (!$this->statement) { + if (!$this->statement instanceof Result) { return false; } @@ -58,7 +58,7 @@ public function next(ProcessState $state): bool public function execute(ProcessState $state): void { $options = $this->getOptions($state); - if (!$this->statement) { + if (!$this->statement instanceof Result) { $this->statement = $this->initializeStatement($state); } @@ -121,11 +121,7 @@ protected function initializeStatement(ProcessState $state): Result $sql = $qb->getSQL(); } - if ($options['input_as_params']) { - $params = $state->getInput(); - } else { - $params = $options['params']; - } + $params = $options['input_as_params'] ? $state->getInput() : $options['params']; return $connection->executeQuery($sql, $params, $options['types']); } diff --git a/src/Task/Database/DatabaseUpdaterTask.php b/src/Task/Database/DatabaseUpdaterTask.php index c52a822..c7d6884 100644 --- a/src/Task/Database/DatabaseUpdaterTask.php +++ b/src/Task/Database/DatabaseUpdaterTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -30,7 +30,7 @@ class DatabaseUpdaterTask extends AbstractConfigurableTask { public function __construct( protected ManagerRegistry $doctrine, - protected LoggerInterface $logger + protected LoggerInterface $logger, ) { } @@ -51,11 +51,7 @@ protected function initializeStatement(ProcessState $state): int $options = $this->getOptions($state); $connection = $this->getConnection($state); - if ($options['input_as_params']) { - $params = $state->getInput(); - } else { - $params = $options['params']; - } + $params = $options['input_as_params'] ? $state->getInput() : $options['params']; if (!\is_array($params)) { throw new \UnexpectedValueException('Expecting an array of params'); } diff --git a/src/Task/EntityManager/AbstractDoctrineQueryTask.php b/src/Task/EntityManager/AbstractDoctrineQueryTask.php index f775dde..e2ccdaa 100644 --- a/src/Task/EntityManager/AbstractDoctrineQueryTask.php +++ b/src/Task/EntityManager/AbstractDoctrineQueryTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -60,8 +60,8 @@ protected function getQueryBuilder( EntityRepository $repository, array $criteria, array $orderBy, - int $limit = null, - int $offset = null + ?int $limit = null, + ?int $offset = null, ): QueryBuilder { $qb = $repository->createQueryBuilder('e'); foreach ($criteria as $field => $value) { diff --git a/src/Task/EntityManager/AbstractDoctrineTask.php b/src/Task/EntityManager/AbstractDoctrineTask.php index 0a20a67..397db62 100644 --- a/src/Task/EntityManager/AbstractDoctrineTask.php +++ b/src/Task/EntityManager/AbstractDoctrineTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -15,8 +15,8 @@ use CleverAge\ProcessBundle\Model\AbstractConfigurableTask; use CleverAge\ProcessBundle\Model\ProcessState; -use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; +use Doctrine\Persistence\ObjectManager; use Symfony\Component\OptionsResolver\OptionsResolver; /** @@ -25,7 +25,7 @@ abstract class AbstractDoctrineTask extends AbstractConfigurableTask { public function __construct( - protected ManagerRegistry $doctrine + protected ManagerRegistry $doctrine, ) { } @@ -37,8 +37,11 @@ protected function configureOptions(OptionsResolver $resolver): void $resolver->setAllowedTypes('entity_manager', ['null', 'string']); } - protected function getManager(ProcessState $state): EntityManagerInterface + protected function getManager(ProcessState $state): ObjectManager { - return $this->doctrine->getManager($this->getOption($state, 'entity_manager')); + /** @var ?string $entityManagerName */ + $entityManagerName = $this->getOption($state, 'entity_manager'); + + return $this->doctrine->getManager($entityManagerName); } } diff --git a/src/Task/EntityManager/ClearEntityManagerTask.php b/src/Task/EntityManager/ClearEntityManagerTask.php index 4a733d3..4c8ea7f 100644 --- a/src/Task/EntityManager/ClearEntityManagerTask.php +++ b/src/Task/EntityManager/ClearEntityManagerTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/src/Task/EntityManager/DoctrineBatchWriterTask.php b/src/Task/EntityManager/DoctrineBatchWriterTask.php index 680d38b..e1ae918 100644 --- a/src/Task/EntityManager/DoctrineBatchWriterTask.php +++ b/src/Task/EntityManager/DoctrineBatchWriterTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -53,7 +53,7 @@ protected function configureOptions(OptionsResolver $resolver): void protected function writeBatch(ProcessState $state): void { - if (0 === \count($this->batch)) { + if ([] === $this->batch) { $state->setSkipped(true); return; @@ -62,6 +62,7 @@ protected function writeBatch(ProcessState $state): void // Support for multiple entity managers is overkill but might be necessary $entityManagers = new \SplObjectStorage(); foreach ($this->batch as $entity) { + /** @var object $entity */ $class = ClassUtils::getClass($entity); $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { diff --git a/src/Task/EntityManager/DoctrineCleanerTask.php b/src/Task/EntityManager/DoctrineCleanerTask.php index dab980b..b1c5b40 100644 --- a/src/Task/EntityManager/DoctrineCleanerTask.php +++ b/src/Task/EntityManager/DoctrineCleanerTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -28,6 +28,7 @@ public function execute(ProcessState $state): void if (null === $entity) { throw new \RuntimeException('DoctrineWriterTask does not allow null input'); } + /** @var object $entity */ $class = ClassUtils::getClass($entity); $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { diff --git a/src/Task/EntityManager/DoctrineDetacherTask.php b/src/Task/EntityManager/DoctrineDetacherTask.php index a303299..a72fa5b 100644 --- a/src/Task/EntityManager/DoctrineDetacherTask.php +++ b/src/Task/EntityManager/DoctrineDetacherTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -28,6 +28,7 @@ public function execute(ProcessState $state): void if (null === $entity) { throw new \RuntimeException('DoctrineWriterTask does not allow null input'); } + /** @var object $entity */ $class = ClassUtils::getClass($entity); $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { diff --git a/src/Task/EntityManager/DoctrineReaderTask.php b/src/Task/EntityManager/DoctrineReaderTask.php index c704803..de84390 100644 --- a/src/Task/EntityManager/DoctrineReaderTask.php +++ b/src/Task/EntityManager/DoctrineReaderTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -30,7 +30,7 @@ class DoctrineReaderTask extends AbstractDoctrineQueryTask implements IterableTa public function __construct( protected LoggerInterface $logger, - ManagerRegistry $doctrine + ManagerRegistry $doctrine, ) { parent::__construct($doctrine); } @@ -42,7 +42,7 @@ public function __construct( */ public function next(ProcessState $state): bool { - if (!$this->iterator) { + if (!$this->iterator instanceof IterableResult) { return false; } $this->iterator->next(); @@ -53,7 +53,8 @@ public function next(ProcessState $state): bool public function execute(ProcessState $state): void { $options = $this->getOptions($state); - if (!$this->iterator) { + if (!$this->iterator instanceof IterableResult) { + /** @var class-string $class */ $class = $options['class_name']; $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { diff --git a/src/Task/EntityManager/DoctrineRefresherTask.php b/src/Task/EntityManager/DoctrineRefresherTask.php index 8df6dbb..ef0afdb 100644 --- a/src/Task/EntityManager/DoctrineRefresherTask.php +++ b/src/Task/EntityManager/DoctrineRefresherTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -28,6 +28,7 @@ public function execute(ProcessState $state): void if (null === $entity) { throw new \RuntimeException('DoctrineRefresherTask does not allow null input'); } + /** @var object $entity */ $class = ClassUtils::getClass($entity); $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { diff --git a/src/Task/EntityManager/DoctrineRemoverTask.php b/src/Task/EntityManager/DoctrineRemoverTask.php index 08c2329..1be5850 100644 --- a/src/Task/EntityManager/DoctrineRemoverTask.php +++ b/src/Task/EntityManager/DoctrineRemoverTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -25,6 +25,7 @@ class DoctrineRemoverTask extends AbstractDoctrineTask public function execute(ProcessState $state): void { $entity = $state->getInput(); + /** @var object $entity */ $class = ClassUtils::getClass($entity); $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { diff --git a/src/Task/EntityManager/DoctrineWriterTask.php b/src/Task/EntityManager/DoctrineWriterTask.php index 76eb366..cd34f21 100644 --- a/src/Task/EntityManager/DoctrineWriterTask.php +++ b/src/Task/EntityManager/DoctrineWriterTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -15,6 +15,7 @@ use CleverAge\ProcessBundle\Model\ProcessState; use Doctrine\Common\Util\ClassUtils; +use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -40,12 +41,14 @@ protected function configureOptions(OptionsResolver $resolver): void protected function writeEntity(ProcessState $state): mixed { $options = $this->getOptions($state); + /** @var object $entity */ $entity = $state->getInput(); if (null === $entity) { throw new \RuntimeException('DoctrineWriterTask does not allow null input'); } $class = ClassUtils::getClass($entity); + /** @var ?EntityManager $entityManager */ $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { throw new \UnexpectedValueException("No manager found for class {$class}"); diff --git a/src/Task/EntityManager/PurgeDoctrineCacheTask.php b/src/Task/EntityManager/PurgeDoctrineCacheTask.php index 3bc3e7a..1d0b8cf 100644 --- a/src/Task/EntityManager/PurgeDoctrineCacheTask.php +++ b/src/Task/EntityManager/PurgeDoctrineCacheTask.php @@ -5,7 +5,7 @@ /* * This file is part of the CleverAge/DoctrineProcessBundle package. * - * Copyright (c) 2017-2023 Clever-Age + * Copyright (c) Clever-Age * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -38,7 +38,7 @@ class PurgeDoctrineCacheTask extends AbstractConfigurableTask ]; public function __construct( - protected ManagerRegistry $doctrine + protected ManagerRegistry $doctrine, ) { } @@ -66,7 +66,7 @@ protected function purgeEntityManagerCache(EntityManagerInterface $entityManager } } - protected function purgeCache(Cache $cache = null): void + protected function purgeCache(?Cache $cache = null): void { if ($cache instanceof FlushableCache) { $cache->flushAll(); From 4ac04643095cee2c4af9ad56cb893a0778678995 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 16:28:27 +0200 Subject: [PATCH 06/33] #6 Update services according to Symfony best practices. Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly. Services must be prefixed with the bundle alias instead of using fully qualified class names => `cleverage_doctrine_process` --- CHANGELOG.md | 7 +- config/services/task.yaml | 64 +++++++++++++++++++ .../CleverAgeDoctrineProcessExtension.php | 2 +- src/Resources/config/services/task.yaml | 8 --- 4 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 config/services/task.yaml delete mode 100644 src/Resources/config/services/task.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index ca69299..9726cd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,13 @@ v2.0 ## BC breaks +* [#6](https://github.com/cleverage/doctrine-process-bundle/issues/6) Update services according to Symfony best practices. Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly. + Services must be prefixed with the bundle alias instead of using fully qualified class names => `cleverage_doctrine_process` + ### Changes -* [#3](https://github.com/cleverage/flysystem-process-bundle/issues/3) Add Makefile & .docker for local standalone usage -* [#3](https://github.com/cleverage/flysystem-process-bundle/issues/3) Add rector, phpstan & php-cs-fixer configurations & apply it +* [#3](https://github.com/cleverage/doctrine-process-bundle/issues/3) Add Makefile & .docker for local standalone usage +* [#3](https://github.com/cleverage/doctrine-process-bundle/issues/3) Add rector, phpstan & php-cs-fixer configurations & apply it ### Fixes diff --git a/config/services/task.yaml b/config/services/task.yaml new file mode 100644 index 0000000..a0bf817 --- /dev/null +++ b/config/services/task.yaml @@ -0,0 +1,64 @@ +services: + _defaults: + public: false + tags: + - { name: monolog.logger, channel: cleverage_process_task } + + cleverage_doctrine_process.task.database_reader: + class: CleverAge\DoctrineProcessBundle\Task\Database\DatabaseReaderTask + arguments: + - '@monolog.logger' + - '@doctrine' + + cleverage_doctrine_process.task.database_updater: + class: CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask + arguments: + - '@doctrine' + - '@monolog.logger' + + cleverage_doctrine_process.task.doctrine_clear_entity_manager: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\ClearEntityManagerTask + arguments: + - '@doctrine' + + cleverage_doctrine_process.task.doctrine_batch_writer: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask + arguments: + - '@doctrine' + + cleverage_doctrine_process.task.doctrine_cleaner: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask + arguments: + - '@doctrine' + + cleverage_doctrine_process.task.doctrine_detacher: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask + arguments: + - '@doctrine' + + cleverage_doctrine_process.task.doctrine_reader: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask + arguments: + - '@monolog.logger' + - '@doctrine' + + cleverage_doctrine_process.task.doctrine_refresher: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask + arguments: + - '@doctrine' + + cleverage_doctrine_process.task.doctrine_remover: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask + arguments: + - '@doctrine' + + cleverage_doctrine_process.task.doctrine_writer: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask + arguments: + - '@doctrine' + + cleverage_doctrine_process.task.purge_doctrine_cache: + class: CleverAge\DoctrineProcessBundle\Task\EntityManager\PurgeDoctrineCacheTask + arguments: + - '@doctrine' + diff --git a/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php b/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php index 021c85c..6bf6e07 100644 --- a/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php +++ b/src/DependencyInjection/CleverAgeDoctrineProcessExtension.php @@ -28,7 +28,7 @@ class CleverAgeDoctrineProcessExtension extends Extension { public function load(array $configs, ContainerBuilder $container): void { - $this->findServices($container, __DIR__.'/../Resources/config/services'); + $this->findServices($container, __DIR__.'/../../config/services'); } /** diff --git a/src/Resources/config/services/task.yaml b/src/Resources/config/services/task.yaml deleted file mode 100644 index 56d8784..0000000 --- a/src/Resources/config/services/task.yaml +++ /dev/null @@ -1,8 +0,0 @@ -services: - CleverAge\DoctrineProcessBundle\Task\: - resource: '../../Task/' - autowire: true - public: true - shared: false - tags: - - { name: monolog.logger, channel: cleverage_process_task } From 0647542afbabcf54e44b6f54891aef8e99b3455b Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 16:36:10 +0200 Subject: [PATCH 07/33] #5 Bump "doctrine/doctrine-bundle": "^2.5" according to Symfony versions supported by process-bundle --- CHANGELOG.md | 1 + composer.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9726cd2..5d44532 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ v2.0 * [#6](https://github.com/cleverage/doctrine-process-bundle/issues/6) Update services according to Symfony best practices. Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly. Services must be prefixed with the bundle alias instead of using fully qualified class names => `cleverage_doctrine_process` +* [#5](https://github.com/cleverage/doctrine-process-bundle/issues/5) Bump "doctrine/doctrine-bundle": "^2.5" according to Symfony versions supported by `cleverage/process-bundle` ### Changes diff --git a/composer.json b/composer.json index 0969332..7b8ff6b 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "php": ">=8.1", "cleverage/process-bundle": "dev-prepare-release", "doctrine/orm": "^2", - "doctrine/doctrine-bundle": "^2" + "doctrine/doctrine-bundle": "^2.5" }, "require-dev": { "friendsofphp/php-cs-fixer": "*", From 7c796e0f509e6b8a0c01237c829de3ed0c97c1d2 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 17:42:11 +0200 Subject: [PATCH 08/33] #4 Allow installing "doctrine/orm": ^3.0 using at least require "doctrine/orm": "^2.9 || ^3.0". Forbid "doctrine/dbal" 4 for now (as on "symfony/orm-pack" - symfony/orm-pack@266bae0#diff-d2ab9925cad7eac58e0ff4cc0d251a937ecf49e4b6bf57f8b95aab76648a9d34R7 ) using "doctrine/dbal": "^2.9 || ^3.0". Add "doctrine/common": "^3.0" and "doctrine/doctrine-migrations-bundle": "^3.2" --- CHANGELOG.md | 4 ++++ composer.json | 11 +++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d44532..21e4ab1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ v2.0 * [#6](https://github.com/cleverage/doctrine-process-bundle/issues/6) Update services according to Symfony best practices. Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly. Services must be prefixed with the bundle alias instead of using fully qualified class names => `cleverage_doctrine_process` * [#5](https://github.com/cleverage/doctrine-process-bundle/issues/5) Bump "doctrine/doctrine-bundle": "^2.5" according to Symfony versions supported by `cleverage/process-bundle` +* [#4](https://github.com/cleverage/doctrine-process-bundle/issues/4) Allow installing "doctrine/orm": ^3.0 using at least require "doctrine/orm": "^2.9 || ^3.0". +Forbid "doctrine/dbal" 4 for now (as on "symfony/orm-pack" - symfony/orm-pack@266bae0#diff-d2ab9925cad7eac58e0ff4cc0d251a937ecf49e4b6bf57f8b95aab76648a9d34R7 ) using "doctrine/dbal": "^2.9 || ^3.0". +Add "doctrine/common": "^3.0" and "doctrine/doctrine-migrations-bundle": "^3.2" + ### Changes diff --git a/composer.json b/composer.json index 7b8ff6b..e9b246e 100644 --- a/composer.json +++ b/composer.json @@ -49,10 +49,13 @@ } }, "require": { - "php": ">=8.1", - "cleverage/process-bundle": "dev-prepare-release", - "doctrine/orm": "^2", - "doctrine/doctrine-bundle": "^2.5" + "php": ">=8.1", + "cleverage/process-bundle": "dev-prepare-release", + "doctrine/common": "^3.0", + "doctrine/dbal": "^2.9 || ^3.0", + "doctrine/doctrine-bundle": "^2.5", + "doctrine/doctrine-migrations-bundle": "^3.2", + "doctrine/orm": "^2.9 || ^3.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "*", From a5acb3b33544d979f4f8af1eed52bf1d0a485fde Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 23 Oct 2024 17:52:16 +0200 Subject: [PATCH 09/33] #4 Remove DoctrineWriterTask option `global_flush` due to removing partially flush ability on `doctrine/orm` 3.* (https://github.com/doctrine/orm/blob/3.0.x/UPGRADE.md#bc-break-removed-ability-to-partially-flushcommit-entity-manager-and-unit-of-work). --- CHANGELOG.md | 5 ++++- docs/reference/tasks/doctrine_writer_task.md | 1 - src/Task/EntityManager/DoctrineReaderTask.php | 20 ++++++++----------- src/Task/EntityManager/DoctrineWriterTask.php | 18 ++--------------- 4 files changed, 14 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21e4ab1..db5248a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,15 @@ v2.0 ## BC breaks -* [#6](https://github.com/cleverage/doctrine-process-bundle/issues/6) Update services according to Symfony best practices. Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly. +* [#6](https://github.com/cleverage/doctrine-process-bundle/issues/6) Update services according to Symfony best practices. +Services should not use autowiring or autoconfiguration. Instead, all services should be defined explicitly. Services must be prefixed with the bundle alias instead of using fully qualified class names => `cleverage_doctrine_process` * [#5](https://github.com/cleverage/doctrine-process-bundle/issues/5) Bump "doctrine/doctrine-bundle": "^2.5" according to Symfony versions supported by `cleverage/process-bundle` * [#4](https://github.com/cleverage/doctrine-process-bundle/issues/4) Allow installing "doctrine/orm": ^3.0 using at least require "doctrine/orm": "^2.9 || ^3.0". Forbid "doctrine/dbal" 4 for now (as on "symfony/orm-pack" - symfony/orm-pack@266bae0#diff-d2ab9925cad7eac58e0ff4cc0d251a937ecf49e4b6bf57f8b95aab76648a9d34R7 ) using "doctrine/dbal": "^2.9 || ^3.0". Add "doctrine/common": "^3.0" and "doctrine/doctrine-migrations-bundle": "^3.2" +* [#4](https://github.com/cleverage/doctrine-process-bundle/issues/4) Remove DoctrineWriterTask option `global_flush` +due to removing [partially flush ability](https://github.com/doctrine/orm/blob/3.0.x/UPGRADE.md#bc-break-removed-ability-to-partially-flushcommit-entity-manager-and-unit-of-work) on `doctrine/orm` 3.* ### Changes diff --git a/docs/reference/tasks/doctrine_writer_task.md b/docs/reference/tasks/doctrine_writer_task.md index 6353f0b..16182dd 100644 --- a/docs/reference/tasks/doctrine_writer_task.md +++ b/docs/reference/tasks/doctrine_writer_task.md @@ -24,5 +24,4 @@ Options | Code | Type | Required | Default | Description | | ---- | ---- | :------: | ------- | ----------- | | `entity_manager` | `string` or `null` | | `null` | Use another entity manager than the default | -| `global_flush` | `bool` | | `true` | Flush the whole entity manager after persist | diff --git a/src/Task/EntityManager/DoctrineReaderTask.php b/src/Task/EntityManager/DoctrineReaderTask.php index de84390..df426bc 100644 --- a/src/Task/EntityManager/DoctrineReaderTask.php +++ b/src/Task/EntityManager/DoctrineReaderTask.php @@ -17,7 +17,6 @@ use CleverAge\ProcessBundle\Model\ProcessState; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; -use Doctrine\ORM\Internal\Hydration\IterableResult; use Doctrine\Persistence\ManagerRegistry; use Psr\Log\LoggerInterface; @@ -26,7 +25,7 @@ */ class DoctrineReaderTask extends AbstractDoctrineQueryTask implements IterableTaskInterface { - protected ?IterableResult $iterator = null; + protected ?iterable $iterator = null; public function __construct( protected LoggerInterface $logger, @@ -42,18 +41,18 @@ public function __construct( */ public function next(ProcessState $state): bool { - if (!$this->iterator instanceof IterableResult) { + if (!is_iterable($this->iterator)) { return false; } - $this->iterator->next(); + next($this->iterator); - return $this->iterator->valid(); + return false !== current($this->iterator); } public function execute(ProcessState $state): void { $options = $this->getOptions($state); - if (!$this->iterator instanceof IterableResult) { + if (!is_iterable($this->iterator)) { /** @var class-string $class */ $class = $options['class_name']; $entityManager = $this->doctrine->getManagerForClass($class); @@ -61,13 +60,10 @@ public function execute(ProcessState $state): void throw new \UnexpectedValueException("No manager found for class {$class}"); } $repository = $entityManager->getRepository($class); - if (!$repository instanceof EntityRepository) { - throw new \UnexpectedValueException("No repository found for class {$class}"); - } $this->initIterator($repository, $options); } - $result = $this->iterator->current(); + $result = current($this->iterator); // Handle empty results if (false === $result) { @@ -95,7 +91,7 @@ protected function initIterator(EntityRepository $repository, array $options): v ); $this->iterator = $qb->getQuery() - ->iterate(); - $this->iterator->next(); // Move to first element + ->toIterable(); + next($this->iterator); // Move to first element } } diff --git a/src/Task/EntityManager/DoctrineWriterTask.php b/src/Task/EntityManager/DoctrineWriterTask.php index cd34f21..984e2a4 100644 --- a/src/Task/EntityManager/DoctrineWriterTask.php +++ b/src/Task/EntityManager/DoctrineWriterTask.php @@ -17,7 +17,6 @@ use Doctrine\Common\Util\ClassUtils; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManagerInterface; -use Symfony\Component\OptionsResolver\OptionsResolver; /** * Persists and flush Doctrine entities. @@ -29,18 +28,9 @@ public function execute(ProcessState $state): void $state->setOutput($this->writeEntity($state)); } - protected function configureOptions(OptionsResolver $resolver): void - { - parent::configureOptions($resolver); - $resolver->setDefaults([ - 'global_flush' => true, - ]); - $resolver->setAllowedTypes('global_flush', ['boolean']); - } - protected function writeEntity(ProcessState $state): mixed { - $options = $this->getOptions($state); + $this->getOptions($state); /** @var object $entity */ $entity = $state->getInput(); @@ -55,11 +45,7 @@ protected function writeEntity(ProcessState $state): mixed } $entityManager->persist($entity); - if ($options['global_flush']) { - $entityManager->flush(); - } else { - $entityManager->flush($entity); - } + $entityManager->flush(); return $entity; } From 5131156bc143e66373cdad016504acad20348c4b Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Thu, 24 Oct 2024 14:56:26 +0200 Subject: [PATCH 10/33] Minor doc fix --- README.md | 2 +- docs/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 43050c7..2fe7d90 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Compatible with [Symfony stable version and latest Long-Term Support (LTS) relea ## Documentation For usage documentation, see: -[docs/index.md](doc/index.md) +[docs/index.md](docs/index.md) ## Support & Contribution diff --git a/docs/index.md b/docs/index.md index 48e4ee3..2f8f9a7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -16,7 +16,7 @@ composer require cleverage/doctrine-process-bundle Remember to add the following line to config/bundles.php (not required if Symfony Flex is used) ```php -CleverAge\FlysystemProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' => true], +CleverAge\DoctrineProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' => true], ``` ## Reference From 5fc18e9aca4db5905d95d9316303834293a61888 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Mon, 28 Oct 2024 15:41:07 +0100 Subject: [PATCH 11/33] #3 Add Doctrine rules on php-cs-fixer & rector --- .php-cs-fixer.dist.php | 1 + rector.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index d248731..86bf5dc 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -29,6 +29,7 @@ '@PHPUnit75Migration:risky' => true, '@Symfony' => true, '@Symfony:risky' => true, + '@DoctrineAnnotation' => true, 'protected_to_private' => false, 'native_constant_invocation' => ['strict' => false], 'header_comment' => ['header' => $fileHeaderComment], diff --git a/rector.php b/rector.php index 72a2408..cb382c4 100644 --- a/rector.php +++ b/rector.php @@ -3,6 +3,7 @@ declare(strict_types=1); use Rector\Config\RectorConfig; +use Rector\Doctrine\Set\DoctrineSetList; use Rector\Set\ValueObject\LevelSetList; use Rector\Symfony\Set\SymfonySetList; use Rector\ValueObject\PhpVersion; @@ -26,5 +27,6 @@ SymfonySetList::SYMFONY_CODE_QUALITY, SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION, SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES, + DoctrineSetList::DOCTRINE_CODE_QUALITY, ]) ; From ed1f2be640f8e9d8176b2869a89aad010c8ada3c Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Tue, 29 Oct 2024 17:01:25 +0100 Subject: [PATCH 12/33] #3 Apply <10.0 restriction on phpunit/phpunit since configuration file is not compatible with 10.0+ --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e9b246e..1a93443 100644 --- a/composer.json +++ b/composer.json @@ -62,7 +62,7 @@ "phpstan/extension-installer": "*", "phpstan/phpstan": "*", "phpstan/phpstan-symfony": "*", - "phpunit/phpunit": "*", + "phpunit/phpunit": "<10.0", "rector/rector": "*", "roave/security-advisories": "dev-latest", "symfony/test-pack": "^1.1" From 44c35616624b8431983e4f17430c4bded9f756b7 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Thu, 21 Nov 2024 17:12:46 +0100 Subject: [PATCH 13/33] #9 Aliasing Transformers & Tasks with FQCN to maintain old release configuration compatibility. --- config/services/task.yaml | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/config/services/task.yaml b/config/services/task.yaml index a0bf817..67d2595 100644 --- a/config/services/task.yaml +++ b/config/services/task.yaml @@ -9,56 +9,88 @@ services: arguments: - '@monolog.logger' - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\Database\DatabaseReaderTask: + alias: cleverage_doctrine_process.task.database_reader + public: true cleverage_doctrine_process.task.database_updater: class: CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask arguments: - '@doctrine' - '@monolog.logger' + CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask: + alias: cleverage_doctrine_process.task.database_updater + public: true cleverage_doctrine_process.task.doctrine_clear_entity_manager: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\ClearEntityManagerTask arguments: - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\ClearEntityManagerTask: + alias: cleverage_doctrine_process.task.doctrine_clear_entity_manager + public: true cleverage_doctrine_process.task.doctrine_batch_writer: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask arguments: - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask: + alias: cleverage_doctrine_process.task.doctrine_batch_writer + public: true cleverage_doctrine_process.task.doctrine_cleaner: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask arguments: - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask: + alias: cleverage_doctrine_process.task.doctrine_cleaner + public: true cleverage_doctrine_process.task.doctrine_detacher: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask arguments: - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask: + alias: cleverage_doctrine_process.task.doctrine_detacher + public: true cleverage_doctrine_process.task.doctrine_reader: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask arguments: - '@monolog.logger' - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask: + alias: cleverage_doctrine_process.task.doctrine_reader + public: true cleverage_doctrine_process.task.doctrine_refresher: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask arguments: - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask: + alias: cleverage_doctrine_process.task.doctrine_refresher + public: true cleverage_doctrine_process.task.doctrine_remover: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask arguments: - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask: + alias: cleverage_doctrine_process.task.doctrine_remover + public: true cleverage_doctrine_process.task.doctrine_writer: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask arguments: - '@doctrine' + CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask: + alias: cleverage_doctrine_process.task.doctrine_writer + public: true cleverage_doctrine_process.task.purge_doctrine_cache: class: CleverAge\DoctrineProcessBundle\Task\EntityManager\PurgeDoctrineCacheTask arguments: - '@doctrine' - + CleverAge\DoctrineProcessBundle\Task\EntityManager\PurgeDoctrineCacheTask: + alias: cleverage_doctrine_process.task.purge_doctrine_cache + public: true From afaa94ed57637d54a9e72a0062b5524b0f88fe8f Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Fri, 22 Nov 2024 10:38:04 +0100 Subject: [PATCH 14/33] cleverage/process-bundle-demo#3 Rename process-bundle-ui-demo to process-bundle-demo --- docs/reference/tasks/database_reader_task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/tasks/database_reader_task.md b/docs/reference/tasks/database_reader_task.md index c0ae973..a624015 100644 --- a/docs/reference/tasks/database_reader_task.md +++ b/docs/reference/tasks/database_reader_task.md @@ -33,4 +33,4 @@ Options Example ------- -https://github.com/cleverage/process-bundle-ui-demo/blob/main/config/packages/process/demo.doctrine.read.yaml +https://github.com/cleverage/process-bundle-demo/blob/main/config/packages/process/demo.doctrine.read.yaml From 69e457cfdc33e1a8bbaa0e517cddb9b89ac5ca30 Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Tue, 10 Dec 2024 18:43:26 +0100 Subject: [PATCH 15/33] #10 replace uniqid with bin2hex(random_bytes(4)) (like Symfony does) --- src/Task/EntityManager/AbstractDoctrineQueryTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Task/EntityManager/AbstractDoctrineQueryTask.php b/src/Task/EntityManager/AbstractDoctrineQueryTask.php index e2ccdaa..7ed85f7 100644 --- a/src/Task/EntityManager/AbstractDoctrineQueryTask.php +++ b/src/Task/EntityManager/AbstractDoctrineQueryTask.php @@ -68,7 +68,7 @@ protected function getQueryBuilder( if (preg_match('/[^a-zA-Z0-9]/', $field)) { throw new \UnexpectedValueException("Forbidden field name '{$field}'"); } - $parameterName = uniqid('param', true); + $parameterName = 'param_' . bin2hex(random_bytes(4)); if (null === $value) { $qb->andWhere("e.{$field} IS null"); } else { From 9c8feb981e8f5b797ebd70271347df5e5ed6a47e Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Tue, 10 Dec 2024 19:57:23 +0100 Subject: [PATCH 16/33] phpcs --- src/Task/EntityManager/AbstractDoctrineQueryTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Task/EntityManager/AbstractDoctrineQueryTask.php b/src/Task/EntityManager/AbstractDoctrineQueryTask.php index 7ed85f7..f63991e 100644 --- a/src/Task/EntityManager/AbstractDoctrineQueryTask.php +++ b/src/Task/EntityManager/AbstractDoctrineQueryTask.php @@ -68,7 +68,7 @@ protected function getQueryBuilder( if (preg_match('/[^a-zA-Z0-9]/', $field)) { throw new \UnexpectedValueException("Forbidden field name '{$field}'"); } - $parameterName = 'param_' . bin2hex(random_bytes(4)); + $parameterName = 'param_'.bin2hex(random_bytes(4)); if (null === $value) { $qb->andWhere("e.{$field} IS null"); } else { From 3eb7b5364bc5c5920a5569a02d8ab119a8c81ad1 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Wed, 11 Dec 2024 14:44:27 +0100 Subject: [PATCH 17/33] #4 Fix $iterator on DoctrineReaderTask that doesn't work with iterable --- src/Task/EntityManager/DoctrineReaderTask.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/Task/EntityManager/DoctrineReaderTask.php b/src/Task/EntityManager/DoctrineReaderTask.php index df426bc..f69b8d0 100644 --- a/src/Task/EntityManager/DoctrineReaderTask.php +++ b/src/Task/EntityManager/DoctrineReaderTask.php @@ -25,7 +25,7 @@ */ class DoctrineReaderTask extends AbstractDoctrineQueryTask implements IterableTaskInterface { - protected ?iterable $iterator = null; + protected ?\IteratorIterator $iterator = null; public function __construct( protected LoggerInterface $logger, @@ -41,18 +41,18 @@ public function __construct( */ public function next(ProcessState $state): bool { - if (!is_iterable($this->iterator)) { + if (!$this->iterator instanceof \IteratorIterator) { return false; } - next($this->iterator); + $this->iterator->next(); - return false !== current($this->iterator); + return $this->iterator->valid(); } public function execute(ProcessState $state): void { $options = $this->getOptions($state); - if (!is_iterable($this->iterator)) { + if (!$this->iterator instanceof \IteratorIterator) { /** @var class-string $class */ $class = $options['class_name']; $entityManager = $this->doctrine->getManagerForClass($class); @@ -62,8 +62,7 @@ public function execute(ProcessState $state): void $repository = $entityManager->getRepository($class); $this->initIterator($repository, $options); } - - $result = current($this->iterator); + $result = $this->iterator->current(); // Handle empty results if (false === $result) { @@ -77,7 +76,7 @@ public function execute(ProcessState $state): void return; } - $state->setOutput(reset($result)); + $state->setOutput($result); } protected function initIterator(EntityRepository $repository, array $options): void @@ -90,8 +89,7 @@ protected function initIterator(EntityRepository $repository, array $options): v $options['offset'] ); - $this->iterator = $qb->getQuery() - ->toIterable(); - next($this->iterator); // Move to first element + $this->iterator = new \IteratorIterator($qb->getQuery()->toIterable()); + $this->iterator->rewind(); } } From 7fb7c40432b4a763d222d5c7aa58465c0995c736 Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Thu, 12 Dec 2024 16:15:37 +0100 Subject: [PATCH 18/33] #12 Delete the PurgeDoctrineCacheTask task --- config/services/task.yaml | 8 -- docs/index.md | 1 - .../EntityManager/PurgeDoctrineCacheTask.php | 108 ------------------ 3 files changed, 117 deletions(-) delete mode 100644 src/Task/EntityManager/PurgeDoctrineCacheTask.php diff --git a/config/services/task.yaml b/config/services/task.yaml index 67d2595..0788a05 100644 --- a/config/services/task.yaml +++ b/config/services/task.yaml @@ -86,11 +86,3 @@ services: CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask: alias: cleverage_doctrine_process.task.doctrine_writer public: true - - cleverage_doctrine_process.task.purge_doctrine_cache: - class: CleverAge\DoctrineProcessBundle\Task\EntityManager\PurgeDoctrineCacheTask - arguments: - - '@doctrine' - CleverAge\DoctrineProcessBundle\Task\EntityManager\PurgeDoctrineCacheTask: - alias: cleverage_doctrine_process.task.purge_doctrine_cache - public: true diff --git a/docs/index.md b/docs/index.md index 2f8f9a7..9e8d8c2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -32,4 +32,3 @@ CleverAge\DoctrineProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' - [DoctrineRefresherTask] - [DoctrineRemoverTask] - [DoctrineWriterTask](reference/tasks/doctrine_writer_task.md) - - [PurgeDoctrineCacheTask] diff --git a/src/Task/EntityManager/PurgeDoctrineCacheTask.php b/src/Task/EntityManager/PurgeDoctrineCacheTask.php deleted file mode 100644 index 1d0b8cf..0000000 --- a/src/Task/EntityManager/PurgeDoctrineCacheTask.php +++ /dev/null @@ -1,108 +0,0 @@ - 'getQueryCacheImpl', - 'result_cache' => 'getResultCacheImpl', - 'hydration_cache' => 'getHydrationCacheImpl', - 'metadata_cache' => 'getMetadataCacheImpl', - ]; - - public function __construct( - protected ManagerRegistry $doctrine, - ) { - } - - public function execute(ProcessState $state): void - { - $entityManager = $this->getOption($state, 'entity_manager'); - if ($entityManager) { - $this->purgeEntityManagerCache($entityManager, $state); - } else { - foreach ($this->doctrine->getManagers() as $entityManager) { - if ($entityManager instanceof EntityManagerInterface) { - $this->purgeEntityManagerCache($entityManager, $state); - } - } - } - } - - protected function purgeEntityManagerCache(EntityManagerInterface $entityManager, ProcessState $state): void - { - $options = $this->getOptions($state); - foreach (self::METHOD_MAP as $option => $method) { - if ($options[$option]) { - $this->purgeCache($entityManager->getConfiguration()->{$method}()); - } - } - } - - protected function purgeCache(?Cache $cache = null): void - { - if ($cache instanceof FlushableCache) { - $cache->flushAll(); - } - } - - protected function configureOptions(OptionsResolver $resolver): void - { - $resolver->setDefaults( - [ - 'query_cache' => true, - 'result_cache' => true, - 'hydration_cache' => true, - 'metadata_cache' => false, - 'entity_manager' => null, // Purge all entity managers by default - ] - ); - $resolver->setAllowedTypes('query_cache', ['bool']); - $resolver->setAllowedTypes('result_cache', ['bool']); - $resolver->setAllowedTypes('hydration_cache', ['bool']); - $resolver->setAllowedTypes('entity_manager', ['null', 'string', EntityManagerInterface::class]); - $resolver->setNormalizer( - 'entity_manager', - function (Options $options, $value): ?EntityManagerInterface { - if (null === $value) { - return null; - } - if (\is_string($value)) { - $value = $this->doctrine->getManager($value); - } - if (!$value instanceof EntityManagerInterface) { - throw new \UnexpectedValueException('Unable to resolve entity manager'); - } - - return $value; - } - ); - } -} From 82fe912e3fa007fbe32366a71fdb97c001b42031 Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Thu, 12 Dec 2024 19:18:19 +0100 Subject: [PATCH 19/33] #11 Push to phpstan level 8 --- phpstan.neon | 15 +--------- src/Task/Database/DatabaseReaderTask.php | 28 ++++++++++++++++--- src/Task/Database/DatabaseUpdaterTask.php | 21 +++++++++++--- .../AbstractDoctrineQueryTask.php | 17 ++++++++++- .../EntityManager/DoctrineBatchWriterTask.php | 3 +- src/Task/EntityManager/DoctrineReaderTask.php | 23 +++++++++++---- src/Task/EntityManager/DoctrineWriterTask.php | 4 +-- 7 files changed, 78 insertions(+), 33 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 30e9572..1cd333b 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,18 +1,5 @@ parameters: - level: 6 + level: 8 paths: - src - tests - ignoreErrors: - - '#type has no value type specified in iterable type#' - - '#has parameter .* with no value type specified in iterable type#' - - '#has no value type specified in iterable type array#' - - '#configureOptions\(\) has no return type specified.#' - - '#configure\(\) has no return type specified#' - - '#process\(\) has no return type specified#' - - '#should return Iterator but returns Traversable#' - - '#Negated boolean expression is always false#' - checkGenericClassInNonGenericObjectType: false - reportUnmatchedIgnoredErrors: false - inferPrivatePropertyTypeFromConstructor: true - treatPhpDocTypesAsCertain: false diff --git a/src/Task/Database/DatabaseReaderTask.php b/src/Task/Database/DatabaseReaderTask.php index a0d3890..22f15f9 100644 --- a/src/Task/Database/DatabaseReaderTask.php +++ b/src/Task/Database/DatabaseReaderTask.php @@ -19,6 +19,7 @@ use CleverAge\ProcessBundle\Model\ProcessState; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Result; +use Doctrine\DBAL\Types\Type; use Doctrine\Persistence\ManagerRegistry; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; @@ -26,6 +27,18 @@ /** * Fetch entities from doctrine. + * + * @phpstan-type Options array{ + * 'sql': ?string, + * 'table': string, + * 'limit': ?int, + * 'empty_log_level': string, + * 'paginate': ?int, + * 'offset': ?int, + * 'input_as_params': bool, + * 'params': array|string, mixed>, + * 'types': array|array + * } */ class DatabaseReaderTask extends AbstractConfigurableTask implements IterableTaskInterface, FinalizableTaskInterface { @@ -42,7 +55,7 @@ public function __construct( /** * Moves the internal pointer to the next element, * return true if the task has a next element - * return false if the task has terminated it's iteration. + * return false if the task has terminated its iteration. */ public function next(ProcessState $state): bool { @@ -57,6 +70,7 @@ public function next(ProcessState $state): bool public function execute(ProcessState $state): void { + /** @var Options $options */ $options = $this->getOptions($state); if (!$this->statement instanceof Result) { $this->statement = $this->initializeStatement($state); @@ -102,6 +116,7 @@ public function finalize(ProcessState $state): void protected function initializeStatement(ProcessState $state): Result { + /** @var Options $options */ $options = $this->getOptions($state); $connection = $this->getConnection($state); $sql = $options['sql']; @@ -121,7 +136,10 @@ protected function initializeStatement(ProcessState $state): Result $sql = $qb->getSQL(); } - $params = $options['input_as_params'] ? $state->getInput() : $options['params']; + + /** @var array $inputAsParams */ + $inputAsParams = $state->getInput(); + $params = $options['input_as_params'] ? $inputAsParams : $options['params']; return $connection->executeQuery($sql, $params, $options['types']); } @@ -168,7 +186,9 @@ protected function configureOptions(OptionsResolver $resolver): void protected function getConnection(ProcessState $state): Connection { - /* @noinspection PhpIncompatibleReturnTypeInspection */ - return $this->doctrine->getConnection($this->getOption($state, 'connection')); + /** @var Connection $connection */ + $connection = $this->doctrine->getConnection($this->getOption($state, 'connection')); + + return $connection; } } diff --git a/src/Task/Database/DatabaseUpdaterTask.php b/src/Task/Database/DatabaseUpdaterTask.php index c7d6884..5484037 100644 --- a/src/Task/Database/DatabaseUpdaterTask.php +++ b/src/Task/Database/DatabaseUpdaterTask.php @@ -17,6 +17,7 @@ use CleverAge\ProcessBundle\Model\ProcessState; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception; +use Doctrine\DBAL\Types\Type; use Doctrine\Persistence\ManagerRegistry; use Psr\Log\LoggerInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -25,6 +26,13 @@ * Execute an update/delete in the database from a SQL statement. * * @see https://www.doctrine-project.org/projects/doctrine-dbal/en/2.9/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion + * + * @phpstan-type Options array{ + * 'sql': string, + * 'input_as_params': bool, + * 'params': mixed, + * 'types': array|array + * } */ class DatabaseUpdaterTask extends AbstractConfigurableTask { @@ -48,15 +56,18 @@ public function execute(ProcessState $state): void */ protected function initializeStatement(ProcessState $state): int { + /** @var Options $options */ $options = $this->getOptions($state); $connection = $this->getConnection($state); - $params = $options['input_as_params'] ? $state->getInput() : $options['params']; + /** @var array $inputAsParams */ + $inputAsParams = $state->getInput(); + $params = $options['input_as_params'] ? $inputAsParams : $options['params']; if (!\is_array($params)) { throw new \UnexpectedValueException('Expecting an array of params'); } - return $connection->executeStatement($options['sql'], $params, $options['types']); + return (int) $connection->executeStatement($options['sql'], $params, $options['types']); } protected function configureOptions(OptionsResolver $resolver): void @@ -77,7 +88,9 @@ protected function configureOptions(OptionsResolver $resolver): void protected function getConnection(ProcessState $state): Connection { - /* @noinspection PhpIncompatibleReturnTypeInspection */ - return $this->doctrine->getConnection($this->getOption($state, 'connection')); + /** @var Connection $connection */ + $connection = $this->doctrine->getConnection($this->getOption($state, 'connection')); + + return $connection; } } diff --git a/src/Task/EntityManager/AbstractDoctrineQueryTask.php b/src/Task/EntityManager/AbstractDoctrineQueryTask.php index f63991e..ef26c21 100644 --- a/src/Task/EntityManager/AbstractDoctrineQueryTask.php +++ b/src/Task/EntityManager/AbstractDoctrineQueryTask.php @@ -20,6 +20,15 @@ /** * Easily extendable task to query entities in their repository. + * + * @phpstan-type Options array{ + * 'class_name': class-string, + * 'criteria': array|null>, + * 'order_by': array, + * 'limit': ?int, + * 'offset': ?int, + * 'empty_log_level': string, + * } */ abstract class AbstractDoctrineQueryTask extends AbstractDoctrineTask { @@ -56,6 +65,13 @@ protected function configureOptions(OptionsResolver $resolver): void ); } + /** + * @template TEntityClass of object + * + * @param EntityRepository $repository + * @param array|null> $criteria + * @param array $orderBy + */ protected function getQueryBuilder( EntityRepository $repository, array $criteria, @@ -80,7 +96,6 @@ protected function getQueryBuilder( $qb->setParameter($parameterName, $value); } } - /* @noinspection ForeachSourceInspection */ foreach ($orderBy as $field => $order) { $qb->addOrderBy("e.{$field}", $order); } diff --git a/src/Task/EntityManager/DoctrineBatchWriterTask.php b/src/Task/EntityManager/DoctrineBatchWriterTask.php index e1ae918..c4c3b67 100644 --- a/src/Task/EntityManager/DoctrineBatchWriterTask.php +++ b/src/Task/EntityManager/DoctrineBatchWriterTask.php @@ -24,6 +24,7 @@ */ class DoctrineBatchWriterTask extends AbstractDoctrineTask implements FlushableTaskInterface { + /** @var array */ protected array $batch = []; public function flush(ProcessState $state): void @@ -60,9 +61,9 @@ protected function writeBatch(ProcessState $state): void } // Support for multiple entity managers is overkill but might be necessary + /** @var \SplObjectStorage $entityManagers */ $entityManagers = new \SplObjectStorage(); foreach ($this->batch as $entity) { - /** @var object $entity */ $class = ClassUtils::getClass($entity); $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { diff --git a/src/Task/EntityManager/DoctrineReaderTask.php b/src/Task/EntityManager/DoctrineReaderTask.php index f69b8d0..2b4ce1c 100644 --- a/src/Task/EntityManager/DoctrineReaderTask.php +++ b/src/Task/EntityManager/DoctrineReaderTask.php @@ -22,10 +22,12 @@ /** * Fetch entities from doctrine. + * + * @phpstan-import-type Options from AbstractDoctrineQueryTask */ class DoctrineReaderTask extends AbstractDoctrineQueryTask implements IterableTaskInterface { - protected ?\IteratorIterator $iterator = null; + protected ?\Iterator $iterator = null; public function __construct( protected LoggerInterface $logger, @@ -41,7 +43,7 @@ public function __construct( */ public function next(ProcessState $state): bool { - if (!$this->iterator instanceof \IteratorIterator) { + if (!$this->iterator instanceof \Iterator) { return false; } $this->iterator->next(); @@ -51,8 +53,9 @@ public function next(ProcessState $state): bool public function execute(ProcessState $state): void { + /** @var Options $options */ $options = $this->getOptions($state); - if (!$this->iterator instanceof \IteratorIterator) { + if (!$this->iterator instanceof \Iterator) { /** @var class-string $class */ $class = $options['class_name']; $entityManager = $this->doctrine->getManagerForClass($class); @@ -62,10 +65,12 @@ public function execute(ProcessState $state): void $repository = $entityManager->getRepository($class); $this->initIterator($repository, $options); } - $result = $this->iterator->current(); + if ($this->iterator instanceof \Iterator) { + $result = $this->iterator->current(); + } // Handle empty results - if (false === $result) { + if (!isset($result) || false === $result) { $logContext = [ 'options' => $options, ]; @@ -79,6 +84,12 @@ public function execute(ProcessState $state): void $state->setOutput($result); } + /** + * @template TEntityClass of object + * + * @param EntityRepository $repository + * @param Options $options + */ protected function initIterator(EntityRepository $repository, array $options): void { $qb = $this->getQueryBuilder( @@ -89,7 +100,7 @@ protected function initIterator(EntityRepository $repository, array $options): v $options['offset'] ); - $this->iterator = new \IteratorIterator($qb->getQuery()->toIterable()); + $this->iterator = new \ArrayIterator(iterator_to_array($qb->getQuery()->toIterable())); $this->iterator->rewind(); } } diff --git a/src/Task/EntityManager/DoctrineWriterTask.php b/src/Task/EntityManager/DoctrineWriterTask.php index 984e2a4..f069376 100644 --- a/src/Task/EntityManager/DoctrineWriterTask.php +++ b/src/Task/EntityManager/DoctrineWriterTask.php @@ -15,7 +15,6 @@ use CleverAge\ProcessBundle\Model\ProcessState; use Doctrine\Common\Util\ClassUtils; -use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManagerInterface; /** @@ -31,14 +30,13 @@ public function execute(ProcessState $state): void protected function writeEntity(ProcessState $state): mixed { $this->getOptions($state); - /** @var object $entity */ + /** @var ?object $entity */ $entity = $state->getInput(); if (null === $entity) { throw new \RuntimeException('DoctrineWriterTask does not allow null input'); } $class = ClassUtils::getClass($entity); - /** @var ?EntityManager $entityManager */ $entityManager = $this->doctrine->getManagerForClass($class); if (!$entityManager instanceof EntityManagerInterface) { throw new \UnexpectedValueException("No manager found for class {$class}"); From 1e00c81bae9b15999daee29ac4a96a149199726e Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Fri, 13 Dec 2024 10:07:59 +0100 Subject: [PATCH 20/33] #11 Push to phpstan level 10 --- .php-cs-fixer.dist.php | 1 + phpstan.neon | 2 +- src/Task/Database/DatabaseReaderTask.php | 11 ++++++++--- src/Task/Database/DatabaseUpdaterTask.php | 8 +++++--- src/Task/EntityManager/DoctrineBatchWriterTask.php | 4 +++- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 86bf5dc..273e26d 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -35,6 +35,7 @@ 'header_comment' => ['header' => $fileHeaderComment], 'modernize_strpos' => true, 'get_class_to_class_keyword' => true, + 'phpdoc_to_comment' => ['ignored_tags' => ['var']], // Fix issue on initializeStatement method $params variable ]) ->setRiskyAllowed(true) ->setFinder( diff --git a/phpstan.neon b/phpstan.neon index 1cd333b..e9a9e7e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,5 +1,5 @@ parameters: - level: 8 + level: 10 paths: - src - tests diff --git a/src/Task/Database/DatabaseReaderTask.php b/src/Task/Database/DatabaseReaderTask.php index 22f15f9..639f2c0 100644 --- a/src/Task/Database/DatabaseReaderTask.php +++ b/src/Task/Database/DatabaseReaderTask.php @@ -36,7 +36,7 @@ * 'paginate': ?int, * 'offset': ?int, * 'input_as_params': bool, - * 'params': array|string, mixed>, + * 'params': array, * 'types': array|array * } */ @@ -137,10 +137,13 @@ protected function initializeStatement(ProcessState $state): Result $sql = $qb->getSQL(); } - /** @var array $inputAsParams */ $inputAsParams = $state->getInput(); $params = $options['input_as_params'] ? $inputAsParams : $options['params']; + if (!\is_array($params)) { + throw new \UnexpectedValueException('Expecting an array of params'); + } + /** @var array $params */ return $connection->executeQuery($sql, $params, $options['types']); } @@ -186,8 +189,10 @@ protected function configureOptions(OptionsResolver $resolver): void protected function getConnection(ProcessState $state): Connection { + /** @var ?string $connectionOptions */ + $connectionOptions = $this->getOption($state, 'connection'); /** @var Connection $connection */ - $connection = $this->doctrine->getConnection($this->getOption($state, 'connection')); + $connection = $this->doctrine->getConnection($connectionOptions); return $connection; } diff --git a/src/Task/Database/DatabaseUpdaterTask.php b/src/Task/Database/DatabaseUpdaterTask.php index 5484037..1d6df62 100644 --- a/src/Task/Database/DatabaseUpdaterTask.php +++ b/src/Task/Database/DatabaseUpdaterTask.php @@ -30,7 +30,7 @@ * @phpstan-type Options array{ * 'sql': string, * 'input_as_params': bool, - * 'params': mixed, + * 'params': array, * 'types': array|array * } */ @@ -60,13 +60,13 @@ protected function initializeStatement(ProcessState $state): int $options = $this->getOptions($state); $connection = $this->getConnection($state); - /** @var array $inputAsParams */ $inputAsParams = $state->getInput(); $params = $options['input_as_params'] ? $inputAsParams : $options['params']; if (!\is_array($params)) { throw new \UnexpectedValueException('Expecting an array of params'); } + /** @var array $params */ return (int) $connection->executeStatement($options['sql'], $params, $options['types']); } @@ -88,8 +88,10 @@ protected function configureOptions(OptionsResolver $resolver): void protected function getConnection(ProcessState $state): Connection { + /** @var ?string $connectionOptions */ + $connectionOptions = $this->getOption($state, 'connection'); /** @var Connection $connection */ - $connection = $this->doctrine->getConnection($this->getOption($state, 'connection')); + $connection = $this->doctrine->getConnection($connectionOptions); return $connection; } diff --git a/src/Task/EntityManager/DoctrineBatchWriterTask.php b/src/Task/EntityManager/DoctrineBatchWriterTask.php index c4c3b67..f26bdf5 100644 --- a/src/Task/EntityManager/DoctrineBatchWriterTask.php +++ b/src/Task/EntityManager/DoctrineBatchWriterTask.php @@ -34,7 +34,9 @@ public function flush(ProcessState $state): void public function execute(ProcessState $state): void { - $this->batch[] = $state->getInput(); + /** @var object $input */ + $input = $state->getInput(); + $this->batch[] = $input; if (\count($this->batch) >= $this->getOption($state, 'batch_count')) { $this->writeBatch($state); From 481881f852f24ab8e68cc47cfae98ae3ae683100 Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Fri, 13 Dec 2024 10:14:46 +0100 Subject: [PATCH 21/33] #12 add BC break --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index db5248a..8b9bda1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Forbid "doctrine/dbal" 4 for now (as on "symfony/orm-pack" - symfony/orm-pack@26 Add "doctrine/common": "^3.0" and "doctrine/doctrine-migrations-bundle": "^3.2" * [#4](https://github.com/cleverage/doctrine-process-bundle/issues/4) Remove DoctrineWriterTask option `global_flush` due to removing [partially flush ability](https://github.com/doctrine/orm/blob/3.0.x/UPGRADE.md#bc-break-removed-ability-to-partially-flushcommit-entity-manager-and-unit-of-work) on `doctrine/orm` 3.* +* [#12](https://github.com/cleverage/doctrine-process-bundle/issues/12) Remove PurgeDoctrineCacheTask ### Changes From 4cc53e5d5ba6a74da7de74094cd27c51812cc6b4 Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Mon, 16 Dec 2024 15:27:35 +0100 Subject: [PATCH 22/33] #13 add DatabaseReaderTask documentation --- docs/reference/tasks/database_reader_task.md | 35 ++++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/docs/reference/tasks/database_reader_task.md b/docs/reference/tasks/database_reader_task.md index a624015..af62a54 100644 --- a/docs/reference/tasks/database_reader_task.md +++ b/docs/reference/tasks/database_reader_task.md @@ -1,7 +1,7 @@ DatabaseReaderTask ================== -Reads data from a Doctrine Repository. +Reads data from a database. Task reference -------------- @@ -12,25 +12,38 @@ Task reference Accepted inputs --------------- -Input is ignored +Input can be used as the query params if needed Possible outputs ---------------- -Iterate on an entity list returned by a Doctrine query. +Iterate on an entity list returned by a sql query. Options ------- -| Code | Type | Required | Default | Description | -|------------------| ---- | :------: | ------- |-------------------------------------------------------| -| `table` | `string` | **X** | | Table | -| `params` | `array` | | `[]` | List of field => value to use while matching entities | -| `limit` | `int` or `null` | | `null` | Result max count | -| `offset` | `int` or `null` | | `null` | Result first item offset | -| `entity_manager` | `string` or `null` | | `null` | Use another entity manager than the default | +| Code | Type | Required | Default | Description | +|-------------------|--------------------|:--------:|-----------|-------------------------------------------------------------------------| +| `connection` | `string` | | `null` | Doctrine connection (default if not specified) | +| `table` | `string` | **X** | `[]` | Table of the query | +| `sql` | `string` | | `null` | Query to execute (if not specified then: "select tbl.* from table tbl") | +| `limit` | `int` or `null` | | `null` | Result max count | +| `offset` | `int` or `null` | | `null` | Result first item offset | +| `paginate` | `int` or `null` | | `null` | Paginate the results | +| `input_as_params` | `bool` | | `false` | Use the input as params | +| `params` | `array` | | `[]` | Query params | +| `types` | `array` | | `[]` | Query params types | +| `empty_log_level` | `string` or `null` | | `warning` | Log level if the result set is empty | Example ------- -https://github.com/cleverage/process-bundle-demo/blob/main/config/packages/process/demo.doctrine.read.yaml +```yaml +entry: + service: '@CleverAge\DoctrineProcessBundle\Task\Database\DatabaseReaderTask' + options: + table: 'book' + limit: 10 + offset: 3 + empty_log_level: debug +``` \ No newline at end of file From a3dd81cbab805056325eaaf078d863fdeabb2548 Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Mon, 16 Dec 2024 15:35:04 +0100 Subject: [PATCH 23/33] #13 add DatabaseUpdaterTask documentation --- docs/reference/tasks/database_updater_task.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docs/reference/tasks/database_updater_task.md diff --git a/docs/reference/tasks/database_updater_task.md b/docs/reference/tasks/database_updater_task.md new file mode 100644 index 0000000..825ee3a --- /dev/null +++ b/docs/reference/tasks/database_updater_task.md @@ -0,0 +1,44 @@ +DatabaseReaderTask +================== + +Writes data to a database. + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask` + +Accepted inputs +--------------- + +Input can be used as the query params if needed + +Possible outputs +---------------- + +Iterate on an entity list returned by a sql query. + +Options +------- + +| Code | Type | Required | Default | Description | +|-------------------|--------------------|:--------:|-----------|------------------------------------------------| +| `connection` | `string` | | `null` | Doctrine connection (default if not specified) | +| `sql` | `string` | **X** | `null` | Query to execute | +| `input_as_params` | `bool` | | `false` | Use the input as params | +| `params` | `array` | | `[]` | Query params | +| `types` | `array` | | `[]` | Query params types | + +Example +------- + +```yaml +entry: + service: '@CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask' + options: + sql: 'update author set firstname = :firstname, lastname = :lastname' + input_as_params: false + params: + firstname: 'Pascal' + lastname: 'Dupont' +``` \ No newline at end of file From ab4194c1aa8081b01ec1be19c58083a630cd8066 Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Mon, 16 Dec 2024 15:40:46 +0100 Subject: [PATCH 24/33] #13 add ClearEntityManagerTask documentation --- docs/index.md | 4 +-- .../tasks/entitymanager_clear_task.md | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 docs/reference/tasks/entitymanager_clear_task.md diff --git a/docs/index.md b/docs/index.md index 9e8d8c2..72ca466 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,8 +23,8 @@ CleverAge\DoctrineProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' - Tasks - [DatabaseReaderTask](reference/tasks/database_reader_task.md) - - [DatabaseUpdaterTask] - - [ClearEntityManagerTask] + - [DatabaseUpdaterTask](reference/tasks/database_updater_task.md) + - [ClearEntityManagerTask](reference/tasks/entitymanager_clear_task.md)) - [DoctrineBatchWriterTask] - [DoctrineCleanerTask] - [DoctrineDetacherTask] diff --git a/docs/reference/tasks/entitymanager_clear_task.md b/docs/reference/tasks/entitymanager_clear_task.md new file mode 100644 index 0000000..57c4d0c --- /dev/null +++ b/docs/reference/tasks/entitymanager_clear_task.md @@ -0,0 +1,32 @@ +ClearEntityManagerTask +====================== + +Clear the entity manager. + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\ClearEntityManagerTask` + +Accepted inputs +--------------- + +Ignored + +Possible outputs +---------------- + +None + +Options +------- + +None + +Example +------- + +```yaml +clear: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\ClearEntityManagerTask' +``` \ No newline at end of file From a79f24255d479bf4853f026cf50598ad469d6be7 Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Mon, 16 Dec 2024 15:52:11 +0100 Subject: [PATCH 25/33] #13 add DoctrineBatchWriterTask documentation --- docs/index.md | 4 +- .../tasks/doctrine_batchwriter_task.md | 58 +++++++++++++++++++ ...r_clear_task.md => doctrine_clear_task.md} | 0 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 docs/reference/tasks/doctrine_batchwriter_task.md rename docs/reference/tasks/{entitymanager_clear_task.md => doctrine_clear_task.md} (100%) diff --git a/docs/index.md b/docs/index.md index 72ca466..498de64 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,8 +24,8 @@ CleverAge\DoctrineProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' - Tasks - [DatabaseReaderTask](reference/tasks/database_reader_task.md) - [DatabaseUpdaterTask](reference/tasks/database_updater_task.md) - - [ClearEntityManagerTask](reference/tasks/entitymanager_clear_task.md)) - - [DoctrineBatchWriterTask] + - [ClearEntityManagerTask](reference/tasks/doctrine_clear_task.md)) + - [DoctrineBatchWriterTask](reference/tasks/doctrine_batchwriter_task.md) - [DoctrineCleanerTask] - [DoctrineDetacherTask] - [DoctrineReaderTask] diff --git a/docs/reference/tasks/doctrine_batchwriter_task.md b/docs/reference/tasks/doctrine_batchwriter_task.md new file mode 100644 index 0000000..e2ae15c --- /dev/null +++ b/docs/reference/tasks/doctrine_batchwriter_task.md @@ -0,0 +1,58 @@ +DoctrineBatchWriterTask +======================= + +Writes multiple entities to a database. + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask` + +Accepted inputs +--------------- + +An array of entities + +Possible outputs +---------------- + +The batch of the entities persisted to the database + +Options +------- + +| Code | Type | Required | Default | Description | +|---------------|-------|:--------:|---------|-------------| +| `batch_count` | `int` | | `10` | Batch size | + +Example +------- + +```yaml +entry: + service: '@CleverAge\ProcessBundle\Task\ConstantIterableOutputTask' + options: + output: + - author1: + firstname: Firstname 1 + lastname: Lastname + - author2: + firstname: Firstname 2 + lastname: Lastname + - author3: + firstname: Firstname 3 + lastname: Lastname + outputs: [iterate] + iterate: + service: '@CleverAge\ProcessBundle\Task\InputIteratorTask' + outputs: [denormalizer] + denormalizer: + service: '@CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask' + options: + class: App\Entity\Author + outputs: [batch_write] + batch_write: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask' + options: + batch_count: 2 +``` \ No newline at end of file diff --git a/docs/reference/tasks/entitymanager_clear_task.md b/docs/reference/tasks/doctrine_clear_task.md similarity index 100% rename from docs/reference/tasks/entitymanager_clear_task.md rename to docs/reference/tasks/doctrine_clear_task.md From ce20c9e01515412e152176b47dec491376725dea Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Mon, 16 Dec 2024 16:03:30 +0100 Subject: [PATCH 26/33] #13 add DoctrineCleanerTask documentation --- docs/index.md | 2 +- docs/reference/tasks/doctrine_cleaner_task.md | 42 +++++++++++++++++++ docs/reference/tasks/doctrine_clear_task.md | 6 ++- .../EntityManager/DoctrineCleanerTask.php | 2 +- 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 docs/reference/tasks/doctrine_cleaner_task.md diff --git a/docs/index.md b/docs/index.md index 498de64..a2b1dce 100644 --- a/docs/index.md +++ b/docs/index.md @@ -26,7 +26,7 @@ CleverAge\DoctrineProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' - [DatabaseUpdaterTask](reference/tasks/database_updater_task.md) - [ClearEntityManagerTask](reference/tasks/doctrine_clear_task.md)) - [DoctrineBatchWriterTask](reference/tasks/doctrine_batchwriter_task.md) - - [DoctrineCleanerTask] + - [DoctrineCleanerTask](reference/tasks/doctrine_cleaner_task.md) - [DoctrineDetacherTask] - [DoctrineReaderTask] - [DoctrineRefresherTask] diff --git a/docs/reference/tasks/doctrine_cleaner_task.md b/docs/reference/tasks/doctrine_cleaner_task.md new file mode 100644 index 0000000..f48a312 --- /dev/null +++ b/docs/reference/tasks/doctrine_cleaner_task.md @@ -0,0 +1,42 @@ +DoctrineCleanerTask +==================== + +Clear the entity manager of an entity. + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask` + +Accepted inputs +--------------- + +A doctrine entity + +Possible outputs +---------------- + +None + +Options +------- + +None + +Example +------- + +```yaml +entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + outputs: [clean] + + clean: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask' +``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_clear_task.md b/docs/reference/tasks/doctrine_clear_task.md index 57c4d0c..a77da6f 100644 --- a/docs/reference/tasks/doctrine_clear_task.md +++ b/docs/reference/tasks/doctrine_clear_task.md @@ -21,7 +21,11 @@ None Options ------- -None +| Code | Type | Required | Default | Description | +|------------------|--------------------|:--------:|---------|---------------------------------------------| +| `entity_manager` | `string` or `null` | | `null` | Use another entity manager than the default | + + Example ------- diff --git a/src/Task/EntityManager/DoctrineCleanerTask.php b/src/Task/EntityManager/DoctrineCleanerTask.php index b1c5b40..55d7fba 100644 --- a/src/Task/EntityManager/DoctrineCleanerTask.php +++ b/src/Task/EntityManager/DoctrineCleanerTask.php @@ -26,7 +26,7 @@ public function execute(ProcessState $state): void { $entity = $state->getInput(); if (null === $entity) { - throw new \RuntimeException('DoctrineWriterTask does not allow null input'); + throw new \RuntimeException('DoctrineCleanerTask does not allow null input'); } /** @var object $entity */ $class = ClassUtils::getClass($entity); From 3520d2a9100e8c03d67a04efc5d3afdb28b5de80 Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Mon, 16 Dec 2024 16:16:09 +0100 Subject: [PATCH 27/33] #13 add DoctrineRefresherTask, DoctrineDetacherTask and DoctrineRemoverTask documentation --- docs/index.md | 6 +-- .../reference/tasks/doctrine_detacher_task.md | 41 ++++++++++++++++ .../tasks/doctrine_refresher_task.md | 48 +++++++++++++++++++ docs/reference/tasks/doctrine_remover_task.md | 42 ++++++++++++++++ docs/reference/tasks/doctrine_writer_task.md | 30 ++++++++++-- .../EntityManager/DoctrineRefresherTask.php | 2 +- 6 files changed, 162 insertions(+), 7 deletions(-) create mode 100644 docs/reference/tasks/doctrine_detacher_task.md create mode 100644 docs/reference/tasks/doctrine_refresher_task.md create mode 100644 docs/reference/tasks/doctrine_remover_task.md diff --git a/docs/index.md b/docs/index.md index a2b1dce..e720857 100644 --- a/docs/index.md +++ b/docs/index.md @@ -27,8 +27,8 @@ CleverAge\DoctrineProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' - [ClearEntityManagerTask](reference/tasks/doctrine_clear_task.md)) - [DoctrineBatchWriterTask](reference/tasks/doctrine_batchwriter_task.md) - [DoctrineCleanerTask](reference/tasks/doctrine_cleaner_task.md) - - [DoctrineDetacherTask] + - [DoctrineDetacherTask](reference/tasks/doctrine_detacher_task.md) - [DoctrineReaderTask] - - [DoctrineRefresherTask] - - [DoctrineRemoverTask] + - [DoctrineRefresherTask](reference/tasks/doctrine_refresher_task.md) + - [DoctrineRemoverTask](reference/tasks/doctrine_remover_task.md) - [DoctrineWriterTask](reference/tasks/doctrine_writer_task.md) diff --git a/docs/reference/tasks/doctrine_detacher_task.md b/docs/reference/tasks/doctrine_detacher_task.md new file mode 100644 index 0000000..c620d7f --- /dev/null +++ b/docs/reference/tasks/doctrine_detacher_task.md @@ -0,0 +1,41 @@ +DoctrineDetacherTask +==================== + +Detach a Doctrine entity from the entity manager + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask` + +Accepted inputs +--------------- + +Any doctrine managed entity. + +Possible outputs +---------------- + +None + +Options +------- + +None + +Example +------- + +```yaml +entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + outputs: [detach] +detach: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask' +``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_refresher_task.md b/docs/reference/tasks/doctrine_refresher_task.md new file mode 100644 index 0000000..04a9386 --- /dev/null +++ b/docs/reference/tasks/doctrine_refresher_task.md @@ -0,0 +1,48 @@ +DoctrineRefresherTask +===================== + +Refreshes a Doctrine entity from the entity manager + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask` + +Accepted inputs +--------------- + +Any doctrine managed entity. + +Possible outputs +---------------- + +The refreshed entity + +Options +------- + +None + +Example +------- + +```yaml +entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + outputs: [modify] +modify: + service: '@CleverAge\ProcessBundle\Task\PropertySetterTask' + options: + values: + firstname: Gérard + outputs: [refresh] +refresh: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask' + outputs: [dump_refreshed] +``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_remover_task.md b/docs/reference/tasks/doctrine_remover_task.md new file mode 100644 index 0000000..388b236 --- /dev/null +++ b/docs/reference/tasks/doctrine_remover_task.md @@ -0,0 +1,42 @@ +DoctrineRemoverTask +=================== + +Removes a Doctrine entity from the entity manager then flushes + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask` + +Accepted inputs +--------------- + +Any doctrine managed entity. + +Possible outputs +---------------- + +None + +Options +------- + +None + +Example +------- + +```yaml +entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Book' + criteria: + title: 'Dracula' + outputs: [dump] + dump: + service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' + outputs: [remover] + remover: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask' +``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_writer_task.md b/docs/reference/tasks/doctrine_writer_task.md index 16182dd..77dcfd2 100644 --- a/docs/reference/tasks/doctrine_writer_task.md +++ b/docs/reference/tasks/doctrine_writer_task.md @@ -21,7 +21,31 @@ Re-output given entity. Options ------- -| Code | Type | Required | Default | Description | -| ---- | ---- | :------: | ------- | ----------- | -| `entity_manager` | `string` or `null` | | `null` | Use another entity manager than the default | +None +Example +------- + +```yaml +entry: + service: '@CleverAge\ProcessBundle\Task\ConstantOutputTask' + options: + output: + firstname: Isaac + lastname: Asimov + outputs: [denormalize] + denormalize: + service: '@CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask' + options: + class: App\Entity\Author + outputs: [save] + save: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask' + outputs: [fetch] + fetch: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'Asimov' +``` \ No newline at end of file diff --git a/src/Task/EntityManager/DoctrineRefresherTask.php b/src/Task/EntityManager/DoctrineRefresherTask.php index ef0afdb..ebfa855 100644 --- a/src/Task/EntityManager/DoctrineRefresherTask.php +++ b/src/Task/EntityManager/DoctrineRefresherTask.php @@ -18,7 +18,7 @@ use Doctrine\ORM\EntityManagerInterface; /** - * Detach Doctrine entities from unit of work. + * Refreshes a Doctrine entity from the database. */ class DoctrineRefresherTask extends AbstractDoctrineTask { From 751f49ae39ba3e5897d3cd988f39c7b9ef795512 Mon Sep 17 00:00:00 2001 From: Xavier Marchegay Date: Mon, 16 Dec 2024 16:22:19 +0100 Subject: [PATCH 28/33] #13 add DoctrineReaderTask documentation --- docs/index.md | 2 +- docs/reference/tasks/doctrine_reader_task.md | 49 ++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 docs/reference/tasks/doctrine_reader_task.md diff --git a/docs/index.md b/docs/index.md index e720857..bd48ef8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -28,7 +28,7 @@ CleverAge\DoctrineProcessBundle\CleverAgeDoctrineProcessBundle::class => ['all' - [DoctrineBatchWriterTask](reference/tasks/doctrine_batchwriter_task.md) - [DoctrineCleanerTask](reference/tasks/doctrine_cleaner_task.md) - [DoctrineDetacherTask](reference/tasks/doctrine_detacher_task.md) - - [DoctrineReaderTask] + - [DoctrineReaderTask](reference/tasks/doctrine_reader_task.md) - [DoctrineRefresherTask](reference/tasks/doctrine_refresher_task.md) - [DoctrineRemoverTask](reference/tasks/doctrine_remover_task.md) - [DoctrineWriterTask](reference/tasks/doctrine_writer_task.md) diff --git a/docs/reference/tasks/doctrine_reader_task.md b/docs/reference/tasks/doctrine_reader_task.md new file mode 100644 index 0000000..884685d --- /dev/null +++ b/docs/reference/tasks/doctrine_reader_task.md @@ -0,0 +1,49 @@ +DoctrineReaderTask +================== + +Reads Doctrine entity from a repository + +Task reference +-------------- + +* **Service**: `CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask` + +Accepted inputs +--------------- + +None. + +Possible outputs +---------------- + +Outputs the result set of the entities. + +Options +------- + + +| Code | Type | Required | Default | Description | +|-------------------|--------------------|:--------:|-----------|------------------------------------------------| +| `class_name` | `string` | **X** | `null` | Name of the class (e.g. : 'App\Entity\Author') | +| `criteria` | `array` | | `[]` | Criteria of the query | +| `order_by` | `array` | | `[]` | Order by of the query | +| `limit` | `int` or `null` | | `null` | Result max count | +| `offset` | `int` or `null` | | `null` | Result first item offset | +| `empty_log_level` | `string` or `null` | | `warning` | Log level if the result set is empty | + + +Example +------- + +```yaml +entry: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' + options: + class_name: 'App\Entity\Author' + criteria: + lastname: 'King' + order_by: + lastname: 'asc' + limit: 5 + offset: 3 +``` \ No newline at end of file From 8927ce7800726f6b0a3c985c8647c830be329bf7 Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Mon, 16 Dec 2024 18:11:50 +0100 Subject: [PATCH 29/33] #11 tweak doc --- docs/index.md | 2 +- .../tasks/doctrine_batchwriter_task.md | 28 ++----------------- docs/reference/tasks/doctrine_cleaner_task.md | 14 ++-------- .../reference/tasks/doctrine_detacher_task.md | 9 ------ .../tasks/doctrine_refresher_task.md | 16 ----------- docs/reference/tasks/doctrine_remover_task.md | 14 ++-------- docs/reference/tasks/doctrine_writer_task.md | 23 ++------------- 7 files changed, 10 insertions(+), 96 deletions(-) diff --git a/docs/index.md b/docs/index.md index bd48ef8..9c24dd1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ ## Prerequisite -CleverAge/ProcessBundle must be [installed](https://github.com/cleverage/process-bundle/blob/main/docs/01-quick_start.md#installation. +CleverAge/ProcessBundle must be [installed](https://github.com/cleverage/process-bundle/blob/main/docs/01-quick_start.md#installation). ## Installation diff --git a/docs/reference/tasks/doctrine_batchwriter_task.md b/docs/reference/tasks/doctrine_batchwriter_task.md index e2ae15c..197c1e2 100644 --- a/docs/reference/tasks/doctrine_batchwriter_task.md +++ b/docs/reference/tasks/doctrine_batchwriter_task.md @@ -29,30 +29,8 @@ Example ------- ```yaml -entry: - service: '@CleverAge\ProcessBundle\Task\ConstantIterableOutputTask' +batch_write: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask' options: - output: - - author1: - firstname: Firstname 1 - lastname: Lastname - - author2: - firstname: Firstname 2 - lastname: Lastname - - author3: - firstname: Firstname 3 - lastname: Lastname - outputs: [iterate] - iterate: - service: '@CleverAge\ProcessBundle\Task\InputIteratorTask' - outputs: [denormalizer] - denormalizer: - service: '@CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask' - options: - class: App\Entity\Author - outputs: [batch_write] - batch_write: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask' - options: - batch_count: 2 + batch_count: 2 ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_cleaner_task.md b/docs/reference/tasks/doctrine_cleaner_task.md index f48a312..e7f7210 100644 --- a/docs/reference/tasks/doctrine_cleaner_task.md +++ b/docs/reference/tasks/doctrine_cleaner_task.md @@ -27,16 +27,6 @@ Example ------- ```yaml -entry: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' - options: - class_name: 'App\Entity\Author' - criteria: - lastname: 'King' - order_by: - lastname: 'asc' - outputs: [clean] - - clean: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask' +clean: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_detacher_task.md b/docs/reference/tasks/doctrine_detacher_task.md index c620d7f..10b79b7 100644 --- a/docs/reference/tasks/doctrine_detacher_task.md +++ b/docs/reference/tasks/doctrine_detacher_task.md @@ -27,15 +27,6 @@ Example ------- ```yaml -entry: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' - options: - class_name: 'App\Entity\Author' - criteria: - lastname: 'King' - order_by: - lastname: 'asc' - outputs: [detach] detach: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_refresher_task.md b/docs/reference/tasks/doctrine_refresher_task.md index 04a9386..7a4315f 100644 --- a/docs/reference/tasks/doctrine_refresher_task.md +++ b/docs/reference/tasks/doctrine_refresher_task.md @@ -27,22 +27,6 @@ Example ------- ```yaml -entry: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' - options: - class_name: 'App\Entity\Author' - criteria: - lastname: 'King' - order_by: - lastname: 'asc' - outputs: [modify] -modify: - service: '@CleverAge\ProcessBundle\Task\PropertySetterTask' - options: - values: - firstname: Gérard - outputs: [refresh] refresh: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask' - outputs: [dump_refreshed] ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_remover_task.md b/docs/reference/tasks/doctrine_remover_task.md index 388b236..1c215bd 100644 --- a/docs/reference/tasks/doctrine_remover_task.md +++ b/docs/reference/tasks/doctrine_remover_task.md @@ -27,16 +27,6 @@ Example ------- ```yaml -entry: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' - options: - class_name: 'App\Entity\Book' - criteria: - title: 'Dracula' - outputs: [dump] - dump: - service: '@CleverAge\ProcessBundle\Task\Debug\DebugTask' - outputs: [remover] - remover: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask' +remover: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_writer_task.md b/docs/reference/tasks/doctrine_writer_task.md index 77dcfd2..be5942c 100644 --- a/docs/reference/tasks/doctrine_writer_task.md +++ b/docs/reference/tasks/doctrine_writer_task.md @@ -27,25 +27,6 @@ Example ------- ```yaml -entry: - service: '@CleverAge\ProcessBundle\Task\ConstantOutputTask' - options: - output: - firstname: Isaac - lastname: Asimov - outputs: [denormalize] - denormalize: - service: '@CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask' - options: - class: App\Entity\Author - outputs: [save] - save: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask' - outputs: [fetch] - fetch: - service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' - options: - class_name: 'App\Entity\Author' - criteria: - lastname: 'Asimov' +write: + service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask' ``` \ No newline at end of file From c9501d34a8673c9ad9bd3f16c4f87ecc3863596b Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Mon, 16 Dec 2024 18:26:53 +0100 Subject: [PATCH 30/33] #11 tweak doc --- docs/reference/tasks/database_reader_task.md | 44 ++++++++++--------- docs/reference/tasks/database_updater_task.md | 3 +- .../tasks/doctrine_batchwriter_task.md | 3 +- docs/reference/tasks/doctrine_cleaner_task.md | 3 +- docs/reference/tasks/doctrine_clear_task.md | 3 +- .../reference/tasks/doctrine_detacher_task.md | 3 +- docs/reference/tasks/doctrine_reader_task.md | 3 +- .../tasks/doctrine_refresher_task.md | 3 +- docs/reference/tasks/doctrine_remover_task.md | 3 +- docs/reference/tasks/doctrine_writer_task.md | 3 +- 10 files changed, 42 insertions(+), 29 deletions(-) diff --git a/docs/reference/tasks/database_reader_task.md b/docs/reference/tasks/database_reader_task.md index af62a54..15473ff 100644 --- a/docs/reference/tasks/database_reader_task.md +++ b/docs/reference/tasks/database_reader_task.md @@ -12,7 +12,7 @@ Task reference Accepted inputs --------------- -Input can be used as the query params if needed +`array` Input can be used as the query params if needed Possible outputs ---------------- @@ -22,28 +22,32 @@ Iterate on an entity list returned by a sql query. Options ------- -| Code | Type | Required | Default | Description | -|-------------------|--------------------|:--------:|-----------|-------------------------------------------------------------------------| -| `connection` | `string` | | `null` | Doctrine connection (default if not specified) | -| `table` | `string` | **X** | `[]` | Table of the query | -| `sql` | `string` | | `null` | Query to execute (if not specified then: "select tbl.* from table tbl") | -| `limit` | `int` or `null` | | `null` | Result max count | -| `offset` | `int` or `null` | | `null` | Result first item offset | -| `paginate` | `int` or `null` | | `null` | Paginate the results | -| `input_as_params` | `bool` | | `false` | Use the input as params | -| `params` | `array` | | `[]` | Query params | -| `types` | `array` | | `[]` | Query params types | -| `empty_log_level` | `string` or `null` | | `warning` | Log level if the result set is empty | +| Code | Type | Required | Default | Description | +|-------------------|--------------------|:--------:|-----------|---------------------------------------------------------------------------| +| `connection` | `string` | | `null` | Doctrine connection (default if not specified) | +| `table` | `string` | **X** | `[]` | Table of the query | +| `sql` | `string` | | `null` | Query to execute (if not specified then: "select tbl.* from `table` tbl") | +| `limit` | `int` or `null` | | `null` | Result max count | +| `offset` | `int` or `null` | | `null` | Result first item offset | +| `paginate` | `int` or `null` | | `null` | Paginate the results | +| `input_as_params` | `bool` | | `false` | Use the input as params | +| `params` | `array` | | `[]` | Query params | +| `types` | `array` | | `[]` | Query params types | +| `empty_log_level` | `string` or `null` | | `warning` | Log level if the result set is empty | + Example ------- ```yaml -entry: - service: '@CleverAge\DoctrineProcessBundle\Task\Database\DatabaseReaderTask' - options: - table: 'book' - limit: 10 - offset: 3 - empty_log_level: debug +# Task configuration level +code: + service: '@CleverAge\DoctrineProcessBundle\Task\Database\DatabaseReaderTask' + options: + table: 'book' + limit: 10 + offset: 3 + params: + title: "IT" + empty_log_level: debug ``` \ No newline at end of file diff --git a/docs/reference/tasks/database_updater_task.md b/docs/reference/tasks/database_updater_task.md index 825ee3a..3037450 100644 --- a/docs/reference/tasks/database_updater_task.md +++ b/docs/reference/tasks/database_updater_task.md @@ -33,7 +33,8 @@ Example ------- ```yaml -entry: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\Database\DatabaseUpdaterTask' options: sql: 'update author set firstname = :firstname, lastname = :lastname' diff --git a/docs/reference/tasks/doctrine_batchwriter_task.md b/docs/reference/tasks/doctrine_batchwriter_task.md index 197c1e2..c41d1ef 100644 --- a/docs/reference/tasks/doctrine_batchwriter_task.md +++ b/docs/reference/tasks/doctrine_batchwriter_task.md @@ -29,7 +29,8 @@ Example ------- ```yaml -batch_write: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineBatchWriterTask' options: batch_count: 2 diff --git a/docs/reference/tasks/doctrine_cleaner_task.md b/docs/reference/tasks/doctrine_cleaner_task.md index e7f7210..7286103 100644 --- a/docs/reference/tasks/doctrine_cleaner_task.md +++ b/docs/reference/tasks/doctrine_cleaner_task.md @@ -27,6 +27,7 @@ Example ------- ```yaml -clean: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineCleanerTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_clear_task.md b/docs/reference/tasks/doctrine_clear_task.md index a77da6f..41ab53d 100644 --- a/docs/reference/tasks/doctrine_clear_task.md +++ b/docs/reference/tasks/doctrine_clear_task.md @@ -31,6 +31,7 @@ Example ------- ```yaml -clear: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\ClearEntityManagerTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_detacher_task.md b/docs/reference/tasks/doctrine_detacher_task.md index 10b79b7..7b91f94 100644 --- a/docs/reference/tasks/doctrine_detacher_task.md +++ b/docs/reference/tasks/doctrine_detacher_task.md @@ -27,6 +27,7 @@ Example ------- ```yaml -detach: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineDetacherTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_reader_task.md b/docs/reference/tasks/doctrine_reader_task.md index 884685d..387afbd 100644 --- a/docs/reference/tasks/doctrine_reader_task.md +++ b/docs/reference/tasks/doctrine_reader_task.md @@ -36,7 +36,8 @@ Example ------- ```yaml -entry: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineReaderTask' options: class_name: 'App\Entity\Author' diff --git a/docs/reference/tasks/doctrine_refresher_task.md b/docs/reference/tasks/doctrine_refresher_task.md index 7a4315f..477aa1a 100644 --- a/docs/reference/tasks/doctrine_refresher_task.md +++ b/docs/reference/tasks/doctrine_refresher_task.md @@ -27,6 +27,7 @@ Example ------- ```yaml -refresh: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRefresherTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_remover_task.md b/docs/reference/tasks/doctrine_remover_task.md index 1c215bd..a0ee9eb 100644 --- a/docs/reference/tasks/doctrine_remover_task.md +++ b/docs/reference/tasks/doctrine_remover_task.md @@ -27,6 +27,7 @@ Example ------- ```yaml -remover: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineRemoverTask' ``` \ No newline at end of file diff --git a/docs/reference/tasks/doctrine_writer_task.md b/docs/reference/tasks/doctrine_writer_task.md index be5942c..5a53ab3 100644 --- a/docs/reference/tasks/doctrine_writer_task.md +++ b/docs/reference/tasks/doctrine_writer_task.md @@ -27,6 +27,7 @@ Example ------- ```yaml -write: +# Task configuration level +code: service: '@CleverAge\DoctrineProcessBundle\Task\EntityManager\DoctrineWriterTask' ``` \ No newline at end of file From 51d9bacb0e5cdf3b1ba10332b065aae206b9fd84 Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Mon, 16 Dec 2024 18:57:27 +0100 Subject: [PATCH 31/33] #11 tweak doc --- docs/reference/tasks/database_reader_task.md | 4 ++-- docs/reference/tasks/database_updater_task.md | 4 ++-- docs/reference/tasks/doctrine_batchwriter_task.md | 4 ++-- docs/reference/tasks/doctrine_cleaner_task.md | 2 +- docs/reference/tasks/doctrine_clear_task.md | 4 ++-- docs/reference/tasks/doctrine_detacher_task.md | 6 +++--- docs/reference/tasks/doctrine_reader_task.md | 4 ++-- docs/reference/tasks/doctrine_refresher_task.md | 4 ++-- docs/reference/tasks/doctrine_remover_task.md | 6 +++--- docs/reference/tasks/doctrine_writer_task.md | 6 +++--- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/reference/tasks/database_reader_task.md b/docs/reference/tasks/database_reader_task.md index 15473ff..ad77b44 100644 --- a/docs/reference/tasks/database_reader_task.md +++ b/docs/reference/tasks/database_reader_task.md @@ -12,12 +12,12 @@ Task reference Accepted inputs --------------- -`array` Input can be used as the query params if needed +`array`or `None`: Input can be used as the query params if needed Possible outputs ---------------- -Iterate on an entity list returned by a sql query. +`array`: Rows returned by the query. Options ------- diff --git a/docs/reference/tasks/database_updater_task.md b/docs/reference/tasks/database_updater_task.md index 3037450..29a342a 100644 --- a/docs/reference/tasks/database_updater_task.md +++ b/docs/reference/tasks/database_updater_task.md @@ -11,12 +11,12 @@ Task reference Accepted inputs --------------- -Input can be used as the query params if needed +`array`or `None`: Input can be used as the query params if needed Possible outputs ---------------- -Iterate on an entity list returned by a sql query. +`int`: Number of rows changed by the query. Options ------- diff --git a/docs/reference/tasks/doctrine_batchwriter_task.md b/docs/reference/tasks/doctrine_batchwriter_task.md index c41d1ef..6080547 100644 --- a/docs/reference/tasks/doctrine_batchwriter_task.md +++ b/docs/reference/tasks/doctrine_batchwriter_task.md @@ -11,12 +11,12 @@ Task reference Accepted inputs --------------- -An array of entities +`array`: Entities to be persisted in the database Possible outputs ---------------- -The batch of the entities persisted to the database +`array`: Batch of the entities persisted to the database Options ------- diff --git a/docs/reference/tasks/doctrine_cleaner_task.md b/docs/reference/tasks/doctrine_cleaner_task.md index 7286103..aa32c66 100644 --- a/docs/reference/tasks/doctrine_cleaner_task.md +++ b/docs/reference/tasks/doctrine_cleaner_task.md @@ -11,7 +11,7 @@ Task reference Accepted inputs --------------- -A doctrine entity +`object`: Entity to be persisted in the database Possible outputs ---------------- diff --git a/docs/reference/tasks/doctrine_clear_task.md b/docs/reference/tasks/doctrine_clear_task.md index 41ab53d..8343304 100644 --- a/docs/reference/tasks/doctrine_clear_task.md +++ b/docs/reference/tasks/doctrine_clear_task.md @@ -11,12 +11,12 @@ Task reference Accepted inputs --------------- -Ignored +`None` Possible outputs ---------------- -None +`None` Options ------- diff --git a/docs/reference/tasks/doctrine_detacher_task.md b/docs/reference/tasks/doctrine_detacher_task.md index 7b91f94..5fdb9eb 100644 --- a/docs/reference/tasks/doctrine_detacher_task.md +++ b/docs/reference/tasks/doctrine_detacher_task.md @@ -11,17 +11,17 @@ Task reference Accepted inputs --------------- -Any doctrine managed entity. +`object`: Doctrine managed entity Possible outputs ---------------- -None +`None` Options ------- -None +`None` Example ------- diff --git a/docs/reference/tasks/doctrine_reader_task.md b/docs/reference/tasks/doctrine_reader_task.md index 387afbd..5e054f8 100644 --- a/docs/reference/tasks/doctrine_reader_task.md +++ b/docs/reference/tasks/doctrine_reader_task.md @@ -11,12 +11,12 @@ Task reference Accepted inputs --------------- -None. +`None` Possible outputs ---------------- -Outputs the result set of the entities. +`array`: Result set of the entities Options ------- diff --git a/docs/reference/tasks/doctrine_refresher_task.md b/docs/reference/tasks/doctrine_refresher_task.md index 477aa1a..d56c428 100644 --- a/docs/reference/tasks/doctrine_refresher_task.md +++ b/docs/reference/tasks/doctrine_refresher_task.md @@ -11,12 +11,12 @@ Task reference Accepted inputs --------------- -Any doctrine managed entity. +`object`: Doctrine managed entity Possible outputs ---------------- -The refreshed entity +`object`: The refreshed entity Options ------- diff --git a/docs/reference/tasks/doctrine_remover_task.md b/docs/reference/tasks/doctrine_remover_task.md index a0ee9eb..435f126 100644 --- a/docs/reference/tasks/doctrine_remover_task.md +++ b/docs/reference/tasks/doctrine_remover_task.md @@ -11,17 +11,17 @@ Task reference Accepted inputs --------------- -Any doctrine managed entity. +`object`: Doctrine managed entity Possible outputs ---------------- -None +`None` Options ------- -None +`None` Example ------- diff --git a/docs/reference/tasks/doctrine_writer_task.md b/docs/reference/tasks/doctrine_writer_task.md index 5a53ab3..c72a4ce 100644 --- a/docs/reference/tasks/doctrine_writer_task.md +++ b/docs/reference/tasks/doctrine_writer_task.md @@ -11,17 +11,17 @@ Task reference Accepted inputs --------------- -Any doctrine managed entity. +`object`: Doctrine managed entity Possible outputs ---------------- -Re-output given entity. +`object`: Re-outputs given entity Options ------- -None +`None` Example ------- From c0a6a141983c21b54c5d8ac895b335a7f61714a5 Mon Sep 17 00:00:00 2001 From: xmarchegay Date: Mon, 16 Dec 2024 18:57:39 +0100 Subject: [PATCH 32/33] #11 fix typo --- docs/reference/tasks/doctrine_writer_task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/tasks/doctrine_writer_task.md b/docs/reference/tasks/doctrine_writer_task.md index c72a4ce..5eb42a3 100644 --- a/docs/reference/tasks/doctrine_writer_task.md +++ b/docs/reference/tasks/doctrine_writer_task.md @@ -1,7 +1,7 @@ DoctrineWriterTask ================== -Write a Doctrine entity to the database. +Writes a Doctrine entity to the database. Task reference -------------- From 4bf118ad91c6bf54382d426b41da5ec30236cda6 Mon Sep 17 00:00:00 2001 From: Nicolas Joubert Date: Tue, 17 Dec 2024 15:14:12 +0100 Subject: [PATCH 33/33] #7 Bump dependency "cleverage/process-bundle": "^4.0" --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1a93443..4afcfe4 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,7 @@ }, "require": { "php": ">=8.1", - "cleverage/process-bundle": "dev-prepare-release", + "cleverage/process-bundle": "^4.0", "doctrine/common": "^3.0", "doctrine/dbal": "^2.9 || ^3.0", "doctrine/doctrine-bundle": "^2.5",