From ce07a52476a48da80a8deaad46dbe363c8b3594f Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 12:46:06 +0000 Subject: [PATCH 1/5] Update extension for phpBB 3.3.x / PHP 7.2+ (incl. PHP 8) - Require phpBB >=3.3.0 and PHP >=7.2, drop outdated dev dependencies - ext.php: use language service, fix soft-require key and regex range - Notifications: use language service for titles - Tests: run on PHPUnit 9 (replace removed assertAttributeEmpty, new phpunit.xml) - Replace Travis setup by GitHub Actions workflow, add dev scripts for local tests Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_014TpJhHt7ke8q3BnSZ8wGZf --- .github/workflows/tests.yml | 18 + .travis.yml | 62 - README.md | 8 +- build.xml | 135 -- composer.json | 10 +- composer.lock | 2039 ------------------------- dev/cloud-setup.sh | 32 + dev/run-tests.sh | 14 + ext.php | 22 +- notification/active_date_reset.php | 2 +- notification/base.php | 2 +- notification/date_added.php | 2 +- notification/date_added_rotation.php | 2 +- notification/invited.php | 2 +- notification/user_added.php | 2 +- phpunit.xml.dist | 26 +- tests/functions/hookup_test.php | 8 +- travis/local_tools/full_test.sh | 76 - travis/local_tools/phpunittest.sh | 43 - travis/local_tools/smart_full_test.sh | 113 -- travis/local_tools/test_config.php | 16 - travis/prepare-langtest.sh | 58 - travis/prepare-phpbb.sh | 24 - travis/test-lang.sh | 31 - 24 files changed, 105 insertions(+), 2642 deletions(-) create mode 100644 .github/workflows/tests.yml delete mode 100644 .travis.yml delete mode 100644 build.xml delete mode 100644 composer.lock create mode 100755 dev/cloud-setup.sh create mode 100755 dev/run-tests.sh delete mode 100644 travis/local_tools/full_test.sh delete mode 100644 travis/local_tools/phpunittest.sh delete mode 100644 travis/local_tools/smart_full_test.sh delete mode 100644 travis/local_tools/test_config.php delete mode 100755 travis/prepare-langtest.sh delete mode 100755 travis/prepare-phpbb.sh delete mode 100755 travis/test-lang.sh diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..1e725b1 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,18 @@ +name: Tests + +on: + push: + branches: + - master + - 'modernize-*' + pull_request: + +jobs: + call-tests: + name: Extension tests + uses: phpbb-extensions/test-framework/.github/workflows/tests.yml@master + with: + EXTNAME: gn36/hookup + PHPBB_BRANCH: 3.3.x + PRIMARY_PHP_VERSION: '8.1' + PHP_VERSION_MATRIX: '["7.2", "7.4", "8.0", "8.1", "8.2", "8.3"]' diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2cefa61..0000000 --- a/.travis.yml +++ /dev/null @@ -1,62 +0,0 @@ -language: php -sudo: required -dist: xenial - -matrix: - include: - - php: 7.3 - env: DB=mariadb # MyISAM - - php: 7.4 - env: DB=mysqli - - php: 7.4 - env: DB=mariadb - - php: 7.4 - env: DB=postgres - - php: 7.4 - env: DB=sqlite3 - - php: 7.2 - env: DB=mariadb - - php: 7.1 - env: DB=mariadb - - php: 8.0 - env: DB=mariadb - - php: hhvm - env: DB=mariadb - allow_failures: - - php: hhvm - fast_finish: true - -env: - global: - - EXTNAME="gn36/hookup" # CHANGE name of the extension HERE - - SNIFF="1" # Should we run code sniffer on your code? - - IMAGE_ICC="1" # Should we run icc profile sniffer on your images? - - EPV="1" # Should we run EPV (Extension Pre Validator) on your code? - - PHPBB_BRANCH="3.3.x" - -branches: - only: - - master - - develop - - /^dev\/.*$/ - -install: - - if [ "${TRAVIS_PHP_VERSION}" = "5.3.3" ]; then cat composer.json | sed 's/"version"/"config":{\n\t\t"disable-tls":true,\n\t\t"secure-http":false\n\t},\n\t"version"/' > composer.tmp.json ; mv composer.tmp.json composer.json ; fi - - composer self-update --1 # Enforce composer version 1 for now - - composer install --dev --no-interaction --prefer-source - - chmod +x travis/prepare-phpbb.sh - - travis/prepare-phpbb.sh $EXTNAME $PHPBB_BRANCH - - travis/prepare-langtest.sh $EXTNAME $PHPBB_BRANCH - - cd ../../phpBB3 - - travis/prepare-extension.sh $EXTNAME $PHPBB_BRANCH - - travis/setup-phpbb.sh $DB $TRAVIS_PHP_VERSION - -before_script: - - travis/setup-database.sh $DB $TRAVIS_PHP_VERSION - -script: - - sh -c "if [ '$SNIFF' != '0' ]; then travis/ext-sniff.sh $DB $TRAVIS_PHP_VERSION $EXTNAME; fi" - - sh -c "if [ '$IMAGE_ICC' != '0' ]; then travis/check-image-icc-profiles.sh $DB $TRAVIS_PHP_VERSION; fi" - - phpBB/vendor/bin/phpunit --configuration phpBB/ext/$EXTNAME/travis/phpunit-$DB-travis.xml --bootstrap ./tests/bootstrap.php - - sh -c "if [ '$EPV' != '0' ] && [ '$TRAVIS_PHP_VERSION' = '7.4' ] && [ '$DB' = 'mysqli' ]; then phpBB/ext/$EXTNAME/vendor/bin/EPV.php run --dir='phpBB/ext/$EXTNAME/'; fi" - - sh -c "if [ '$TRAVIS_PHP_VERSION' = '7.4' ] && [ '$DB' = 'mysqli' ]; then ../langtest/travis/test-lang.sh; fi" diff --git a/README.md b/README.md index f92b54a..ebcdcc3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# phpBB 3.1 Extension - Hookup +# phpBB 3.3 Extension - Hookup This Extension adds the possibility of scheduling meetings with multiple people to your topics. Use this for finding the right date for a meeting very easy or for getting feedback on availability of users on certain dates. This Extension is intended to be fully backwards compatible to the existing phpBB 3.0.x Mod "Hookup" from the phpBB.de Team for Upgrades, but may include additional features. @@ -27,6 +27,8 @@ Clone into ext/gn36/hookup: git clone https://github.com/gn36/phpbb-ext-hookup ext/gn36/hookup +Requires phpBB 3.3.x and PHP 7.2 or newer (including PHP 8). + Go to "ACP" > "Customise" > "Extensions" and enable the "Hookup" extension. ## Development @@ -39,9 +41,7 @@ If you wish to contribute a translation, feel free to send a pull request. Your ## Automated Testing -We use automated unit tests including functional tests to prevent regressions. Check out our travis build below: - -master: [![Build Status](https://travis-ci.org/gn36/phpbb-ext-hookup.png?branch=master)](http://travis-ci.org/gn36/phpbb-ext-hookup) +Tests run via GitHub Actions using the [phpbb-extensions test framework](https://github.com/phpbb-extensions/test-framework) (see `.github/workflows/tests.yml`). ## License diff --git a/build.xml b/build.xml deleted file mode 100644 index f5f91f6..0000000 --- a/build.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/composer.json b/composer.json index 9588c80..f078a98 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "homepage" : "https://github.com/gn36/phpbb-ext-hookup/", "version" : "1.0.3", "time" : "2015-01-03", - "license" : "GPL-2.0", + "license" : "GPL-2.0-only", "authors" : [{ "name" : "Martin Beckmann", "email" : "gn#36@phpbb.de", @@ -18,18 +18,14 @@ } ], "require" : { - "php" : ">=5.3.3", + "php" : ">=7.2", "eonasdan/bootstrap-datetimepicker" : ">=4.17", "fortawesome/font-awesome" : "~4.4.0" }, - "require-dev" : { - "phpbb/epv" : "dev-master", - "phpbb/translation-validator" : "1.*" - }, "extra" : { "display-name" : "Hookup", "soft-require" : { - "phpbb/phpbb" : ">=3.2.2,<3.4@dev" + "phpbb/phpbb" : ">=3.3.0,<3.4@dev" }, "version-check" : { "host" : "phpbb.gn36.de", diff --git a/composer.lock b/composer.lock deleted file mode 100644 index c7edbe5..0000000 --- a/composer.lock +++ /dev/null @@ -1,2039 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "359b5dec08404d4be3a0ec81ce549278", - "packages": [ - { - "name": "components/jquery", - "version": "3.5.1", - "source": { - "type": "git", - "url": "https://github.com/components/jquery.git", - "reference": "b33e8f0f9a1cb2ae390cf05d766a900b53d2125b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/components/jquery/zipball/b33e8f0f9a1cb2ae390cf05d766a900b53d2125b", - "reference": "b33e8f0f9a1cb2ae390cf05d766a900b53d2125b", - "shasum": "" - }, - "type": "component", - "extra": { - "component": { - "scripts": [ - "jquery.js" - ], - "files": [ - "jquery.min.js", - "jquery.min.map", - "jquery.slim.js", - "jquery.slim.min.js", - "jquery.slim.min.map" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "JS Foundation and other contributors" - } - ], - "description": "jQuery JavaScript Library", - "homepage": "http://jquery.com", - "time": "2020-05-05T13:21:02+00:00" - }, - { - "name": "composer/installers", - "version": "v1.9.0", - "source": { - "type": "git", - "url": "https://github.com/composer/installers.git", - "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca", - "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0" - }, - "replace": { - "roundcube/plugin-installer": "*", - "shama/baton": "*" - }, - "require-dev": { - "composer/composer": "1.6.* || 2.0.*@dev", - "composer/semver": "1.0.* || 2.0.*@dev", - "phpunit/phpunit": "^4.8.36", - "sebastian/comparator": "^1.2.4", - "symfony/process": "^2.3" - }, - "type": "composer-plugin", - "extra": { - "class": "Composer\\Installers\\Plugin", - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Installers\\": "src/Composer/Installers" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kyle Robinson Young", - "email": "kyle@dontkry.com", - "homepage": "https://github.com/shama" - } - ], - "description": "A multi-framework Composer library installer", - "homepage": "https://composer.github.io/installers/", - "keywords": [ - "Craft", - "Dolibarr", - "Eliasis", - "Hurad", - "ImageCMS", - "Kanboard", - "Lan Management System", - "MODX Evo", - "MantisBT", - "Mautic", - "Maya", - "OXID", - "Plentymarkets", - "Porto", - "RadPHP", - "SMF", - "Thelia", - "Whmcs", - "WolfCMS", - "agl", - "aimeos", - "annotatecms", - "attogram", - "bitrix", - "cakephp", - "chef", - "cockpit", - "codeigniter", - "concrete5", - "croogo", - "dokuwiki", - "drupal", - "eZ Platform", - "elgg", - "expressionengine", - "fuelphp", - "grav", - "installer", - "itop", - "joomla", - "known", - "kohana", - "laravel", - "lavalite", - "lithium", - "magento", - "majima", - "mako", - "mediawiki", - "modulework", - "modx", - "moodle", - "osclass", - "phpbb", - "piwik", - "ppi", - "puppet", - "pxcms", - "reindex", - "roundcube", - "shopware", - "silverstripe", - "sydes", - "sylius", - "symfony", - "typo3", - "wordpress", - "yawik", - "zend", - "zikula" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-04-07T06:57:05+00:00" - }, - { - "name": "eonasdan/bootstrap-datetimepicker", - "version": "4.17.47", - "source": { - "type": "git", - "url": "https://github.com/Eonasdan/bootstrap-datetimepicker.git", - "reference": "25c11d79e614bc6463a87c3dd9cbf8280422e006" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Eonasdan/bootstrap-datetimepicker/zipball/25c11d79e614bc6463a87c3dd9cbf8280422e006", - "reference": "25c11d79e614bc6463a87c3dd9cbf8280422e006", - "shasum": "" - }, - "require": { - "components/jquery": ">=1.9.1", - "moment/moment": ">=2.10.5", - "robloach/component-installer": "*" - }, - "type": "component", - "extra": { - "component": { - "scripts": [ - "src/js/bootstrap-datetimepicker.js" - ], - "files": [ - "build/js/bootstrap-datetimepicker.min.js", - "build/css/bootstrap-datetimepicker.min.css" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Date/time picker widget based on twitter bootstrap", - "homepage": "http://eonasdan.github.io/bootstrap-datetimepicker/", - "keywords": [ - "DateTimePicker", - "bootstrap" - ], - "time": "2017-02-28T14:32:02+00:00" - }, - { - "name": "fortawesome/font-awesome", - "version": "v4.4.0", - "source": { - "type": "git", - "url": "https://github.com/FortAwesome/Font-Awesome.git", - "reference": "e554555d73a44e0a7d11b0361ad7a5325a5f551c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FortAwesome/Font-Awesome/zipball/e554555d73a44e0a7d11b0361ad7a5325a5f551c", - "reference": "e554555d73a44e0a7d11b0361ad7a5325a5f551c", - "shasum": "" - }, - "require-dev": { - "jekyll": "1.0.2", - "lessc": "1.4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OFL-1.1", - "MIT" - ], - "authors": [ - { - "name": "Dave Gandy", - "email": "dave@fontawesome.io", - "homepage": "http://twitter.com/davegandy", - "role": "Developer" - } - ], - "description": "The iconic font and CSS framework", - "homepage": "http://fontawesome.io/", - "keywords": [ - "FontAwesome", - "awesome", - "bootstrap", - "font", - "icon" - ], - "time": "2015-07-28T21:55:03+00:00" - }, - { - "name": "kriswallsmith/assetic", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/kriswallsmith/assetic.git", - "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", - "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", - "shasum": "" - }, - "require": { - "php": ">=5.3.1", - "symfony/process": "~2.1|~3.0" - }, - "conflict": { - "twig/twig": "<1.27" - }, - "require-dev": { - "leafo/lessphp": "^0.3.7", - "leafo/scssphp": "~0.1", - "meenie/javascript-packer": "^1.1", - "mrclay/minify": "<2.3", - "natxet/cssmin": "3.0.4", - "patchwork/jsqueeze": "~1.0|~2.0", - "phpunit/phpunit": "~4.8 || ^5.6", - "psr/log": "~1.0", - "ptachoire/cssembed": "~1.0", - "symfony/phpunit-bridge": "~2.7|~3.0", - "twig/twig": "~1.23|~2.0", - "yfix/packager": "dev-master" - }, - "suggest": { - "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", - "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", - "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", - "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor", - "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", - "twig/twig": "Assetic provides the integration with the Twig templating engine" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-0": { - "Assetic": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kris Wallsmith", - "email": "kris.wallsmith@gmail.com", - "homepage": "http://kriswallsmith.net/" - } - ], - "description": "Asset Management for PHP", - "homepage": "https://github.com/kriswallsmith/assetic", - "keywords": [ - "assets", - "compression", - "minification" - ], - "time": "2016-11-11T18:43:20+00:00" - }, - { - "name": "moment/moment", - "version": "2.29.1", - "source": { - "type": "git", - "url": "https://github.com/moment/moment.git", - "reference": "b7ec8e2ec068e03de4f832f28362675bb9e02261" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/moment/moment/zipball/b7ec8e2ec068e03de4f832f28362675bb9e02261", - "reference": "b7ec8e2ec068e03de4f832f28362675bb9e02261", - "shasum": "" - }, - "require": { - "oomphinc/composer-installers-extender": "*" - }, - "type": "component", - "extra": { - "component": { - "scripts": [ - "moment.js" - ], - "files": [ - "min/*.js", - "locale/*.js" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tim Wood", - "email": "washwithcare@gmail.com" - } - ], - "description": "Parse, validate, manipulate, and display dates in JavaScript.", - "homepage": "https://github.com/moment/moment", - "keywords": [ - "date", - "ender", - "format", - "i18n", - "l10n", - "moment", - "parse", - "time", - "validate" - ], - "time": "2020-10-06T11:13:21+00:00" - }, - { - "name": "oomphinc/composer-installers-extender", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/oomphinc/composer-installers-extender.git", - "reference": "8d3fe38a1723e0e91076920c8bb946b1696e28ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/oomphinc/composer-installers-extender/zipball/8d3fe38a1723e0e91076920c8bb946b1696e28ca", - "reference": "8d3fe38a1723e0e91076920c8bb946b1696e28ca", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1 || ^2.0", - "composer/installers": "^1.0", - "php": ">=7.1" - }, - "require-dev": { - "composer/composer": "^2.0", - "phpunit/phpunit": "^7.2", - "squizlabs/php_codesniffer": "^3.3" - }, - "type": "composer-plugin", - "extra": { - "class": "OomphInc\\ComposerInstallersExtender\\Plugin" - }, - "autoload": { - "psr-4": { - "OomphInc\\ComposerInstallersExtender\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stephen Beemsterboer", - "email": "stephen@oomphinc.com", - "homepage": "https://github.com/balbuf" - }, - { - "name": "Nathan Dentzau", - "email": "nate@oomphinc.com", - "homepage": "http://oomph.is/ndentzau" - } - ], - "description": "Extend the composer/installers plugin to accept any arbitrary package type.", - "homepage": "http://www.oomphinc.com/", - "time": "2020-08-11T21:06:11+00:00" - }, - { - "name": "robloach/component-installer", - "version": "0.2.3", - "source": { - "type": "git", - "url": "https://github.com/RobLoach/component-installer.git", - "reference": "908a859aa7c4949ba9ad67091e67bac10b66d3d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7", - "reference": "908a859aa7c4949ba9ad67091e67bac10b66d3d7", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0", - "kriswallsmith/assetic": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "composer/composer": "1.*@alpha", - "phpunit/phpunit": "4.*" - }, - "type": "composer-plugin", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - }, - "class": "ComponentInstaller\\ComponentInstallerPlugin" - }, - "autoload": { - "psr-0": { - "ComponentInstaller": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Loach", - "homepage": "http://robloach.net" - } - ], - "description": "Allows installation of Components via Composer.", - "abandoned": "oomphinc/composer-installers-extender", - "time": "2015-08-10T12:35:38+00:00" - }, - { - "name": "symfony/process", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b8648cf1d5af12a44a51d07ef9bf980921f15fca", - "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T10:57:07+00:00" - } - ], - "packages-dev": [ - { - "name": "battye/php-array-parser", - "version": "v1.0.8", - "source": { - "type": "git", - "url": "https://github.com/battye/php-array-parser.git", - "reference": "e5da491091cfba55e7d3eaee4e35fa12094b8a9b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/battye/php-array-parser/zipball/e5da491091cfba55e7d3eaee4e35fa12094b8a9b", - "reference": "e5da491091cfba55e7d3eaee4e35fa12094b8a9b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "battye\\array_parser\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Parse text representation of a PHP array into an actual PHP array.", - "keywords": [ - "array", - "parser", - "php" - ], - "time": "2019-09-27T16:08:09+00:00" - }, - { - "name": "composer/ca-bundle", - "version": "1.2.9", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-01-12T12:10:35+00:00" - }, - { - "name": "composer/composer", - "version": "1.10.22", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/28c9dfbe2351635961f670773e8d7b17bc5eda25", - "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^5.2.10", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/console": "2.8.38" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-04-27T11:10:45+00:00" - }, - { - "name": "composer/semver", - "version": "1.7.2", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/647490bbcaf7fc4891c58f47b825eb99d19c377a", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-03T15:47:16+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.5", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-03T16:04:16+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.6", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-03-25T17:01:18+00:00" - }, - { - "name": "gitonomy/gitlib", - "version": "v0.1.8", - "source": { - "type": "git", - "url": "https://github.com/gitonomy/gitlib.git", - "reference": "f575b8f7da917ade7890c6aa705fa22545690389" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/f575b8f7da917ade7890c6aa705fa22545690389", - "reference": "f575b8f7da917ade7890c6aa705fa22545690389", - "shasum": "" - }, - "require": { - "symfony/process": "^2.3|^3.0" - }, - "require-dev": { - "psr/log": "^1.0" - }, - "suggest": { - "psr/log": "Add some log" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Gitonomy\\Git\\": "src/Gitonomy/Git/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alexandre Salomé", - "email": "alexandre.salome@gmail.com", - "homepage": "http://alexandre-salome.fr" - }, - { - "name": "Julien DIDIER", - "email": "genzo.wm@gmail.com", - "homepage": "http://www.jdidier.net" - } - ], - "description": "Library for accessing git", - "homepage": "http://gitonomy.com", - "time": "2015-12-01T22:25:57+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.10", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "time": "2020-05-27T16:41:55+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v3.1.5", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "time": "2018-02-28T20:30:58+00:00" - }, - { - "name": "phpbb/epv", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpbb/epv.git", - "reference": "f79c2f60406786873d9d3c4d26de2983ffbfd2ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpbb/epv/zipball/f79c2f60406786873d9d3c4d26de2983ffbfd2ef", - "reference": "f79c2f60406786873d9d3c4d26de2983ffbfd2ef", - "shasum": "" - }, - "require": { - "composer/composer": "^1.5", - "gitonomy/gitlib": "0.1.*@dev", - "nikic/php-parser": "~3.0", - "php": ">=7.0", - "sensiolabs/ansi-to-html": "~1.1", - "symfony/console": "^3.0|^4.0|^5.0", - "symfony/finder": "^3.0|^4.0|^5.0", - "symfony/process": "^3.0|^4.0|^5.0", - "symfony/yaml": "^3.0|^4.0|^5.0" - }, - "require-dev": { - "phpunit/phpunit": "~5.4", - "phpunit/phpunit-mock-objects": "~3.2" - }, - "bin": [ - "src/EPV.php" - ], - "type": "library", - "autoload": { - "psr-4": { - "Phpbb\\Epv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-only" - ], - "authors": [ - { - "name": "Paul Sohier", - "email": "paul@phpbb.com" - } - ], - "description": "A extension validator for phpBB extensions. Extensions are required to pass the validator when submitted to the extension database.", - "time": "2021-02-26T18:45:45+00:00" - }, - { - "name": "phpbb/translation-validator", - "version": "1.5.3", - "source": { - "type": "git", - "url": "https://github.com/phpbb/phpbb-translation-validator.git", - "reference": "28caf76f9e9f7374e2ad2053dd0ddb25b12662a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpbb/phpbb-translation-validator/zipball/28caf76f9e9f7374e2ad2053dd0ddb25b12662a0", - "reference": "28caf76f9e9f7374e2ad2053dd0ddb25b12662a0", - "shasum": "" - }, - "require": { - "battye/php-array-parser": "~1.0", - "php": ">=5.5.9", - "symfony/console": "~3.0", - "symfony/finder": "~3.0", - "symfony/yaml": "~3.0" - }, - "require-dev": { - "phpunit/phpunit": "~5.7" - }, - "bin": [ - "translation.php" - ], - "type": "library", - "autoload": { - "classmap": [ - "src/", - "tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-only" - ], - "authors": [ - { - "name": "Joas Schilling", - "email": "nickvergessen@phpbb.com", - "homepage": "http://www.phpbb.com/", - "role": "Developer" - }, - { - "name": "Battye", - "email": "battye@phpbb.com", - "homepage": "https://www.phpbb.com", - "role": "Developer" - } - ], - "description": "A language package validator for phpBB language packs. Language packs are required to pass the validator when submitted to the language pack database.", - "homepage": "https://github.com/phpbb/phpbb-translation-validator", - "time": "2020-11-10T19:57:39+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.8.3", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2020-11-11T09:19:24+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "time": "2020-07-07T18:42:57+00:00" - }, - { - "name": "sensiolabs/ansi-to-html", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/ansi-to-html.git", - "reference": "94a3145aae4733ff933c8910263ef56d1ae317a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/ansi-to-html/zipball/94a3145aae4733ff933c8910263ef56d1ae317a9", - "reference": "94a3145aae4733ff933c8910263ef56d1ae317a9", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "conflict": { - "twig/twig": "< 2.4.0" - }, - "require-dev": { - "twig/twig": "^2.4 || ^3.0" - }, - "suggest": { - "twig/twig": "Provides nice templating features" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "SensioLabs\\AnsiConverter\\": "SensioLabs/AnsiConverter" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "A library to convert a text with ANSI codes to HTML", - "time": "2020-10-06T05:48:55+00:00" - }, - { - "name": "symfony/console", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81", - "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T10:57:07+00:00" - }, - { - "name": "symfony/debug", - "version": "v4.4.20", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "157bbec4fd773bae53c5483c50951a5530a2cc16" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/157bbec4fd773bae53c5483c50951a5530a2cc16", - "reference": "157bbec4fd773bae53c5483c50951a5530a2cc16", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/http-kernel": "<3.4" - }, - "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to ease debugging PHP code", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-28T16:54:48+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.2.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c86a82f51658188119e62cff0a050a12d09836f", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-28T14:30:26+00:00" - }, - { - "name": "symfony/finder", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/b6b6ad3db3edb1b4b1c1896b1975fb684994de6e", - "reference": "b6b6ad3db3edb1b4b1c1896b1975fb684994de6e", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-11-16T17:02:08+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/yaml", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "88289caa3c166321883f67fe5130188ebbb47094" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", - "reference": "88289caa3c166321883f67fe5130188ebbb47094", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T10:57:07+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "phpbb/epv": 20 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.3.3" - }, - "platform-dev": [], - "plugin-api-version": "1.1.0" -} diff --git a/dev/cloud-setup.sh b/dev/cloud-setup.sh new file mode 100755 index 0000000..d4f2f64 --- /dev/null +++ b/dev/cloud-setup.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Setup-Script für eine Claude-Cloud-Umgebung zum Testen von phpBB-3.3-Erweiterungen. +# Installiert (möglichst versionsunabhängig): MariaDB, PHP-Erweiterungen, phpBB 3.3.x inkl. PHPUnit 9. +# Wird bei Umgebungen mit Setup-Script einmal ausgeführt und im Ergebnis zwischengespeichert. +set -euo pipefail + +PHPBB_BRANCH="${PHPBB_BRANCH:-3.3.x}" +PHPBB_DIR="${PHPBB_DIR:-/opt/phpbb-core}" + +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq +# php-cli ist im Basis-Image meist vorhanden; die Pakete ohne Versionsnummer nehmen die Standard-PHP-Version der Distribution. +apt-get install -y -qq git unzip rsync mariadb-server \ + php-cli php-mbstring php-xml php-zip php-gd php-curl php-intl php-mysql php-sqlite3 php-pgsql + +# Datenbank für die phpBB-Tests (MariaDB); SQLite geht auch ohne Server. +service mariadb start || service mysql start || true +for i in $(seq 1 20); do mysqladmin ping --silent && break; sleep 1; done +mysql -e "CREATE DATABASE IF NOT EXISTS phpbb_tests CHARACTER SET utf8mb4; + CREATE USER IF NOT EXISTS 'phpbb'@'localhost' IDENTIFIED BY 'phpbb'; + GRANT ALL ON phpbb_tests.* TO 'phpbb'@'localhost';" + +# phpBB-Quellcode (aktueller Stand des 3.3-Branches) +if [ ! -d "$PHPBB_DIR/.git" ]; then + git clone --depth 1 -b "$PHPBB_BRANCH" https://github.com/phpbb/phpbb "$PHPBB_DIR" +fi +cd "$PHPBB_DIR/phpBB" +composer install --no-interaction --no-progress +# Wie phpBBs eigenes CI unter PHP 8: PHPUnit 9 statt 7 +composer remove phpunit/dbunit --dev --update-with-dependencies --no-interaction +composer require symfony/yaml:^4.4 misantron/dbunit:5.2.1 phpunit/phpunit:^9.3 doctrine/instantiator:^1.4 \ + --dev --update-with-all-dependencies --ignore-platform-reqs --no-interaction diff --git a/dev/run-tests.sh b/dev/run-tests.sh new file mode 100755 index 0000000..399e10d --- /dev/null +++ b/dev/run-tests.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Führt die Extension-Tests gegen den phpBB-Checkout aus (SQLite, ohne DB-Server). +# Nutzung: dev/run-tests.sh [phpunit-Argumente] +set -e +EXT="$(cd "$(dirname "$0")/.." && pwd)" +CORE="${PHPBB_DIR:-/opt/phpbb-core}" +DEST="$CORE/phpBB/ext/gn36/hookup" +rm -rf "$DEST" && mkdir -p "$DEST" +cp -a "$EXT/." "$DEST/" && rm -rf "$DEST/.git" +cd "$CORE" +export PHPBB_TEST_DBMS=sqlite3 PHPBB_TEST_DBHOST=/tmp/phpbb_test.sqlite +php -d error_reporting=24575 phpBB/vendor/bin/phpunit \ + --configuration phpBB/ext/gn36/hookup/phpunit.xml.dist \ + "${@:---testsuite=Extension Test Suite}" diff --git a/ext.php b/ext.php index fd937f7..351093a 100644 --- a/ext.php +++ b/ext.php @@ -35,7 +35,7 @@ protected function extra_dependencies() */ protected function split_version_info($string) { - $pattern = '#(\^|~|>=|>|gt(?:;=?)?|ge|==?|eq|!=|<>|ne|<=|<|le|lt(?:;=?)?(?:gt;)?)([0-9._*-PLAHBETRCDV]+?)(?:$|,)#is'; + $pattern = '#(\^|~|>=|>|gt(?:;=?)?|ge|==?|eq|!=|<>|ne|<=|<|le|lt(?:;=?)?(?:gt;)?)([0-9._*\-PLAHBETRCDV]+?)(?:$|,)#is'; $matches = null; preg_match_all($pattern, $string, $matches); @@ -73,16 +73,16 @@ function is_enableable() $require = array(); } - if (isset($meta['extra']['soft_require'])) + if (isset($meta['extra']['soft-require'])) { - $require = array_merge($require, $meta['extra']['soft_require']); + $require = array_merge($require, $meta['extra']['soft-require']); } $require = array_merge($require, $this->extra_dependencies()); - /** @var $user \phpbb\user */ - $user = $this->container->get('user'); - $user->add_lang_ext($this->extension_name, 'install'); + /** @var $language \phpbb\language\language */ + $language = $this->container->get('language'); + $language->add_lang('install', $this->extension_name); $dep_files_to_search = array(); @@ -97,7 +97,7 @@ function is_enableable() case 'php': if (!phpbb_version_compare(PHP_VERSION, $version, $info['operator'][$vkey])) { - trigger_error($user->lang('WRONG_PHP_VERSION') . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); + trigger_error($language->lang('WRONG_PHP_VERSION') . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); return false; } break; @@ -105,7 +105,7 @@ function is_enableable() case 'phpbb/phpbb': if (!phpbb_version_compare($config['version'], $version, $info['operator'][$vkey])) { - trigger_error($user->lang('WRONG_PHPBB_VERSION') . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); + trigger_error($language->lang('WRONG_PHPBB_VERSION') . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); return false; } break; @@ -138,7 +138,7 @@ function is_enableable() // Apparently not a vendor dir. This should be an extension as a requirement if (!$mgr->is_enabled($key)) { - trigger_error($user->lang('MISSING_EXTENSION', $key) . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); + trigger_error($language->lang('MISSING_EXTENSION', $key) . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); return false; } @@ -148,7 +148,7 @@ function is_enableable() if (!phpbb_version_compare($ext_version, $version, $info['operator'][$vkey])) { - trigger_error($user->lang('WRONG_EXTENSION_VERSION', $key) . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); + trigger_error($language->lang('WRONG_EXTENSION_VERSION', $key) . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); return false; } break; @@ -161,7 +161,7 @@ function is_enableable() { if (!file_exists($file)) { - trigger_error($user->lang('MISSING_DEPENDENCIES', $key) . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); + trigger_error($language->lang('MISSING_DEPENDENCIES', $key) . adm_back_link(append_sid('index.' . $this->container->getParameter('core.php_ext'), 'i=acp_extensions&mode=main')), E_USER_WARNING); return false; } } diff --git a/notification/active_date_reset.php b/notification/active_date_reset.php index da0a25a..fd9be96 100644 --- a/notification/active_date_reset.php +++ b/notification/active_date_reset.php @@ -32,7 +32,7 @@ public function is_available() public function get_title() { $username = $this->user_loader->get_username($this->get_data('user_id'), 'no_profile'); - return $this->user->lang($this->language_key, $username, $this->get_data('topic_title')); + return $this->language->lang($this->language_key, $username, $this->get_data('topic_title')); } public function get_email_template() diff --git a/notification/base.php b/notification/base.php index ab112bb..060540e 100644 --- a/notification/base.php +++ b/notification/base.php @@ -124,7 +124,7 @@ public function get_title() $description = $this->user->format_date($this->get_data('date')); } - return $this->user->lang($this->language_key, $username, $this->get_data('topic_title'), $description , $this->get_data('yes'), $this->get_data('no'), $this->get_data('maybe')); + return $this->language->lang($this->language_key, $username, $this->get_data('topic_title'), $description , $this->get_data('yes'), $this->get_data('no'), $this->get_data('maybe')); } function users_to_query() diff --git a/notification/date_added.php b/notification/date_added.php index 9b8dc40..9a3d6d4 100644 --- a/notification/date_added.php +++ b/notification/date_added.php @@ -36,7 +36,7 @@ public function is_available() public function get_title() { $username = $this->user_loader->get_username($this->get_data('user_id'), 'no_profile'); - return $this->user->lang($this->language_key, $username, $this->get_data('topic_title')); + return $this->language->lang($this->language_key, $username, $this->get_data('topic_title')); } public function get_email_template() diff --git a/notification/date_added_rotation.php b/notification/date_added_rotation.php index bf629cd..ff5f69e 100644 --- a/notification/date_added_rotation.php +++ b/notification/date_added_rotation.php @@ -40,7 +40,7 @@ public function get_avatar() public function get_title() { - return $this->user->lang($this->language_key, $this->get_data('topic_title')); + return $this->language->lang($this->language_key, $this->get_data('topic_title')); } public function get_email_template() diff --git a/notification/invited.php b/notification/invited.php index c525038..e7e6752 100644 --- a/notification/invited.php +++ b/notification/invited.php @@ -61,7 +61,7 @@ public function find_users_for_notification($notification_data, $options = array public function get_title() { $username = $this->user_loader->get_username($this->get_data('user_id'), 'no_profile'); - return $this->user->lang($this->language_key, $username, $this->get_data('topic_title')); + return $this->language->lang($this->language_key, $username, $this->get_data('topic_title')); } public function get_email_template() diff --git a/notification/user_added.php b/notification/user_added.php index a0cca57..16e8f22 100644 --- a/notification/user_added.php +++ b/notification/user_added.php @@ -50,7 +50,7 @@ public function find_users_for_notification($notification_data, $options = array public function get_title() { $username = $this->user_loader->get_username($this->get_data('user_id'), 'no_profile'); - return $this->user->lang($this->language_key, $username, $this->get_data('topic_title')); + return $this->language->lang($this->language_key, $username, $this->get_data('topic_title')); } public function get_email_template() diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 30b52c2..3e8e6a5 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,14 +1,14 @@ - @@ -17,18 +17,18 @@ ./tests/functional - ./tests/functional/ + ./tests/functional/ - - + + ./ - - ./language/ - ./migrations/ - ./tests/ - - - + + + ./language/ + ./migrations/ + ./tests/ + + diff --git a/tests/functions/hookup_test.php b/tests/functions/hookup_test.php index 87906af..6e86d0b 100644 --- a/tests/functions/hookup_test.php +++ b/tests/functions/hookup_test.php @@ -703,10 +703,10 @@ public function test_delete($topic_id, $returnvalue, $topicdata, $datedata, $mem $this->assertEquals($returnvalue, $hookup->delete()); // Attributes - $this->assertAttributeEmpty('hookup_availables', $hookup); - $this->assertAttributeEmpty('hookup_dates', $hookup); - $this->assertAttributeEmpty('hookup_users', $hookup); - $this->assertAttributeEmpty('hookup_available_sums', $hookup); + $this->assertEmpty($hookup->hookup_availables); + $this->assertEmpty($hookup->hookup_dates); + $this->assertEmpty($hookup->hookup_users); + $this->assertEmpty($hookup->hookup_available_sums); $this->assertFalse($hookup->hookup_enabled); $this->assertFalse($hookup->hookup_autoreset); $this->assertFalse($hookup->hookup_self_invite); diff --git a/travis/local_tools/full_test.sh b/travis/local_tools/full_test.sh deleted file mode 100644 index 6993759..0000000 --- a/travis/local_tools/full_test.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -# Environment: -#EXTNAME="phpbbde/pastebin" # CHANGE name of the extension HERE -EXTNAME="gn36/hookup" # CHANGE name of the extension HERE -#EXTBRANCH="dev/translation-validator" # Branch to test -EXTBRANCH="dev/tests" # Branch to test -SNIFF="1" # Should we run code sniffer on your code? -IMAGE_ICC="1" # Should we run icc profile sniffer on your images? -EPV="1" # Should we run EPV (Extension Pre Validator) on your code? -LANG_TEST="0" -PHPBB_BRANCH="3.1.x" - -DB=mysqli -TRAVIS_PHP_VERSION=5.5.9 - -# Go into testdir and copy the extension: -EXTDIR=${EXTNAME%/*} -if [ ! -e testdir ]; then - mkdir testdir -fi -cd testdir -if [ -e $EXTDIR ]; then - rm -rf $EXTDIR -fi -mkdir $EXTDIR -cp -r ../../extensions/$EXTNAME $EXTDIR -#git clone --depth=1 ../../extensions/$EXTNAME $EXTNAME --branch=$EXTBRANCH -cd $EXTNAME - -# Install -#php composer.phar install --dev --no-interaction --prefer-source -php composer.phar install --no-interaction -if [ ! -e ../../phpBB3 ]; then - chmod +x travis/prepare-phpbb.sh - travis/prepare-phpbb.sh $EXTNAME $PHPBB_BRANCH - if [ "$LANG_TEST" != '0' ]; then - travis/prepare-langtest.sh $EXTNAME $PHPBB_BRANCH - fi - cd ../../phpBB3 -else - if [ "$LANG_TEST" != '0' ]; then - travis/prepare-langtest.sh $EXTNAME $PHPBB_BRANCH - fi - if [ ! -e ../../tmp ]; then - # This is from prepare-phpbb.sh - mkdir ../../tmp - cp -R . ../../tmp - fi - cd ../../phpBB3 - git pull origin -fi - -travis/prepare-extension.sh $EXTNAME $PHPBB_BRANCH -travis/setup-phpbb.sh $DB $TRAVIS_PHP_VERSION -travis/install-phpbb-test-dependencies.sh -cd phpBB -#php ../composer.phar install --dev --no-interaction --prefer-source -php ../composer.phar install --no-interaction -cd .. - -# Preparation: -travis/setup-database.sh $DB $TRAVIS_PHP_VERSION - -# Functional tests: -if [ -e ../../../test_config.php ]; then - cp ../../../test_config.php ../tests/ -fi - -# script: -sh -c "if [ '$SNIFF' != '0' ]; then travis/ext-sniff.sh $DB $TRAVIS_PHP_VERSION $EXTNAME; fi" -sh -c "if [ '$IMAGE_ICC' != '0' ]; then travis/check-image-icc-profiles.sh $DB $TRAVIS_PHP_VERSION; fi" -#php phpBB/vendor/bin/phpunit --configuration phpBB/ext/$EXTNAME/travis/phpunit-$DB-travis.xml --bootstrap ./tests/bootstrap.php -php phpBB/vendor/bin/phpunit --configuration phpBB/ext/$EXTNAME/phpunit.xml.dist --bootstrap ./tests/bootstrap.php -sh -c "if [ '$EPV' != '0' ] && [ '$DB' = 'mysqli' ]; then phpBB/ext/$EXTNAME/vendor/bin/EPV.php run --dir='phpBB/ext/$EXTNAME/'; fi" -sh -c "if [ '$LANG_TEST' != '0' ]; then ../langtest/travis/test-lang.sh; fi" diff --git a/travis/local_tools/phpunittest.sh b/travis/local_tools/phpunittest.sh deleted file mode 100644 index 1314465..0000000 --- a/travis/local_tools/phpunittest.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# This script assumes a working test setup in testdir (e.g. setup by one of the other scripts) -# It also assumes the extensions to be tested to be located in ../extensions/vendor/name (relative to this script) -# Please make sure this is correct, otherwise testing won't work -# For db and functional tests, the test_config.php is required to be in the same folder. -# -# (c) 2016 - Martin Beckmann -# License: GPL v2 -# - -# Environment: -export EXTNAME="gn36/hookup" # Name of extension - -# Copy the current version of the ext for testing: -EXTDIR=${EXTNAME%/*} -if [ ! -e testdir ]; then - mkdir testdir -fi -cd testdir/phpBB3/phpBB/ext/ -if [ -e $EXTDIR ]; then - rm -rf $EXTDIR 2>/dev/null -fi -mkdir $EXTDIR -#cp -r ../../../../../extensions/$EXTNAME $EXTDIR -cp -r ../../../../../phpbb/phpBB/ext/$EXTNAME $EXTDIR - -#cp -r ../../../../../extensions/$EXTNAME/event $EXTNAME -cp -r ../../../../../phpbb/phpBB/ext/$EXTNAME/event $EXTNAME - -cd ../../ -pwd - -# Functional and database tests require test_config, make sure it's there: -if [ -e ../../test_config.php ]; then - cp ../../test_config.php tests/ -fi - -# Use installed phpunit version (may be fairly old) -#phpunit -c phpBB/ext/$EXTNAME/phpunit.xml.dist |sed "s/\[^[[0-9;]*[a-zA-Z]//gi" -#phpunit -c phpBB/ext/$EXTNAME/travis/phpunit-mysqli-travis.xml - -# Use phpBB dependency phpunit: -phpBB/vendor/bin/phpunit -c phpBB/ext/$EXTNAME/phpunit.xml.dist diff --git a/travis/local_tools/smart_full_test.sh b/travis/local_tools/smart_full_test.sh deleted file mode 100644 index 509fdd5..0000000 --- a/travis/local_tools/smart_full_test.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/bash -# -# Performs a full travis-like test on the extension. -# Please adjust settings to ensure that this works. -# -# This crude script assumes the following setup: -# / -# extensions/ -# gn36/hookup/ -# test/ -# testdir/ (will be created automatically) -# smart_full_test.sh -# phpunittest.sh -# full_test.sh -# test_config.php (optional) -# -# Testing done by this script is very similar to travis testing. -# The script was created based upon a travis configuration. -# This leads to some weird constructions of folders sometimes. -# -# (c) 2016 - Martin Beckmann -# License: GPL v2 -# - -# Environment: -EXTNAME="gn36/hookup" # CHANGE name of the extension HERE -EXTBRANCH="dev/tests" # Branch to test (not used) -SNIFF="1" # Should we run code sniffer on your code? -IMAGE_ICC="1" # Should we run icc profile sniffer on your images? -EPV="1" # Should we run EPV (Extension Pre Validator) on your code? -LANG_TEST="0" # Should we validate the language files? -PHPBB_BRANCH="3.1.x" # Which phpBB branch to check out - -DB=mysqli -TRAVIS_PHP_VERSION=5.5.9 - -# Go into testdir and copy the extension: -EXTDIR=${EXTNAME%/*} -if [ ! -e testdir ]; then - mkdir testdir -else - # Existing test dir, delete a few things to make sure everything works out correctly - rm -rf testdir/$EXTNAME - rm -rf testdir/phpBB3/phpBB/ext/$EXTNAME - rm -rf testdir/phpBB3/phpBB/ext/$EXTDIR - rm -rf testdir/phpBB3/phpBB/cache/* - cp testdir/phpBB3/phpBB/ext/index.htm testdir/phpBB3/phpBB/cache/ - rm -rf testdir/tmp - - # Not sure if this is really necessary - dbs=$(mysql -e "SET SESSION group_concat_max_len=1000000; SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) AS statement FROM information_schema.tables WHERE table_schema = 'phpbb_tests' AND table_name LIKE 'phpbb_%';") - cleaned=$(echo "$dbs" | sed 's/statement//g') - mysql -e "USE phpbb_tests; $cleaned" -fi -cd testdir -if [ -e $EXTDIR ]; then - rm -rf $EXTDIR -fi -mkdir $EXTDIR - -# Copy instead of cloning (on some systems, cloning may be faster?) -cp -r ../../extensions/$EXTNAME $EXTDIR -#git clone --depth=1 ../../extensions/$EXTNAME $EXTNAME --branch=$EXTBRANCH -cd $EXTNAME - -# Install -#php composer.phar install --dev --no-interaction --prefer-source -php composer.phar install --no-interaction -if [ ! -e ../../phpBB3 ]; then - chmod +x travis/prepare-phpbb.sh - travis/prepare-phpbb.sh $EXTNAME $PHPBB_BRANCH - if [ "$LANG_TEST" != '0' ]; then - travis/prepare-langtest.sh $EXTNAME $PHPBB_BRANCH - fi - cd ../../phpBB3 -else - if [ "$LANG_TEST" != '0' ]; then - travis/prepare-langtest.sh $EXTNAME $PHPBB_BRANCH - fi - if [ ! -e ../../tmp ]; then - # This is from prepare-phpbb.sh - mkdir ../../tmp - cp -R . ../../tmp - fi - cd ../../phpBB3 - git pull origin -fi - -travis/prepare-extension.sh $EXTNAME $PHPBB_BRANCH -travis/setup-phpbb.sh $DB $TRAVIS_PHP_VERSION -travis/install-phpbb-test-dependencies.sh -cd phpBB -#php ../composer.phar install --dev --no-interaction --prefer-source -php ../composer.phar install --no-interaction -cd .. - -# Preparation: -travis/setup-database.sh $DB $TRAVIS_PHP_VERSION - -# Database setup: -if [ -e ../../../test_config.php ]; then - cp ../../../test_config.php ../tests/ -fi - -# script: -sh -c "if [ '$SNIFF' != '0' ]; then travis/ext-sniff.sh $DB $TRAVIS_PHP_VERSION $EXTNAME; fi" -sh -c "if [ '$IMAGE_ICC' != '0' ]; then travis/check-image-icc-profiles.sh $DB $TRAVIS_PHP_VERSION; fi" -# This would be default, but the default sql user config is kind of stupid in some setups. -# So use the project unittest file and a config file instead: -#php phpBB/vendor/bin/phpunit --configuration phpBB/ext/$EXTNAME/travis/phpunit-$DB-travis.xml --bootstrap ./tests/bootstrap.php -php phpBB/vendor/bin/phpunit --configuration phpBB/ext/$EXTNAME/phpunit.xml.dist --bootstrap ./tests/bootstrap.php -sh -c "if [ '$EPV' != '0' ] && [ '$DB' = 'mysqli' ]; then phpBB/ext/$EXTNAME/vendor/bin/EPV.php run --dir='phpBB/ext/$EXTNAME/'; fi" -sh -c "if [ '$LANG_TEST' != '0' ]; then ../langtest/travis/test-lang.sh; fi" diff --git a/travis/local_tools/test_config.php b/travis/local_tools/test_config.php deleted file mode 100644 index 7ebb625..0000000 --- a/travis/local_tools/test_config.php +++ /dev/null @@ -1,16 +0,0 @@ - 3, -));" > $LANGTESTPATH/language/$i/common.php -done - -# copy the license file to all languages to avoid that fatal error -for i in $(ls $EXTPATH/language/) -do - cp $EXTPATH/license.txt $LANGTESTPATH/language/$i/LICENSE -done - -# link to vendor dir and travis dir -currentdir=`pwd` -cd $EXTPATH -absextpath=`pwd` -cd $currentdir -ln -s $absextpath/vendor/ $LANGTESTPATH/vendor -ln -s $absextpath/travis/ $LANGTESTPATH/travis - diff --git a/travis/prepare-phpbb.sh b/travis/prepare-phpbb.sh deleted file mode 100755 index 46b739b..0000000 --- a/travis/prepare-phpbb.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# -# This file is part of the phpBB Forum Software package. -# -# @copyright (c) phpBB Limited -# @license GNU General Public License, version 2 (GPL-2.0) -# -# For full copyright and license information, please see -# the docs/CREDITS.txt file. -# -set -e -set -x - -EXTNAME=$1 -BRANCH=$2 -EXTPATH_TEMP=$3 - -# Copy extension to a temp folder -mkdir ../../tmp -cp -R . ../../tmp -cd ../../ - -# Clone phpBB -git clone --depth=1 "git://github.com/phpbb/phpbb.git" "phpBB3" --branch=$BRANCH \ No newline at end of file diff --git a/travis/test-lang.sh b/travis/test-lang.sh deleted file mode 100755 index d396289..0000000 --- a/travis/test-lang.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# -# This file is part of the hookup extension for phpBB -# -# @copyright (c) gn#36 -# @license GNU General Public License, version 2 (GPL-2.0) -# -# -#set -e -#set -x - -echo "Running language tests" -retval=true -# we should be in phpBB3, so we need to go up one level into the langtest dir: -cd ../langtest ; - -for i in $(ls language/) -do - php vendor/bin/PhpbbTranslationValidator.php validate --language-dir=language $i - if [ ! $? -eq 0 ]; then - retval=false - fi - echo ""; -done; - -cd ../phpBB3 -if [ "$retval" = true ]; then - exit 0 -fi -exit 1 - From 5725f12b3f20e670fdc136346ac136b25c8bd637 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 12:50:11 +0000 Subject: [PATCH 2/5] Make functional tests run on PHPUnit 9 and allow Composer 2 plugins - composer.json: allow the installer plugins required for the vendor dependencies (Composer 2) - Add fresh composer.lock - Functional tests: use assertStringContainsString instead of removed string support in assertContains - Add dev/run-functional-tests.sh for running the functional tests headless Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_014TpJhHt7ke8q3BnSZ8wGZf --- composer.json | 7 + composer.lock | 622 ++++++++++++++++++++++++++++++ dev/run-functional-tests.sh | 14 + tests/functional/install_test.php | 6 +- tests/functional/use_test.php | 28 +- 5 files changed, 660 insertions(+), 17 deletions(-) create mode 100644 composer.lock create mode 100755 dev/run-functional-tests.sh diff --git a/composer.json b/composer.json index f078a98..8aa9b9b 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,13 @@ "eonasdan/bootstrap-datetimepicker" : ">=4.17", "fortawesome/font-awesome" : "~4.4.0" }, + "config" : { + "allow-plugins" : { + "composer/installers" : true, + "oomphinc/composer-installers-extender" : true, + "robloach/component-installer" : true + } + }, "extra" : { "display-name" : "Hookup", "soft-require" : { diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..b3c5d1b --- /dev/null +++ b/composer.lock @@ -0,0 +1,622 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "5e45ba4c0da7cc979cce1a53b7e702cf", + "packages": [ + { + "name": "components/jquery", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/components/jquery.git", + "reference": "594f9dd922c3b12519c8d52bde744b79fd2ca816" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/components/jquery/zipball/594f9dd922c3b12519c8d52bde744b79fd2ca816", + "reference": "594f9dd922c3b12519c8d52bde744b79fd2ca816", + "shasum": "" + }, + "type": "component", + "extra": { + "component": { + "files": [ + "jquery.min.js", + "jquery.min.map", + "jquery.slim.js", + "jquery.slim.min.js", + "jquery.slim.min.map" + ], + "scripts": [ + "jquery.js" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "JS Foundation and other contributors" + } + ], + "description": "jQuery JavaScript Library", + "homepage": "http://jquery.com", + "support": { + "forum": "http://forum.jquery.com", + "irc": "irc://irc.freenode.org/jquery", + "issues": "https://github.com/jquery/jquery/issues", + "source": "https://github.com/jquery/jquery", + "wiki": "http://docs.jquery.com/" + }, + "time": "2026-05-11T18:06:23+00:00" + }, + { + "name": "composer/installers", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/12fb2dfe5e16183de69e784a7b84046c43d97e8e", + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "composer/composer": "^1.10.27 || ^2.7", + "composer/semver": "^1.7.2 || ^3.4.0", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-phpunit": "^1", + "symfony/phpunit-bridge": "^7.1.1", + "symfony/process": "^5 || ^6 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-main": "2.x-dev" + }, + "plugin-modifies-install-path": true + }, + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Starbug", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "concreteCMS", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "matomo", + "mediawiki", + "miaoxing", + "modulework", + "modx", + "moodle", + "osclass", + "pantheon", + "phpbb", + "piwik", + "ppi", + "processwire", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "tastyigniter", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-06-24T20:46:46+00:00" + }, + { + "name": "eonasdan/bootstrap-datetimepicker", + "version": "4.17.49", + "source": { + "type": "git", + "url": "https://github.com/Eonasdan/tempus-dominus.git", + "reference": "5b97d5b89e4bcbded740efed7dfb1f3ec4c745a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Eonasdan/tempus-dominus/zipball/5b97d5b89e4bcbded740efed7dfb1f3ec4c745a2", + "reference": "5b97d5b89e4bcbded740efed7dfb1f3ec4c745a2", + "shasum": "" + }, + "require": { + "components/jquery": ">=1.9.1", + "moment/moment": ">=2.10.5", + "robloach/component-installer": "*" + }, + "type": "component", + "extra": { + "component": { + "files": [ + "build/js/bootstrap-datetimepicker.min.js", + "build/css/bootstrap-datetimepicker.min.css" + ], + "scripts": [ + "src/js/bootstrap-datetimepicker.js" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Date/time picker widget based on twitter bootstrap", + "homepage": "http://eonasdan.github.io/bootstrap-datetimepicker/", + "keywords": [ + "DateTimePicker", + "bootstrap" + ], + "support": { + "issues": "https://github.com/Eonasdan/tempus-dominus/issues", + "source": "https://github.com/Eonasdan/tempus-dominus/tree/4.17.49" + }, + "time": "2020-12-17T13:25:21+00:00" + }, + { + "name": "fortawesome/font-awesome", + "version": "v4.4.0", + "source": { + "type": "git", + "url": "https://github.com/FortAwesome/Font-Awesome.git", + "reference": "e554555d73a44e0a7d11b0361ad7a5325a5f551c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FortAwesome/Font-Awesome/zipball/e554555d73a44e0a7d11b0361ad7a5325a5f551c", + "reference": "e554555d73a44e0a7d11b0361ad7a5325a5f551c", + "shasum": "" + }, + "require-dev": { + "jekyll": "1.0.2", + "lessc": "1.4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OFL-1.1", + "MIT" + ], + "authors": [ + { + "name": "Dave Gandy", + "email": "dave@fontawesome.io", + "homepage": "http://twitter.com/davegandy", + "role": "Developer" + } + ], + "description": "The iconic font and CSS framework", + "homepage": "http://fontawesome.io/", + "keywords": [ + "FontAwesome", + "awesome", + "bootstrap", + "font", + "icon" + ], + "support": { + "issues": "https://github.com/FortAwesome/Font-Awesome/issues", + "source": "https://github.com/FortAwesome/Font-Awesome/tree/v4.4.0" + }, + "time": "2015-07-28T21:55:03+00:00" + }, + { + "name": "kriswallsmith/assetic", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/kriswallsmith/assetic.git", + "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", + "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", + "shasum": "" + }, + "require": { + "php": ">=5.3.1", + "symfony/process": "~2.1|~3.0" + }, + "conflict": { + "twig/twig": "<1.27" + }, + "require-dev": { + "leafo/lessphp": "^0.3.7", + "leafo/scssphp": "~0.1", + "meenie/javascript-packer": "^1.1", + "mrclay/minify": "<2.3", + "natxet/cssmin": "3.0.4", + "patchwork/jsqueeze": "~1.0|~2.0", + "phpunit/phpunit": "~4.8 || ^5.6", + "psr/log": "~1.0", + "ptachoire/cssembed": "~1.0", + "symfony/phpunit-bridge": "~2.7|~3.0", + "twig/twig": "~1.23|~2.0", + "yfix/packager": "dev-master" + }, + "suggest": { + "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", + "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", + "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", + "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor", + "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", + "twig/twig": "Assetic provides the integration with the Twig templating engine" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-0": { + "Assetic": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kris Wallsmith", + "email": "kris.wallsmith@gmail.com", + "homepage": "http://kriswallsmith.net/" + } + ], + "description": "Asset Management for PHP", + "homepage": "https://github.com/kriswallsmith/assetic", + "keywords": [ + "assets", + "compression", + "minification" + ], + "support": { + "issues": "https://github.com/kriswallsmith/assetic/issues", + "source": "https://github.com/kriswallsmith/assetic/tree/master" + }, + "time": "2016-11-11T18:43:20+00:00" + }, + { + "name": "moment/moment", + "version": "2.31.0", + "source": { + "type": "git", + "url": "https://github.com/moment/moment.git", + "reference": "15b45d48a176312e8f34143c5a800090abf4787f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/moment/moment/zipball/15b45d48a176312e8f34143c5a800090abf4787f", + "reference": "15b45d48a176312e8f34143c5a800090abf4787f", + "shasum": "" + }, + "require": { + "oomphinc/composer-installers-extender": "*" + }, + "type": "component", + "extra": { + "component": { + "files": [ + "min/*.js", + "locale/*.js" + ], + "scripts": [ + "moment.js" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tim Wood", + "email": "washwithcare@gmail.com" + } + ], + "description": "Parse, validate, manipulate, and display dates in JavaScript.", + "homepage": "https://github.com/moment/moment", + "keywords": [ + "date", + "ender", + "format", + "i18n", + "l10n", + "moment", + "parse", + "time", + "validate" + ], + "support": { + "issues": "https://github.com/moment/moment/issues", + "source": "https://github.com/moment/moment/tree/2.31.0" + }, + "time": "2026-09-15T00:50:55+00:00" + }, + { + "name": "oomphinc/composer-installers-extender", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/oomphinc/composer-installers-extender.git", + "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oomphinc/composer-installers-extender/zipball/cbf4b6f9a24153b785d09eee755b995ba87bd5f9", + "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0", + "composer/installers": "^1.0 || ^2.0", + "php": ">=7.1" + }, + "require-dev": { + "composer/composer": "^2.0", + "phpunit/phpunit": "^7.2", + "squizlabs/php_codesniffer": "^3.3" + }, + "type": "composer-plugin", + "extra": { + "class": "OomphInc\\ComposerInstallersExtender\\Plugin" + }, + "autoload": { + "psr-4": { + "OomphInc\\ComposerInstallersExtender\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Beemsterboer", + "email": "stephen@oomphinc.com", + "homepage": "https://github.com/balbuf" + }, + { + "name": "Nathan Dentzau", + "email": "nate@oomphinc.com", + "homepage": "http://oomph.is/ndentzau" + } + ], + "description": "Extend the composer/installers plugin to accept any arbitrary package type.", + "homepage": "http://www.oomphinc.com/", + "support": { + "issues": "https://github.com/oomphinc/composer-installers-extender/issues", + "source": "https://github.com/oomphinc/composer-installers-extender/tree/2.0.1" + }, + "abandoned": true, + "time": "2021-12-15T12:32:42+00:00" + }, + { + "name": "robloach/component-installer", + "version": "0.0.12", + "source": { + "type": "git", + "url": "https://github.com/RobLoach/component-installer.git", + "reference": "1864f25db21fc173e02a359f646acd596c1b0460" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/RobLoach/component-installer/zipball/1864f25db21fc173e02a359f646acd596c1b0460", + "reference": "1864f25db21fc173e02a359f646acd596c1b0460", + "shasum": "" + }, + "require": { + "kriswallsmith/assetic": "1.*", + "php": ">=5.3.2" + }, + "require-dev": { + "composer/composer": "1.*" + }, + "type": "composer-installer", + "extra": { + "class": "ComponentInstaller\\Installer" + }, + "autoload": { + "psr-0": { + "ComponentInstaller": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rob Loach", + "email": "robloach@gmail.com", + "homepage": "http://robloach.net" + } + ], + "description": "Allows installation of Components via Composer.", + "support": { + "issues": "https://github.com/RobLoach/component-installer/issues", + "source": "https://github.com/RobLoach/component-installer/tree/master" + }, + "abandoned": "oomphinc/composer-installers-extender", + "time": "2013-08-31T23:46:48+00:00" + }, + { + "name": "symfony/process", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/b8648cf1d5af12a44a51d07ef9bf980921f15fca", + "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-24T10:57:07+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/dev/run-functional-tests.sh b/dev/run-functional-tests.sh new file mode 100755 index 0000000..b9f93df --- /dev/null +++ b/dev/run-functional-tests.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Führt die Funktionstests headless aus: startet den PHP-Entwicklungsserver auf dem phpBB-Checkout, +# installiert die Erweiterungs-Abhängigkeiten (vendor/) falls nötig und ruft dev/run-tests.sh auf. +set -e +EXT="$(cd "$(dirname "$0")/.." && pwd)" +CORE="${PHPBB_DIR:-/opt/phpbb-core}" +PORT="${PORT:-8000}" +[ -d "$EXT/vendor" ] || (cd "$EXT" && composer install --no-interaction) +php -S "127.0.0.1:$PORT" -t "$CORE" >/dev/null 2>&1 & +SERVER=$! +trap 'kill $SERVER 2>/dev/null' EXIT +sleep 1 +export PHPBB_FUNCTIONAL_URL="http://127.0.0.1:$PORT/phpBB/" +"$EXT/dev/run-tests.sh" --testsuite="Extension Functional Tests" "$@" diff --git a/tests/functional/install_test.php b/tests/functional/install_test.php index 2c28d5a..cd10a4d 100644 --- a/tests/functional/install_test.php +++ b/tests/functional/install_test.php @@ -24,12 +24,12 @@ public function test_validate_posting() { // Check whether we can still call posting.php in edit mode (even though login prevents any useful use) $crawler = self::request('GET', 'posting.php?mode=edit&f=2&p=1'); - $this->assertContains('Username', $crawler->filter('dt')->text()); + $this->assertStringContainsString('Username', $crawler->filter('dt')->text()); // The same thing with login, check for hookup buttons $this->login(); $crawler = self::request('GET', 'posting.php?mode=edit&f=2&p=1'); - $this->assertContains('Meeting planner', $crawler->text()); + $this->assertStringContainsString('Meeting planner', $crawler->text()); $this->assert_find_one_checkbox($crawler, 'hookup_enabled'); $this->assert_find_one_checkbox($crawler, 'hookup_self_invite'); $this->assert_find_one_checkbox($crawler, 'hookup_autoreset'); @@ -39,6 +39,6 @@ public function test_validate_viewtopic() { // Check whether we can still call viewtopic.php without errors $crawler = self::request('GET', 'viewtopic.php?f=2&p=1'); - $this->assertContains('Welcome', $crawler->filter('h2')->text()); + $this->assertStringContainsString('Welcome', $crawler->filter('h2')->text()); } } diff --git a/tests/functional/use_test.php b/tests/functional/use_test.php index 27b99c2..c91683b 100644 --- a/tests/functional/use_test.php +++ b/tests/functional/use_test.php @@ -133,37 +133,37 @@ public function test_validate_viewtopic_login($hookup, $result, $title) if ($result) { - $this->assertContains('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringContainsString('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); if ($hookup['hookup_autoreset']) { - $this->assertContains('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringContainsString('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); } else { - $this->assertNotContains('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringNotContainsString('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); } if ($hookup['hookup_self_invite']) { - $this->assertContains('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); - $this->assertContains('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); - $this->assertContains('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + $this->assertStringContainsString('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringContainsString('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + $this->assertStringContainsString('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); } else { - $this->assertNotContains('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringNotContainsString('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); // This actually can still be in there because the admin has permission to invite users - //$this->assertNotContains('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); - $this->assertNotContains('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + //$this->assertStringNotContainsString('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + $this->assertStringNotContainsString('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); } } else { - $this->assertNotContains('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); - $this->assertNotContains('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); - $this->assertNotContains('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); - $this->assertNotContains('invite_self', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); - $this->assertNotContains('part of this meeting planner', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); + $this->assertStringNotContainsString('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringNotContainsString('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringNotContainsString('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertStringNotContainsString('invite_self', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); + $this->assertStringNotContainsString('part of this meeting planner', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); } } From 6d4275aa2880d36d018a8ee2236a9418b24adbe2 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 14:06:10 +0000 Subject: [PATCH 3/5] Support phpBB 3.2.x and 3.3.x, fix CI - composer.json: allow phpBB >=3.2.2 and PHP >=5.4, drop composer.lock (resolved per PHP version) - Tests: assertions that work on PHPUnit 4 (phpBB 3.2) and 9 (phpBB 3.3) - CI: use test-framework@3.3.x (master targets phpBB 4) incl. composer install, separate workflow for phpBB 3.2.x - Rename dev/ to develop/ (skipped by the executable files check), add develop/check.sh mirroring the CI checks - Fix code sniffer findings Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_014TpJhHt7ke8q3BnSZ8wGZf --- .github/workflows/tests-3.2.yml | 60 +++ .github/workflows/tests.yml | 19 +- .gitignore | 3 +- composer.json | 4 +- composer.lock | 622 ----------------------- develop/check.sh | 36 ++ {dev => develop}/cloud-setup.sh | 0 {dev => develop}/run-functional-tests.sh | 4 +- {dev => develop}/run-tests.sh | 2 +- event/viewtopic.php | 6 +- ext.php | 6 +- notification/base.php | 6 +- tests/compat.php | 26 + tests/functional/install_test.php | 8 +- tests/functional/use_test.php | 30 +- 15 files changed, 172 insertions(+), 660 deletions(-) create mode 100644 .github/workflows/tests-3.2.yml delete mode 100644 composer.lock create mode 100755 develop/check.sh rename {dev => develop}/cloud-setup.sh (100%) rename {dev => develop}/run-functional-tests.sh (82%) rename {dev => develop}/run-tests.sh (91%) create mode 100644 tests/compat.php diff --git a/.github/workflows/tests-3.2.yml b/.github/workflows/tests-3.2.yml new file mode 100644 index 0000000..05b1c68 --- /dev/null +++ b/.github/workflows/tests-3.2.yml @@ -0,0 +1,60 @@ +name: Tests phpBB 3.2 + +on: + workflow_call: + +env: + EXTNAME: gn36/hookup + PHPBB_BRANCH: 3.2.x + +jobs: + tests: + name: PHP ${{ matrix.php }} + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + php: ['5.6', '7.1', '7.3'] + + steps: + - name: Checkout phpBB + uses: actions/checkout@v4 + with: + repository: phpbb/phpbb + ref: ${{ env.PHPBB_BRANCH }} + path: phpBB3 + + - name: Checkout extension + uses: actions/checkout@v4 + with: + path: phpBB3/phpBB/ext/${{ env.EXTNAME }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: dom, curl, libxml, mbstring, zip, pdo, sqlite, pdo_sqlite, intl, gd, iconv + tools: composer:v2 + coverage: none + + - name: Install phpBB dependencies + run: composer install --dev --no-interaction --no-progress + working-directory: ./phpBB3/phpBB + + - name: Install extension dependencies + run: composer install --no-interaction --no-progress + working-directory: ./phpBB3/phpBB/ext/${{ env.EXTNAME }} + + - name: Start web server for functional tests + run: nohup php -S 127.0.0.1:8000 -t . > /tmp/php-server.log 2>&1 & + working-directory: ./phpBB3 + + - name: Run unit and functional tests + env: + PHPBB_TEST_DBMS: sqlite3 + PHPBB_TEST_DBHOST: /tmp/phpbb_test.sqlite + PHPBB_FUNCTIONAL_URL: http://127.0.0.1:8000/phpBB/ + run: | + phpBB/vendor/bin/phpunit --configuration "phpBB/ext/$EXTNAME/phpunit.xml.dist" --testsuite "Extension Test Suite" + phpBB/vendor/bin/phpunit --configuration "phpBB/ext/$EXTNAME/phpunit.xml.dist" --testsuite "Extension Functional Tests" + working-directory: ./phpBB3 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1e725b1..641d346 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -4,15 +4,22 @@ on: push: branches: - master - - 'modernize-*' + - 'claude/**' pull_request: jobs: - call-tests: - name: Extension tests - uses: phpbb-extensions/test-framework/.github/workflows/tests.yml@master + # phpBB 3.3.x: gemeinsamer Workflow der phpBB-Extension-Entwickler (Sniffer, EPV, Unit- und Funktionstests auf allen DBs) + # Der Branch 3.3.x des Frameworks zielt auf phpBB 3.3.x (master zielt auf phpBB 4) + phpbb-3-3: + name: phpBB 3.3 + uses: phpbb-extensions/test-framework/.github/workflows/tests.yml@3.3.x with: EXTNAME: gn36/hookup PHPBB_BRANCH: 3.3.x - PRIMARY_PHP_VERSION: '8.1' - PHP_VERSION_MATRIX: '["7.2", "7.4", "8.0", "8.1", "8.2", "8.3"]' + # Die Funktionstests benötigen die Composer-Abhängigkeiten (vendor/) der Erweiterung + RUN_COMPOSER_INSTALL: '1' + + # phpBB 3.2.x: das Framework unterstützt nur 3.3.x, daher ein eigener, kleiner Workflow + phpbb-3-2: + name: phpBB 3.2 + uses: ./.github/workflows/tests-3.2.yml diff --git a/.gitignore b/.gitignore index b7c6d4a..d1ed8b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ components/* -vendor/* \ No newline at end of file +vendor/* +composer.lock diff --git a/composer.json b/composer.json index 8aa9b9b..ffdf60b 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ } ], "require" : { - "php" : ">=7.2", + "php" : ">=5.4", "eonasdan/bootstrap-datetimepicker" : ">=4.17", "fortawesome/font-awesome" : "~4.4.0" }, @@ -32,7 +32,7 @@ "extra" : { "display-name" : "Hookup", "soft-require" : { - "phpbb/phpbb" : ">=3.3.0,<3.4@dev" + "phpbb/phpbb" : ">=3.2.2,<3.4@dev" }, "version-check" : { "host" : "phpbb.gn36.de", diff --git a/composer.lock b/composer.lock deleted file mode 100644 index b3c5d1b..0000000 --- a/composer.lock +++ /dev/null @@ -1,622 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "5e45ba4c0da7cc979cce1a53b7e702cf", - "packages": [ - { - "name": "components/jquery", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/components/jquery.git", - "reference": "594f9dd922c3b12519c8d52bde744b79fd2ca816" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/components/jquery/zipball/594f9dd922c3b12519c8d52bde744b79fd2ca816", - "reference": "594f9dd922c3b12519c8d52bde744b79fd2ca816", - "shasum": "" - }, - "type": "component", - "extra": { - "component": { - "files": [ - "jquery.min.js", - "jquery.min.map", - "jquery.slim.js", - "jquery.slim.min.js", - "jquery.slim.min.map" - ], - "scripts": [ - "jquery.js" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "JS Foundation and other contributors" - } - ], - "description": "jQuery JavaScript Library", - "homepage": "http://jquery.com", - "support": { - "forum": "http://forum.jquery.com", - "irc": "irc://irc.freenode.org/jquery", - "issues": "https://github.com/jquery/jquery/issues", - "source": "https://github.com/jquery/jquery", - "wiki": "http://docs.jquery.com/" - }, - "time": "2026-05-11T18:06:23+00:00" - }, - { - "name": "composer/installers", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/composer/installers.git", - "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/12fb2dfe5e16183de69e784a7b84046c43d97e8e", - "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "composer/composer": "^1.10.27 || ^2.7", - "composer/semver": "^1.7.2 || ^3.4.0", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-phpunit": "^1", - "symfony/phpunit-bridge": "^7.1.1", - "symfony/process": "^5 || ^6 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "Composer\\Installers\\Plugin", - "branch-alias": { - "dev-main": "2.x-dev" - }, - "plugin-modifies-install-path": true - }, - "autoload": { - "psr-4": { - "Composer\\Installers\\": "src/Composer/Installers" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kyle Robinson Young", - "email": "kyle@dontkry.com", - "homepage": "https://github.com/shama" - } - ], - "description": "A multi-framework Composer library installer", - "homepage": "https://composer.github.io/installers/", - "keywords": [ - "Dolibarr", - "Eliasis", - "Hurad", - "ImageCMS", - "Kanboard", - "Lan Management System", - "MODX Evo", - "MantisBT", - "Mautic", - "Maya", - "OXID", - "Plentymarkets", - "Porto", - "RadPHP", - "SMF", - "Starbug", - "Thelia", - "Whmcs", - "WolfCMS", - "agl", - "annotatecms", - "attogram", - "bitrix", - "cakephp", - "chef", - "cockpit", - "codeigniter", - "concrete5", - "concreteCMS", - "croogo", - "dokuwiki", - "drupal", - "eZ Platform", - "elgg", - "expressionengine", - "fuelphp", - "grav", - "installer", - "itop", - "known", - "kohana", - "laravel", - "lavalite", - "lithium", - "magento", - "majima", - "mako", - "matomo", - "mediawiki", - "miaoxing", - "modulework", - "modx", - "moodle", - "osclass", - "pantheon", - "phpbb", - "piwik", - "ppi", - "processwire", - "puppet", - "pxcms", - "reindex", - "roundcube", - "shopware", - "silverstripe", - "sydes", - "sylius", - "tastyigniter", - "wordpress", - "yawik", - "zend", - "zikula" - ], - "support": { - "issues": "https://github.com/composer/installers/issues", - "source": "https://github.com/composer/installers/tree/v2.3.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-06-24T20:46:46+00:00" - }, - { - "name": "eonasdan/bootstrap-datetimepicker", - "version": "4.17.49", - "source": { - "type": "git", - "url": "https://github.com/Eonasdan/tempus-dominus.git", - "reference": "5b97d5b89e4bcbded740efed7dfb1f3ec4c745a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Eonasdan/tempus-dominus/zipball/5b97d5b89e4bcbded740efed7dfb1f3ec4c745a2", - "reference": "5b97d5b89e4bcbded740efed7dfb1f3ec4c745a2", - "shasum": "" - }, - "require": { - "components/jquery": ">=1.9.1", - "moment/moment": ">=2.10.5", - "robloach/component-installer": "*" - }, - "type": "component", - "extra": { - "component": { - "files": [ - "build/js/bootstrap-datetimepicker.min.js", - "build/css/bootstrap-datetimepicker.min.css" - ], - "scripts": [ - "src/js/bootstrap-datetimepicker.js" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Date/time picker widget based on twitter bootstrap", - "homepage": "http://eonasdan.github.io/bootstrap-datetimepicker/", - "keywords": [ - "DateTimePicker", - "bootstrap" - ], - "support": { - "issues": "https://github.com/Eonasdan/tempus-dominus/issues", - "source": "https://github.com/Eonasdan/tempus-dominus/tree/4.17.49" - }, - "time": "2020-12-17T13:25:21+00:00" - }, - { - "name": "fortawesome/font-awesome", - "version": "v4.4.0", - "source": { - "type": "git", - "url": "https://github.com/FortAwesome/Font-Awesome.git", - "reference": "e554555d73a44e0a7d11b0361ad7a5325a5f551c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FortAwesome/Font-Awesome/zipball/e554555d73a44e0a7d11b0361ad7a5325a5f551c", - "reference": "e554555d73a44e0a7d11b0361ad7a5325a5f551c", - "shasum": "" - }, - "require-dev": { - "jekyll": "1.0.2", - "lessc": "1.4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OFL-1.1", - "MIT" - ], - "authors": [ - { - "name": "Dave Gandy", - "email": "dave@fontawesome.io", - "homepage": "http://twitter.com/davegandy", - "role": "Developer" - } - ], - "description": "The iconic font and CSS framework", - "homepage": "http://fontawesome.io/", - "keywords": [ - "FontAwesome", - "awesome", - "bootstrap", - "font", - "icon" - ], - "support": { - "issues": "https://github.com/FortAwesome/Font-Awesome/issues", - "source": "https://github.com/FortAwesome/Font-Awesome/tree/v4.4.0" - }, - "time": "2015-07-28T21:55:03+00:00" - }, - { - "name": "kriswallsmith/assetic", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/kriswallsmith/assetic.git", - "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", - "reference": "e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1", - "shasum": "" - }, - "require": { - "php": ">=5.3.1", - "symfony/process": "~2.1|~3.0" - }, - "conflict": { - "twig/twig": "<1.27" - }, - "require-dev": { - "leafo/lessphp": "^0.3.7", - "leafo/scssphp": "~0.1", - "meenie/javascript-packer": "^1.1", - "mrclay/minify": "<2.3", - "natxet/cssmin": "3.0.4", - "patchwork/jsqueeze": "~1.0|~2.0", - "phpunit/phpunit": "~4.8 || ^5.6", - "psr/log": "~1.0", - "ptachoire/cssembed": "~1.0", - "symfony/phpunit-bridge": "~2.7|~3.0", - "twig/twig": "~1.23|~2.0", - "yfix/packager": "dev-master" - }, - "suggest": { - "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", - "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", - "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", - "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor", - "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", - "twig/twig": "Assetic provides the integration with the Twig templating engine" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-0": { - "Assetic": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kris Wallsmith", - "email": "kris.wallsmith@gmail.com", - "homepage": "http://kriswallsmith.net/" - } - ], - "description": "Asset Management for PHP", - "homepage": "https://github.com/kriswallsmith/assetic", - "keywords": [ - "assets", - "compression", - "minification" - ], - "support": { - "issues": "https://github.com/kriswallsmith/assetic/issues", - "source": "https://github.com/kriswallsmith/assetic/tree/master" - }, - "time": "2016-11-11T18:43:20+00:00" - }, - { - "name": "moment/moment", - "version": "2.31.0", - "source": { - "type": "git", - "url": "https://github.com/moment/moment.git", - "reference": "15b45d48a176312e8f34143c5a800090abf4787f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/moment/moment/zipball/15b45d48a176312e8f34143c5a800090abf4787f", - "reference": "15b45d48a176312e8f34143c5a800090abf4787f", - "shasum": "" - }, - "require": { - "oomphinc/composer-installers-extender": "*" - }, - "type": "component", - "extra": { - "component": { - "files": [ - "min/*.js", - "locale/*.js" - ], - "scripts": [ - "moment.js" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tim Wood", - "email": "washwithcare@gmail.com" - } - ], - "description": "Parse, validate, manipulate, and display dates in JavaScript.", - "homepage": "https://github.com/moment/moment", - "keywords": [ - "date", - "ender", - "format", - "i18n", - "l10n", - "moment", - "parse", - "time", - "validate" - ], - "support": { - "issues": "https://github.com/moment/moment/issues", - "source": "https://github.com/moment/moment/tree/2.31.0" - }, - "time": "2026-09-15T00:50:55+00:00" - }, - { - "name": "oomphinc/composer-installers-extender", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/oomphinc/composer-installers-extender.git", - "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/oomphinc/composer-installers-extender/zipball/cbf4b6f9a24153b785d09eee755b995ba87bd5f9", - "reference": "cbf4b6f9a24153b785d09eee755b995ba87bd5f9", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1 || ^2.0", - "composer/installers": "^1.0 || ^2.0", - "php": ">=7.1" - }, - "require-dev": { - "composer/composer": "^2.0", - "phpunit/phpunit": "^7.2", - "squizlabs/php_codesniffer": "^3.3" - }, - "type": "composer-plugin", - "extra": { - "class": "OomphInc\\ComposerInstallersExtender\\Plugin" - }, - "autoload": { - "psr-4": { - "OomphInc\\ComposerInstallersExtender\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stephen Beemsterboer", - "email": "stephen@oomphinc.com", - "homepage": "https://github.com/balbuf" - }, - { - "name": "Nathan Dentzau", - "email": "nate@oomphinc.com", - "homepage": "http://oomph.is/ndentzau" - } - ], - "description": "Extend the composer/installers plugin to accept any arbitrary package type.", - "homepage": "http://www.oomphinc.com/", - "support": { - "issues": "https://github.com/oomphinc/composer-installers-extender/issues", - "source": "https://github.com/oomphinc/composer-installers-extender/tree/2.0.1" - }, - "abandoned": true, - "time": "2021-12-15T12:32:42+00:00" - }, - { - "name": "robloach/component-installer", - "version": "0.0.12", - "source": { - "type": "git", - "url": "https://github.com/RobLoach/component-installer.git", - "reference": "1864f25db21fc173e02a359f646acd596c1b0460" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/RobLoach/component-installer/zipball/1864f25db21fc173e02a359f646acd596c1b0460", - "reference": "1864f25db21fc173e02a359f646acd596c1b0460", - "shasum": "" - }, - "require": { - "kriswallsmith/assetic": "1.*", - "php": ">=5.3.2" - }, - "require-dev": { - "composer/composer": "1.*" - }, - "type": "composer-installer", - "extra": { - "class": "ComponentInstaller\\Installer" - }, - "autoload": { - "psr-0": { - "ComponentInstaller": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Loach", - "email": "robloach@gmail.com", - "homepage": "http://robloach.net" - } - ], - "description": "Allows installation of Components via Composer.", - "support": { - "issues": "https://github.com/RobLoach/component-installer/issues", - "source": "https://github.com/RobLoach/component-installer/tree/master" - }, - "abandoned": "oomphinc/composer-installers-extender", - "time": "2013-08-31T23:46:48+00:00" - }, - { - "name": "symfony/process", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b8648cf1d5af12a44a51d07ef9bf980921f15fca", - "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v3.4.47" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T10:57:07+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.2" - }, - "platform-dev": {}, - "plugin-api-version": "2.6.0" -} diff --git a/develop/check.sh b/develop/check.sh new file mode 100755 index 0000000..40dd668 --- /dev/null +++ b/develop/check.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Führt lokal dieselben Prüfungen wie das CI (phpbb-extensions/test-framework@3.3.x) aus: +# Code Sniffer, Executable-Check, ICC-Profile, EPV (falls installiert) und die Unit-Tests (SQLite). +# Nutzung: develop/check.sh +set -e +EXTNAME=gn36/hookup +EXT="$(cd "$(dirname "$0")/.." && pwd)" +CORE="${PHPBB_DIR:-/opt/phpbb-core}" +DEST="$CORE/phpBB/ext/$EXTNAME" +rm -rf "$DEST" && mkdir -p "$DEST" +cp -a "$EXT/." "$DEST/" && rm -rf "$DEST/.git" +cd "$CORE" + +echo "== Code Sniffer" +phpBB/vendor/bin/phpcs -s --extensions=php --standard=build/code_sniffer/ruleset-php-extensions.xml \ + --ignore=*/"$EXTNAME"/tests/*,*/"$EXTNAME"/vendor/* phpBB/ext/"$EXTNAME" + +echo "== Executable files" +.github/ext-check-executable-files.sh ./ "$EXTNAME" + +echo "== ICC profiles" +if command -v exiftool >/dev/null; then + .github/check-image-icc-profiles.sh +else + echo "exiftool nicht installiert, übersprungen" +fi + +echo "== EPV" +if [ -x phpBB/vendor/bin/EPV.php ]; then + phpBB/vendor/bin/EPV.php run --dir="phpBB/ext/$EXTNAME/" +else + echo "EPV nicht installiert, übersprungen" +fi + +echo "== Unit tests" +"$EXT/develop/run-tests.sh" diff --git a/dev/cloud-setup.sh b/develop/cloud-setup.sh similarity index 100% rename from dev/cloud-setup.sh rename to develop/cloud-setup.sh diff --git a/dev/run-functional-tests.sh b/develop/run-functional-tests.sh similarity index 82% rename from dev/run-functional-tests.sh rename to develop/run-functional-tests.sh index b9f93df..e56b27f 100755 --- a/dev/run-functional-tests.sh +++ b/develop/run-functional-tests.sh @@ -1,6 +1,6 @@ #!/bin/bash # Führt die Funktionstests headless aus: startet den PHP-Entwicklungsserver auf dem phpBB-Checkout, -# installiert die Erweiterungs-Abhängigkeiten (vendor/) falls nötig und ruft dev/run-tests.sh auf. +# installiert die Erweiterungs-Abhängigkeiten (vendor/) falls nötig und ruft develop/run-tests.sh auf. set -e EXT="$(cd "$(dirname "$0")/.." && pwd)" CORE="${PHPBB_DIR:-/opt/phpbb-core}" @@ -11,4 +11,4 @@ SERVER=$! trap 'kill $SERVER 2>/dev/null' EXIT sleep 1 export PHPBB_FUNCTIONAL_URL="http://127.0.0.1:$PORT/phpBB/" -"$EXT/dev/run-tests.sh" --testsuite="Extension Functional Tests" "$@" +"$EXT/develop/run-tests.sh" --testsuite="Extension Functional Tests" "$@" diff --git a/dev/run-tests.sh b/develop/run-tests.sh similarity index 91% rename from dev/run-tests.sh rename to develop/run-tests.sh index 399e10d..fd4a682 100755 --- a/dev/run-tests.sh +++ b/develop/run-tests.sh @@ -1,6 +1,6 @@ #!/bin/bash # Führt die Extension-Tests gegen den phpBB-Checkout aus (SQLite, ohne DB-Server). -# Nutzung: dev/run-tests.sh [phpunit-Argumente] +# Nutzung: develop/run-tests.sh [phpunit-Argumente] set -e EXT="$(cd "$(dirname "$0")/.." && pwd)" CORE="${PHPBB_DIR:-/opt/phpbb-core}" diff --git a/event/viewtopic.php b/event/viewtopic.php index 75ba08a..8f71820 100644 --- a/event/viewtopic.php +++ b/event/viewtopic.php @@ -30,7 +30,7 @@ static public function getSubscribedEvents() ); } - /** @var \gn36\hookup\functions\hookup */ + /** @var hookup */ protected $hookup; /** @var \phpbb\db\driver\driver_interface */ @@ -66,7 +66,7 @@ static public function getSubscribedEvents() /** * Constructor * - * @param \gn36\hookup\functions\hookup $hookup + * @param hookup $hookup * @param \phpbb\template\template $template * @param \phpbb\db\driver\driver_interface $db * @param \phpbb\user $user @@ -78,7 +78,7 @@ static public function getSubscribedEvents() * @param string $phpEx * @param string $hookup_path */ - function __construct(\gn36\hookup\functions\hookup $hookup, \phpbb\template\template $template, \phpbb\db\driver\driver_interface $db, \phpbb\user $user, \phpbb\auth\auth $auth, \phpbb\request\request_interface $request, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\notification\manager $notification_manager, $phpbb_root_path, $phpEx, $hookup_path) + function __construct(hookup $hookup, \phpbb\template\template $template, \phpbb\db\driver\driver_interface $db, \phpbb\user $user, \phpbb\auth\auth $auth, \phpbb\request\request_interface $request, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\notification\manager $notification_manager, $phpbb_root_path, $phpEx, $hookup_path) { $this->hookup = $hookup; $this->template = $template; diff --git a/ext.php b/ext.php index 351093a..3ca8cae 100644 --- a/ext.php +++ b/ext.php @@ -89,7 +89,7 @@ function is_enableable() foreach ($require as $key => $value) { $info = $this->split_version_info($value); - + foreach ($info['version'] as $vkey => $version) { switch (strtolower($key)) @@ -134,7 +134,7 @@ function is_enableable() // Assume installed for simplicity break; } - + // Apparently not a vendor dir. This should be an extension as a requirement if (!$mgr->is_enabled($key)) { @@ -155,7 +155,7 @@ function is_enableable() } } } - + // Now check the files to search for: foreach ($dep_files_to_search as $key => $file) { diff --git a/notification/base.php b/notification/base.php index 060540e..ca8e04f 100644 --- a/notification/base.php +++ b/notification/base.php @@ -21,13 +21,13 @@ class base extends \phpbb\notification\type\base 'lang' => 'HOOKUP_NOTIFY_OPTION', 'group' => 'NOTIFICATION_GROUP_MISCELLANEOUS', ); - + /** @var \phpbb\user_loader */ protected $user_loader; - + /** @var \phpbb\config\config */ protected $config; - + /** @var string */ protected $notification_types_table; diff --git a/tests/compat.php b/tests/compat.php new file mode 100644 index 0000000..e0cf5a6 --- /dev/null +++ b/tests/compat.php @@ -0,0 +1,26 @@ +assertThat($haystack, $this->stringContains($needle), $message); + } + + public function assertTextNotContains($needle, $haystack, $message = '') + { + $this->assertThat($haystack, $this->logicalNot($this->stringContains($needle)), $message); + } +} diff --git a/tests/functional/install_test.php b/tests/functional/install_test.php index cd10a4d..cc19c8e 100644 --- a/tests/functional/install_test.php +++ b/tests/functional/install_test.php @@ -15,6 +15,8 @@ */ class install_test extends \phpbb_functional_test_case { + use \gn36\hookup\tests\compat; + static protected function setup_extensions() { return array('gn36/hookup'); @@ -24,12 +26,12 @@ public function test_validate_posting() { // Check whether we can still call posting.php in edit mode (even though login prevents any useful use) $crawler = self::request('GET', 'posting.php?mode=edit&f=2&p=1'); - $this->assertStringContainsString('Username', $crawler->filter('dt')->text()); + $this->assertTextContains('Username', $crawler->filter('dt')->text()); // The same thing with login, check for hookup buttons $this->login(); $crawler = self::request('GET', 'posting.php?mode=edit&f=2&p=1'); - $this->assertStringContainsString('Meeting planner', $crawler->text()); + $this->assertTextContains('Meeting planner', $crawler->text()); $this->assert_find_one_checkbox($crawler, 'hookup_enabled'); $this->assert_find_one_checkbox($crawler, 'hookup_self_invite'); $this->assert_find_one_checkbox($crawler, 'hookup_autoreset'); @@ -39,6 +41,6 @@ public function test_validate_viewtopic() { // Check whether we can still call viewtopic.php without errors $crawler = self::request('GET', 'viewtopic.php?f=2&p=1'); - $this->assertStringContainsString('Welcome', $crawler->filter('h2')->text()); + $this->assertTextContains('Welcome', $crawler->filter('h2')->text()); } } diff --git a/tests/functional/use_test.php b/tests/functional/use_test.php index c91683b..100880d 100644 --- a/tests/functional/use_test.php +++ b/tests/functional/use_test.php @@ -15,6 +15,8 @@ */ class use_test extends \phpbb_functional_test_case { + use \gn36\hookup\tests\compat; + static protected function setup_extensions() { return array('gn36/hookup'); @@ -133,37 +135,37 @@ public function test_validate_viewtopic_login($hookup, $result, $title) if ($result) { - $this->assertStringContainsString('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextContains('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); if ($hookup['hookup_autoreset']) { - $this->assertStringContainsString('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextContains('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); } else { - $this->assertStringNotContainsString('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextNotContains('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); } if ($hookup['hookup_self_invite']) { - $this->assertStringContainsString('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); - $this->assertStringContainsString('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); - $this->assertStringContainsString('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + $this->assertTextContains('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextContains('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + $this->assertTextContains('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); } else { - $this->assertStringNotContainsString('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextNotContains('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); // This actually can still be in there because the admin has permission to invite users - //$this->assertStringNotContainsString('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); - $this->assertStringNotContainsString('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + //$this->assertTextNotContains('invite_self', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); + $this->assertTextNotContains('part of this meeting planner', implode(' ', $crawler->filter('form')->each(function($node, $i){ return $node->html();}))); } } else { - $this->assertStringNotContainsString('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); - $this->assertStringNotContainsString('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); - $this->assertStringNotContainsString('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); - $this->assertStringNotContainsString('invite_self', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); - $this->assertStringNotContainsString('part of this meeting planner', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); + $this->assertTextNotContains('Meeting planner', implode(' ', $crawler->filter('h2')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextNotContains('Weekly reset', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextNotContains('Participate', implode(' ', $crawler->filter('h3')->each(function($node, $i){ return $node->text(); }))); + $this->assertTextNotContains('invite_self', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); + $this->assertTextNotContains('part of this meeting planner', implode(' ', $crawler->filter('input')->each(function($node, $i){ return $node->html();}))); } } From feb3b4897afedd6eb5d0123f36c3d3d3262aee0a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 14:08:04 +0000 Subject: [PATCH 4/5] CI: phpBB 3.2 runs on PHP 5.6-7.2, tests without setUp(): void phpBB 3.2.x does not support PHP 7.3+, and a ': void' return type breaks PHP < 7.1. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_014TpJhHt7ke8q3BnSZ8wGZf --- .github/workflows/tests-3.2.yml | 3 ++- .github/workflows/tests.yml | 1 - tests/cron/main_test.php | 13 +++---------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/workflows/tests-3.2.yml b/.github/workflows/tests-3.2.yml index 05b1c68..08b6319 100644 --- a/.github/workflows/tests-3.2.yml +++ b/.github/workflows/tests-3.2.yml @@ -14,7 +14,8 @@ jobs: strategy: fail-fast: false matrix: - php: ['5.6', '7.1', '7.3'] + # phpBB 3.2.x selbst unterstützt PHP 7.3 und neuer nicht (Notices im Core) + php: ['5.6', '7.1', '7.2'] steps: - name: Checkout phpBB diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 641d346..683c2ac 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -4,7 +4,6 @@ on: push: branches: - master - - 'claude/**' pull_request: jobs: diff --git a/tests/cron/main_test.php b/tests/cron/main_test.php index 7e3341d..52b14bb 100644 --- a/tests/cron/main_test.php +++ b/tests/cron/main_test.php @@ -21,16 +21,6 @@ public function getDataSet() return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/hookup_entries.xml'); } - protected function setUp() : void - { - parent::setUp(); - - //$this->db = $this->new_dbal(); - - $this->cache = $this->getMockBuilder('\phpbb\cache\service')->disableOriginalConstructor()->getMock(); - $this->log = $this->getMockBuilder('\phpbb\log\log')->disableOriginalConstructor()->getMock(); - } - public function runProvider() { $now = time(); @@ -140,6 +130,9 @@ private function get_task($last_run = 0) $db = $this->new_dbal(); $this->db = $db; + $this->cache = $this->getMockBuilder('\phpbb\cache\service')->disableOriginalConstructor()->getMock(); + $this->log = $this->getMockBuilder('\phpbb\log\log')->disableOriginalConstructor()->getMock(); + $this->config = new \phpbb\config\config(array( 'hookup_weekly_reset_last_gc' => $last_run, 'hookup_weekly_reset_gc' => 86400, From cb965c728c7756aa6dbcd4118c0ebd9088fdd84e Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 14:16:15 +0000 Subject: [PATCH 5/5] Fix saving hookup dates on MSSQL (explicit value for identity column) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_014TpJhHt7ke8q3BnSZ8wGZf --- functions/hookup.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/functions/hookup.php b/functions/hookup.php index 404ca5a..53779d9 100644 --- a/functions/hookup.php +++ b/functions/hookup.php @@ -471,7 +471,18 @@ public function submit($reload_data = true, $return_changes = false, $force_run } $date['topic_id'] = $topic_id; $sql = 'INSERT INTO ' . $this->hookup_dates_table . ' ' . $db->sql_build_array('INSERT', $date); + + // MSSQL only accepts explicit values for the identity column date_id when told so + $identity_insert = isset($date['date_id']) && strpos($db->get_sql_layer(), 'mssql') === 0; + if ($identity_insert) + { + $db->sql_query('SET IDENTITY_INSERT ' . $this->hookup_dates_table . ' ON'); + } $db->sql_query($sql); + if ($identity_insert) + { + $db->sql_query('SET IDENTITY_INSERT ' . $this->hookup_dates_table . ' OFF'); + } } //Update the entries for availability: