Compare commits

...

4 Commits

Author SHA1 Message Date
Clemens Schwaighofer
5be34453ce Fix in Smarty Template class and PAGE WIDTH set 2022-11-10 10:26:59 +09:00
Clemens Schwaighofer
7773b78e17 Fix in CoreLib Bytes for null to trim 2022-11-09 18:11:14 +09:00
Clemens Schwaighofer
2a3798c8c2 Create mo file update, basic edit css/javascript updates 2022-10-25 16:48:34 +09:00
Clemens Schwaighofer
bc8303fe5f Composer update 2022-10-25 16:48:12 +09:00
115 changed files with 734 additions and 320 deletions

View File

@@ -7,9 +7,9 @@ base_folder="${BASE_FOLDER}../../www/";
# locale gettext po to mo translator master
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
file=$(basename $file .po);
echo "Translate language ${file}";
locale=$(echo "${file}" | cut -d "-" -f 1);
domain=$(echo "${file}" | cut -d "-" -f 2);
echo "- Translate language file '${file}' for locale '${locale}' and domain '${domain}':";
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
fi;

View File

@@ -26,22 +26,22 @@ CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
RETURNS TRIGGER AS
$$
BEGIN
-- if new is not null/empty
-- and old one is null or old one different new one
-- set NOW()
-- if new one is NULL
-- set NULL
IF
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
THEN
NEW.login_user_id_set_date = NOW();
NEW.login_user_id_last_revalidate = NOW();
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
NEW.login_user_id_set_date = NULL;
NEW.login_user_id_last_revalidate = NULL;
END IF;
RETURN NEW;
-- if new is not null/empty
-- and old one is null or old one different new one
-- set NOW()
-- if new one is NULL
-- set NULL
IF
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
THEN
NEW.login_user_id_set_date = NOW();
NEW.login_user_id_last_revalidate = NOW();
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
NEW.login_user_id_set_date = NULL;
NEW.login_user_id_last_revalidate = NULL;
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

60
www/composer.lock generated
View File

@@ -623,16 +623,16 @@
},
{
"name": "phpunit/phpunit",
"version": "9.5.24",
"version": "9.5.25",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5"
"reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"shasum": ""
},
"require": {
@@ -654,14 +654,14 @@
"phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5",
"sebastian/comparator": "^4.0.8",
"sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3",
"sebastian/exporter": "^4.0.5",
"sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^3.1",
"sebastian/type": "^3.2",
"sebastian/version": "^3.0.2"
},
"suggest": {
@@ -705,7 +705,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.24"
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25"
},
"funding": [
{
@@ -715,9 +715,13 @@
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
"type": "tidelift"
}
],
"time": "2022-08-30T07:42:16+00:00"
"time": "2022-09-25T03:44:45+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -888,16 +892,16 @@
},
{
"name": "sebastian/comparator",
"version": "4.0.6",
"version": "4.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382"
"reference": "fa0f136dd2334583309d32b62544682ee972b51a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
"reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": ""
},
"require": {
@@ -950,7 +954,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
},
"funding": [
{
@@ -958,7 +962,7 @@
"type": "github"
}
],
"time": "2020-10-26T15:49:45+00:00"
"time": "2022-09-14T12:41:17+00:00"
},
{
"name": "sebastian/complexity",
@@ -1148,16 +1152,16 @@
},
{
"name": "sebastian/exporter",
"version": "4.0.4",
"version": "4.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"shasum": ""
},
"require": {
@@ -1213,7 +1217,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
},
"funding": [
{
@@ -1221,7 +1225,7 @@
"type": "github"
}
],
"time": "2021-11-11T14:18:36+00:00"
"time": "2022-09-14T06:03:37+00:00"
},
{
"name": "sebastian/global-state",
@@ -1576,16 +1580,16 @@
},
{
"name": "sebastian/type",
"version": "3.1.0",
"version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
"reference": "fb44e1cc6e557418387ad815780360057e40753e"
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb44e1cc6e557418387ad815780360057e40753e",
"reference": "fb44e1cc6e557418387ad815780360057e40753e",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"shasum": ""
},
"require": {
@@ -1597,7 +1601,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
"dev-master": "3.2-dev"
}
},
"autoload": {
@@ -1620,7 +1624,7 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/3.1.0"
"source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
},
"funding": [
{
@@ -1628,7 +1632,7 @@
"type": "github"
}
],
"time": "2022-08-29T06:55:37+00:00"
"time": "2022-09-12T14:47:03+00:00"
},
{
"name": "sebastian/version",

View File

@@ -249,7 +249,7 @@ if ($is_secure) {
define('HOST_PROTOCOL', 'http://');
}
// define the db config set name, the db config and the db schema
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host'] ?? '');
define('DB_CONFIG', $DB_CONFIG[DB_CONFIG_NAME] ?? []);
// because we can't change constant, but we want to for db debug flag
$GLOBALS['DB_CONFIG_SET'] = DB_CONFIG;
@@ -268,9 +268,9 @@ define('SITE_ENCODING', $SITE_CONFIG[HOST_NAME]['site_encoding'] ?? DEFAULT_ENCO
define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled'] ?? false);
define('AUTH', $SITE_CONFIG[HOST_NAME]['auth'] ?? false);
// paths
// define('CSV_PATH', $PATHS[TARGET]['csv_path']);
// define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
// define('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
// define('CSV_PATH', $PATHS[TARGET]['csv_path'] ?? '');
// define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin'] ?? '');
// define('REDIRECT_URL', $PATHS[TARGET]['redirect_url'] ?? '');
// show all errors if debug_all & show_error_handling are enabled
define('SHOW_ALL_ERRORS', true);

View File

@@ -159,9 +159,9 @@ input[type="text"]:focus, textarea:focus, select:focus {
text-align: center;
}
.warning {
border: 1px solid #df7700;
color: #d57200;
.warning, .warn {
border: 1px solid #ffa947;
color: #ffa947;
margin: 5px;
padding: 2px;
text-align: center;
@@ -181,8 +181,8 @@ input[type="text"]:focus, textarea:focus, select:focus {
margin-top: 1px;
}
.div_warning {
border: 1px solid #df7700;
.div_warning, .div_warn {
border: 1px solid #ffa947;
}
/* borders */

View File

@@ -974,7 +974,7 @@ function phfo(tree)
if (tree.id) {
line += ' id="' + tree.id + '"';
// if anything input (input, textarea, select then add name too)
if (['input', 'textarea', 'select'].includes(tree.tag)) {
if (['input', 'textarea', 'select', 'button'].includes(tree.tag)) {
line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
}
}

View File

@@ -134,7 +134,7 @@ class Byte
// remove all non valid characters from the number
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
// final clean up and convert to float
$number = (float)trim($number);
$number = (float)trim((string)$number);
// convert any mb/gb/etc to single m/b
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[3]);
if ($unit) {

View File

@@ -465,7 +465,7 @@ class SmartyExtend extends \Smarty
$this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
// the page name
$this->DATA['page_name'] = $this->page_name;
$this->DATA['table_width'] = empty($this->PAGE_WIDTH) ?: PAGE_WIDTH;
$this->DATA['table_width'] = !empty($this->PAGE_WIDTH) ?: PAGE_WIDTH;
$this->DATA['form_name'] = $this->DATA['FORM_NAME'];
// for tinymce special
$this->DATA['TINYMCE_LANG'] = $this->lang_short;

View File

@@ -367,6 +367,7 @@ return array(
'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php',
'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php',
'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php',
'PHPUnit\\Util\\Cloner' => $vendorDir . '/phpunit/phpunit/src/Util/Cloner.php',
'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php',
'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php',
'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php',
@@ -668,6 +669,7 @@ return array(
'SebastianBergmann\\Type\\NeverType' => $vendorDir . '/sebastian/type/src/type/NeverType.php',
'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/type/NullType.php',
'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/type/ObjectType.php',
'SebastianBergmann\\Type\\Parameter' => $vendorDir . '/sebastian/type/src/Parameter.php',
'SebastianBergmann\\Type\\ReflectionMapper' => $vendorDir . '/sebastian/type/src/ReflectionMapper.php',
'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php',
'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/type/SimpleType.php',

View File

@@ -400,6 +400,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php',
'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php',
'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php',
'PHPUnit\\Util\\Cloner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Cloner.php',
'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php',
'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php',
'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php',
@@ -701,6 +702,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
'SebastianBergmann\\Type\\NeverType' => __DIR__ . '/..' . '/sebastian/type/src/type/NeverType.php',
'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/type/NullType.php',
'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/ObjectType.php',
'SebastianBergmann\\Type\\Parameter' => __DIR__ . '/..' . '/sebastian/type/src/Parameter.php',
'SebastianBergmann\\Type\\ReflectionMapper' => __DIR__ . '/..' . '/sebastian/type/src/ReflectionMapper.php',
'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php',
'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/type/SimpleType.php',

View File

@@ -646,17 +646,17 @@
},
{
"name": "phpunit/phpunit",
"version": "9.5.24",
"version_normalized": "9.5.24.0",
"version": "9.5.25",
"version_normalized": "9.5.25.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5"
"reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"shasum": ""
},
"require": {
@@ -678,21 +678,21 @@
"phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5",
"sebastian/comparator": "^4.0.8",
"sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3",
"sebastian/exporter": "^4.0.5",
"sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^3.1",
"sebastian/type": "^3.2",
"sebastian/version": "^3.0.2"
},
"suggest": {
"ext-soap": "*",
"ext-xdebug": "*"
},
"time": "2022-08-30T07:42:16+00:00",
"time": "2022-09-25T03:44:45+00:00",
"bin": [
"phpunit"
],
@@ -731,7 +731,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.24"
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25"
},
"funding": [
{
@@ -741,6 +741,10 @@
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
"type": "tidelift"
}
],
"install-path": "../phpunit/phpunit"
@@ -923,17 +927,17 @@
},
{
"name": "sebastian/comparator",
"version": "4.0.6",
"version_normalized": "4.0.6.0",
"version": "4.0.8",
"version_normalized": "4.0.8.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382"
"reference": "fa0f136dd2334583309d32b62544682ee972b51a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
"reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": ""
},
"require": {
@@ -944,7 +948,7 @@
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"time": "2020-10-26T15:49:45+00:00",
"time": "2022-09-14T12:41:17+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -988,7 +992,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
},
"funding": [
{
@@ -1195,17 +1199,17 @@
},
{
"name": "sebastian/exporter",
"version": "4.0.4",
"version_normalized": "4.0.4.0",
"version": "4.0.5",
"version_normalized": "4.0.5.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"shasum": ""
},
"require": {
@@ -1216,7 +1220,7 @@
"ext-mbstring": "*",
"phpunit/phpunit": "^9.3"
},
"time": "2021-11-11T14:18:36+00:00",
"time": "2022-09-14T06:03:37+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -1263,7 +1267,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
},
"funding": [
{
@@ -1644,17 +1648,17 @@
},
{
"name": "sebastian/type",
"version": "3.1.0",
"version_normalized": "3.1.0.0",
"version": "3.2.0",
"version_normalized": "3.2.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
"reference": "fb44e1cc6e557418387ad815780360057e40753e"
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb44e1cc6e557418387ad815780360057e40753e",
"reference": "fb44e1cc6e557418387ad815780360057e40753e",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"shasum": ""
},
"require": {
@@ -1663,11 +1667,11 @@
"require-dev": {
"phpunit/phpunit": "^9.5"
},
"time": "2022-08-29T06:55:37+00:00",
"time": "2022-09-12T14:47:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
"dev-master": "3.2-dev"
}
},
"installation-source": "dist",
@@ -1691,7 +1695,7 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/3.1.0"
"source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
},
"funding": [
{

View File

@@ -110,12 +110,12 @@
'dev_requirement' => true,
),
'phpunit/phpunit' => array(
'pretty_version' => '9.5.24',
'version' => '9.5.24.0',
'pretty_version' => '9.5.25',
'version' => '9.5.25.0',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/phpunit',
'aliases' => array(),
'reference' => 'd0aa6097bef9fd42458a9b3c49da32c6ce6129c5',
'reference' => '3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d',
'dev_requirement' => true,
),
'sebastian/cli-parser' => array(
@@ -146,12 +146,12 @@
'dev_requirement' => true,
),
'sebastian/comparator' => array(
'pretty_version' => '4.0.6',
'version' => '4.0.6.0',
'pretty_version' => '4.0.8',
'version' => '4.0.8.0',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/comparator',
'aliases' => array(),
'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
'reference' => 'fa0f136dd2334583309d32b62544682ee972b51a',
'dev_requirement' => true,
),
'sebastian/complexity' => array(
@@ -182,12 +182,12 @@
'dev_requirement' => true,
),
'sebastian/exporter' => array(
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'pretty_version' => '4.0.5',
'version' => '4.0.5.0',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/exporter',
'aliases' => array(),
'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
'reference' => 'ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d',
'dev_requirement' => true,
),
'sebastian/global-state' => array(
@@ -245,12 +245,12 @@
'dev_requirement' => true,
),
'sebastian/type' => array(
'pretty_version' => '3.1.0',
'version' => '3.1.0.0',
'pretty_version' => '3.2.0',
'version' => '3.2.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/type',
'aliases' => array(),
'reference' => 'fb44e1cc6e557418387ad815780360057e40753e',
'reference' => 'fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e',
'dev_requirement' => true,
),
'sebastian/version' => array(

View File

@@ -2,11 +2,16 @@
All notable changes of the PHPUnit 8.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
## [8.5.30] - 2022-MM-DD
## [8.5.30] - 2022-09-25
### Changed
* The configuration generator now asks for a cache directory
### Fixed
* [#4913](https://github.com/sebastianbergmann/phpunit/issues/4913): Failed `assert()` should show a backtrace
* [#4966](https://github.com/sebastianbergmann/phpunit/issues/4966): `TestCase::assertSame()` (and related exact comparisons) must compare `float` exactly
## [8.5.29] - 2022-08-22
@@ -245,7 +250,7 @@ All notable changes of the PHPUnit 8.5 release series are documented in this fil
* [#3967](https://github.com/sebastianbergmann/phpunit/issues/3967): Cannot double interface that extends interface that extends `\Throwable`
* [#3968](https://github.com/sebastianbergmann/phpunit/pull/3968): Test class run in a separate PHP process are passing when `exit` called inside
[8.5.30]: https://github.com/sebastianbergmann/phpunit/compare/8.5.29...8.5
[8.5.30]: https://github.com/sebastianbergmann/phpunit/compare/8.5.29...8.5.30
[8.5.29]: https://github.com/sebastianbergmann/phpunit/compare/8.5.28...8.5.29
[8.5.28]: https://github.com/sebastianbergmann/phpunit/compare/8.5.27...8.5.28
[8.5.27]: https://github.com/sebastianbergmann/phpunit/compare/8.5.26...8.5.27

View File

@@ -2,6 +2,16 @@
All notable changes of the PHPUnit 9.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
## [9.5.25] - 2022-09-25
### Added
* [#5042](https://github.com/sebastianbergmann/phpunit/issues/5042): Support Disjunctive Normal Form types
### Fixed
* [#4966](https://github.com/sebastianbergmann/phpunit/issues/4966): `TestCase::assertSame()` (and related exact comparisons) must compare `float` exactly
## [9.5.24] - 2022-08-30
### Added
@@ -190,6 +200,7 @@ All notable changes of the PHPUnit 9.5 release series are documented in this fil
* [#4535](https://github.com/sebastianbergmann/phpunit/issues/4535): `getMockFromWsdl()` does not handle methods that do not have parameters correctly
[9.5.25]: https://github.com/sebastianbergmann/phpunit/compare/9.5.24...9.5.25
[9.5.24]: https://github.com/sebastianbergmann/phpunit/compare/9.5.23...9.5.24
[9.5.23]: https://github.com/sebastianbergmann/phpunit/compare/9.5.22...9.5.23
[9.5.22]: https://github.com/sebastianbergmann/phpunit/compare/9.5.21...9.5.22

View File

@@ -1,33 +1,29 @@
PHPUnit
BSD 3-Clause License
Copyright (c) 2001-2022, Sebastian Bergmann <sebastian@phpunit.de>.
Copyright (c) 2001-2022, Sebastian Bergmann
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Sebastian Bergmann nor the names of his
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

11
www/vendor/phpunit/phpunit/SECURITY.md vendored Normal file
View File

@@ -0,0 +1,11 @@
# Security Policy
PHPUnit is a framework for writing as well as a commandline tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver.
**If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.**
Please note that if you upload PHPUnit to a webserver "bad things" may happen. [You have been warned.](https://thephp.cc/articles/phpunit-a-security-risk)
## Security Contact Information
After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`.

View File

@@ -39,14 +39,14 @@
"phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5",
"sebastian/comparator": "^4.0.8",
"sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3",
"sebastian/exporter": "^4.0.5",
"sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^3.1",
"sebastian/type": "^3.2",
"sebastian/version": "^3.0.2"
},
"config": {

View File

@@ -1321,7 +1321,9 @@ abstract class Assert
* @throws ExpectationFailedException
*
* @psalm-template ExpectedType
*
* @psalm-param ExpectedType $expected
*
* @psalm-assert =ExpectedType $actual
*/
public static function assertSame($expected, $actual, string $message = ''): void
@@ -1364,7 +1366,9 @@ abstract class Assert
* @throws ExpectationFailedException
*
* @psalm-template ExpectedType of object
*
* @psalm-param class-string<ExpectedType> $expected
*
* @psalm-assert =ExpectedType $actual
*/
public static function assertInstanceOf(string $expected, $actual, string $message = ''): void
@@ -1388,7 +1392,9 @@ abstract class Assert
* @throws ExpectationFailedException
*
* @psalm-template ExpectedType of object
*
* @psalm-param class-string<ExpectedType> $expected
*
* @psalm-assert !ExpectedType $actual
*/
public static function assertNotInstanceOf(string $expected, $actual, string $message = ''): void

View File

@@ -10,6 +10,7 @@
namespace PHPUnit\Framework;
use function func_get_args;
use function function_exists;
use ArrayAccess;
use Countable;
use DOMDocument;
@@ -1453,7 +1454,9 @@ if (!function_exists('PHPUnit\Framework\assertSame')) {
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
*
* @psalm-template ExpectedType
*
* @psalm-param ExpectedType $expected
*
* @psalm-assert =ExpectedType $actual
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
@@ -1494,7 +1497,9 @@ if (!function_exists('PHPUnit\Framework\assertInstanceOf')) {
* @throws Exception
*
* @psalm-template ExpectedType of object
*
* @psalm-param class-string<ExpectedType> $expected
*
* @psalm-assert =ExpectedType $actual
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
@@ -1516,7 +1521,9 @@ if (!function_exists('PHPUnit\Framework\assertNotInstanceOf')) {
* @throws Exception
*
* @psalm-template ExpectedType of object
*
* @psalm-param class-string<ExpectedType> $expected
*
* @psalm-assert !ExpectedType $actual
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit

View File

@@ -82,6 +82,7 @@ abstract class Constraint implements Countable, SelfDescribing
* This method can be overridden to implement the evaluation algorithm.
*
* @param mixed $other value or object to evaluate
*
* @codeCoverageIgnore
*/
protected function matches($other): bool

View File

@@ -9,13 +9,8 @@
*/
namespace PHPUnit\Framework\Constraint;
use const PHP_FLOAT_EPSILON;
use function abs;
use function get_class;
use function is_array;
use function is_float;
use function is_infinite;
use function is_nan;
use function is_object;
use function is_string;
use function sprintf;
@@ -52,13 +47,7 @@ final class IsIdentical extends Constraint
*/
public function evaluate($other, string $description = '', bool $returnResult = false): ?bool
{
if (is_float($this->value) && is_float($other) &&
!is_infinite($this->value) && !is_infinite($other) &&
!is_nan($this->value) && !is_nan($other)) {
$success = abs($this->value - $other) < PHP_FLOAT_EPSILON;
} else {
$success = $this->value === $other;
}
$success = $this->value === $other;
if ($returnResult) {
return $success;

View File

@@ -9,6 +9,9 @@
*/
namespace PHPUnit\Framework\MockObject;
use function array_diff_assoc;
use function array_unique;
use function implode;
use function sprintf;
/**

View File

@@ -9,6 +9,9 @@
*/
namespace PHPUnit\Framework\MockObject;
use function get_class;
use function gettype;
use function is_object;
use function sprintf;
/**

View File

@@ -9,6 +9,8 @@
*/
namespace PHPUnit\Framework\MockObject;
use function sprintf;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*/

View File

@@ -291,7 +291,9 @@ EOT;
* Concrete methods to mock can be specified with the $mockedMethods parameter.
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*
* @throws \PHPUnit\Framework\InvalidArgumentException

View File

@@ -13,6 +13,8 @@ use function array_map;
use function explode;
use function get_class;
use function implode;
use function in_array;
use function interface_exists;
use function is_object;
use function sprintf;
use function strpos;
@@ -20,7 +22,7 @@ use function strtolower;
use function substr;
use Doctrine\Instantiator\Instantiator;
use PHPUnit\Framework\SelfDescribing;
use PHPUnit\Util\Type;
use PHPUnit\Util\Cloner;
use SebastianBergmann\Exporter\Exporter;
use stdClass;
use Throwable;
@@ -90,7 +92,7 @@ final class Invocation implements SelfDescribing
foreach ($this->parameters as $key => $value) {
if (is_object($value)) {
$this->parameters[$key] = $this->cloneObject($value);
$this->parameters[$key] = Cloner::clone($value);
}
}
}
@@ -121,12 +123,17 @@ final class Invocation implements SelfDescribing
return null;
}
$intersection = false;
$union = false;
$intersection = false;
$union = false;
$unionContainsIntersections = false;
if (strpos($this->returnType, '|') !== false) {
$types = explode('|', $this->returnType);
$union = true;
if (strpos($this->returnType, '(') !== false) {
$unionContainsIntersections = true;
}
} elseif (strpos($this->returnType, '&') !== false) {
$types = explode('&', $this->returnType);
$intersection = true;
@@ -136,7 +143,7 @@ final class Invocation implements SelfDescribing
$types = array_map('strtolower', $types);
if (!$intersection) {
if (!$intersection && !$unionContainsIntersections) {
if (in_array('', $types, true) ||
in_array('null', $types, true) ||
in_array('mixed', $types, true) ||
@@ -220,38 +227,28 @@ final class Invocation implements SelfDescribing
}
}
if ($intersection && $this->onlyInterfaces($types)) {
try {
return (new Generator)->getMockForInterfaces($types);
} catch (Throwable $t) {
throw new RuntimeException(
sprintf(
'Return value for %s::%s() cannot be generated: %s',
$this->className,
$this->methodName,
$t->getMessage(),
),
(int) $t->getCode(),
);
}
}
$reason = '';
if ($union) {
$reason = ' because the declared return type is a union';
} elseif ($intersection) {
$reason = ' because the declared return type is an intersection';
$onlyInterfaces = true;
foreach ($types as $type) {
if (!interface_exists($type)) {
$onlyInterfaces = false;
break;
}
}
if ($onlyInterfaces) {
try {
return (new Generator)->getMockForInterfaces($types);
} catch (Throwable $t) {
throw new RuntimeException(
sprintf(
'Return value for %s::%s() cannot be generated: %s',
$this->className,
$this->methodName,
$t->getMessage(),
),
(int) $t->getCode(),
);
}
}
}
throw new RuntimeException(
@@ -288,12 +285,17 @@ final class Invocation implements SelfDescribing
return $this->object;
}
private function cloneObject(object $original): object
/**
* @psalm-param non-empty-list<string> $types
*/
private function onlyInterfaces(array $types): bool
{
if (Type::isCloneable($original)) {
return clone $original;
foreach ($types as $type) {
if (!interface_exists($type)) {
return false;
}
}
return $original;
return true;
}
}

View File

@@ -23,11 +23,8 @@ use function substr;
use function substr_count;
use function trim;
use function var_export;
use ReflectionIntersectionType;
use ReflectionMethod;
use ReflectionNamedType;
use ReflectionParameter;
use ReflectionUnionType;
use SebastianBergmann\Template\Exception as TemplateException;
use SebastianBergmann\Template\Template;
use SebastianBergmann\Type\ReflectionMapper;
@@ -274,6 +271,7 @@ final class MockMethod
private static function getMethodParametersForDeclaration(ReflectionMethod $method): string
{
$parameters = [];
$types = (new ReflectionMapper)->fromParameterTypes($method);
foreach ($method->getParameters() as $i => $parameter) {
$name = '$' . $parameter->getName();
@@ -285,19 +283,16 @@ final class MockMethod
$name = '$arg' . $i;
}
$nullable = '';
$default = '';
$reference = '';
$typeDeclaration = '';
$type = null;
$typeName = null;
if ($parameter->hasType()) {
$type = $parameter->getType();
if (!$types[$i]->type()->isUnknown()) {
$typeDeclaration = $types[$i]->type()->asString() . ' ';
}
if ($type instanceof ReflectionNamedType) {
$typeName = $type->getName();
}
if ($parameter->isPassedByReference()) {
$reference = '&';
}
if ($parameter->isVariadic()) {
@@ -308,34 +303,7 @@ final class MockMethod
$default = ' = null';
}
if ($type !== null) {
if ($typeName !== 'mixed' &&
$typeName !== 'null' &&
!$type instanceof ReflectionIntersectionType &&
!$type instanceof ReflectionUnionType &&
$parameter->allowsNull()) {
$nullable = '?';
}
if ($typeName === 'self') {
$typeDeclaration = $method->getDeclaringClass()->getName() . ' ';
} elseif ($typeName !== null) {
$typeDeclaration = $typeName . ' ';
} elseif ($type instanceof ReflectionUnionType) {
$typeDeclaration = self::unionTypeAsString(
$type,
$method->getDeclaringClass()->getName()
);
} elseif ($type instanceof ReflectionIntersectionType) {
$typeDeclaration = self::intersectionTypeAsString($type);
}
}
if ($parameter->isPassedByReference()) {
$reference = '&';
}
$parameters[] = $nullable . $typeDeclaration . $reference . $name . $default;
$parameters[] = $typeDeclaration . $reference . $name . $default;
}
return implode(', ', $parameters);
@@ -409,30 +377,4 @@ final class MockMethod
}
// @codeCoverageIgnoreEnd
}
private static function unionTypeAsString(ReflectionUnionType $union, string $self): string
{
$types = [];
foreach ($union->getTypes() as $type) {
if ((string) $type === 'self') {
$types[] = $self;
} else {
$types[] = $type;
}
}
return implode('|', $types) . ' ';
}
private static function intersectionTypeAsString(ReflectionIntersectionType $intersection): string
{
$types = [];
foreach ($intersection->getTypes() as $type) {
$types[] = $type;
}
return implode('&', $types) . ' ';
}
}

View File

@@ -17,6 +17,7 @@ use PHPUnit\Framework\MockObject\Invocation as BaseInvocation;
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/4297
*
* @codeCoverageIgnore
*/
final class InvokedAtIndex extends InvocationOrder

View File

@@ -91,11 +91,11 @@ use PHPUnit\Framework\MockObject\Stub\ReturnStub;
use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub;
use PHPUnit\Runner\BaseTestRunner;
use PHPUnit\Runner\PhptTestCase;
use PHPUnit\Util\Cloner;
use PHPUnit\Util\Exception as UtilException;
use PHPUnit\Util\GlobalState;
use PHPUnit\Util\PHP\AbstractPhpProcess;
use PHPUnit\Util\Test as TestUtil;
use PHPUnit\Util\Type;
use Prophecy\Exception\Prediction\PredictionException;
use Prophecy\Prophecy\MethodProphecy;
use Prophecy\Prophecy\ObjectProphecy;
@@ -417,6 +417,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* at the given index.
*
* @deprecated https://github.com/sebastianbergmann/phpunit/issues/4297
*
* @codeCoverageIgnore
*/
public static function at(int $index): InvokedAtIndexMatcher
@@ -912,7 +913,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* Returns a builder object to create mock objects using a fluent interface.
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $className
*
* @psalm-return MockBuilder<RealInstanceType>
*/
public function getMockBuilder(string $className): MockBuilder
@@ -1699,7 +1702,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* Makes configurable stub for the specified class.
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return Stub&RealInstanceType
*/
protected function createStub(string $originalClassName): Stub
@@ -1711,7 +1716,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* Returns a mock object for the specified class.
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*/
protected function createMock(string $originalClassName): MockObject
@@ -1723,7 +1730,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* Returns a configured mock object for the specified class.
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*/
protected function createConfiguredMock(string $originalClassName, array $configuration): MockObject
@@ -1743,7 +1752,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* @param string[] $methods
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*/
protected function createPartialMock(string $originalClassName, array $methods): MockObject
@@ -1791,7 +1802,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* Returns a test proxy for the specified class.
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*/
protected function createTestProxy(string $originalClassName, array $constructorArguments = []): MockObject
@@ -1808,7 +1821,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* @param null|array $methods $methods
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType>|string $originalClassName
*
* @psalm-return class-string<MockObject&RealInstanceType>
*/
protected function getMockClass(string $originalClassName, $methods = [], array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = false, bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = false): string
@@ -1835,7 +1850,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* To mock concrete methods, use the 7th parameter ($mockedMethods).
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*/
protected function getMockForAbstractClass(string $originalClassName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = [], bool $cloneArguments = false): MockObject
@@ -1862,7 +1879,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
* Returns a mock object based on the given WSDL file.
*
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType>|string $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*/
protected function getMockFromWsdl(string $wsdlFile, string $originalClassName = '', string $mockClassName = '', array $methods = [], bool $callOriginalConstructor = true, array $options = []): MockObject
@@ -2434,9 +2453,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
} else {
foreach ($testArguments as $testArgument) {
if ($testArgument instanceof MockObject) {
if (Type::isCloneable($testArgument)) {
$testArgument = clone $testArgument;
}
$testArgument = Cloner::clone($testArgument);
$this->registerMockObject($testArgument);
} elseif (is_array($testArgument) && !in_array($testArgument, $visited, true)) {
@@ -2569,7 +2586,9 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T
/**
* @psalm-template RealInstanceType of object
*
* @psalm-param class-string<RealInstanceType> $originalClassName
*
* @psalm-return MockObject&RealInstanceType
*/
private function createMockObject(string $originalClassName): MockObject

View File

@@ -13,6 +13,7 @@ use Throwable;
/**
* @deprecated The `TestListener` interface is deprecated
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
*/
trait TestListenerDefaultImplementation

View File

@@ -10,7 +10,9 @@
namespace PHPUnit\Framework;
use const PHP_EOL;
use function class_exists;
use function count;
use function extension_loaded;
use function function_exists;
use function get_class;
use function sprintf;

View File

@@ -13,6 +13,7 @@ use const PHP_EOL;
use function array_keys;
use function array_map;
use function array_merge;
use function array_slice;
use function array_unique;
use function basename;
use function call_user_func;

View File

@@ -21,6 +21,7 @@ use function is_dir;
use function is_file;
use function json_decode;
use function json_encode;
use function sprintf;
use PHPUnit\Util\Filesystem;
/**

View File

@@ -100,6 +100,7 @@ final class ExtensionHandler
if ($extensionConfiguration->hasSourceFile()) {
/**
* @noinspection PhpIncludeInspection
*
* @psalm-suppress UnresolvableInclude
*/
require_once $extensionConfiguration->sourceFile();

View File

@@ -9,6 +9,7 @@
*/
namespace PHPUnit\Runner\Extension;
use function is_file;
use PharIo\Manifest\ApplicationName;
use PharIo\Manifest\Exception as ManifestException;
use PharIo\Manifest\ManifestLoader;
@@ -60,6 +61,7 @@ final class PharLoader
/**
* @noinspection PhpIncludeInspection
*
* @psalm-suppress UnresolvableInclude
*/
require $file;

View File

@@ -41,7 +41,7 @@ final class Version
}
if (self::$version === '') {
self::$version = (new VersionId('9.5.24', dirname(__DIR__, 2)))->getVersion();
self::$version = (new VersionId('9.5.25', dirname(__DIR__, 2)))->getVersion();
}
return self::$version;

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\Extension;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Configuration

View File

@@ -24,6 +24,7 @@ use function get_class;
use function getcwd;
use function ini_get;
use function ini_set;
use function is_array;
use function is_callable;
use function is_dir;
use function is_file;
@@ -437,6 +438,7 @@ class Command
if ($loaderFile) {
/**
* @noinspection PhpIncludeInspection
*
* @psalm-suppress UnresolvableInclude
*/
require $loaderFile;
@@ -498,6 +500,7 @@ class Command
if ($printerFile) {
/**
* @noinspection PhpIncludeInspection
*
* @psalm-suppress UnresolvableInclude
*/
require $printerFile;

View File

@@ -24,6 +24,7 @@ use PHPUnit\TextUI\XmlConfiguration\FileCollection;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class CodeCoverage

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Filter;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Directory

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class DirectoryCollection implements Countable, IteratorAggregate

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Clover

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Cobertura

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Crap4j

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\Directory;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Html

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Php

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Text

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\Directory;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Xml

View File

@@ -15,6 +15,7 @@ use PHPUnit\Util\Xml\ValidationResult;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Configuration

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Directory

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class DirectoryCollection implements Countable, IteratorAggregate

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class File

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class FileCollection implements Countable, IteratorAggregate

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Group

View File

@@ -13,6 +13,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class GroupCollection implements IteratorAggregate

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Groups

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Junit

View File

@@ -16,6 +16,7 @@ use PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Xml as TestDoxXml;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Logging

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class TeamCity

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Html

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Text

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Xml

View File

@@ -13,6 +13,7 @@ use PHPUnit\TextUI\XmlConfiguration\File;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Text

View File

@@ -9,6 +9,8 @@
*/
namespace PHPUnit\TextUI\XmlConfiguration;
use function assert;
use function in_array;
use DOMDocument;
use DOMElement;
use PHPUnit\Util\Xml\SnapshotNodeList;

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Constant

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class ConstantCollection implements Countable, IteratorAggregate

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class IniSetting

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class IniSettingCollection implements Countable, IteratorAggregate

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Php

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Variable

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class VariableCollection implements Countable, IteratorAggregate

View File

@@ -11,12 +11,14 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class Extension
{
/**
* @var string
*
* @psalm-var class-string
*/
private $className;

View File

@@ -13,6 +13,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class ExtensionCollection implements IteratorAggregate

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class PHPUnit

View File

@@ -13,6 +13,7 @@ use PHPUnit\Util\VersionComparisonOperator;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class TestDirectory

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class TestDirectoryCollection implements Countable, IteratorAggregate

View File

@@ -13,6 +13,7 @@ use PHPUnit\Util\VersionComparisonOperator;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class TestFile

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class TestFileCollection implements Countable, IteratorAggregate

View File

@@ -11,6 +11,7 @@ namespace PHPUnit\TextUI\XmlConfiguration;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class TestSuite

View File

@@ -15,6 +15,7 @@ use IteratorAggregate;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class TestSuiteCollection implements Countable, IteratorAggregate

View File

@@ -43,6 +43,7 @@ final class Registry
/**
* @throws Exception
*
* @psalm-param class-string $class
*/
public function forClassName(string $class): DocBlock
@@ -68,6 +69,7 @@ final class Registry
/**
* @throws Exception
*
* @psalm-param class-string $classInHierarchy
*/
public function forMethod(string $classInHierarchy, string $method): DocBlock

View File

@@ -0,0 +1,34 @@
<?php declare(strict_types=1);
/*
* This file is part of PHPUnit.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PHPUnit\Util;
use Throwable;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*/
final class Cloner
{
/**
* @psalm-template OriginalType
*
* @psalm-param OriginalType $original
*
* @psalm-return OriginalType
*/
public static function clone(object $original): object
{
try {
return clone $original;
} catch (Throwable $t) {
return $original;
}
}
}

View File

@@ -60,6 +60,7 @@ final class FileLoader
/**
* @noinspection PhpIncludeInspection
*
* @psalm-suppress UnresolvableInclude
*/
include_once $filename;

View File

@@ -112,6 +112,7 @@ final class Test
* @throws CodeCoverageException
*
* @return array|bool
*
* @psalm-param class-string $className
*/
public static function getLinesToBeCovered(string $className, string $methodName)
@@ -132,6 +133,7 @@ final class Test
* Returns lines of code specified with the @uses annotation.
*
* @throws CodeCoverageException
*
* @psalm-param class-string $className
*/
public static function getLinesToBeUsed(string $className, string $methodName): array
@@ -173,6 +175,7 @@ final class Test
/**
* @throws Exception
*
* @psalm-param class-string $className
*/
public static function getRequirements(string $className, string $methodName): array
@@ -188,6 +191,7 @@ final class Test
*
* @throws Exception
* @throws Warning
*
* @psalm-param class-string $className
*/
public static function getMissingRequirements(string $className, string $methodName): array
@@ -316,6 +320,7 @@ final class Test
* Returns the provided data for a method.
*
* @throws Exception
*
* @psalm-param class-string $className
*/
public static function getProvidedData(string $className, string $methodName): ?array
@@ -592,6 +597,7 @@ final class Test
/**
* @throws CodeCoverageException
*
* @psalm-param class-string $className
*/
private static function getLinesToBeCoveredOrUsed(string $className, string $methodName, string $mode): array

View File

@@ -9,8 +9,6 @@
*/
namespace PHPUnit\Util;
use Throwable;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*/
@@ -38,15 +36,4 @@ final class Type
return false;
}
}
public static function isCloneable(object $object): bool
{
try {
$clone = clone $object;
} catch (Throwable $t) {
return false;
}
return $clone instanceof $object;
}
}

View File

@@ -14,6 +14,7 @@ use function sprintf;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
*
* @psalm-immutable
*/
final class VersionComparisonOperator

View File

@@ -9,6 +9,7 @@
*/
namespace PHPUnit\Util\Xml;
use function count;
use ArrayIterator;
use Countable;
use DOMNode;

View File

@@ -32,7 +32,7 @@ final class XmlTestListRenderer
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument();
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('tests');
$currentTestCase = null;
@@ -84,6 +84,7 @@ final class XmlTestListRenderer
}
$writer->endElement();
$writer->endDocument();
return $writer->outputMemory();
}

View File

@@ -2,6 +2,18 @@
All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
## [4.0.8] - 2022-09-14
### Fixed
* [#102](https://github.com/sebastianbergmann/comparator/pull/102): Fix `float` comparison precision
## [4.0.7] - 2022-09-14
### Fixed
* [#99](https://github.com/sebastianbergmann/comparator/pull/99): Fix weak comparison between `'0'` and `false`
## [4.0.6] - 2020-10-26
### Fixed
@@ -44,6 +56,24 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
* Removed support for PHP 7.1 and PHP 7.2
## [3.0.5] - 2022-09-14
### Fixed
* [#102](https://github.com/sebastianbergmann/comparator/pull/102): Fix `float` comparison precision
## [3.0.4] - 2022-09-14
### Fixed
* [#99](https://github.com/sebastianbergmann/comparator/pull/99): Fix weak comparison between `'0'` and `false`
## [3.0.3] - 2020-11-30
### Changed
* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1`
## [3.0.2] - 2018-07-12
### Changed
@@ -61,7 +91,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
### Fixed
* Fixed [#48](https://github.com/sebastianbergmann/comparator/issues/48): `DateTimeComparator` does not support fractional second deltas
* [#48](https://github.com/sebastianbergmann/comparator/issues/48): `DateTimeComparator` does not support fractional second deltas
### Removed
@@ -83,7 +113,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
### Fixed
* Fixed [phpunit/#2923](https://github.com/sebastianbergmann/phpunit/issues/2923): Unexpected failed date matching
* [phpunit/#2923](https://github.com/sebastianbergmann/phpunit/issues/2923): Unexpected failed date matching
## [2.1.0] - 2017-11-03
@@ -92,13 +122,18 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
* Added `SebastianBergmann\Comparator\Factory::reset()` to unregister all non-default comparators
* Added support for `phpunit/phpunit-mock-objects` version `^5.0`
[4.0.8]: https://github.com/sebastianbergmann/comparator/compare/4.0.7...4.0.8
[4.0.7]: https://github.com/sebastianbergmann/comparator/compare/4.0.6...4.0.7
[4.0.6]: https://github.com/sebastianbergmann/comparator/compare/4.0.5...4.0.6
[4.0.5]: https://github.com/sebastianbergmann/comparator/compare/4.0.4...4.0.5
[4.0.4]: https://github.com/sebastianbergmann/comparator/compare/4.0.3...4.0.4
[4.0.3]: https://github.com/sebastianbergmann/comparator/compare/4.0.2...4.0.3
[4.0.2]: https://github.com/sebastianbergmann/comparator/compare/4.0.1...4.0.2
[4.0.1]: https://github.com/sebastianbergmann/comparator/compare/4.0.0...4.0.1
[4.0.0]: https://github.com/sebastianbergmann/comparator/compare/3.0.2...4.0.0
[4.0.0]: https://github.com/sebastianbergmann/comparator/compare/3.0.5...4.0.0
[3.0.5]: https://github.com/sebastianbergmann/comparator/compare/3.0.4...3.0.5
[3.0.4]: https://github.com/sebastianbergmann/comparator/compare/3.0.3...3.0.4
[3.0.3]: https://github.com/sebastianbergmann/comparator/compare/3.0.2...3.0.3
[3.0.2]: https://github.com/sebastianbergmann/comparator/compare/3.0.1...3.0.2
[3.0.1]: https://github.com/sebastianbergmann/comparator/compare/3.0.0...3.0.1
[3.0.0]: https://github.com/sebastianbergmann/comparator/compare/2.1.3...3.0.0

View File

@@ -14,6 +14,8 @@ use function is_numeric;
/**
* Compares doubles for equality.
*
* @deprecated since v3.0.5 and v4.0.8
*/
class DoubleComparator extends NumericComparator
{

View File

@@ -127,7 +127,6 @@ class Factory
$this->registerDefaultComparator(new ObjectComparator);
$this->registerDefaultComparator(new ResourceComparator);
$this->registerDefaultComparator(new ArrayComparator);
$this->registerDefaultComparator(new DoubleComparator);
$this->registerDefaultComparator(new NumericComparator);
$this->registerDefaultComparator(new ScalarComparator);
$this->registerDefaultComparator(new TypeComparator);

View File

@@ -32,10 +32,8 @@ class NumericComparator extends ScalarComparator
*/
public function accepts($expected, $actual)
{
// all numerical values, but not if one of them is a double
// or both of them are strings
// all numerical values, but not if both of them are strings
return is_numeric($expected) && is_numeric($actual) &&
!(is_float($expected) || is_float($actual)) &&
!(is_string($expected) && is_string($actual));
}

View File

@@ -9,6 +9,7 @@
*/
namespace SebastianBergmann\Comparator;
use function is_bool;
use function is_object;
use function is_scalar;
use function is_string;
@@ -58,7 +59,7 @@ class ScalarComparator extends Comparator
// always compare as strings to avoid strange behaviour
// otherwise 0 == 'Foobar'
if (is_string($expected) || is_string($actual)) {
if ((is_string($expected) && !is_bool($actual)) || (is_string($actual) && !is_bool($expected))) {
$expectedToCompare = (string) $expectedToCompare;
$actualToCompare = (string) $actualToCompare;

View File

@@ -2,6 +2,12 @@
All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
## [4.0.5] - 2022-09-14
### Fixed
* [#47](https://github.com/sebastianbergmann/exporter/pull/47): Fix `float` export precision
## [4.0.4] - 2021-11-11
### Changed
@@ -32,6 +38,12 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
* This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2
## [3.1.5] - 2022-09-14
### Fixed
* [#47](https://github.com/sebastianbergmann/exporter/pull/47): Fix `float` export precision
## [3.1.4] - 2021-11-11
### Changed
@@ -54,11 +66,13 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
* Remove HHVM-specific code that is no longer needed
[4.0.5]: https://github.com/sebastianbergmann/exporter/compare/4.0.4...4.0.5
[4.0.4]: https://github.com/sebastianbergmann/exporter/compare/4.0.3...4.0.4
[4.0.3]: https://github.com/sebastianbergmann/exporter/compare/4.0.2...4.0.3
[4.0.2]: https://github.com/sebastianbergmann/exporter/compare/4.0.1...4.0.2
[4.0.1]: https://github.com/sebastianbergmann/exporter/compare/4.0.0...4.0.1
[4.0.0]: https://github.com/sebastianbergmann/exporter/compare/3.1.2...4.0.0
[3.1.5]: https://github.com/sebastianbergmann/exporter/compare/3.1.4...3.1.5
[3.1.4]: https://github.com/sebastianbergmann/exporter/compare/3.1.3...3.1.4
[3.1.3]: https://github.com/sebastianbergmann/exporter/compare/3.1.2...3.1.3
[3.1.2]: https://github.com/sebastianbergmann/exporter/compare/3.1.1...3.1.2

View File

@@ -16,6 +16,8 @@ use function get_class;
use function get_resource_type;
use function gettype;
use function implode;
use function ini_get;
use function ini_set;
use function is_array;
use function is_float;
use function is_object;
@@ -232,8 +234,22 @@ class Exporter
return 'false';
}
if (is_float($value) && (float) ((int) $value) === $value) {
return "{$value}.0";
if (is_float($value)) {
$precisionBackup = ini_get('precision');
ini_set('precision', '-1');
try {
$valueStr = (string) $value;
if ((string) (int) $value === $valueStr) {
return $valueStr . '.0';
}
return $valueStr;
} finally {
ini_set('precision', $precisionBackup);
}
}
if (gettype($value) === 'resource (closed)') {

View File

@@ -2,6 +2,15 @@
All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
## [3.2.0] - 2022-09-12
### Added
* [#25](https://github.com/sebastianbergmann/type/issues/25): Support Disjunctive Normal Form types
* Added `ReflectionMapper::fromParameterTypes()`
* Added `IntersectionType::types()` and `UnionType::types()`
* Added `UnionType::containsIntersectionTypes()`
## [3.1.0] - 2022-08-29
### Added
@@ -130,6 +139,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
* Initial release based on [code contributed by Michel Hartmann to PHPUnit](https://github.com/sebastianbergmann/phpunit/pull/3673)
[3.2.0]: https://github.com/sebastianbergmann/type/compare/3.1.0...3.2.0
[3.1.0]: https://github.com/sebastianbergmann/type/compare/3.0.0...3.1.0
[3.0.0]: https://github.com/sebastianbergmann/type/compare/2.3.4...3.0.0
[2.3.4]: https://github.com/sebastianbergmann/type/compare/ca39369c41313ed12c071ed38ecda8fcdb248859...2.3.4

View File

@@ -44,7 +44,7 @@
},
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
"dev-master": "3.2-dev"
}
}
}

View File

@@ -0,0 +1,42 @@
<?php declare(strict_types=1);
/*
* This file is part of sebastian/type.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace SebastianBergmann\Type;
final class Parameter
{
/**
* @psalm-var non-empty-string
*/
private $name;
/**
* @var Type
*/
private $type;
/**
* @psalm-param non-empty-string $name
*/
public function __construct(string $name, Type $type)
{
$this->name = $name;
$this->type = $type;
}
public function name(): string
{
return $this->name;
}
public function type(): Type
{
return $this->type;
}
}

View File

@@ -19,6 +19,55 @@ use ReflectionUnionType;
final class ReflectionMapper
{
/**
* @psalm-return list<Parameter>
*/
public function fromParameterTypes(ReflectionFunctionAbstract $functionOrMethod): array
{
$parameters = [];
foreach ($functionOrMethod->getParameters() as $parameter) {
$name = $parameter->getName();
assert($name !== '');
if (!$parameter->hasType()) {
$parameters[] = new Parameter($name, new UnknownType);
continue;
}
$type = $parameter->getType();
if ($type instanceof ReflectionNamedType) {
$parameters[] = new Parameter(
$name,
$this->mapNamedType($type, $functionOrMethod)
);
continue;
}
if ($type instanceof ReflectionUnionType) {
$parameters[] = new Parameter(
$name,
$this->mapUnionType($type, $functionOrMethod)
);
continue;
}
if ($type instanceof ReflectionIntersectionType) {
$parameters[] = new Parameter(
$name,
$this->mapIntersectionType($type, $functionOrMethod)
);
}
}
return $parameters;
}
public function fromReturnType(ReflectionFunctionAbstract $functionOrMethod): Type
{
if (!$this->hasReturnType($functionOrMethod)) {
@@ -30,54 +79,78 @@ final class ReflectionMapper
assert($returnType instanceof ReflectionNamedType || $returnType instanceof ReflectionUnionType || $returnType instanceof ReflectionIntersectionType);
if ($returnType instanceof ReflectionNamedType) {
if ($functionOrMethod instanceof ReflectionMethod && $returnType->getName() === 'self') {
return ObjectType::fromName(
$functionOrMethod->getDeclaringClass()->getName(),
$returnType->allowsNull()
);
}
if ($functionOrMethod instanceof ReflectionMethod && $returnType->getName() === 'static') {
return new StaticType(
TypeName::fromReflection($functionOrMethod->getDeclaringClass()),
$returnType->allowsNull()
);
}
if ($returnType->getName() === 'mixed') {
return new MixedType;
}
if ($functionOrMethod instanceof ReflectionMethod && $returnType->getName() === 'parent') {
return ObjectType::fromName(
$functionOrMethod->getDeclaringClass()->getParentClass()->getName(),
$returnType->allowsNull()
);
}
return Type::fromName(
$returnType->getName(),
$returnType->allowsNull()
);
}
assert($returnType instanceof ReflectionUnionType || $returnType instanceof ReflectionIntersectionType);
$types = [];
foreach ($returnType->getTypes() as $type) {
if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'self') {
$types[] = ObjectType::fromName(
$functionOrMethod->getDeclaringClass()->getName(),
false
);
} else {
$types[] = Type::fromName($type->getName(), false);
}
return $this->mapNamedType($returnType, $functionOrMethod);
}
if ($returnType instanceof ReflectionUnionType) {
return new UnionType(...$types);
return $this->mapUnionType($returnType, $functionOrMethod);
}
if ($returnType instanceof ReflectionIntersectionType) {
return $this->mapIntersectionType($returnType, $functionOrMethod);
}
}
private function mapNamedType(ReflectionNamedType $type, ReflectionFunctionAbstract $functionOrMethod): Type
{
if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'self') {
return ObjectType::fromName(
$functionOrMethod->getDeclaringClass()->getName(),
$type->allowsNull()
);
}
if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'static') {
return new StaticType(
TypeName::fromReflection($functionOrMethod->getDeclaringClass()),
$type->allowsNull()
);
}
if ($type->getName() === 'mixed') {
return new MixedType;
}
if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'parent') {
return ObjectType::fromName(
$functionOrMethod->getDeclaringClass()->getParentClass()->getName(),
$type->allowsNull()
);
}
return Type::fromName(
$type->getName(),
$type->allowsNull()
);
}
private function mapUnionType(ReflectionUnionType $type, ReflectionFunctionAbstract $functionOrMethod): Type
{
$types = [];
foreach ($type->getTypes() as $_type) {
assert($_type instanceof ReflectionNamedType || $_type instanceof ReflectionIntersectionType);
if ($_type instanceof ReflectionNamedType) {
$types[] = $this->mapNamedType($_type, $functionOrMethod);
continue;
}
$types[] = $this->mapIntersectionType($_type, $functionOrMethod);
}
return new UnionType(...$types);
}
private function mapIntersectionType(ReflectionIntersectionType $type, ReflectionFunctionAbstract $functionOrMethod): Type
{
$types = [];
foreach ($type->getTypes() as $_type) {
assert($_type instanceof ReflectionNamedType);
$types[] = $this->mapNamedType($_type, $functionOrMethod);
}
return new IntersectionType(...$types);

View File

@@ -84,6 +84,9 @@ final class CallableType extends Type
return $this->allowsNull;
}
/**
* @psalm-assert-if-true CallableType $this
*/
public function isCallable(): bool
{
return true;

Some files were not shown because too many files have changed in this diff Show More