diff --git a/.github/workflows/phpcs.yml b/.github/workflows/phpcs.yml new file mode 100644 index 0000000..a8c4a2d --- /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..cd4f18d --- /dev/null +++ b/.github/workflows/phpstan.yml @@ -0,0 +1,52 @@ +name: PHPStan + +on: + pull_request: + paths: + - '**.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: | + 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 + + - 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..affcdc8 --- /dev/null +++ b/.github/workflows/phpunit.yml @@ -0,0 +1,40 @@ +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: + # The info.xml says CiviCRM 5.38 is supported. Though running phpunit in + # that container fails with: + # The file "tests/phpunit/api/v4/services.xml" does not exist (in: "/var/www/html/sites/all/modules/civicrm"). + # Thus, the least version here is 5.39. + civicrm-image-tags: [ '5-drupal', '5.39-drupal-php7.4' ] + 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..5211182 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..2784d1f --- /dev/null +++ b/phpstan.ci.neon @@ -0,0 +1,15 @@ +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" + - '#^Method Civi\\Moregreetings\\Fixtures\\ContactFixture::addIndividual\(\) has CRM_Core_Exception in PHPDoc @throws tag but it.s not thrown.$#' + - '#::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" + ] + } +}