From 94be8d211d53b3c4bf14db10cd27a7837affb93f Mon Sep 17 00:00:00 2001 From: Dominic Tubach Date: Thu, 18 Apr 2024 11:29:58 +0200 Subject: [PATCH] Replace deprecated usage of `CRM_Core_BAO_Setting` Additionally add configuration for phpcs, phpstan, and phpunit and a first test. --- .github/workflows/phpcs.yml | 42 + .github/workflows/phpstan.yml | 57 + .github/workflows/phpunit.yml | 36 + .gitignore | 6 + CRM/Moregreetings/Config.php | 2 +- CRM/Moregreetings/Form/Settings.php | 6 +- CRM/Moregreetings/Job.php | 2 +- CRM/Moregreetings/Renderer.php | 4 +- .../Resolver/MoreGreetingsSubscriber.php | 2 +- api/v3/Job/UpdateMoregreetings.php | 6 +- ci/README.md | 2 + ci/composer.json | 14 + composer.json | 44 + phpcs.xml.dist | 80 + phpstan.ci.neon | 14 + phpstan.neon.dist | 37 + phpstan.neon.template | 12 + phpstanBootstrap.php | 47 + phpunit.xml.dist | 32 + tests/docker-compose.yml | 34 + tests/docker-phpunit.sh | 19 + tests/docker-prepare.sh | 45 + tests/ignored-deprecations.json | 1317 +++++++++++++++++ .../CRM_Moregreetings_RendererTest.php | 36 + .../AbstractMoregreetingsHeadlessTestCase.php | 35 + .../Moregreetings/Fixtures/ContactFixture.php | 27 + tests/phpunit/bootstrap.php | 80 + tools/phpcs/composer.json | 11 + tools/phpstan/composer.json | 18 + tools/phpunit/composer.json | 13 + 30 files changed, 2069 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/phpcs.yml create mode 100644 .github/workflows/phpstan.yml create mode 100644 .github/workflows/phpunit.yml create mode 100644 .gitignore create mode 100644 ci/README.md create mode 100644 ci/composer.json create mode 100644 composer.json create mode 100644 phpcs.xml.dist create mode 100644 phpstan.ci.neon create mode 100644 phpstan.neon.dist create mode 100644 phpstan.neon.template create mode 100644 phpstanBootstrap.php create mode 100644 phpunit.xml.dist create mode 100644 tests/docker-compose.yml create mode 100755 tests/docker-phpunit.sh create mode 100755 tests/docker-prepare.sh create mode 100644 tests/ignored-deprecations.json create mode 100644 tests/phpunit/CRM/Moregreetings/CRM_Moregreetings_RendererTest.php create mode 100644 tests/phpunit/Civi/Moregreetings/AbstractMoregreetingsHeadlessTestCase.php create mode 100644 tests/phpunit/Civi/Moregreetings/Fixtures/ContactFixture.php create mode 100644 tests/phpunit/bootstrap.php create mode 100644 tools/phpcs/composer.json create mode 100644 tools/phpstan/composer.json create mode 100644 tools/phpunit/composer.json diff --git a/.github/workflows/phpcs.yml b/.github/workflows/phpcs.yml new file mode 100644 index 0000000..2c89c37 --- /dev/null +++ b/.github/workflows/phpcs.yml @@ -0,0 +1,42 @@ +name: PHP_CodeSniffer + +on: + pull_request:: + paths: + - '**.php' + - tools/phpcs/composer.json + - phpcs.xml.dist + +jobs: + phpcs: + runs-on: ubuntu-latest + name: PHP_CodeSniffer + + steps: + - uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + coverage: none + tools: cs2pr + env: + fail-fast: true + + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('tools/phpcs/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install dependencies + run: composer composer-phpcs -- update --no-progress --prefer-dist + + - name: Run PHP_CodeSniffer + run: composer phpcs -- -q --report=checkstyle | cs2pr diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml new file mode 100644 index 0000000..36e0264 --- /dev/null +++ b/.github/workflows/phpstan.yml @@ -0,0 +1,57 @@ +name: PHPStan + +on: + push: + pull_request: + - '**.php' + - composer.json + - tools/phpstan/composer.json + - ci/composer.json + - phpstan.ci.neon + - phpstan.neon.dist + +jobs: + phpstan: + runs-on: ubuntu-latest + strategy: + matrix: + php-versions: ['7.4', '8.0', '8.3'] + prefer: ['prefer-stable', 'prefer-lowest'] + name: PHPStan with PHP ${{ matrix.php-versions }} ${{ matrix.prefer }} + + steps: + - uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + coverage: none + env: + fail-fast: true + + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies + uses: actions/cache@v3 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ matrix.prefer }}-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer-${{ matrix.prefer }}- + + - name: Install dependencies + run: | + git clone --depth=1 https://github.com/systopia/activity-entity.git ../activity-entity && + git clone --depth=1 https://github.com/systopia/de.systopia.civioffice.git ../de.systopia.civioffice && + git clone --depth=1 https://github.com/systopia/de.systopia.remotetools.git ../de.systopia.remotetools && + git clone --depth=1 https://github.com/systopia/external-file.git ../external-file && + composer update --no-progress --prefer-dist --${{ matrix.prefer }} --optimize-autoloader --ignore-platform-req=ext-gd && + composer composer-phpunit -- update --no-progress --prefer-dist && + composer composer-phpstan -- update --no-progress --prefer-dist --optimize-autoloader && + composer --working-dir=ci update --no-progress --prefer-dist --${{ matrix.prefer }} --optimize-autoloader --ignore-platform-req=ext-gd + composer --working-dir=../de.systopia.remotetools update --no-progress --prefer-dist --${{ matrix.prefer }} --optimize-autoloader + + - name: Run PHPStan + run: composer phpstan -- analyse -c phpstan.ci.neon diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml new file mode 100644 index 0000000..158b867 --- /dev/null +++ b/.github/workflows/phpunit.yml @@ -0,0 +1,36 @@ +name: PHPUnit + +on: + pull_request: + paths: + - '**.php' + - composer.json + - tools/phpunit/composer.json + - phpunit.xml.dist + +env: + # On github CI machine creating the "/vendor" volume fails otherwise with: read-only file system: unknown + BIND_VOLUME_PERMISSIONS: rw + +jobs: + phpunit: + runs-on: ubuntu-latest + strategy: + matrix: + civicrm-image-tags: [ '5-drupal', '5.38-drupal-php8.0' ] + name: PHPUnit with Docker image michaelmcandrew/civicrm:${{ matrix.civicrm-image-tags }} + env: + CIVICRM_IMAGE_TAG: ${{ matrix.civicrm-image-tags }} + + steps: + - uses: actions/checkout@v3 + - name: Pull images + run: docker compose -f tests/docker-compose.yml pull --quiet + - name: Start containers + run: docker compose -f tests/docker-compose.yml up -d + - name: Prepare environment + run: docker compose -f tests/docker-compose.yml exec civicrm sites/default/files/civicrm/ext/de.systopia.moregreetings/tests/docker-prepare.sh + - name: Run PHPUnit + run: docker compose -f tests/docker-compose.yml exec civicrm sites/default/files/civicrm/ext/de.systopia.moregreetings/tests/docker-phpunit.sh + - name: Remove containers + run: docker compose -f tests/docker-compose.yml down -v diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..601160c --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/.phpcs.cache +/.phpunit.result.cache +/.phpstan/ +/phpstan.neon +/tools/*/vendor/ +/tools/*/composer.lock diff --git a/CRM/Moregreetings/Config.php b/CRM/Moregreetings/Config.php index 79cb320..e1fc156 100644 --- a/CRM/Moregreetings/Config.php +++ b/CRM/Moregreetings/Config.php @@ -152,7 +152,7 @@ public static function restartCalculateAllGreetingsJob() { $job = self::getAllGreetingsJob(); // start from zero: - CRM_Core_BAO_Setting::setItem('0', 'moregreetings', 'moregreetings_job_status'); + Civi::settings()->set('moregreetings_job_status', '0'); // enable cronjob if (!$job['is_active']) { diff --git a/CRM/Moregreetings/Form/Settings.php b/CRM/Moregreetings/Form/Settings.php index 48dd647..1197c72 100644 --- a/CRM/Moregreetings/Form/Settings.php +++ b/CRM/Moregreetings/Form/Settings.php @@ -93,7 +93,7 @@ public function buildQuickForm() { * set the default (=current) values in the form */ public function setDefaultValues() { - $values = CRM_Core_BAO_Setting::getItem('moregreetings', 'moregreetings_templates'); + $values = Civi::settings()->get('moregreetings_templates'); if (!is_array($values)) { $values = array(); } @@ -109,7 +109,7 @@ public function postProcess() { $values = $this->exportValues(); // first: update the greetings - $old_greetings = CRM_Core_BAO_Setting::getItem('moregreetings', 'moregreetings_templates'); + $old_greetings = Civi::settings()->get('moregreetings_templates'); $greetings_changed = FALSE; for ($i = 1; $i <= self::getNumberOfGreetings(); ++$i) { if (isset($values["greeting_smarty_{$i}"])) { @@ -123,7 +123,7 @@ public function postProcess() { $greetings_changed = TRUE; } } - CRM_Core_BAO_Setting::setItem($values_array, 'moregreetings', 'moregreetings_templates'); + Civi::settings()->set('moregreetings_templates', $values_array); // then: adjust the greeting count if ($values['greeting_count'] != self::getNumberOfGreetings()) { diff --git a/CRM/Moregreetings/Job.php b/CRM/Moregreetings/Job.php index a2954be..0555a85 100644 --- a/CRM/Moregreetings/Job.php +++ b/CRM/Moregreetings/Job.php @@ -51,7 +51,7 @@ public function run($context) { } // determine the fields to load - $templates = CRM_Core_BAO_Setting::getItem('moregreetings', 'moregreetings_templates'); + $templates = Civi::settings()->get('moregreetings_templates'); $used_fields = CRM_Moregreetings_Renderer::getUsedContactFields($templates); // load contacts diff --git a/CRM/Moregreetings/Renderer.php b/CRM/Moregreetings/Renderer.php index 104bc90..a7c67fa 100644 --- a/CRM/Moregreetings/Renderer.php +++ b/CRM/Moregreetings/Renderer.php @@ -36,7 +36,7 @@ public static function updateMoreGreetings($contact_id, $contact = NULL): void { } // load the templates - $templates = CRM_Core_BAO_Setting::getItem('moregreetings', 'moregreetings_templates'); + $templates = Civi::settings()->get('moregreetings_templates'); if (!is_array($templates)) { return; } @@ -95,7 +95,7 @@ public static function updateMoreGreetings($contact_id, $contact = NULL): void { * @return int last contact ID processed, 0 if none */ public static function updateMoreGreetingsForContacts($from_id, $max_count): int { - $templates = CRM_Core_BAO_Setting::getItem('moregreetings', 'moregreetings_templates'); + $templates = Civi::settings()->get('moregreetings_templates'); // remark: if you change these parameters, see if you also want to adjust // CRM_Moregreetings_Job::run and CRM_Moregreetings_Renderer::updateMoreGreetings diff --git a/CRM/Xdedupe/Resolver/MoreGreetingsSubscriber.php b/CRM/Xdedupe/Resolver/MoreGreetingsSubscriber.php index a350a2a..fbcca69 100644 --- a/CRM/Xdedupe/Resolver/MoreGreetingsSubscriber.php +++ b/CRM/Xdedupe/Resolver/MoreGreetingsSubscriber.php @@ -27,7 +27,7 @@ class CRM_Xdedupe_Resolver_MoreGreetingsSubscriber implements EventSubscriberInt /** * Subscribe to the list events, so we can plug the built-in ones */ - public static function getSubscribedEvents() { + public static function getSubscribedEvents(): array { return [ 'civi.xdedupe.resolvers' => ['addBuiltinResolvers', Events::W_MIDDLE], ]; diff --git a/api/v3/Job/UpdateMoregreetings.php b/api/v3/Job/UpdateMoregreetings.php index 239b382..a1ab65c 100644 --- a/api/v3/Job/UpdateMoregreetings.php +++ b/api/v3/Job/UpdateMoregreetings.php @@ -19,14 +19,14 @@ * Cron Job to update the more-greetings for all contacts */ function civicrm_api3_job_update_moregreetings($params) { - $last_id = CRM_Core_BAO_Setting::getItem('moregreetings', 'moregreetings_job_status'); + $last_id = Civi::settings()->get('moregreetings_job_status'); if ($last_id == 'busy') { // there's another job running return civicrm_api3_create_success(ts("Job already running", array('domain' => 'de.systopia.moregreetings'))); } // ok, let's go - CRM_Core_BAO_Setting::setItem('busy', 'moregreetings', 'moregreetings_job_status'); + Civi::settings()->set('moregreetings_job_status', 'busy'); $start_time = microtime(TRUE); // run the renderer on blocks of contacts until the time runs out @@ -41,7 +41,7 @@ function civicrm_api3_job_update_moregreetings($params) { } // store last processed ID - CRM_Core_BAO_Setting::setItem((string)$last_id, 'moregreetings', 'moregreetings_job_status'); + Civi::settings()->set('moregreetings_job_status', (string)$last_id); if ($last_id == 0) { // we're done! diff --git a/ci/README.md b/ci/README.md new file mode 100644 index 0000000..0bfc584 --- /dev/null +++ b/ci/README.md @@ -0,0 +1,2 @@ +The dependencies specified in composer.json of this directory are required to +run phpstan in CI. diff --git a/ci/composer.json b/ci/composer.json new file mode 100644 index 0000000..fdf1cf0 --- /dev/null +++ b/ci/composer.json @@ -0,0 +1,14 @@ +{ + "minimum-stability": "dev", + "prefer-stable": true, + "config": { + "allow-plugins": { + "civicrm/composer-compile-plugin": false, + "civicrm/composer-downloads-plugin": true, + "cweagans/composer-patches": true + } + }, + "require": { + "civicrm/civicrm-core": "^5.38" + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..5256dba --- /dev/null +++ b/composer.json @@ -0,0 +1,44 @@ +{ + "name": "systopia/de.systopia.moregreetings", + "type": "civicrm-ext", + "license": "AGPL-3.0-or-later", + "minimum-stability": "dev", + "prefer-stable": true, + "config": { + "sort-packages": true + }, + "require": {}, + "scripts": { + "composer-phpcs": [ + "@composer --working-dir=tools/phpcs" + ], + "composer-phpstan": [ + "@composer --working-dir=tools/phpstan" + ], + "composer-phpunit": [ + "@composer --working-dir=tools/phpunit" + ], + "composer-tools": [ + "@composer-phpcs", + "@composer-phpstan", + "@composer-phpunit" + ], + "phpcs": [ + "@php tools/phpcs/vendor/bin/phpcs" + ], + "phpcbf": [ + "@php tools/phpcs/vendor/bin/phpcbf" + ], + "phpstan": [ + "@php tools/phpstan/vendor/bin/phpstan" + ], + "phpunit": [ + "@php tools/phpunit/vendor/bin/simple-phpunit --coverage-text" + ], + "test": [ + "@phpcs", + "@phpstan", + "@phpunit" + ] + } +} diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 0000000..ba890e6 --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,80 @@ + + + CiviCRM coding standard with support for PHPStan type hints and some additional rules + + + + + tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/phpstan.ci.neon b/phpstan.ci.neon new file mode 100644 index 0000000..bd8e612 --- /dev/null +++ b/phpstan.ci.neon @@ -0,0 +1,14 @@ +includes: + - phpstan.neon.dist + +parameters: + scanDirectories: + - ci/vendor/civicrm/civicrm-core/api/ + - ci/vendor/civicrm/civicrm-core/CRM/ + bootstrapFiles: + - ci/vendor/autoload.php + # Because we test with different versions in CI we have unmatched errors + reportUnmatchedIgnoredErrors: false + ignoreErrors: + # Errors we get when using "prefer-lowest" + - '#::getSubscribedEvents\(\) return type has no value type specified in iterable type array.$#' diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000..47740da --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,37 @@ +parameters: + paths: + # TODO: Commented paths should be commented in. Maybe the level should be reduced initially. + #- api + #- CRM + - tests + #- moregreetings.php + excludePaths: + analyse: + - tests/phpunit/bootstrap.php + scanFiles: + - moregreetings.civix.php + - tools/phpunit/vendor/bin/.phpunit/phpunit/src/Framework/TestCase.php + scanDirectories: + - CRM + - tools/phpunit/vendor/bin/.phpunit/phpunit/src/Framework + bootstrapFiles: + - tools/phpunit/vendor/bin/.phpunit/phpunit/vendor/autoload.php + - phpstanBootstrap.php + level: 9 + universalObjectCratesClasses: + - Civi\Core\Event\GenericHookEvent + checkTooWideReturnTypesInProtectedAndPublicMethods: true + checkUninitializedProperties: true + checkMissingCallableSignature: true + treatPhpDocTypesAsCertain: false + exceptions: + check: + missingCheckedExceptionInThrows: true + tooWideThrowType: true + checkedExceptionClasses: + - \Webmozart\Assert\InvalidArgumentException + implicitThrows: false + ignoreErrors: + # Note paths are prefixed with ""*/" to wirk with inspections in PHPStorm because of: + # https://youtrack.jetbrains.com/issue/WI-63891/PHPStan-ignoreErrors-configuration-isnt-working-with-inspections + tmpDir: .phpstan diff --git a/phpstan.neon.template b/phpstan.neon.template new file mode 100644 index 0000000..0012295 --- /dev/null +++ b/phpstan.neon.template @@ -0,0 +1,12 @@ +# Copy this file to phpstan.neon and replace {VENDOR_DIR} with the appropriate +# paths. + +includes: + - phpstan.neon.dist + +parameters: + scanDirectories: + - {VENDOR_DIR}/civicrm/civicrm-core/api/ + - {VENDOR_DIR}/civicrm/civicrm-core/CRM/ + bootstrapFiles: + - {VENDOR_DIR}/autoload.php diff --git a/phpstanBootstrap.php b/phpstanBootstrap.php new file mode 100644 index 0000000..2703404 --- /dev/null +++ b/phpstanBootstrap.php @@ -0,0 +1,47 @@ +. + */ + +declare(strict_types = 1); + +if (file_exists(__DIR__ . '/vendor/autoload.php')) { + require_once __DIR__ . '/vendor/autoload.php'; +} + +// phpcs:disable Drupal.Commenting.DocComment.ContentAfterOpen +/** @var \PHPStan\DependencyInjection\Container $container */ +/** @phpstan-var array $bootstrapFiles */ +$bootstrapFiles = $container->getParameter('bootstrapFiles'); +foreach ($bootstrapFiles as $bootstrapFile) { + if (str_ends_with($bootstrapFile, 'vendor/autoload.php')) { + $vendorDir = dirname($bootstrapFile); + $civiCrmVendorDir = $vendorDir . '/civicrm'; + $civiCrmCoreDir = $civiCrmVendorDir . '/civicrm-core'; + if (file_exists($civiCrmCoreDir)) { + set_include_path(get_include_path() + . PATH_SEPARATOR . $civiCrmCoreDir + . PATH_SEPARATOR . $civiCrmVendorDir . '/civicrm-packages' + ); + // $bootstrapFile might not be included, yet. It is required for the + // following require_once, though. + require_once $bootstrapFile; + // Prevent error "Class 'CRM_Core_Exception' not found in file". + require_once $civiCrmCoreDir . '/CRM/Core/Exception.php'; + + break; + } + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..8f2dae9 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,32 @@ + + + + + + + + + + + ./tests/phpunit + + + + + api + CRM + Civi + + + + + + + + diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml new file mode 100644 index 0000000..b85120b --- /dev/null +++ b/tests/docker-compose.yml @@ -0,0 +1,34 @@ +version: "3" +services: + civicrm: + image: michaelmcandrew/civicrm:${CIVICRM_IMAGE_TAG:-5-drupal} + environment: + - PROJECT_NAME=test + - BASE_URL=http://localhost + - CIVICRM_DB_NAME=test + - CIVICRM_DB_USER=root + - CIVICRM_DB_PASS=secret + - CIVICRM_DB_HOST=mysql + - CIVICRM_DB_PORT=3306 + - CIVICRM_SITE_KEY=test + - DRUPAL_DB_NAME=test + - DRUPAL_DB_USER=root + - DRUPAL_DB_PASS=secret + - DRUPAL_DB_HOST=mysql + - DRUPAL_DB_PORT=3306 + - PHP_DATE_TIMEZONE=UTC + - DEBUG=ON + - SMTP_HOST=localhost + - SMTP_MAILDOMAIN=example.org + volumes: + - ../:/var/www/html/sites/default/files/civicrm/ext/de.systopia.moregreetings:${BIND_VOLUME_PERMISSIONS:-ro} + - /var/www/html/sites/default/files/civicrm/ext/de.systopia.moregreetings/vendor + - /var/www/html/sites/default/files/civicrm/ext/de.systopia.moregreetings/tools/phpunit/vendor + # Don't start Apache HTTP Server, but keep container running + command: ["tail", "-f", "/dev/null"] + stop_signal: SIGKILL + mysql: + image: mariadb + environment: + MARIADB_ROOT_PASSWORD: secret + MARIADB_DATABASE: test diff --git a/tests/docker-phpunit.sh b/tests/docker-phpunit.sh new file mode 100755 index 0000000..2b0fc69 --- /dev/null +++ b/tests/docker-phpunit.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -eu -o pipefail + +SCRIPT_DIR=$(realpath "$(dirname "$0")") +EXT_DIR=$(dirname "$SCRIPT_DIR") + +cd "$EXT_DIR" +if [ ! -e tools/phpunit/vendor/bin ]; then + "$SCRIPT_DIR/docker-prepare.sh" +fi + +export XDEBUG_MODE=coverage +# TODO: Remove when not needed, anymore. +# In Docker container with CiviCRM 5.5? all deprecations are reported as direct +# deprecations so "disabling" check of deprecation count is necessary for the +# tests to pass (if baselineFile does not contain all deprecations). +export SYMFONY_DEPRECATIONS_HELPER="max[total]=99999&baselineFile=./tests/ignored-deprecations.json" + +composer phpunit -- --cache-result-file=/tmp/.phpunit.result.cache "$@" diff --git a/tests/docker-prepare.sh b/tests/docker-prepare.sh new file mode 100755 index 0000000..a293c74 --- /dev/null +++ b/tests/docker-prepare.sh @@ -0,0 +1,45 @@ +#!/bin/bash +set -eu -o pipefail + +EXT_DIR=$(dirname "$(dirname "$(realpath "$0")")") +EXT_NAME=$(basename "$EXT_DIR") + +i=0 +while ! mysql -h "$CIVICRM_DB_HOST" -P "$CIVICRM_DB_PORT" -u "$CIVICRM_DB_USER" --password="$CIVICRM_DB_PASS" -e 'SELECT 1;' >/dev/null 2>&1; do + i=$((i+1)) + if [ $i -gt 10 ]; then + echo "Failed to connect to database" >&2 + exit 1 + fi + + echo -n . + sleep 1 +done + +echo + +export XDEBUG_MODE=off +if mysql -h "$CIVICRM_DB_HOST" -P "$CIVICRM_DB_PORT" -u "$CIVICRM_DB_USER" --password="$CIVICRM_DB_PASS" "$CIVICRM_DB_NAME" -e 'SELECT 1 FROM civicrm_setting LIMIT 1;' >/dev/null 2>&1; then + cv flush +else + # For headless tests it is required that CIVICRM_UF is defined using the corresponding env variable. + sed -E "s/define\('CIVICRM_UF', '([^']+)'\);/define('CIVICRM_UF', getenv('CIVICRM_UF') ?: '\1');/g" \ + -i /var/www/html/sites/default/civicrm.settings.php + civicrm-docker-install + + # Avoid this error: + # The autoloader expected class "Civi\ActionSchedule\Mapping" to be defined in + # file "[...]/Civi/ActionSchedule/Mapping.php". The file was found but the + # class was not in it, the class name or namespace probably has a typo. + rm -f /var/www/html/sites/all/modules/civicrm/Civi/ActionSchedule/Mapping.php + + # For headless tests these files need to exist. + touch /var/www/html/sites/all/modules/civicrm/sql/test_data.mysql + touch /var/www/html/sites/all/modules/civicrm/sql/test_data_second_domain.mysql + + cv ext:enable "$EXT_NAME" +fi + +cd "$EXT_DIR" +composer update --no-progress --prefer-dist --optimize-autoloader --no-dev +composer composer-phpunit -- update --no-progress --prefer-dist diff --git a/tests/ignored-deprecations.json b/tests/ignored-deprecations.json new file mode 100644 index 0000000..ef2cecb --- /dev/null +++ b/tests/ignored-deprecations.json @@ -0,0 +1,1317 @@ +[ + { + "location": "Civi\\Test\\CiviTestListenerPHPUnit7", + "message": "The \"Civi\\Test\\CiviTestListenerPHPUnit7\" class implements \"PHPUnit\\Framework\\TestListener\" that is deprecated.", + "count": 1 + }, + { + "location": "Civi\\Test\\CiviTestListenerPHPUnit7", + "message": "The \"Civi\\Test\\CiviTestListenerPHPUnit7\" class uses \"PHPUnit\\Framework\\TestListenerDefaultImplementation\" that is deprecated The `TestListener` interface is deprecated.", + "count": 1 + }, + { + "location": "Civi\\Test\\CiviTestListener", + "message": "The \"Civi\\Test\\CiviTestListenerPHPUnit7\" class implements \"PHPUnit\\Framework\\TestListener\" that is deprecated.", + "count": 1 + }, + { + "location": "Civi\\Test\\CiviTestListener", + "message": "The \"Civi\\Test\\CiviTestListenerPHPUnit7\" class uses \"PHPUnit\\Framework\\TestListenerDefaultImplementation\" that is deprecated The `TestListener` interface is deprecated.", + "count": 1 + }, + { + "location": "CRM_Utils_System_UnitTests", + "message": "The \"CRM_Utils_System_Base::isLoaded()\" method is considered internal. It may change without further notice. You should not extend it from \"CRM_Utils_System_UnitTests\".", + "count": 1 + }, + { + "location": "CRM_Utils_System_UnitTests", + "message": "Method \"CRM_Utils_System_Base::authenticate()\" might add \"array|bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Utils_System_UnitTests\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_System_UnitTests", + "message": "Method \"CRM_Utils_System_Base::cmsRootPath()\" might add \"?string\" as a native return type declaration in the future. Do the same in child class \"CRM_Utils_System_UnitTests\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_System_UnitTests", + "message": "Method \"CRM_Utils_System_Base::postURL()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Utils_System_UnitTests\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_System_UnitTests", + "message": "Method \"CRM_Utils_System_Base::url()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Utils_System_UnitTests\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_System_UnitTests", + "message": "Method \"CRM_Utils_System_Base::getLoginURL()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Utils_System_UnitTests\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_SqlGroup", + "message": "Method \"CRM_Utils_Cache_Interface::has()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_SqlGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_SqlGroup", + "message": "Method \"CRM_Utils_Cache_Interface::flush()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_SqlGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_SqlGroup", + "message": "Method \"CRM_Utils_Cache_Interface::clear()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_SqlGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Cache", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Cache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"Psr\\SimpleCache\\CacheInterface::getMultiple()\" might add \"iterable\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"Psr\\SimpleCache\\CacheInterface::setMultiple()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"Psr\\SimpleCache\\CacheInterface::deleteMultiple()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"CRM_Utils_Cache_Interface::set()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"CRM_Utils_Cache_Interface::get()\" might add \"mixed\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"CRM_Utils_Cache_Interface::delete()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"CRM_Utils_Cache_Interface::clear()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_CacheWrapper", + "message": "Method \"CRM_Utils_Cache_Interface::has()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_CacheWrapper\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_ArrayCache", + "message": "Method \"CRM_Utils_Cache_Interface::flush()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_ArrayCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_ArrayCache", + "message": "Method \"CRM_Utils_Cache_Interface::clear()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_ArrayCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_Cache_ArrayCache", + "message": "Method \"CRM_Utils_Cache_Interface::has()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_Cache_ArrayCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Core\\Compiler\\AutoServiceScannerPass", + "message": "Method \"Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface::process()\" might add \"void\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Core\\Compiler\\AutoServiceScannerPass\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Core\\Compiler\\EventScannerPass", + "message": "Method \"Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface::process()\" might add \"void\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Core\\Compiler\\EventScannerPass\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Core\\Compiler\\SpecProviderPass", + "message": "Method \"Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface::process()\" might add \"void\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Core\\Compiler\\SpecProviderPass\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Extension", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Extension\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_LocationType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_LocationType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Managed", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Managed\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Mapping", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Mapping\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_MessageTemplate", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_MessageTemplate\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_OptionGroup", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_OptionGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_PreferencesDate", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_PreferencesDate\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Translation", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Translation\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_PrevNextCache", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_PrevNextCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_RecurringEntity", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_RecurringEntity\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_BAO_RecurringEntity", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_BAO_RecurringEntity\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_ACL_DAO_ACL", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_ACL_DAO_ACL\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_ACL_DAO_ACLEntityRole", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_ACL_DAO_ACLEntityRole\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_Contact", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_Contact\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_RelationshipType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_RelationshipType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_SavedSearch", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_SavedSearch\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_ContactType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_ContactType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Batch_DAO_Batch", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Batch_DAO_Batch\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Batch_BAO_Batch", + "message": "The \"CRM_Batch_BAO_Batch::links()\" method will require a new \"array $new_links\" argument in the next major version of its parent class \"DB_DataObject\", not defining it is deprecated.", + "count": 1 + }, + { + "location": "CRM_Batch_DAO_EntityBatch", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Batch_DAO_EntityBatch\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_MailingComponent", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_MailingComponent\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_MailingAB", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_MailingAB\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_BouncePattern", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_BouncePattern\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_Premium", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_Premium\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_FinancialAccount", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_FinancialAccount\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_PaymentProcessorType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_PaymentProcessorType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_FinancialType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_FinancialType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_EntityFinancialAccount", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_EntityFinancialAccount\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_FinancialItem", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_FinancialItem\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Member_DAO_MembershipStatus", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Member_DAO_MembershipStatus\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Campaign_DAO_Campaign", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Campaign_DAO_Campaign\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Campaign_DAO_Survey", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Campaign_DAO_Survey\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_DAO_ParticipantStatusType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Event_DAO_ParticipantStatusType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Dedupe_DAO_DedupeRuleGroup", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Dedupe_DAO_DedupeRuleGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Dedupe_DAO_DedupeRule", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Dedupe_DAO_DedupeRule\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Dedupe_DAO_DedupeException", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Dedupe_DAO_DedupeException\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Case_DAO_CaseType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Case_DAO_CaseType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Friend_DAO_Friend", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Friend_DAO_Friend\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Pledge_DAO_PledgeBlock", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Pledge_DAO_PledgeBlock\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Queue_DAO_Queue", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Queue_DAO_Queue\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Queue_DAO_QueueItem", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Queue_DAO_QueueItem\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_PCP_DAO_PCP", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_PCP_DAO_PCP\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Cxn_DAO_Cxn", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Cxn_DAO_Cxn\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Country", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Country\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_CustomGroup", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_CustomGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_BAO_CustomGroup", + "message": "Method \"CRM_Core_DAO::buildOptions()\" might add \"array|bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_BAO_CustomGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_CustomField", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_CustomField\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_BAO_CustomField", + "message": "Method \"CRM_Core_DAO::buildOptions()\" might add \"array|bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_BAO_CustomField\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Domain", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Domain\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Email", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Email\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_File", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_File\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_IM", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_IM\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Job", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Job\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Log", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Log\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_MailSettings", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_MailSettings\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Navigation", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Navigation\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Note", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Note\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_OptionValue", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_OptionValue\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Phone", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Phone\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Tag", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Tag\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_UFMatch", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_UFMatch\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_UserJob", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_UserJob\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_OpenID", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_OpenID\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Website", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Website\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Setting", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Setting\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_WordReplacement", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_WordReplacement\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_StatusPreference", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_StatusPreference\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_Group", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_Group\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_SubscriptionHistory", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_SubscriptionHistory\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_GroupContactCache", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_GroupContactCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_GroupNesting", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_GroupNesting\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_GroupOrganization", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_GroupOrganization\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventSubscribe", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventSubscribe\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventConfirm", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventConfirm\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_ContributionPage", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_ContributionPage\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_Product", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_Product\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_Widget", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_Widget\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_PaymentProcessor", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_PaymentProcessor\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_SMS_DAO_SmsProvider", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_SMS_DAO_SmsProvider\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Member_DAO_MembershipType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Member_DAO_MembershipType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Member_DAO_MembershipBlock", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Member_DAO_MembershipBlock\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Case_DAO_Case", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Case_DAO_Case\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Case_DAO_CaseContact", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Case_DAO_CaseContact\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Pledge_DAO_Pledge", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Pledge_DAO_Pledge\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Report_DAO_ReportInstance", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Report_DAO_ReportInstance\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Price_DAO_PriceSet", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Price_DAO_PriceSet\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_County", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_County\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Dashboard", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Dashboard\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Discount", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Discount\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_BAO_Discount", + "message": "Method \"CRM_Core_DAO::buildOptions()\" might add \"array|bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_BAO_Discount\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_EntityTag", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_EntityTag\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_UFGroup", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_UFGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_UFField", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_UFField\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_UFJoin", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_UFJoin\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_ActionSchedule", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_ActionSchedule\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_ActionLog", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_ActionLog\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_DashboardContact", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_DashboardContact\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_Relationship", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_Relationship\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_BAO_Relationship", + "message": "Method \"CRM_Core_DAO::buildOptions()\" might add \"array|bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_BAO_Relationship\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_RelationshipCache", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_RelationshipCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_Mailing", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_Mailing\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_MailingTrackableURL", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_MailingTrackableURL\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_MailingJob", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_MailingJob\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_MailingRecipients", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_MailingRecipients\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_Spool", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_Spool\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventQueue", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventQueue\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventBounce", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventBounce\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventDelivered", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventDelivered\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventForward", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventForward\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventOpened", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventOpened\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventReply", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventReply\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventTrackableURLOpen", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventTrackableURLOpen\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Event_DAO_MailingEventUnsubscribe", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Event_DAO_MailingEventUnsubscribe\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_ContributionRecur", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_ContributionRecur\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_BAO_ContributionRecur", + "message": "Method \"CRM_Core_DAO::buildOptions()\" might add \"array|bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_BAO_ContributionRecur\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_FinancialTrxn", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_FinancialTrxn\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Member_DAO_Membership", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Member_DAO_Membership\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Member_DAO_MembershipLog", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Member_DAO_MembershipLog\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Activity_DAO_Activity", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Activity_DAO_Activity\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Activity_DAO_ActivityContact", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Activity_DAO_ActivityContact\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Activity_BAO_ActivityContact", + "message": "The \"CRM_Activity_BAO_ActivityContact::links()\" method will require a new \"array $new_links\" argument in the next major version of its parent class \"DB_DataObject\", not defining it is deprecated.", + "count": 1 + }, + { + "location": "CRM_Price_DAO_PriceField", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Price_DAO_PriceField\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Price_DAO_PriceFieldValue", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Price_DAO_PriceFieldValue\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_PCP_DAO_PCPBlock", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_PCP_DAO_PCPBlock\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Address", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Address\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_GroupContact", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_GroupContact\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_Contribution", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_Contribution\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_ContributionSoft", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_ContributionSoft\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_EntityFinancialTrxn", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_EntityFinancialTrxn\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Member_DAO_MembershipPayment", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Member_DAO_MembershipPayment\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_DAO_Event", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Event_DAO_Event\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_DAO_Participant", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Event_DAO_Participant\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_DAO_ParticipantPayment", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Event_DAO_ParticipantPayment\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Pledge_DAO_PledgePayment", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Pledge_DAO_PledgePayment\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Price_DAO_LineItem", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Price_DAO_LineItem\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Activity_ActionMapping", + "message": "Method \"Civi\\ActionSchedule\\MappingInterface::getId()\" might add \"string|int\" as a native return type declaration in the future. Do the same in implementation \"CRM_Activity_ActionMapping\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Token\\AbstractTokenSubscriber", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Token\\AbstractTokenSubscriber\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Activity_Tokens", + "message": "Method \"CRM_Core_EntityTokens::getActiveTokens()\" might add \"mixed\" as a native return type declaration in the future. Do the same in child class \"CRM_Activity_Tokens\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Campaign_Info", + "message": "Method \"CRM_Core_Component_Info::getActivityTypes()\" might add \"?array\" as a native return type declaration in the future. Do the same in child class \"CRM_Campaign_Info\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Case_Info", + "message": "Method \"CRM_Core_Component_Info::getReferenceCounts()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"CRM_Case_Info\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_ActionMapping", + "message": "Method \"Civi\\ActionSchedule\\MappingInterface::getId()\" might add \"string|int\" as a native return type declaration in the future. Do the same in implementation \"CRM_Contact_ActionMapping\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Cxn_CiviCxnStore", + "message": "Method \"Civi\\Cxn\\Rpc\\CxnStore\\CxnStoreInterface::getAll()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Cxn_CiviCxnStore\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Cxn_CiviCxnStore", + "message": "Method \"Civi\\Cxn\\Rpc\\CxnStore\\CxnStoreInterface::getByCxnId()\" might add \"?array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Cxn_CiviCxnStore\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Cxn_CiviCxnStore", + "message": "Method \"Civi\\Cxn\\Rpc\\CxnStore\\CxnStoreInterface::getByAppId()\" might add \"?array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Cxn_CiviCxnStore\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "HTML_QuickForm_Page", + "message": "Method \"HTML_QuickForm::exportValues()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"HTML_QuickForm_Page\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Logging_ReportDetail", + "message": "Method \"CRM_Report_Form::buildQuery()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Logging_ReportDetail\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Logging_ReportDetail", + "message": "Method \"CRM_Report_Form::limit()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"CRM_Logging_ReportDetail\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_ActionTokens", + "message": "Method \"Civi\\Token\\AbstractTokenSubscriber::checkActive()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_ActionTokens\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Tokens", + "message": "Method \"Civi\\Token\\AbstractTokenSubscriber::checkActive()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_Tokens\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Member_ActionMapping", + "message": "Method \"Civi\\ActionSchedule\\MappingInterface::getId()\" might add \"string|int\" as a native return type declaration in the future. Do the same in implementation \"CRM_Member_ActionMapping\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_ACL_DAO_ACLCache", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_ACL_DAO_ACLCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_PrintLabel", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_PrintLabel\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Payment_Dummy", + "message": "Method \"CRM_Core_Payment::doRefund()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Payment_Dummy\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Payment_Manual", + "message": "Method \"CRM_Core_Payment::checkConfig()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Payment_Manual\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Payment_Manual", + "message": "Method \"CRM_Core_Payment::supportsNoEmailProvided()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Payment_Manual\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_DrupalBase", + "message": "Method \"CRM_Core_Permission_Base::isModulePermissionSupported()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_DrupalBase\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_Backdrop", + "message": "Method \"CRM_Core_Permission_Base::getAvailablePermissions()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_Backdrop\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_Backdrop", + "message": "Method \"CRM_Core_Permission_Base::isModulePermissionSupported()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_Backdrop\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_Drupal", + "message": "Method \"CRM_Core_Permission_Base::getAvailablePermissions()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_Drupal\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_Drupal", + "message": "Method \"CRM_Core_Permission_Base::isModulePermissionSupported()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_Drupal\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_Joomla", + "message": "Method \"CRM_Core_Permission_Base::isModulePermissionSupported()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_Joomla\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_WordPress", + "message": "Method \"CRM_Core_Permission_Base::getAvailablePermissions()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_WordPress\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_Permission_WordPress", + "message": "Method \"CRM_Core_Permission_Base::isModulePermissionSupported()\" might add \"bool\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_Permission_WordPress\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_PrevNextCache_Redis", + "message": "Method \"CRM_Core_PrevNextCache_Interface::fillWithSql()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_PrevNextCache_Redis\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_PrevNextCache_Redis", + "message": "Method \"CRM_Core_PrevNextCache_Interface::fillWithArray()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_PrevNextCache_Redis\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_PrevNextCache_Redis", + "message": "Method \"CRM_Core_PrevNextCache_Interface::fetch()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_PrevNextCache_Redis\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_PrevNextCache_Redis", + "message": "Method \"CRM_Core_PrevNextCache_Interface::getSelection()\" might add \"?array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_PrevNextCache_Redis\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_PrevNextCache_Redis", + "message": "Method \"CRM_Core_PrevNextCache_Interface::getPositions()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_PrevNextCache_Redis\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_PrevNextCache_Redis", + "message": "Method \"CRM_Core_PrevNextCache_Interface::getCount()\" might add \"int\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_PrevNextCache_Redis\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_PrevNextCache_Sql", + "message": "Method \"CRM_Core_PrevNextCache_Interface::fillWithArray()\" might add \"bool\" as a native return type declaration in the future. Do the same in implementation \"CRM_Core_PrevNextCache_Sql\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Dedupe_BAO_Rule", + "message": "The \"CRM_Dedupe_BAO_DedupeRule::validateContacts()\" method is considered internal do not call from outside tested core code. No universe uses Feb 2024. It may change without further notice. You should not extend it from \"CRM_Dedupe_BAO_Rule\".", + "count": 1 + }, + { + "location": "CRM_Dedupe_BAO_Rule", + "message": "The \"CRM_Dedupe_BAO_DedupeRule::dedupeRuleFields()\" method is considered internal do not call from outside tested core code. No universe uses Feb 2024. It may change without further notice. You should not extend it from \"CRM_Dedupe_BAO_Rule\".", + "count": 1 + }, + { + "location": "CRM_Event_ActionMapping_ByEvent", + "message": "Method \"Civi\\ActionSchedule\\MappingInterface::getId()\" might add \"string|int\" as a native return type declaration in the future. Do the same in implementation \"CRM_Event_ActionMapping_ByEvent\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_ActionMapping_ByTemplate", + "message": "Method \"Civi\\ActionSchedule\\MappingInterface::getId()\" might add \"string|int\" as a native return type declaration in the future. Do the same in implementation \"CRM_Event_ActionMapping_ByTemplate\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_ActionMapping_ByType", + "message": "Method \"Civi\\ActionSchedule\\MappingInterface::getId()\" might add \"string|int\" as a native return type declaration in the future. Do the same in implementation \"CRM_Event_ActionMapping_ByType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_Service_ListUnsubscribe", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Mailing_Service_ListUnsubscribe\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Queue_Queue_SqlParallel", + "message": "Method \"CRM_Queue_Queue::claimItem()\" might add \"object\" as a native return type declaration in the future. Do the same in child class \"CRM_Queue_Queue_SqlParallel\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Activity_Import_Parser_Activity", + "message": "Method \"CRM_Import_Parser::init()\" might add \"void\" as a native return type declaration in the future. Do the same in child class \"CRM_Activity_Import_Parser_Activity\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_Import_Parser_Contact", + "message": "Method \"CRM_Import_Parser::init()\" might add \"void\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_Import_Parser_Contact\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_Import_Parser_Contribution", + "message": "Method \"CRM_Import_Parser::init()\" might add \"void\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_Import_Parser_Contribution\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_Import_Parser_Participant", + "message": "Method \"CRM_Import_Parser::init()\" might add \"void\" as a native return type declaration in the future. Do the same in child class \"CRM_Event_Import_Parser_Participant\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_BAO_ExportFormat_CSV", + "message": "Method \"CRM_Financial_BAO_ExportFormat::export()\" might add \"mixed\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_BAO_ExportFormat_CSV\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_BAO_ExportFormat_IIF", + "message": "Method \"CRM_Financial_BAO_ExportFormat::export()\" might add \"mixed\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_BAO_ExportFormat_IIF\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Core\\MetadataFlush", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Core\\MetadataFlush\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Core\\Url", + "message": "Method \"JsonSerializable::jsonSerialize()\" might add \"mixed\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Core\\Url\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Managed\\MultisiteManaged", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Managed\\MultisiteManaged\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Token\\ImpliedContextSubscriber", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Token\\ImpliedContextSubscriber\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\WorkflowMessage\\TestBanner", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"Civi\\WorkflowMessage\\TestBanner\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Api4\\Generic\\AbstractAction", + "message": "Method \"ArrayAccess::offsetGet()\" might add \"mixed\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Api4\\Generic\\AbstractAction\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Api4\\Service\\Autocomplete\\EventAutocompleteProvider", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Api4\\Service\\Autocomplete\\EventAutocompleteProvider\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Api4\\Service\\Spec\\RequestSpec", + "message": "Method \"Iterator::rewind()\" might add \"void\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Api4\\Service\\Spec\\RequestSpec\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Api4\\Service\\Spec\\RequestSpec", + "message": "Method \"Iterator::current()\" might add \"mixed\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Api4\\Service\\Spec\\RequestSpec\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Api4\\Service\\Spec\\RequestSpec", + "message": "Method \"Iterator::key()\" might add \"mixed\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Api4\\Service\\Spec\\RequestSpec\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Api4\\Service\\Spec\\SpecGatherer", + "message": "Method \"Symfony\\Component\\EventDispatcher\\EventSubscriberInterface::getSubscribedEvents()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"Civi\\Api4\\Service\\Spec\\SpecGatherer\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Extension_Upgrader_Base", + "message": "Method \"CRM_Extension_Upgrader_Interface::notify()\" might add \"mixed\" as a native return type declaration in the future. Do the same in implementation \"CRM_Extension_Upgrader_Base\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_AbstractFieldCoder", + "message": "Method \"API_Wrapper::fromApiInput()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_API_AbstractFieldCoder\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_AbstractFieldCoder", + "message": "Method \"API_Wrapper::toApiOutput()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_API_AbstractFieldCoder\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_HTMLInputCoder", + "message": "Method \"CRM_Utils_API_AbstractFieldCoder::decodeOutput()\" might add \"mixed\" as a native return type declaration in the future. Do the same in child class \"CRM_Utils_API_HTMLInputCoder\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_NullOutputCoder", + "message": "Method \"CRM_Utils_API_AbstractFieldCoder::decodeOutput()\" might add \"mixed\" as a native return type declaration in the future. Do the same in child class \"CRM_Utils_API_NullOutputCoder\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_ReloadOption", + "message": "Method \"API_Wrapper::fromApiInput()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_API_ReloadOption\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_ReloadOption", + "message": "Method \"API_Wrapper::toApiOutput()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_API_ReloadOption\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_MatchOption", + "message": "Method \"API_Wrapper::fromApiInput()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_API_MatchOption\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_API_MatchOption", + "message": "Method \"API_Wrapper::toApiOutput()\" might add \"array\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_API_MatchOption\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_BounceType", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_BounceType\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_EntityFile", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_EntityFile\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_JobLog", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_JobLog\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_LocBlock", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_LocBlock\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_MappingField", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_MappingField\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_StateProvince", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_StateProvince\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Worldregion", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Worldregion\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_ContributionProduct", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_ContributionProduct\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_PaymentToken", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_PaymentToken\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contribute_DAO_PremiumsProduct", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contribute_DAO_PremiumsProduct\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Price_DAO_PriceSetEntity", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Price_DAO_PriceSetEntity\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Mailing_DAO_MailingGroup", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Mailing_DAO_MailingGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_LazyArray", + "message": "Method \"ArrayAccess::offsetGet()\" might add \"mixed\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_LazyArray\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Utils_LazyArray", + "message": "Method \"IteratorAggregate::getIterator()\" might add \"\\Traversable\" as a native return type declaration in the future. Do the same in implementation \"CRM_Utils_LazyArray\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Component", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Component\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_AddressFormat", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_AddressFormat\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_SystemLog", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_SystemLog\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Contact_DAO_ACLContactCache", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Contact_DAO_ACLContactCache\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Financial_DAO_Currency", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Financial_DAO_Currency\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Campaign_DAO_CampaignGroup", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Campaign_DAO_CampaignGroup\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_Cart_DAO_Cart", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Event_Cart_DAO_Cart\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Menu", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Menu\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Core_DAO_Timezone", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Core_DAO_Timezone\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Case_DAO_CaseActivity", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Case_DAO_CaseActivity\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Event_Cart_DAO_EventInCart", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Event_Cart_DAO_EventInCart\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "civi\\test\\civitestlistener", + "message": "The \"Civi\\Test\\CiviTestListenerPHPUnit7\" class implements \"PHPUnit\\Framework\\TestListener\" that is deprecated.", + "count": 1 + }, + { + "location": "civi\\test\\civitestlistener", + "message": "The \"Civi\\Test\\CiviTestListenerPHPUnit7\" class uses \"PHPUnit\\Framework\\TestListenerDefaultImplementation\" that is deprecated The `TestListener` interface is deprecated.", + "count": 1 + }, + { + "location": "HTML_QuickForm_Rule_Email", + "message": "Method \"HTML_QuickForm_Rule::getValidationScript()\" might add \"array\" as a native return type declaration in the future. Do the same in child class \"HTML_QuickForm_Rule_Email\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Afform_DAO_AfformSubmission", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Afform_DAO_AfformSubmission\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Search_DAO_SearchDisplay", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Search_DAO_SearchDisplay\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "CRM_Search_DAO_SearchSegment", + "message": "Method \"CRM_Core_DAO::getEntityTitle()\" might add \"string\" as a native return type declaration in the future. Do the same in child class \"CRM_Search_DAO_SearchSegment\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + }, + { + "location": "Civi\\Token\\TokenRowIterator", + "message": "Method \"IteratorIterator::current()\" might add \"mixed\" as a native return type declaration in the future. Do the same in child class \"Civi\\Token\\TokenRowIterator\" now to avoid errors or add an explicit @return annotation to suppress this message.", + "count": 1 + } +] diff --git a/tests/phpunit/CRM/Moregreetings/CRM_Moregreetings_RendererTest.php b/tests/phpunit/CRM/Moregreetings/CRM_Moregreetings_RendererTest.php new file mode 100644 index 0000000..1213d80 --- /dev/null +++ b/tests/phpunit/CRM/Moregreetings/CRM_Moregreetings_RendererTest.php @@ -0,0 +1,36 @@ + 'Foo', 'last_name' => 'Bar']); + + $template = 'Hello {$contact.first_name} {$contact.last_name}'; + $templates = ['greeting_smarty_1' => $template]; + \Civi::settings()->set('moregreetings_templates', $templates); + \CRM_Moregreetings_Config::setActiveFieldCount(1); + + \CRM_Moregreetings_Renderer::updateMoreGreetings($contact['id']); + + static::assertSame( + 'Hello Foo Bar', + Contact::get(FALSE) + ->addSelect('more_greetings_group.greeting_field_1') + ->addWhere('id', '=', $contact['id']) + ->execute()->single()['more_greetings_group.greeting_field_1'] + ); + } + +} diff --git a/tests/phpunit/Civi/Moregreetings/AbstractMoregreetingsHeadlessTestCase.php b/tests/phpunit/Civi/Moregreetings/AbstractMoregreetingsHeadlessTestCase.php new file mode 100644 index 0000000..b665901 --- /dev/null +++ b/tests/phpunit/Civi/Moregreetings/AbstractMoregreetingsHeadlessTestCase.php @@ -0,0 +1,35 @@ +installMe(__DIR__) + ->apply(); + } + + protected function setUp(): void { + parent::setUp(); + $this->setUserPermissions(['access CiviCRM']); + } + + /** + * @phpstan-param array|null $permissions + */ + protected function setUserPermissions(?array $permissions): void { + $userPermissions = \CRM_Core_Config::singleton()->userPermissionClass; + // @phpstan-ignore-next-line + $userPermissions->permissions = $permissions; + } + +} diff --git a/tests/phpunit/Civi/Moregreetings/Fixtures/ContactFixture.php b/tests/phpunit/Civi/Moregreetings/Fixtures/ContactFixture.php new file mode 100644 index 0000000..af7da7a --- /dev/null +++ b/tests/phpunit/Civi/Moregreetings/Fixtures/ContactFixture.php @@ -0,0 +1,27 @@ + $values + * + * @return array + * @phpstan-return array + * + * @throws \CRM_Core_Exception + */ + public static function addIndividual(array $values = []): array { + return Contact::create(FALSE) + ->setValues($values + [ + 'contact_type' => 'Individual', + 'first_name' => 'Some', + 'last_name' => 'Individual', + ])->execute()->single(); + } + +} diff --git a/tests/phpunit/bootstrap.php b/tests/phpunit/bootstrap.php new file mode 100644 index 0000000..cdee9c7 --- /dev/null +++ b/tests/phpunit/bootstrap.php @@ -0,0 +1,80 @@ +add('CRM_', [__DIR__ . '/../..', __DIR__]); +$loader->addPsr4('Civi\\', [__DIR__ . '/../../Civi', __DIR__ . '/Civi']); +$loader->add('api_', [__DIR__ . '/../..', __DIR__]); +$loader->addPsr4('api\\', [__DIR__ . '/../../api', __DIR__ . '/api']); +$loader->register(); + +// Ensure function ts() is available - it's declared in the same file as CRM_Core_I18n +\CRM_Core_I18n::singleton(); + +/** + * Call the "cv" command. + * + * @param string $cmd + * The rest of the command to send. + * @param string $decode + * Ex: 'json' or 'phpcode'. + * @return mixed + * Response output (if the command executed normally). + * For 'raw' or 'phpcode', this will be a string. For 'json', it could be any JSON value. + * @throws \RuntimeException + * If the command terminates abnormally. + */ +function cv(string $cmd, string $decode = 'json') { + $cmd = 'cv ' . $cmd; + $descriptorSpec = [0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => STDERR]; + $oldOutput = getenv('CV_OUTPUT'); + putenv('CV_OUTPUT=json'); + + // Execute `cv` in the original folder. This is a work-around for + // phpunit/codeception, which seem to manipulate PWD. + $cmd = sprintf('cd %s; %s', escapeshellarg(getenv('PWD')), $cmd); + + $process = proc_open($cmd, $descriptorSpec, $pipes, __DIR__); + putenv("CV_OUTPUT=$oldOutput"); + fclose($pipes[0]); + $result = stream_get_contents($pipes[1]); + fclose($pipes[1]); + if (proc_close($process) !== 0) { + throw new RuntimeException("Command failed ($cmd):\n$result"); + } + switch ($decode) { + case 'raw': + return $result; + + case 'phpcode': + // If the last output is /*PHPCODE*/, then we managed to complete execution. + if (substr(trim($result), 0, 12) !== '/*BEGINPHP*/' || substr(trim($result), -10) !== '/*ENDPHP*/') { + throw new RuntimeException("Command failed ($cmd):\n$result"); + } + return $result; + + case 'json': + return json_decode($result, TRUE); + + default: + throw new RuntimeException("Bad decoder format ($decode)"); + } +} diff --git a/tools/phpcs/composer.json b/tools/phpcs/composer.json new file mode 100644 index 0000000..980e4b9 --- /dev/null +++ b/tools/phpcs/composer.json @@ -0,0 +1,11 @@ +{ + "repositories": [ + { + "type": "git", + "url": "https://github.com/civicrm/coder.git" + } + ], + "require": { + "drupal/coder": "dev-8.x-2.x-civi" + } +} diff --git a/tools/phpstan/composer.json b/tools/phpstan/composer.json new file mode 100644 index 0000000..fb29a56 --- /dev/null +++ b/tools/phpstan/composer.json @@ -0,0 +1,18 @@ +{ + "require": { + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.7", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.2", + "phpstan/phpstan-webmozart-assert": "^1.2", + "thecodingmachine/phpstan-strict-rules": "^1.0", + "voku/phpstan-rules": "^3" + }, + "config": { + "allow-plugins": { + "phpstan/extension-installer": true + }, + "sort-packages": true + } +} diff --git a/tools/phpunit/composer.json b/tools/phpunit/composer.json new file mode 100644 index 0000000..ab64ce0 --- /dev/null +++ b/tools/phpunit/composer.json @@ -0,0 +1,13 @@ +{ + "require": { + "symfony/phpunit-bridge": "^7" + }, + "scripts": { + "post-install-cmd": [ + "@php vendor/bin/simple-phpunit install --configuration ../../phpunit.xml.dist" + ], + "post-update-cmd": [ + "@php vendor/bin/simple-phpunit install --configuration ../../phpunit.xml.dist" + ] + } +}