Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 378d6c7527 | |||
| 5c6a5c2d20 | |||
| b033a718ad | |||
| 51e3cc7c7f | |||
| b7935dcb71 | |||
| 89e8f79cae | |||
| 1a027e5c7d |
+5
-5
@@ -1,9 +1,9 @@
|
|||||||
.libs
|
.libs
|
||||||
node_modules/
|
node_modules/
|
||||||
**/composer.lock
|
composer.lock
|
||||||
**/vendor/
|
vendor/
|
||||||
tools/
|
tools/
|
||||||
**/configs/.env
|
www/composer.lock
|
||||||
|
www/vendor
|
||||||
|
**/.env
|
||||||
**/.target
|
**/.target
|
||||||
package-lock.json
|
|
||||||
build/
|
|
||||||
|
|||||||
+2
-2
@@ -26,8 +26,8 @@
|
|||||||
use Phan\Config;
|
use Phan\Config;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// "target_php_version" => "8.3",
|
// "target_php_version" => "8.2",
|
||||||
"minimum_target_php_version" => "8.3",
|
"minimum_target_php_version" => "8.2",
|
||||||
// turn color on (-C)
|
// turn color on (-C)
|
||||||
"color_issue_messages_if_supported" => true,
|
"color_issue_messages_if_supported" => true,
|
||||||
// If true, missing properties will be created when
|
// If true, missing properties will be created when
|
||||||
|
|||||||
+8
-8
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<phive xmlns="https://phar.io/phive">
|
<phive xmlns="https://phar.io/phive">
|
||||||
<phar name="phpunit" version="~9.6" installed="9.6.34" location="./tools/phpunit" copy="false"/>
|
<phar name="phpunit" version="^10.3.5" installed="10.5.46" location="./tools/phpunit" copy="false"/>
|
||||||
<phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/>
|
<phar name="phpcbf" version="^3.7.2" installed="3.13.0" location="./tools/phpcbf" copy="false"/>
|
||||||
<phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/>
|
<phar name="phpcs" version="^3.10.3" installed="3.13.0" location="./tools/phpcs" copy="false"/>
|
||||||
<phar name="phpstan" version="^2.0" installed="2.2.2" location="./tools/phpstan" copy="false"/>
|
<phar name="phpstan" version="^2.0" installed="2.1.17" location="./tools/phpstan" copy="false"/>
|
||||||
<phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/>
|
<phar name="phan" version="^5.4.3" installed="5.4.3" location="./tools/phan" copy="false"/>
|
||||||
<phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" copy="false"/>
|
<phar name="psalm" version="^5.15.0" installed="5.24.0" location="./tools/psalm" copy="false"/>
|
||||||
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
||||||
<phar name="phpdocumentor" version="^3.4.2" installed="3.10.0" location="./tools/phpDocumentor" copy="false"/>
|
<phar name="phpdocumentor" version="^3.4.2" installed="3.4.3" location="./tools/phpDocumentor" copy="false"/>
|
||||||
<phar name="php-cs-fixer" version="^3.34.1" installed="3.95.10" location="./tools/php-cs-fixer" copy="false"/>
|
<phar name="php-cs-fixer" version="^3.34.1" installed="3.57.2" location="./tools/php-cs-fixer" copy="false"/>
|
||||||
</phive>
|
</phive>
|
||||||
|
|||||||
+4
-98
@@ -1,100 +1,6 @@
|
|||||||
#!/bin/env bash
|
base=$(pwd)"/";
|
||||||
|
|
||||||
function error() {
|
|
||||||
if [ -t 1 ]; then echo "[MAK] ERROR: $*" >&2; fi; exit 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
cat <<EOF
|
|
||||||
Usage: $(basename "${BASH_SOURCE[0]}") [-h | --help] [-p | --php VERSION] [-c | --composer]
|
|
||||||
|
|
||||||
Runs phan static analyzer.
|
|
||||||
|
|
||||||
If -p is not set, the default intalled PHP is used.
|
|
||||||
|
|
||||||
Available options:
|
|
||||||
|
|
||||||
-h, --help Print this help and exit
|
|
||||||
-p, --php VERSION Chose PHP version in the form of "N.N", if not found will exit
|
|
||||||
-c, --composer Use composer version and not the default phives bundle
|
|
||||||
EOF
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
BASE_PATH=$(pwd)"/";
|
|
||||||
PHP_BIN_PATH=$(which php);
|
|
||||||
if [ -z "${PHP_BIN_PATH}" ]; then
|
|
||||||
echo "Cannot find php binary";
|
|
||||||
exit;
|
|
||||||
fi;
|
|
||||||
DEFAULT_PHP_VERSION=$(${PHP_BIN_PATH} -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;");
|
|
||||||
if [ -z "${DEFAULT_PHP_VERSION}" ]; then
|
|
||||||
echo "Cannot set default PHP version";
|
|
||||||
exit;
|
|
||||||
fi;
|
|
||||||
php_version="";
|
|
||||||
no_php_version=0;
|
|
||||||
use_composer=0;
|
|
||||||
while [ -n "${1-}" ]; do
|
|
||||||
case "${1}" in
|
|
||||||
-p | --php)
|
|
||||||
php_version="${2-}";
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-c | --composer)
|
|
||||||
use_composer=1;
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-h | --help)
|
|
||||||
usage
|
|
||||||
;;
|
|
||||||
# invalid option
|
|
||||||
-?*)
|
|
||||||
error "[!] Unknown option: '$1'."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift;
|
|
||||||
done;
|
|
||||||
if [ -z "${php_version}" ]; then
|
|
||||||
php_version="${DEFAULT_PHP_VERSION}";
|
|
||||||
no_php_version=1;
|
|
||||||
fi;
|
|
||||||
php_bin="${PHP_BIN_PATH}${php_version}";
|
|
||||||
echo "Use PHP Version: ${php_version}";
|
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
|
||||||
echo "Use composer installed";
|
|
||||||
else
|
|
||||||
echo "Use phive installed";
|
|
||||||
fi;
|
|
||||||
|
|
||||||
if [ ! -f "${php_bin}" ]; then
|
|
||||||
echo "Set php ${php_bin} does not exist";
|
|
||||||
exit;
|
|
||||||
fi;
|
|
||||||
|
|
||||||
# must be run in ${base}
|
# must be run in ${base}
|
||||||
cd "$BASE_PATH" || exit;
|
cd $base || exit;
|
||||||
export PHAN_DISABLE_XDEBUG_WARN=1;
|
#PHAN_DISABLE_XDEBUG_WARN=1;${base}tools/phan --progress-bar -C --analyze-twice
|
||||||
PHAN_CALL=(
|
PHAN_DISABLE_XDEBUG_WARN=1;${base}vendor/bin/phan --progress-bar -C --analyze-twice
|
||||||
"${php_bin}"
|
|
||||||
);
|
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
|
||||||
PHAN_CALL+=("${BASE_PATH}vendor/bin/phan");
|
|
||||||
else
|
|
||||||
PHAN_CALL+=("${BASE_PATH}tools/phan");
|
|
||||||
fi;
|
|
||||||
PHAN_CALL+=(
|
|
||||||
"--progress-bar"
|
|
||||||
"-C"
|
|
||||||
"--analyze-twice"
|
|
||||||
)
|
|
||||||
"${PHAN_CALL[@]}";
|
|
||||||
if [ "${no_php_version}" -eq 0 ]; then
|
|
||||||
echo "*** CALLED WITH PHP ${php_bin} ***";
|
|
||||||
${php_bin} --version;
|
|
||||||
else
|
|
||||||
echo "Default PHP used: $(php --version)";
|
|
||||||
fi;
|
|
||||||
cd ~ || exit;
|
cd ~ || exit;
|
||||||
|
|
||||||
# __END__
|
|
||||||
|
|||||||
@@ -1,92 +1,5 @@
|
|||||||
#!/bin/env bash
|
base=$(pwd)"/";
|
||||||
|
# must be run in ${base}
|
||||||
function error() {
|
cd $base || exit;
|
||||||
if [ -t 1 ]; then echo "[MAK] ERROR: $*" >&2; fi; exit 0;
|
${base}tools/phpstan;
|
||||||
}
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
cat <<EOF
|
|
||||||
Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-h | --help] [-p | --php VERSION] [-c | --composer]
|
|
||||||
|
|
||||||
Runs phan static analyzer.
|
|
||||||
|
|
||||||
If -p is not set, the default intalled PHP is used.
|
|
||||||
|
|
||||||
Available options:
|
|
||||||
|
|
||||||
-h, --help Print this help and exit
|
|
||||||
-p, --php VERSION Chose PHP version in the form of "N.N", if not found will exit
|
|
||||||
-c, --composer Use composer version and not the default phives bundle
|
|
||||||
EOF
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
BASE_PATH=$(pwd)"/";
|
|
||||||
PHP_BIN_PATH=$(which php);
|
|
||||||
if [ -z "${PHP_BIN_PATH}" ]; then
|
|
||||||
echo "Cannot find php binary";
|
|
||||||
exit;
|
|
||||||
fi;
|
|
||||||
DEFAULT_PHP_VERSION=$(${PHP_BIN_PATH} -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;");
|
|
||||||
if [ -z "${DEFAULT_PHP_VERSION}" ]; then
|
|
||||||
echo "Cannot set default PHP version";
|
|
||||||
exit;
|
|
||||||
fi;
|
|
||||||
php_version="";
|
|
||||||
no_php_version=0;
|
|
||||||
use_composer=0;
|
|
||||||
while [ -n "${1-}" ]; do
|
|
||||||
case "${1}" in
|
|
||||||
-p | --php)
|
|
||||||
php_version="${2-}";
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-c | --composer)
|
|
||||||
use_composer=1;
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-h | --help)
|
|
||||||
usage
|
|
||||||
;;
|
|
||||||
# invalid option
|
|
||||||
-?*)
|
|
||||||
error "[!] Unknown option: '$1'."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift;
|
|
||||||
done;
|
|
||||||
if [ -z "${php_version}" ]; then
|
|
||||||
php_version="${DEFAULT_PHP_VERSION}";
|
|
||||||
no_php_version=1;
|
|
||||||
fi;
|
|
||||||
php_bin="${PHP_BIN_PATH}${php_version}";
|
|
||||||
echo "Use PHP Version: ${php_version}";
|
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
|
||||||
echo "Use composer installed";
|
|
||||||
else
|
|
||||||
echo "Use phive installed";
|
|
||||||
fi;
|
|
||||||
|
|
||||||
if [ ! -f "${php_bin}" ]; then
|
|
||||||
echo "Set php ${php_bin} does not exist";
|
|
||||||
exit;
|
|
||||||
fi;
|
|
||||||
|
|
||||||
BASE_PATH=$(pwd)"/";
|
|
||||||
cd "$BASE_PATH" || exit;
|
|
||||||
PHPSTAN_CALL=(
|
|
||||||
"${php_bin}"
|
|
||||||
);
|
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
|
||||||
PHPSTAN_CALL+=("${BASE_PATH}vendor/bin/phpstan");
|
|
||||||
else
|
|
||||||
PHPSTAN_CALL+=("${BASE_PATH}tools/phpstan");
|
|
||||||
fi;
|
|
||||||
"${PHPSTAN_CALL[@]}";
|
|
||||||
if [ "${no_php_version}" -eq 0 ]; then
|
|
||||||
echo "*** CALLED WITH PHP ${php_bin} ***";
|
|
||||||
${php_bin} --version;
|
|
||||||
else
|
|
||||||
echo "Default PHP used: $(php --version)";
|
|
||||||
fi;
|
|
||||||
cd ~ || exit;
|
cd ~ || exit;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ function error() {
|
|||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
Usage: $(basename "${BASH_SOURCE[0]}") [-h | --help] [-p | --php VERSION] [-c | --composer] [-t | --testdox] [-v | --verbose]
|
Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-t] [-v] [-p VERSION]
|
||||||
|
|
||||||
Runs all the PHP unit tests.
|
Runs all the PHP unit tests.
|
||||||
|
|
||||||
@@ -15,11 +15,9 @@ If -p is not set, the default intalled PHP is used.
|
|||||||
Available options:
|
Available options:
|
||||||
|
|
||||||
-h, --help Print this help and exit
|
-h, --help Print this help and exit
|
||||||
-t, --testdox Enable testdox output for PHPunit
|
-t, --testdox Enable testdox output for phpunit
|
||||||
-v, --verbose Enable verbose output for PHPunit
|
-v, --verbose Enable verbose output for PHPunit
|
||||||
-c, --composer Use composer version and not the default phives bundle
|
|
||||||
-p, --php VERSION Chose PHP version in the form of "N.N", if not found will exit
|
-p, --php VERSION Chose PHP version in the form of "N.N", if not found will exit
|
||||||
-C, --coverage Generate code coverage report in text format (default: disabled)
|
|
||||||
EOF
|
EOF
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
@@ -47,9 +45,6 @@ opt_testdox="";
|
|||||||
opt_verbose="";
|
opt_verbose="";
|
||||||
php_version="";
|
php_version="";
|
||||||
no_php_version=0;
|
no_php_version=0;
|
||||||
use_composer=0;
|
|
||||||
opt_generate_coverage="";
|
|
||||||
opt_generate_coverage_html="";
|
|
||||||
while [ -n "${1-}" ]; do
|
while [ -n "${1-}" ]; do
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
-t | --testdox)
|
-t | --testdox)
|
||||||
@@ -58,18 +53,6 @@ while [ -n "${1-}" ]; do
|
|||||||
-v | --verbose)
|
-v | --verbose)
|
||||||
opt_verbose="--verbose";
|
opt_verbose="--verbose";
|
||||||
;;
|
;;
|
||||||
-c | --composer)
|
|
||||||
use_composer=1;
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-C | --coverage)
|
|
||||||
opt_generate_coverage="--coverage-text";
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--coverage-report)
|
|
||||||
opt_generate_coverage_html="--coverage-html build/coverage-report";
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-p | --php)
|
-p | --php)
|
||||||
php_version="${2-}";
|
php_version="${2-}";
|
||||||
shift
|
shift
|
||||||
@@ -91,44 +74,21 @@ if [ -z "${php_version}" ]; then
|
|||||||
fi;
|
fi;
|
||||||
php_bin="${PHP_BIN_PATH}${php_version}";
|
php_bin="${PHP_BIN_PATH}${php_version}";
|
||||||
echo "Use PHP Version: ${php_version}";
|
echo "Use PHP Version: ${php_version}";
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
|
||||||
echo "Use composer installed";
|
|
||||||
else
|
|
||||||
echo "Use phive installed";
|
|
||||||
fi;
|
|
||||||
|
|
||||||
if [ ! -f "${php_bin}" ]; then
|
if [ ! -f "${php_bin}" ]; then
|
||||||
echo "Set php ${php_bin} does not exist";
|
echo "Set php ${php_bin} does not exist";
|
||||||
exit;
|
exit;
|
||||||
fi;
|
fi;
|
||||||
|
php_bin="${php_bin} ";
|
||||||
|
|
||||||
# Note 4dev/tests/bootstrap.php has to be set as bootstrap file in phpunit.xml
|
# Note 4dev/tests/bootstrap.php has to be set as bootstrap file in phpunit.xml
|
||||||
PHPUNIT_CALL=(
|
phpunit_call="${php_bin}${BASE_PATH}vendor/bin/phpunit ${opt_testdox} ${opt_verbose} -c ${PHPUNIT_CONFIG} ${BASE_PATH}4dev/tests/";
|
||||||
"${php_bin}"
|
|
||||||
);
|
${phpunit_call};
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
|
||||||
PHPUNIT_CALL+=("${BASE_PATH}vendor/bin/phpunit");
|
|
||||||
else
|
|
||||||
PHPUNIT_CALL+=("${BASE_PATH}tools/phpunit");
|
|
||||||
fi;
|
|
||||||
if [ -n "${opt_generate_coverage}" ]; then
|
|
||||||
echo "Will run coverage report";
|
|
||||||
export XDEBUG_MODE=coverage
|
|
||||||
fi;
|
|
||||||
PHPUNIT_CALL+=(
|
|
||||||
"${opt_testdox}"
|
|
||||||
"${opt_verbose}"
|
|
||||||
"${opt_generate_coverage}"
|
|
||||||
"${opt_generate_coverage_html}"
|
|
||||||
"-c" "${PHPUNIT_CONFIG}"
|
|
||||||
"${BASE_PATH}4dev/tests/"
|
|
||||||
);
|
|
||||||
"${PHPUNIT_CALL[@]}" || exit;
|
|
||||||
|
|
||||||
echo -e "\nPHPUnit Config: ${PHPUNIT_CONFIG}";
|
echo -e "\nPHPUnit Config: ${PHPUNIT_CONFIG}";
|
||||||
if [ "${no_php_version}" -eq 0 ]; then
|
if [ "${no_php_version}" -eq 0 ]; then
|
||||||
echo "*** CALLED WITH PHP ${php_bin} ***";
|
echo "CALLED WITH PHP: ${php_bin}$(${php_bin} --version)";
|
||||||
${php_bin} --version;
|
|
||||||
else
|
else
|
||||||
echo "Default PHP used: $(php --version)";
|
echo "Default PHP used: $(php --version)";
|
||||||
fi;
|
fi;
|
||||||
|
|||||||
@@ -9,6 +9,5 @@
|
|||||||
CREATE TABLE generic (
|
CREATE TABLE generic (
|
||||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||||
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
||||||
uuid UUID DEFAULT gen_random_uuid(),
|
|
||||||
uid VARCHAR
|
uid VARCHAR
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
||||||
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
||||||
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
||||||
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
||||||
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsAAASetupDataTest extends TestCase
|
final class CoreLibsAAASetupDataTest extends TestCase
|
||||||
{
|
{
|
||||||
public const TIME_ZONE = 'Asia/Tokyo';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Covers nothing
|
* Covers nothing
|
||||||
*
|
*
|
||||||
@@ -36,9 +34,6 @@ final class CoreLibsAAASetupDataTest extends TestCase
|
|||||||
BASE,
|
BASE,
|
||||||
'BASE Path set check'
|
'BASE Path set check'
|
||||||
);
|
);
|
||||||
|
|
||||||
// if time zone is not set, errors can happen
|
|
||||||
ini_set('date.timezone', self::TIME_ZONE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
'log_file_id' => 'CoreLibs-ACL-Login-Test',
|
'log_file_id' => 'CoreLibs-ACL-Login-Test',
|
||||||
]);
|
]);
|
||||||
// test database we need to connect do, if not possible this test is skipped
|
// test database we need to connect do, if not possible this test is skipped
|
||||||
try {
|
|
||||||
self::$db = new \CoreLibs\DB\IO(
|
self::$db = new \CoreLibs\DB\IO(
|
||||||
[
|
[
|
||||||
'db_name' => $db_name,
|
'db_name' => $db_name,
|
||||||
@@ -96,11 +95,6 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
],
|
],
|
||||||
self::$log
|
self::$log
|
||||||
);
|
);
|
||||||
} catch (\Exception $e) {
|
|
||||||
self::markTestSkipped(
|
|
||||||
'Cannot connect to Test DB for ACL\Login test: ' . $e->getMessage()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// ALWAYS drop DB and RECREATE DB
|
// ALWAYS drop DB and RECREATE DB
|
||||||
// dropdb -U corelibs_acl_login_test -h localhost corelibs_acl_login_test
|
// dropdb -U corelibs_acl_login_test -h localhost corelibs_acl_login_test
|
||||||
// createdb -U corelibs_acl_login_test -O corelibs_acl_login_test -E utf8 corelibs_acl_login_test;
|
// createdb -U corelibs_acl_login_test -O corelibs_acl_login_test -E utf8 corelibs_acl_login_test;
|
||||||
|
|||||||
@@ -15,12 +15,6 @@ if [ ! -f "${load_sql}" ]; then
|
|||||||
echo 1;
|
echo 1;
|
||||||
exit 1;
|
exit 1;
|
||||||
fi;
|
fi;
|
||||||
# if we have no dropdb, createdb, psql, exit with 6
|
|
||||||
if ! command -v dropdb &> /dev/null || ! command -v createdb &> /dev/null || ! command -v psql &> /dev/null; then
|
|
||||||
echo 6;
|
|
||||||
exit 6;
|
|
||||||
fi;
|
|
||||||
|
|
||||||
db_user="${2}";
|
db_user="${2}";
|
||||||
db_name="${3}";
|
db_name="${3}";
|
||||||
db_host="${4}";
|
db_host="${4}";
|
||||||
@@ -30,25 +24,25 @@ if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
|
|||||||
exit 2;
|
exit 2;
|
||||||
fi;
|
fi;
|
||||||
# drop database, on error exit with 3
|
# drop database, on error exit with 3
|
||||||
dropdb -U "${db_user}" -h "${db_host}" "${db_name}" 2>&1;
|
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1;
|
||||||
if [ ! $? ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo 3;
|
echo 3;
|
||||||
exit 3;
|
exit 3;
|
||||||
fi;
|
fi;
|
||||||
# create database, on error exit with 4
|
# create database, on error exit with 4
|
||||||
createdb -U "${db_user}" -O "${db_user}" -h "${db_host}" -E utf8 "${db_name}" 2>&1;
|
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1;
|
||||||
if [ ! $? ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo 4;
|
echo 4;
|
||||||
exit 4;
|
exit 4;
|
||||||
fi;
|
fi;
|
||||||
# if error 5 thrown, test with enabled below
|
# if error 5 thrown, test with enabled below
|
||||||
if [ -n "${5}" ]; then
|
if [ ! -z "${5}" ]; then
|
||||||
psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}";
|
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
|
||||||
else
|
else
|
||||||
# load data (redirect ALL error to null), on error exit with 5
|
# load data (redirect ALL error to null), on error exit with 5
|
||||||
psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}" 2>&1 1>/dev/null 2>/dev/null;
|
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null;
|
||||||
fi;
|
fi;
|
||||||
if [ ! $? ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo 5;
|
echo 5;
|
||||||
exit 5;
|
exit 5;
|
||||||
fi;
|
fi;
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
'get email regex invalid -1, will be 0' => [
|
'get email regex invalid -1, will be 0' => [
|
||||||
-1,
|
-1,
|
||||||
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
],
|
],
|
||||||
'get email regex invalid 10, will be 0' => [
|
'get email regex invalid 10, will be 0' => [
|
||||||
10,
|
10,
|
||||||
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
],
|
],
|
||||||
'get email regex valid 1, will be 1' => [
|
'get email regex valid 1, will be 1' => [
|
||||||
1,
|
1,
|
||||||
@@ -157,7 +157,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
'error' => 0,
|
'error' => 0,
|
||||||
'message' => 'Invalid email address',
|
'message' => 'Invalid email address',
|
||||||
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 1 will return double @ error' => [
|
'error 1 will return double @ error' => [
|
||||||
@@ -181,7 +181,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 3,
|
'error' => 3,
|
||||||
'message' => 'Invalid domain part after @ sign',
|
'message' => 'Invalid domain part after @ sign',
|
||||||
'regex' => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 4 will be invalid domain' => [
|
'error 4 will be invalid domain' => [
|
||||||
@@ -189,7 +189,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 4,
|
'error' => 4,
|
||||||
'message' => 'Invalid domain name part',
|
'message' => 'Invalid domain name part',
|
||||||
'regex' => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\."
|
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\."
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 5 will be invalid domain top level only' => [
|
'error 5 will be invalid domain top level only' => [
|
||||||
@@ -197,7 +197,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 5,
|
'error' => 5,
|
||||||
'message' => 'Wrong domain top level part',
|
'message' => 'Wrong domain top level part',
|
||||||
'regex' => "\.[a-zA-Z]{2,6}$"
|
'regex' => "\.([a-zA-Z]{2,6}){1}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 6 will be domain double dot' => [
|
'error 6 will be domain double dot' => [
|
||||||
|
|||||||
@@ -1266,8 +1266,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::arrayGetPrevKey
|
* @covers ::arrayGetPrevKey, ::arrayGetNextKey
|
||||||
* @covers ::arrayGetNextKey
|
|
||||||
* @dataProvider providerArrayGetNextPrevKey
|
* @dataProvider providerArrayGetNextPrevKey
|
||||||
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
|
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?php // phpcs:disable Generic.Files.LineLength
|
<?php
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
@@ -71,16 +71,15 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @covers ::dateStringFormat
|
* @covers ::dateStringFormat
|
||||||
* @dataProvider timestampProvider
|
* @dataProvider timestampProvider
|
||||||
* @testdox dateStringFormat $input (mt $flag_show_micro, float mt $flag_micro_as_float) will be $expected [$_dataName]
|
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
* @param int|float $input
|
* @param int|float $input
|
||||||
* @param bool $flag_show_micro
|
* @param bool $flag
|
||||||
* @param bool $flag_micro_as_float
|
|
||||||
* @param string $expected
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDateStringFormat(
|
public function testDateStringFormat(
|
||||||
int|float $input,
|
$input,
|
||||||
bool $flag_show_micro,
|
bool $flag_show_micro,
|
||||||
bool $flag_micro_as_float,
|
bool $flag_micro_as_float,
|
||||||
string $expected
|
string $expected
|
||||||
@@ -491,11 +490,11 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
],
|
],
|
||||||
'micro interval with microtime' => [
|
'micro interval with microtime' => [
|
||||||
'18999d 0h 38m 10s 1235ms',
|
'18999d 0h 38m 10s 1235ms',
|
||||||
1641515891.235,
|
1641515890.1235,
|
||||||
],
|
],
|
||||||
'micro interval with microtime' => [
|
'micro interval with microtime' => [
|
||||||
'18999d 0h 38m 10s 1234567890ms',
|
'18999d 0h 38m 10s 1234567890ms',
|
||||||
1642750457.89,
|
1641515890.1234567,
|
||||||
],
|
],
|
||||||
'negative interval no microtime' => [
|
'negative interval no microtime' => [
|
||||||
'-18999d 0h 38m 10s',
|
'-18999d 0h 38m 10s',
|
||||||
@@ -504,246 +503,23 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
// short for mini tests
|
// short for mini tests
|
||||||
'microtime only' => [
|
'microtime only' => [
|
||||||
'0s 1235ms',
|
'0s 1235ms',
|
||||||
1.235,
|
0.1235,
|
||||||
],
|
],
|
||||||
'seconds only' => [
|
'seconds only' => [
|
||||||
'30s 1235ms',
|
'30s 1235ms',
|
||||||
31.235,
|
30.1235,
|
||||||
],
|
],
|
||||||
'minutes only' => [
|
'minutes only' => [
|
||||||
'1m 30s 1235ms',
|
'1m 30s 1235ms',
|
||||||
91.235,
|
90.1235,
|
||||||
],
|
],
|
||||||
'hours only' => [
|
'hours only' => [
|
||||||
'1h 1m 30s 1235ms',
|
'1h 1m 30s 1235ms',
|
||||||
3691.235,
|
3690.1235,
|
||||||
],
|
],
|
||||||
'days only' => [
|
'days only' => [
|
||||||
'1d 1h 1m 30s 1235ms',
|
'1d 1h 1m 30s 1235ms',
|
||||||
90091.235,
|
90090.1235,
|
||||||
],
|
|
||||||
'days only with long name' => [
|
|
||||||
'1day 1hour 1min 30second 1235millisecond',
|
|
||||||
90091.235,
|
|
||||||
],
|
|
||||||
// Test day variations
|
|
||||||
'day singular' => [
|
|
||||||
'5day',
|
|
||||||
432000,
|
|
||||||
],
|
|
||||||
'days plural' => [
|
|
||||||
'3days',
|
|
||||||
259200,
|
|
||||||
],
|
|
||||||
'days with space' => [
|
|
||||||
'2days 5h',
|
|
||||||
190800,
|
|
||||||
],
|
|
||||||
'day without space' => [
|
|
||||||
'1day1h',
|
|
||||||
90000,
|
|
||||||
],
|
|
||||||
// Test hour variations
|
|
||||||
'hour singular' => [
|
|
||||||
'2hour',
|
|
||||||
7200,
|
|
||||||
],
|
|
||||||
'hours plural' => [
|
|
||||||
'4hours',
|
|
||||||
14400,
|
|
||||||
],
|
|
||||||
'hours with space' => [
|
|
||||||
'3hours 30m',
|
|
||||||
12600,
|
|
||||||
],
|
|
||||||
'hour without space' => [
|
|
||||||
'1hour30m',
|
|
||||||
5400,
|
|
||||||
],
|
|
||||||
// Test minute variations
|
|
||||||
'min short' => [
|
|
||||||
'45min',
|
|
||||||
2700,
|
|
||||||
],
|
|
||||||
'minute singular' => [
|
|
||||||
'1minute',
|
|
||||||
60,
|
|
||||||
],
|
|
||||||
'minutes plural' => [
|
|
||||||
'10minutes',
|
|
||||||
600,
|
|
||||||
],
|
|
||||||
'minutes with space' => [
|
|
||||||
'5minutes 20s',
|
|
||||||
320,
|
|
||||||
],
|
|
||||||
'min without space' => [
|
|
||||||
'2min30s',
|
|
||||||
150,
|
|
||||||
],
|
|
||||||
// Test second variations
|
|
||||||
'sec short' => [
|
|
||||||
'30sec',
|
|
||||||
30,
|
|
||||||
],
|
|
||||||
'second singular' => [
|
|
||||||
'1second',
|
|
||||||
1,
|
|
||||||
],
|
|
||||||
'seconds plural' => [
|
|
||||||
'45seconds',
|
|
||||||
45,
|
|
||||||
],
|
|
||||||
'seconds with space' => [
|
|
||||||
'15seconds 500ms',
|
|
||||||
15.5,
|
|
||||||
],
|
|
||||||
'sec without space' => [
|
|
||||||
'10sec250ms',
|
|
||||||
10.25,
|
|
||||||
],
|
|
||||||
// Test millisecond variations
|
|
||||||
'ms short' => [
|
|
||||||
'500ms',
|
|
||||||
0.5,
|
|
||||||
],
|
|
||||||
'millis short' => [
|
|
||||||
'250millis',
|
|
||||||
0.25,
|
|
||||||
],
|
|
||||||
'millisec medium singular' => [
|
|
||||||
'250millisec',
|
|
||||||
0.25,
|
|
||||||
],
|
|
||||||
'millisecs medium plural' => [
|
|
||||||
'250millisecs',
|
|
||||||
0.25,
|
|
||||||
],
|
|
||||||
'misec medium singular' => [
|
|
||||||
'250millisec',
|
|
||||||
0.25,
|
|
||||||
],
|
|
||||||
'msecs medium plural' => [
|
|
||||||
'250millisecs',
|
|
||||||
0.25,
|
|
||||||
],
|
|
||||||
'millisecond long singular' => [
|
|
||||||
'1millisecond',
|
|
||||||
0.001,
|
|
||||||
],
|
|
||||||
'milliseconds long plural' => [
|
|
||||||
'999milliseconds',
|
|
||||||
0.999,
|
|
||||||
],
|
|
||||||
// Test negative values
|
|
||||||
'negative days' => [
|
|
||||||
'-5d',
|
|
||||||
-432000,
|
|
||||||
],
|
|
||||||
'negative hours' => [
|
|
||||||
'-3h',
|
|
||||||
-10800,
|
|
||||||
],
|
|
||||||
'negative minutes' => [
|
|
||||||
'-45m',
|
|
||||||
-2700,
|
|
||||||
],
|
|
||||||
'negative seconds' => [
|
|
||||||
'-30s',
|
|
||||||
-30,
|
|
||||||
],
|
|
||||||
'negative milliseconds' => [
|
|
||||||
'-500ms',
|
|
||||||
-0.5,
|
|
||||||
],
|
|
||||||
'negative complex' => [
|
|
||||||
'-2days 3hours 15minutes 30seconds 250milliseconds',
|
|
||||||
-184530.25,
|
|
||||||
],
|
|
||||||
// Test combined formats
|
|
||||||
'all components short' => [
|
|
||||||
'1d 2h 3m 4s 5ms',
|
|
||||||
93784.005,
|
|
||||||
],
|
|
||||||
'all components long' => [
|
|
||||||
'2days 3hours 4minutes 5seconds 678milliseconds',
|
|
||||||
183845.678,
|
|
||||||
],
|
|
||||||
'mixed short and long' => [
|
|
||||||
'1day 2h 3minutes 4sec 100ms',
|
|
||||||
93784.1,
|
|
||||||
],
|
|
||||||
'no spaces between components' => [
|
|
||||||
'1d2h3m4s5ms',
|
|
||||||
93784.005,
|
|
||||||
],
|
|
||||||
'only days and milliseconds' => [
|
|
||||||
'5d 123ms',
|
|
||||||
432000.123,
|
|
||||||
],
|
|
||||||
'only hours and seconds' => [
|
|
||||||
'2h 45s',
|
|
||||||
7245,
|
|
||||||
],
|
|
||||||
'only minutes and milliseconds' => [
|
|
||||||
'30m 500ms',
|
|
||||||
1800.5,
|
|
||||||
],
|
|
||||||
// Test zero values
|
|
||||||
'zero seconds' => [
|
|
||||||
'0s',
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
'zero with milliseconds' => [
|
|
||||||
'0s 123ms',
|
|
||||||
0.123,
|
|
||||||
],
|
|
||||||
// Test large values
|
|
||||||
'large days' => [
|
|
||||||
'365days',
|
|
||||||
31536000,
|
|
||||||
],
|
|
||||||
'large hours' => [
|
|
||||||
'48hours',
|
|
||||||
172800,
|
|
||||||
],
|
|
||||||
'large minutes' => [
|
|
||||||
'1440minutes',
|
|
||||||
86400,
|
|
||||||
],
|
|
||||||
'large seconds' => [
|
|
||||||
'86400seconds',
|
|
||||||
86400,
|
|
||||||
],
|
|
||||||
// Test edge cases with spaces
|
|
||||||
'extra spaces' => [
|
|
||||||
'1d 2h 3m 4s 5ms',
|
|
||||||
93784.005,
|
|
||||||
],
|
|
||||||
'mixed spaces and no spaces' => [
|
|
||||||
'1d 2h3m 4s5ms',
|
|
||||||
93784.005,
|
|
||||||
],
|
|
||||||
// Test single component each
|
|
||||||
'only days short' => [
|
|
||||||
'7d',
|
|
||||||
604800,
|
|
||||||
],
|
|
||||||
'only hours short' => [
|
|
||||||
'12h',
|
|
||||||
43200,
|
|
||||||
],
|
|
||||||
'only minutes short' => [
|
|
||||||
'90m',
|
|
||||||
5400,
|
|
||||||
],
|
|
||||||
'only seconds short' => [
|
|
||||||
'120s',
|
|
||||||
120,
|
|
||||||
],
|
|
||||||
'only milliseconds short' => [
|
|
||||||
'1500ms',
|
|
||||||
1.5,
|
|
||||||
],
|
],
|
||||||
'already set' => [
|
'already set' => [
|
||||||
1641515890,
|
1641515890,
|
||||||
@@ -753,18 +529,10 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
'xyz',
|
'xyz',
|
||||||
'xyz',
|
'xyz',
|
||||||
],
|
],
|
||||||
'empty data' => [
|
|
||||||
' ',
|
|
||||||
' ',
|
|
||||||
],
|
|
||||||
'out of bound data' => [
|
'out of bound data' => [
|
||||||
'99999999999999999999d',
|
'99999999999999999999d',
|
||||||
8.64E+24
|
8.64E+24
|
||||||
],
|
],
|
||||||
'spaces inbetween' => [
|
|
||||||
' - 9 d 2h 58minutes 35 seconds 123 ms ',
|
|
||||||
-788315.123,
|
|
||||||
]
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -787,36 +555,6 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::stringToTime
|
|
||||||
* @testdox stringToTime invalid input will throw exception if requested
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testStringToTimeException(): void
|
|
||||||
{
|
|
||||||
$this->expectException(\InvalidArgumentException::class);
|
|
||||||
$this->expectExceptionMessageMatches("/^Invalid time string format, cannot parse: /");
|
|
||||||
\CoreLibs\Combined\DateTime::stringToTime('1x 2y 3z', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::stringToTime
|
|
||||||
* @testdox stringToTime empty input will throw exception if requested
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testStringToTimeExceptionEmpty(): void
|
|
||||||
{
|
|
||||||
$this->expectException(\InvalidArgumentException::class);
|
|
||||||
$this->expectExceptionMessageMatches("/^Invalid time string format, no interval value found: /");
|
|
||||||
\CoreLibs\Combined\DateTime::stringToTime(' ', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -123,6 +123,47 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function byteStringProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'negative number' => [
|
||||||
|
0 => '-117.42 MB',
|
||||||
|
1 => -123123794,
|
||||||
|
2 => -117420000,
|
||||||
|
],
|
||||||
|
'megabyte' => [
|
||||||
|
0 => '242.98 MB',
|
||||||
|
1 => 254782996,
|
||||||
|
2 => 242980000
|
||||||
|
],
|
||||||
|
'megabyte si' => [
|
||||||
|
0 => '254.78 MiB',
|
||||||
|
1 => 267156193,
|
||||||
|
2 => 254780000
|
||||||
|
],
|
||||||
|
'petabyte' => [
|
||||||
|
0 => '1 EiB',
|
||||||
|
1 => 1152921504606846976,
|
||||||
|
2 => 1000000000000000000,
|
||||||
|
],
|
||||||
|
'max int' => [
|
||||||
|
0 => '8 EB',
|
||||||
|
1 => -9223372036854775807 - 1,
|
||||||
|
2 => 8000000000000000000,
|
||||||
|
],
|
||||||
|
'exabyte, overflow' => [
|
||||||
|
0 => '867.36EB',
|
||||||
|
1 => 3873816255479021568,
|
||||||
|
2 => 363028535651074048,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -139,7 +180,7 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testHumanReadableByteFormat(
|
public function testHumanReadableByteFormat(
|
||||||
string|int|float $input,
|
$input,
|
||||||
string $expected,
|
string $expected,
|
||||||
string $expected_si,
|
string $expected_si,
|
||||||
string $expected_no_space,
|
string $expected_no_space,
|
||||||
@@ -176,73 +217,6 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function byteStringProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'negative number' => [
|
|
||||||
0 => '-117.42 MB',
|
|
||||||
1 => -123123794,
|
|
||||||
2 => -117420000,
|
|
||||||
3 => "-123123793",
|
|
||||||
4 => "-117420000",
|
|
||||||
5 => null,
|
|
||||||
],
|
|
||||||
'megabyte' => [
|
|
||||||
0 => '242.98 MB',
|
|
||||||
1 => 254782996,
|
|
||||||
2 => 242980000,
|
|
||||||
3 => "254782996",
|
|
||||||
4 => "242980000",
|
|
||||||
5 => null,
|
|
||||||
],
|
|
||||||
'megabyte si' => [
|
|
||||||
0 => '254.78 MiB',
|
|
||||||
1 => 267156193,
|
|
||||||
2 => 254780000,
|
|
||||||
3 => "267156193",
|
|
||||||
4 => "254780000",
|
|
||||||
5 => null,
|
|
||||||
],
|
|
||||||
'petabyte' => [
|
|
||||||
0 => '1 EiB',
|
|
||||||
1 => 1152921504606846976,
|
|
||||||
2 => 1000000000000000000,
|
|
||||||
3 => "1152921504606846976",
|
|
||||||
4 => "1000000000000000000",
|
|
||||||
5 => null,
|
|
||||||
],
|
|
||||||
'max int' => [
|
|
||||||
0 => '8 EB',
|
|
||||||
1 => 0,
|
|
||||||
2 => 0,
|
|
||||||
3 => "9223372036854775808",
|
|
||||||
4 => "8000000000000000000",
|
|
||||||
5 => \LengthException::class,
|
|
||||||
],
|
|
||||||
'exabyte, overflow' => [
|
|
||||||
0 => '867.36EB',
|
|
||||||
1 => 0,
|
|
||||||
2 => 0,
|
|
||||||
3 => "999997996235794808832",
|
|
||||||
4 => "867360000000000000000",
|
|
||||||
5 => \LengthException::class,
|
|
||||||
],
|
|
||||||
'huge exabyte, overflow' => [
|
|
||||||
0 => '1000EB',
|
|
||||||
1 => 0,
|
|
||||||
2 => 0,
|
|
||||||
3 => "1152921504606846976000",
|
|
||||||
4 => "1000000000000000000000",
|
|
||||||
5 => \LengthException::class,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -253,22 +227,10 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
* @param string|int|float $input
|
* @param string|int|float $input
|
||||||
* @param string|int|float $expected
|
* @param string|int|float $expected
|
||||||
* @param string|int|float $expected_si
|
* @param string|int|float $expected_si
|
||||||
* @param string|int|float $expected_string
|
|
||||||
* @param string|int|float $expected_string_si
|
|
||||||
* @param ?string $exception
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testStringByteFormat(
|
public function testStringByteFormat($input, $expected, $expected_si): void
|
||||||
string|int|float $input,
|
{
|
||||||
string|int|float $expected,
|
|
||||||
string|int|float $expected_si,
|
|
||||||
string|int|float $expected_string,
|
|
||||||
string|int|float $expected_string_si,
|
|
||||||
?string $exception
|
|
||||||
): void {
|
|
||||||
if ($exception !== null) {
|
|
||||||
$this->expectException($exception);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Convert\Byte::stringByteFormat($input)
|
\CoreLibs\Convert\Byte::stringByteFormat($input)
|
||||||
@@ -277,17 +239,6 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
$expected_si,
|
$expected_si,
|
||||||
\CoreLibs\Convert\Byte::stringByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_SI)
|
\CoreLibs\Convert\Byte::stringByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_SI)
|
||||||
);
|
);
|
||||||
$this->assertEquals(
|
|
||||||
$expected_string,
|
|
||||||
\CoreLibs\Convert\Byte::stringByteFormat($input, \CoreLibs\Convert\Byte::RETURN_AS_STRING)
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_string_si,
|
|
||||||
\CoreLibs\Convert\Byte::stringByteFormat(
|
|
||||||
$input,
|
|
||||||
\CoreLibs\Convert\Byte::BYTE_FORMAT_SI | \CoreLibs\Convert\Byte::RETURN_AS_STRING
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
* @covers ::rgbToHwb
|
* @covers ::rgbToHwb
|
||||||
* @covers ::hsbToRgb
|
* @covers ::hsbToRgb
|
||||||
* @covers ::hslToRgb
|
* @covers ::hslToRgb
|
||||||
* @covers ::hwbToRgb
|
* @covers ::hwebToRgb
|
||||||
* @testdox Convert from and to RGB via HSL, HWB, HSB/V
|
* @testdox Convert from and to RGB via HSL, HWB, HSB/V
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -298,6 +298,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers ::returnAsHex()
|
||||||
* @testdox Convert from and to RGB via hex
|
* @testdox Convert from and to RGB via hex
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -341,6 +342,8 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* linear RGB conversion tests
|
* linear RGB conversion tests
|
||||||
*
|
*
|
||||||
|
* @covers ::fromLinear
|
||||||
|
* @covers ::toLinear
|
||||||
* @testdox Convert from and to RGB linear conversion check
|
* @testdox Convert from and to RGB linear conversion check
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -930,6 +933,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers ::__get
|
||||||
* @testdox Exception handling for RGB general calls
|
* @testdox Exception handling for RGB general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -954,6 +958,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers ::setFromHex
|
||||||
* @testdox Exception handling for RGB setFromHex failues
|
* @testdox Exception handling for RGB setFromHex failues
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -1081,6 +1086,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers ::__get
|
||||||
* @testdox Exception handling for Lab general calls
|
* @testdox Exception handling for Lab general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -1114,6 +1120,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers ::__get
|
||||||
* @testdox Exception handling for LCH general calls
|
* @testdox Exception handling for LCH general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -1148,6 +1155,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers ::__get
|
||||||
* @testdox Exception handling for XYZ general calls
|
* @testdox Exception handling for XYZ general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
|
|||||||
@@ -164,51 +164,6 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* test with flags
|
|
||||||
*
|
|
||||||
* @covers ::jsonConvertToArray
|
|
||||||
* @testdox jsonConvertToArray flag test, if flag is used
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testJsonConvertToArrayWithFlags(): void
|
|
||||||
{
|
|
||||||
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
|
||||||
/* $expected_without_flag = [
|
|
||||||
'valid' => 'json'
|
|
||||||
];
|
|
||||||
$expected_with_flag = [
|
|
||||||
'valid' => 'json',
|
|
||||||
'invalid' => "\xB1\x31"
|
|
||||||
]; */
|
|
||||||
// no idea why in both it throws an erro
|
|
||||||
$expected_without_flag = [];
|
|
||||||
$expected_with_flag = [];
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_without_flag,
|
|
||||||
\CoreLibs\Convert\Json::jsonConvertToArray($input)
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_with_flag,
|
|
||||||
\CoreLibs\Convert\Json::jsonConvertToArray($input, flags:JSON_INVALID_UTF8_IGNORE)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testJsonConvertToArrayRemoveThrowFlag(): void
|
|
||||||
{
|
|
||||||
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
|
||||||
// show NOT throw an exception
|
|
||||||
try {
|
|
||||||
$this->assertEquals(
|
|
||||||
[],
|
|
||||||
\CoreLibs\Convert\Json::jsonConvertToArray($input, flags:JSON_THROW_ON_ERROR)
|
|
||||||
);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$this->fail('Exception was thrown despite flag removal');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test json error states
|
* test json error states
|
||||||
*
|
*
|
||||||
@@ -234,81 +189,6 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* test json error states
|
|
||||||
*
|
|
||||||
* @covers ::jsonValidate
|
|
||||||
* @dataProvider jsonErrorProvider
|
|
||||||
* @testdox jsonValidate $input will be $expected_i/$expected_s [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|null $input
|
|
||||||
* @param int $expected_i
|
|
||||||
* @param string $expected_s
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testJsonValidateGetLastError(?string $input, int $expected_i, string $expected_s): void
|
|
||||||
{
|
|
||||||
\CoreLibs\Convert\Json::jsonValidate($input);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_i,
|
|
||||||
\CoreLibs\Convert\Json::jsonGetLastError()
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_s,
|
|
||||||
\CoreLibs\Convert\Json::jsonGetLastError(true)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* test json validation
|
|
||||||
*
|
|
||||||
* @covers ::jsonValidate
|
|
||||||
* @testdox jsonValidate test valid and invalid json
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testJsonValidate(): void
|
|
||||||
{
|
|
||||||
$this->assertTrue(
|
|
||||||
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}')
|
|
||||||
);
|
|
||||||
$this->assertFalse(
|
|
||||||
\CoreLibs\Convert\Json::jsonValidate('not valid json')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if invalid flag throws exception
|
|
||||||
*
|
|
||||||
* @covers ::jsonValidate
|
|
||||||
* @testdox jsonValidate test exception thrown on invalid flag
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testJsonValidateInvalidFlag(): void
|
|
||||||
{
|
|
||||||
$this->expectException("\InvalidArgumentException");
|
|
||||||
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if valid flag throws no exception
|
|
||||||
*
|
|
||||||
* @covers ::jsonValidate
|
|
||||||
* @testdox jsonValidate test no exception on valid flag
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testJsonValidateValidflag(): void
|
|
||||||
{
|
|
||||||
$this->assertTrue(
|
|
||||||
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 0)
|
|
||||||
);
|
|
||||||
$this->assertTrue(
|
|
||||||
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', JSON_INVALID_UTF8_IGNORE)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -122,9 +122,9 @@ final class CoreLibsConvertMathTest extends TestCase
|
|||||||
public function providerCbrt(): array
|
public function providerCbrt(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'cube root of 2' => [2, 1.25992, 5, null],
|
'cube root of 2' => [2, 1.25992, 5],
|
||||||
'cube root of 3' => [3, 1.44225, 5, null],
|
'cube root of 3' => [3, 1.44225, 5],
|
||||||
'cube root of -1' => [-1, 'NAN', 0, \InvalidArgumentException::class],
|
'cube root of -1' => [-1, 'NAN', 0],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,14 +138,10 @@ final class CoreLibsConvertMathTest extends TestCase
|
|||||||
* @param float|int $number
|
* @param float|int $number
|
||||||
* @param float $expected
|
* @param float $expected
|
||||||
* @param int $round_to
|
* @param int $round_to
|
||||||
* @param ?string $exception
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testCbrt(float|int $number, float|string $expected, int $round_to, ?string $exception): void
|
public function testCbrt(float|int $number, float|string $expected, int $round_to): void
|
||||||
{
|
{
|
||||||
if ($exception !== null) {
|
|
||||||
$this->expectException($exception);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
round(\CoreLibs\Convert\Math::cbrt($number), $round_to)
|
round(\CoreLibs\Convert\Math::cbrt($number), $round_to)
|
||||||
|
|||||||
@@ -671,7 +671,7 @@ final class CoreLibsConvertStringsTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::isValidRegex
|
* @covers ::isValidRegexSimple
|
||||||
* @dataProvider isValidRegexSimpleProvider
|
* @dataProvider isValidRegexSimpleProvider
|
||||||
* @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName]
|
* @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName]
|
||||||
*
|
*
|
||||||
@@ -698,89 +698,6 @@ final class CoreLibsConvertStringsTest extends TestCase
|
|||||||
'Cannot match last preg error string'
|
'Cannot match last preg error string'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function parseCharacterRangesProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'simple a-z' => [
|
|
||||||
['a-z'],
|
|
||||||
implode('', range('a', 'z')),
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'simple A-Z' => [
|
|
||||||
['A-Z'],
|
|
||||||
implode('', range('A', 'Z')),
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'simple 0-9' => [
|
|
||||||
['0-9'],
|
|
||||||
implode('', range('0', '9')),
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'mixed ranges' => [
|
|
||||||
['a-c', 'X-Z', '3-5'],
|
|
||||||
'abcXYZ345',
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'reverse ranges' => [
|
|
||||||
['z-a'],
|
|
||||||
'abcdefghijklmnopqrstuvwxyz',
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'overlapping ranges' => [
|
|
||||||
['a-f', 'd-j'],
|
|
||||||
'abcdefghij',
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'mixed valid and overlap ranges' => [
|
|
||||||
['a-f', 'z-a', '0-3'],
|
|
||||||
'abcdefghijklmnopqrstuvwxyz0123',
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'range without dashes' => [
|
|
||||||
['abcddfff'],
|
|
||||||
'abcdf',
|
|
||||||
null,
|
|
||||||
],
|
|
||||||
'invalid ranges' => [
|
|
||||||
['a-あ', 'A-あ', '0-あ'],
|
|
||||||
'',
|
|
||||||
\InvalidArgumentException::class,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::parseCharacterRanges
|
|
||||||
* @dataProvider parseCharacterRangesProvider
|
|
||||||
* @testdox parseCharacterRanges $input to $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param string $expected
|
|
||||||
* @param string|null $expected_exception
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testParseCharacterRanges(
|
|
||||||
array $input,
|
|
||||||
string $expected,
|
|
||||||
?string $expected_exception
|
|
||||||
): void {
|
|
||||||
if ($expected_exception !== null) {
|
|
||||||
$this->expectException($expected_exception);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
implode('', \CoreLibs\Convert\Strings::parseCharacterRanges(implode('', $input)))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ final class CoreLibsCreateRandomKeyTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::randomKeyGen
|
* @covers ::randomKeyGeyn
|
||||||
* @dataProvider randomKeyGenProvider
|
* @dataProvider randomKeyGenProvider
|
||||||
* @testdox randomKeyGen use $input key length $expected [$_dataName]
|
* @testdox randomKeyGen use $input key length $expected [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ final class CoreLibsCreateSessionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test session start
|
* Test session start
|
||||||
*
|
*
|
||||||
|
* @covers ::startSession
|
||||||
* @dataProvider sessionProvider
|
* @dataProvider sessionProvider
|
||||||
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
|
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ final class CoreLibsCreateUidsTest extends TestCase
|
|||||||
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
||||||
*
|
*
|
||||||
* @covers ::uuidv4
|
* @covers ::uuidv4
|
||||||
|
* @covers ::validateUuidv4
|
||||||
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ use CoreLibs\DB\Support\ConvertPlaceholder;
|
|||||||
* Test class for DB\IO + DB\SQL\PgSQL
|
* Test class for DB\IO + DB\SQL\PgSQL
|
||||||
* This will only test the PgSQL parts
|
* This will only test the PgSQL parts
|
||||||
* @coversDefaultClass \CoreLibs\DB\IO
|
* @coversDefaultClass \CoreLibs\DB\IO
|
||||||
|
* @coversDefaultClass \CoreLibs\DB\SQL\PgSQL
|
||||||
* @testdox \CoreLibs\DB\IO method tests for SQL\PgSQL
|
* @testdox \CoreLibs\DB\IO method tests for SQL\PgSQL
|
||||||
*/
|
*/
|
||||||
final class CoreLibsDBIOTest extends TestCase
|
final class CoreLibsDBIOTest extends TestCase
|
||||||
@@ -123,16 +124,10 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
'log_file_id' => 'CoreLibs-DB-IO-Test',
|
'log_file_id' => 'CoreLibs-DB-IO-Test',
|
||||||
]);
|
]);
|
||||||
// will be true, default logging is true
|
// will be true, default logging is true
|
||||||
try {
|
|
||||||
$db = new \CoreLibs\DB\IO(
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$db_config['valid'],
|
self::$db_config['valid'],
|
||||||
self::$log
|
self::$log
|
||||||
);
|
);
|
||||||
} catch (\Exception $e) {
|
|
||||||
self::markTestSkipped(
|
|
||||||
'Cannot connect to Test DB for DB\IO test: ' . $e->getMessage()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (!$db->dbGetConnectionStatus()) {
|
if (!$db->dbGetConnectionStatus()) {
|
||||||
self::markTestSkipped(
|
self::markTestSkipped(
|
||||||
'Cannot connect to valid Test DB for DB\IO test.'
|
'Cannot connect to valid Test DB for DB\IO test.'
|
||||||
@@ -549,6 +544,8 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test dbSetDbug, dbGetDebug
|
* Test dbSetDbug, dbGetDebug
|
||||||
*
|
*
|
||||||
|
* @covers ::dbGetDbug
|
||||||
|
* @covers ::dbSetDebug
|
||||||
* @testdox Set and Get Debug flag
|
* @testdox Set and Get Debug flag
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -3025,6 +3022,8 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
* @covers ::dbReturnParams
|
* @covers ::dbReturnParams
|
||||||
* @covers ::dbCacheReset
|
* @covers ::dbCacheReset
|
||||||
* @covers ::dbGetCursorExt
|
* @covers ::dbGetCursorExt
|
||||||
|
* @covers ::dbCursorPos
|
||||||
|
* @covers ::dbCursorNumRows
|
||||||
* @dataProvider dbReturnProvider
|
* @dataProvider dbReturnProvider
|
||||||
* @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName]
|
* @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for DB\SqLite
|
||||||
|
* This will only test the SqLite parts
|
||||||
|
* @coversDefaultClass \CoreLibs\DB\SqLite
|
||||||
|
* @testdox \CoreLibs\SqLite method tests for extended DB interface
|
||||||
|
*/
|
||||||
|
final class CoreLibsDBESqLiteTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
if (!extension_loaded('sqlite')) {
|
||||||
|
$this->markTestSkipped(
|
||||||
|
'The SqLite extension is not available.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox DB\SqLite Class tests
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSqLite()
|
||||||
|
{
|
||||||
|
$this->markTestIncomplete(
|
||||||
|
'DB\SqLite Tests have not yet been implemented'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -13,6 +13,29 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsDebugFileWriterTest extends TestCase
|
final class CoreLibsDebugFileWriterTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function fsetFolderProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid log folder name' => [
|
||||||
|
0 => '/tmp/',
|
||||||
|
1 => true,
|
||||||
|
],
|
||||||
|
'invalid log folder name' => [
|
||||||
|
0 => 'some name',
|
||||||
|
1 => false,
|
||||||
|
],
|
||||||
|
'not writeable log folder name' => [
|
||||||
|
0 => '/opt',
|
||||||
|
1 => false,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -62,59 +85,18 @@ final class CoreLibsDebugFileWriterTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @testdox fsetFolder test correct return code
|
* @dataProvider fsetFolderProvider
|
||||||
|
* @testdox fsetFolder $input will match $expected [$_dataName]
|
||||||
*
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param boolean $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testFsetFolder(): void
|
public function testFsetFolder(string $input, bool $expected): void
|
||||||
{
|
{
|
||||||
// check the following
|
|
||||||
// - valid folder, writeable
|
|
||||||
// - valid folder, not writeable
|
|
||||||
// - invalid folder (eg file)
|
|
||||||
// - invalid folder name (eg contains spaces), must match ^[\w\-\/]+
|
|
||||||
|
|
||||||
// if we have no /tmp/ folder, we cannot test this, so skip the test
|
|
||||||
if (!is_dir('/tmp')) {
|
|
||||||
$this->markTestSkipped('No /tmp folder found, cannot test fsetFolder');
|
|
||||||
}
|
|
||||||
// TEST 3:
|
|
||||||
// create a file in /tmp/ to test invalid folder (eg file)
|
|
||||||
$test_file = '/tmp/somefile.txt';
|
|
||||||
if (!is_file($test_file)) {
|
|
||||||
touch($test_file);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
false,
|
$expected,
|
||||||
\CoreLibs\Debug\FileWriter::fsetFolder($test_file)
|
\CoreLibs\Debug\FileWriter::fsetFolder($input)
|
||||||
);
|
|
||||||
// TEST 4:
|
|
||||||
// test invalid folder name (eg contains spaces), must match ^[\w\-\/]+
|
|
||||||
$this->assertEquals(
|
|
||||||
false,
|
|
||||||
\CoreLibs\Debug\FileWriter::fsetFolder('some name')
|
|
||||||
);
|
|
||||||
// TEST 1:
|
|
||||||
// create a folder in /tmp/ to test valid folder, writeable
|
|
||||||
$test_folder = '/tmp/somefolder';
|
|
||||||
if (!is_dir($test_folder)) {
|
|
||||||
mkdir($test_folder);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
|
||||||
true,
|
|
||||||
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
|
|
||||||
);
|
|
||||||
// TEST 2:
|
|
||||||
// create a folder in /tmp/ to test valid folder, not writeable
|
|
||||||
$test_folder = '/tmp/somefolder2';
|
|
||||||
if (!is_dir($test_folder)) {
|
|
||||||
mkdir($test_folder);
|
|
||||||
}
|
|
||||||
// remove all write permissions for the folder
|
|
||||||
chmod($test_folder, 0555);
|
|
||||||
$this->assertEquals(
|
|
||||||
false,
|
|
||||||
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
* @dataProvider printTimeProvider
|
* @dataProvider printTimeProvider
|
||||||
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
||||||
*
|
*
|
||||||
* @param ?int $microtime
|
* @param int|null $mircrotime
|
||||||
* @param string $regex
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testPrintTime(?int $microtime, string $regex): void
|
public function testPrintTime(?int $microtime, string $regex): void
|
||||||
@@ -460,8 +460,10 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @cover ::getCallerFileLine
|
* @cover ::getCallerFileLine
|
||||||
|
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:6434","phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php:6434"]
|
||||||
* @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName]
|
* @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName]
|
||||||
*
|
*
|
||||||
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testGetCallerFileLine(): void
|
public function testGetCallerFileLine(): void
|
||||||
@@ -469,19 +471,15 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
// regex prefix with path "/../" and then fixed vendor + \d+
|
// regex prefix with path "/../" and then fixed vendor + \d+
|
||||||
// or phar start if phiev installed
|
// or phar start if phiev installed
|
||||||
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
|
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
|
||||||
// phar:///usr/local/bin/phpunit/phpunit/Framework/TestCase.php
|
|
||||||
$regex = "/^("
|
$regex = "/^("
|
||||||
. "\/.*\/vendor\/phpunit\/phpunit\/src"
|
. "\/.*\/vendor\/phpunit\/phpunit\/src"
|
||||||
. "|"
|
. "|"
|
||||||
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
|
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
|
||||||
. "|"
|
|
||||||
. "phar:\/\/\/usr\/local\/bin\/phpunit\/phpunit"
|
|
||||||
. ")"
|
. ")"
|
||||||
. "\/Framework\/TestCase.php:\d+$/";
|
. "\/Framework\/TestCase.php:\d+$/";
|
||||||
$this->assertMatchesRegularExpression(
|
$this->assertMatchesRegularExpression(
|
||||||
$regex,
|
$regex,
|
||||||
Support::getCallerFileLine(),
|
Support::getCallerFileLine()
|
||||||
'Failed for: ' . Support::getCallerFileLine()
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,7 +522,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
$compare,
|
$compare,
|
||||||
'assert expected 10: ' . print_r($compare, true)
|
'assert expected 10'
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
@@ -547,20 +545,10 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
$compare,
|
$compare,
|
||||||
'assert expected 11: ' . print_r($compare, true)
|
'assert expected 11'
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
// if compare starts with "main"
|
|
||||||
if ($compare[0] == 'main') {
|
|
||||||
// add two more run after main
|
|
||||||
array_splice(
|
|
||||||
$expected,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
['run', 'run']
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// add two "run" before "runBare"
|
// add two "run" before "runBare"
|
||||||
array_splice(
|
array_splice(
|
||||||
$expected,
|
$expected,
|
||||||
@@ -574,11 +562,10 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
0,
|
0,
|
||||||
['include']
|
['include']
|
||||||
);
|
);
|
||||||
}
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
$compare,
|
$compare,
|
||||||
'assert expected 12: ' . print_r($compare, true)
|
'assert expected 12'
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -602,7 +589,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
if ($call_stack < 8) {
|
if ($call_stack < 8) {
|
||||||
$this->assertFalse(true, 'getCallStack too low: 8');
|
$this->assertFalse(true, 'getCallStack too low: 8');
|
||||||
} else {
|
} else {
|
||||||
$this->assertTrue(true, 'getCallStack ok');
|
$this->assertTrue(true, 'getCallSteck ok');
|
||||||
}
|
}
|
||||||
// just test top entry
|
// just test top entry
|
||||||
$first = array_shift($call_stack);
|
$first = array_shift($call_stack);
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
test.env
|
|
||||||
@@ -442,6 +442,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* init check and connected change translation
|
* init check and connected change translation
|
||||||
*
|
*
|
||||||
* @covers ::getTranslator
|
* @covers ::getTranslator
|
||||||
|
* @covers ::l10nReloadMOfile
|
||||||
* @dataProvider getTranslatorProvider
|
* @dataProvider getTranslatorProvider
|
||||||
* @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName]
|
* @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName]
|
||||||
*
|
*
|
||||||
@@ -638,7 +639,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* plural and plural context
|
* plural and plural context
|
||||||
*
|
*
|
||||||
* @covers ::__n
|
* @covers ::__n
|
||||||
* @covers ::__np
|
* @covers ::__pn
|
||||||
* @dataProvider ngettextProvider
|
* @dataProvider ngettextProvider
|
||||||
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
|
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
|
||||||
*
|
*
|
||||||
@@ -864,7 +865,6 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
string $value,
|
string $value,
|
||||||
string $expected
|
string $expected
|
||||||
): void {
|
): void {
|
||||||
$old_value = null;
|
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case 'global':
|
case 'global':
|
||||||
$GLOBALS[$var] = $value;
|
$GLOBALS[$var] = $value;
|
||||||
@@ -1101,11 +1101,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* fuctions check
|
* fuctions check
|
||||||
* TODO: others d/dn/dp/dnp gettext functions
|
* TODO: others d/dn/dp/dnp gettext functions
|
||||||
*
|
*
|
||||||
* @covers _setlocale
|
* @covers __setlocale
|
||||||
* @covers _bindtextdomain
|
* @covers __bindtextdomain
|
||||||
* @covers _bind_textdomain_codeset
|
* @covers __bind_textdomain_codeset
|
||||||
* @covers _textdomain
|
* @covers __textdomain
|
||||||
* @covers _gettext
|
* @covers __gettext
|
||||||
* @covers __
|
* @covers __
|
||||||
* @dataProvider functionsProvider
|
* @dataProvider functionsProvider
|
||||||
* @testdox check functions with locale $locale and domain $domain [$_dataName]
|
* @testdox check functions with locale $locale and domain $domain [$_dataName]
|
||||||
|
|||||||
@@ -105,15 +105,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
'log_level' => Level::Error,
|
'log_level' => Level::Error,
|
||||||
]);
|
]);
|
||||||
$errorLogTmpfile = tmpfile();
|
|
||||||
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setMessage(
|
$em->setMessage(
|
||||||
$level,
|
$level,
|
||||||
$str
|
$str
|
||||||
);
|
);
|
||||||
// for exceptions if log level is set to catch them
|
|
||||||
$error_log_content = stream_get_contents($errorLogTmpfile);
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
[
|
[
|
||||||
'level' => $expected,
|
'level' => $expected,
|
||||||
@@ -381,8 +377,6 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
?bool $log_warning,
|
?bool $log_warning,
|
||||||
string $expected
|
string $expected
|
||||||
): void {
|
): void {
|
||||||
$errorLogTmpfile = tmpfile();
|
|
||||||
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
|
||||||
$log = new \CoreLibs\Logging\Logging([
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_file_id' => 'testErrorMessagesLogError',
|
'log_file_id' => 'testErrorMessagesLogError',
|
||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
@@ -398,9 +392,6 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
log_error: $log_error,
|
log_error: $log_error,
|
||||||
log_warning: $log_warning
|
log_warning: $log_warning
|
||||||
);
|
);
|
||||||
ini_set('error_log', $errorLogLocationBackup);
|
|
||||||
// for exceptions if log level is set to catch them
|
|
||||||
$error_log_content = stream_get_contents($errorLogTmpfile);
|
|
||||||
$file_content = '';
|
$file_content = '';
|
||||||
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
@@ -456,8 +447,6 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'log_level' => Level::Debug,
|
'log_level' => Level::Debug,
|
||||||
'log_per_run' => true
|
'log_per_run' => true
|
||||||
]);
|
]);
|
||||||
$errorLogTmpfile = tmpfile();
|
|
||||||
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setErrorMsg(
|
$em->setErrorMsg(
|
||||||
$id,
|
$id,
|
||||||
@@ -467,9 +456,6 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
log_error: $log_error,
|
log_error: $log_error,
|
||||||
log_warning: $log_warning
|
log_warning: $log_warning
|
||||||
);
|
);
|
||||||
ini_set('error_log', $errorLogLocationBackup);
|
|
||||||
// for exceptions if log level is set to catch them
|
|
||||||
$error_log_content = stream_get_contents($errorLogTmpfile);
|
|
||||||
$file_content = '';
|
$file_content = '';
|
||||||
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ use CoreLibs\Logging\Logger\Flag;
|
|||||||
final class CoreLibsLoggingLoggingTest extends TestCase
|
final class CoreLibsLoggingLoggingTest extends TestCase
|
||||||
{
|
{
|
||||||
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
||||||
private const REGEX_BASE = "\[[\d\-\s\.:+T]+\]\s{1}" // date, just basic checks
|
private const REGEX_BASE = "\[[\d\-\s\.:]+\]\s{1}" // date
|
||||||
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
||||||
. "\[(phar:\/\/)?[\w\-\.\/]+:\d+\]\s{1}" // folder/file [note phar:// is for phpunit]
|
. "\[(phar:\/\/)?[\w\-\.\/]+:\d+\]\s{1}" // folder/file [note phar:// is for phpunit]
|
||||||
. "\[\w+\]\s{1}" // run id
|
. "\[\w+\]\s{1}" // run id
|
||||||
@@ -514,6 +514,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers Logger\Flag
|
||||||
* @testdox Logger\Flag enum test
|
* @testdox Logger\Flag enum test
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -827,7 +828,6 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
// clean all data in folder first
|
// clean all data in folder first
|
||||||
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
|
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
|
||||||
|
|
||||||
$log_status = false;
|
|
||||||
switch ($level->value) {
|
switch ($level->value) {
|
||||||
case 200:
|
case 200:
|
||||||
$log_status = $log->info($message);
|
$log_status = $log->info($message);
|
||||||
@@ -851,7 +851,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
$log_status = $log->emergency($message);
|
$log_status = $log->emergency($message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$this->assertTrue($log_status, 'log write unsuccessful for level: ' . $level->getName());
|
$this->assertTrue($log_status, 'log write successful');
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
$log->getLogFolder() . $log->getLogFile()
|
$log->getLogFolder() . $log->getLogFile()
|
||||||
) ?: '';
|
) ?: '';
|
||||||
|
|||||||
@@ -334,6 +334,7 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -369,6 +370,7 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -395,6 +397,7 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -421,6 +424,7 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -465,6 +469,7 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -491,6 +496,7 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -515,6 +521,7 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -131,6 +132,7 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -156,6 +158,7 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encryptKey
|
* @covers ::encryptKey
|
||||||
* @covers ::decryptKey
|
* @covers ::decryptKey
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -199,6 +202,7 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -224,6 +228,7 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -247,6 +252,7 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
* @covers ::encryptKey
|
* @covers ::encryptKey
|
||||||
* @covers ::decryptKey
|
* @covers ::decryptKey
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ final class CoreLibsTemplateHtmlBuilderElementTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
* @covers ::Element
|
||||||
* @covers ::buildHtml
|
* @covers ::buildHtml
|
||||||
* @covers ::getTag
|
* @covers ::getTag
|
||||||
* @covers ::getId
|
* @covers ::getId
|
||||||
|
|||||||
@@ -58,12 +58,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
if ($handle === false) {
|
if ($handle === false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
$status = curl_exec($handle);
|
|
||||||
if ($status === false) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$this->url_basic = $url;
|
$this->url_basic = $url;
|
||||||
|
// split out the last / part for url set test
|
||||||
|
curl_close($handle);
|
||||||
// print "Open: $url\n";
|
// print "Open: $url\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -464,14 +461,15 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* set setup + header, base uri change
|
* set setup + header, base uri change
|
||||||
*
|
*
|
||||||
|
* @covers ::Curl
|
||||||
* @covers ::setBaseUri
|
* @covers ::setBaseUri
|
||||||
* @covers ::setHeaders
|
* @covers ::addHeader
|
||||||
* @covers ::removeHeaders
|
* @covers ::removeHEader
|
||||||
* @dataProvider providerUrlRequestsCurlSetup
|
* @dataProvider providerUrlRequestsCurlSetup
|
||||||
* @testdox UrlRequests\Curl Class setup tasks [$_dataName]
|
* @testdox UrlRequests\Curl Class setup tasks [$_dataName]
|
||||||
*
|
*
|
||||||
* @param null|array $config
|
* @param null|array $config
|
||||||
* @param array<string,mixed> $expected_set
|
* @param array $expected
|
||||||
* @param null|string $new_base_uri
|
* @param null|string $new_base_uri
|
||||||
* @param null|array $set_header
|
* @param null|array $set_header
|
||||||
* @param null|bool $set_header_add
|
* @param null|bool $set_header_add
|
||||||
@@ -496,18 +494,10 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
};
|
};
|
||||||
// if ($new_base_uri === null && $set_header === null && $remove_header === null) {
|
// if ($new_base_uri === null && $set_header === null && $remove_header === null) {
|
||||||
// }
|
// }
|
||||||
$this->assertEquals(
|
$this->assertEquals($expected_set, $curl->getConfig(), 'Class setup config mismatch');
|
||||||
$expected_set,
|
|
||||||
$curl->getConfig(),
|
|
||||||
'Class setup config mismatch'
|
|
||||||
);
|
|
||||||
if ($new_base_uri !== null) {
|
if ($new_base_uri !== null) {
|
||||||
$curl->setBaseUri($new_base_uri);
|
$curl->setBaseUri($new_base_uri);
|
||||||
$this->assertEquals(
|
$this->assertEquals($expected_change, $curl->getConfig(), 'new base_uri not matching');
|
||||||
$expected_change,
|
|
||||||
$curl->getConfig(),
|
|
||||||
'new base_uri not matching'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if ($set_header !== null) {
|
if ($set_header !== null) {
|
||||||
if ($set_header_add !== null) {
|
if ($set_header_add !== null) {
|
||||||
@@ -515,19 +505,11 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
} else {
|
} else {
|
||||||
$curl->setHeaders($set_header);
|
$curl->setHeaders($set_header);
|
||||||
}
|
}
|
||||||
$this->assertEquals(
|
$this->assertEquals($expected_change, $curl->getConfig(), 'new headers not matching');
|
||||||
$expected_change,
|
|
||||||
$curl->getConfig(),
|
|
||||||
'new headers not matching'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if ($remove_header !== null) {
|
if ($remove_header !== null) {
|
||||||
$curl->removeHeaders($remove_header);
|
$curl->removeHeaders($remove_header);
|
||||||
$this->assertEquals(
|
$this->assertEquals($expected_change, $curl->getConfig(), 'removed headers not matching');
|
||||||
$expected_change,
|
|
||||||
$curl->getConfig(),
|
|
||||||
'removed headers not matching'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -897,7 +879,7 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
string $return_content
|
string $return_content
|
||||||
) {
|
) {
|
||||||
if (!$this->url_basic) {
|
if (!$this->url_basic) {
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
$this->markTestSkipped('No backend interface setup for testing: GET');
|
||||||
}
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
// options
|
// options
|
||||||
@@ -980,9 +962,6 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testUrlRequestsCurlRequestMultiple()
|
public function testUrlRequestsCurlRequestMultiple()
|
||||||
{
|
{
|
||||||
if (!$this->url_basic) {
|
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
|
||||||
}
|
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
// get
|
// get
|
||||||
$response = $curl->get($this->url_basic, [
|
$response = $curl->get($this->url_basic, [
|
||||||
@@ -990,77 +969,76 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
"query" => ["foo-get" => "bar"]
|
"query" => ["foo-get" => "bar"]
|
||||||
]);
|
]);
|
||||||
$this->assertEquals("200", $response["code"], "multi call: get response code not matching");
|
$this->assertEquals("200", $response["code"], "multi call: get response code not matching");
|
||||||
$request_expected = json_decode(
|
if (PHP_VERSION_ID >= 80400) {
|
||||||
<<<JSON
|
|
||||||
{
|
|
||||||
"HEADERS":{
|
|
||||||
"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",
|
|
||||||
"HTTP_FIRST_CALL":"get","HTTP_ACCEPT":"*\/*",
|
|
||||||
"HTTP_HOST":"soba.egplusww.jp"
|
|
||||||
},
|
|
||||||
"REQUEST_TYPE":"GET",
|
|
||||||
"PARAMS":{"foo-get":"bar"},"BODY":null
|
|
||||||
}
|
|
||||||
JSON,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$request_expected,
|
'{"HEADERS":{"HTTP_HOST":"soba.egplusww.jp",'
|
||||||
json_decode($response['content'], true),
|
. '"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1","HTTP_FIRST_CALL":"get",'
|
||||||
|
. '"HTTP_ACCEPT":"*\/*"},"REQUEST_TYPE":"GET","PARAMS":{"foo-get":"bar"},"BODY":null}',
|
||||||
|
$response['content'],
|
||||||
'multi call: get content not matching'
|
'multi call: get content not matching'
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
'{"HEADERS":{"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",'
|
||||||
|
. '"HTTP_FIRST_CALL":"get","HTTP_ACCEPT":"*\/*",'
|
||||||
|
. '"HTTP_HOST":"soba.egplusww.jp"},'
|
||||||
|
. '"REQUEST_TYPE":"GET",'
|
||||||
|
. '"PARAMS":{"foo-get":"bar"},"BODY":null}',
|
||||||
|
$response['content'],
|
||||||
|
'multi call: get content not matching'
|
||||||
|
);
|
||||||
|
}
|
||||||
// post
|
// post
|
||||||
$response = $curl->post($this->url_basic, [
|
$response = $curl->post($this->url_basic, [
|
||||||
"headers" => ["second-call" => "post"],
|
"headers" => ["second-call" => "post"],
|
||||||
"body" => ["foo-post" => "baz"]
|
"body" => ["foo-post" => "baz"]
|
||||||
]);
|
]);
|
||||||
$this->assertEquals("200", $response["code"], "multi call: post response code not matching");
|
$this->assertEquals("200", $response["code"], "multi call: post response code not matching");
|
||||||
$request_expected = json_decode(
|
if (PHP_VERSION_ID >= 80400) {
|
||||||
<<<JSON
|
|
||||||
{
|
|
||||||
"HEADERS":{
|
|
||||||
"HTTP_HOST":"soba.egplusww.jp",
|
|
||||||
"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",
|
|
||||||
"HTTP_SECOND_CALL":"post",
|
|
||||||
"HTTP_ACCEPT":"*\/*"
|
|
||||||
},
|
|
||||||
"REQUEST_TYPE":"POST",
|
|
||||||
"PARAMS":[],
|
|
||||||
"BODY":{"foo-post":"baz"}
|
|
||||||
}
|
|
||||||
JSON,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$request_expected,
|
'{"HEADERS":{"HTTP_HOST":"soba.egplusww.jp",'
|
||||||
json_decode($response['content'], true),
|
. '"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",'
|
||||||
|
. '"HTTP_SECOND_CALL":"post","HTTP_ACCEPT":"*\/*"},'
|
||||||
|
. '"REQUEST_TYPE":"POST","PARAMS":[],"BODY":{"foo-post":"baz"}}',
|
||||||
|
$response['content'],
|
||||||
'multi call: post content not matching'
|
'multi call: post content not matching'
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
'{"HEADERS":{"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",'
|
||||||
|
. '"HTTP_SECOND_CALL":"post","HTTP_ACCEPT":"*\/*",'
|
||||||
|
. '"HTTP_HOST":"soba.egplusww.jp"},'
|
||||||
|
. '"REQUEST_TYPE":"POST",'
|
||||||
|
. '"PARAMS":[],"BODY":{"foo-post":"baz"}}',
|
||||||
|
$response['content'],
|
||||||
|
'multi call: post content not matching'
|
||||||
|
);
|
||||||
|
}
|
||||||
// delete
|
// delete
|
||||||
$response = $curl->delete($this->url_basic, [
|
$response = $curl->delete($this->url_basic, [
|
||||||
"headers" => ["third-call" => "delete"],
|
"headers" => ["third-call" => "delete"],
|
||||||
]);
|
]);
|
||||||
$this->assertEquals("200", $response["code"], "multi call: delete response code not matching");
|
$this->assertEquals("200", $response["code"], "multi call: delete response code not matching");
|
||||||
$request_expected = json_decode(
|
if (PHP_VERSION_ID >= 80400) {
|
||||||
<<<JSON
|
|
||||||
{
|
|
||||||
"HEADERS":{
|
|
||||||
"HTTP_HOST":"soba.egplusww.jp",
|
|
||||||
"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",
|
|
||||||
"HTTP_THIRD_CALL":"delete","HTTP_ACCEPT":"*\/*"
|
|
||||||
},
|
|
||||||
"REQUEST_TYPE":"DELETE",
|
|
||||||
"PARAMS":[],
|
|
||||||
"BODY":[]
|
|
||||||
}
|
|
||||||
JSON,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$request_expected,
|
'{"HEADERS":{"HTTP_HOST":"soba.egplusww.jp",'
|
||||||
json_decode($response['content'], true),
|
. '"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",'
|
||||||
|
. '"HTTP_THIRD_CALL":"delete","HTTP_ACCEPT":"*\/*"},'
|
||||||
|
. '"REQUEST_TYPE":"DELETE","PARAMS":[],"BODY":[]}',
|
||||||
|
$response['content'],
|
||||||
'multi call: delete content not matching'
|
'multi call: delete content not matching'
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
'{"HEADERS":{"HTTP_USER_AGENT":"CoreLibsUrlRequestCurl\/1",'
|
||||||
|
. '"HTTP_THIRD_CALL":"delete","HTTP_ACCEPT":"*\/*",'
|
||||||
|
. '"HTTP_HOST":"soba.egplusww.jp"},'
|
||||||
|
. '"REQUEST_TYPE":"DELETE",'
|
||||||
|
. '"PARAMS":[],"BODY":[]}',
|
||||||
|
$response['content'],
|
||||||
|
'multi call: delete content not matching'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: auth header set via config
|
// MARK: auth header set via config
|
||||||
@@ -1074,9 +1052,6 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testUrlRequestsCurlAuthHeader()
|
public function testUrlRequestsCurlAuthHeader()
|
||||||
{
|
{
|
||||||
if (!$this->url_basic) {
|
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
|
||||||
}
|
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl([
|
$curl = new \CoreLibs\UrlRequests\Curl([
|
||||||
"auth" => ["user", "pass", "basic"],
|
"auth" => ["user", "pass", "basic"],
|
||||||
"http_errors" => false,
|
"http_errors" => false,
|
||||||
@@ -1143,9 +1118,6 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionInvalidHeaderKey(): void
|
public function testExceptionInvalidHeaderKey(): void
|
||||||
{
|
{
|
||||||
if (!$this->url_basic) {
|
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
|
||||||
}
|
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/InvalidHeaderKey/");
|
$this->expectExceptionMessageMatches("/InvalidHeaderKey/");
|
||||||
@@ -1166,9 +1138,6 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionInvalidHeaderValue(): void
|
public function testExceptionInvalidHeaderValue(): void
|
||||||
{
|
{
|
||||||
if (!$this->url_basic) {
|
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
|
||||||
}
|
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/InvalidHeaderValue/");
|
$this->expectExceptionMessageMatches("/InvalidHeaderValue/");
|
||||||
@@ -1218,9 +1187,6 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionBadRequest(): void
|
public function testExceptionBadRequest(): void
|
||||||
{
|
{
|
||||||
if (!$this->url_basic) {
|
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
|
||||||
}
|
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/ClientError/");
|
$this->expectExceptionMessageMatches("/ClientError/");
|
||||||
@@ -1242,9 +1208,6 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionBadRequestEnable(): void
|
public function testExceptionBadRequestEnable(): void
|
||||||
{
|
{
|
||||||
if (!$this->url_basic) {
|
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
|
||||||
}
|
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]);
|
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]);
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/ClientError/");
|
$this->expectExceptionMessageMatches("/ClientError/");
|
||||||
@@ -1267,9 +1230,6 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionBadRequestUnset(): void
|
public function testExceptionBadRequestUnset(): void
|
||||||
{
|
{
|
||||||
if (!$this->url_basic) {
|
|
||||||
$this->markTestSkipped('No backend interface setup for testing');
|
|
||||||
}
|
|
||||||
// if true, with false it has to be off
|
// if true, with false it has to be off
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
||||||
$response = $curl->request('get', $this->url_basic, [
|
$response = $curl->request('get', $this->url_basic, [
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$set = 0;
|
$set = 0;
|
||||||
foreach (['/../../www', '/../www', '/../../src', '/../src', '/../..', '/..'] as $src) {
|
foreach (['/../../www', '/../www', '/../..', '/..', '/../../src', '/../src'] as $src) {
|
||||||
if (is_file(dirname(__DIR__) . $src . '/vendor/autoload.php')) {
|
if (is_file(dirname(__DIR__) . $src . '/vendor/autoload.php')) {
|
||||||
require dirname(__DIR__) . $src . '/vendor/autoload.php';
|
require dirname(__DIR__) . $src . '/vendor/autoload.php';
|
||||||
$set = 1;
|
$set = 1;
|
||||||
|
|||||||
@@ -119,8 +119,6 @@ On a version update the old phpunit folder in .libs has to be removed and the ne
|
|||||||
|
|
||||||
The original edit.js javascript functions are now in utils.js or utils.min.js.
|
The original edit.js javascript functions are now in utils.js or utils.min.js.
|
||||||
|
|
||||||
The development for those files is located in a different repository
|
The development for thos files is located in a different repository
|
||||||
|
|
||||||
General: <https://[service]/CodeBlocks/JavaScript.utils>
|
https://[service]/CodeBlocks/javascript-utils
|
||||||
|
|
||||||
Org: <https://[serverice]/[org]/Code-Blocks.JavaScript.utils>
|
|
||||||
|
|||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
This software follows the [Semver 2.0 scheme](https://semver.org/).
|
|
||||||
|
|
||||||
## Supported Versions
|
|
||||||
|
|
||||||
Only the latest version is supported
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
Open a ticket to report a secuirty problem
|
|
||||||
+2
-5
@@ -1,11 +1,8 @@
|
|||||||
// https://www.typescriptlang.org/tsconfig/#compilerOptions
|
// https://www.typescriptlang.org/tsconfig/#compilerOptions
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
// if "bundler"
|
"module": "ESNext",
|
||||||
// "module": "ESNext",
|
"moduleResolution": "Node",
|
||||||
"module": "NodeNext",
|
|
||||||
// "bundler" (front), "nodenext" or "node16"
|
|
||||||
"moduleResolution": "nodenext",
|
|
||||||
"target": "ES2020",
|
"target": "ES2020",
|
||||||
"jsx": "react",
|
"jsx": "react",
|
||||||
"checkJs": true,
|
"checkJs": true,
|
||||||
|
|||||||
Generated
+1567
File diff suppressed because it is too large
Load Diff
-19
@@ -10,23 +10,4 @@
|
|||||||
<directory>4dev/tests</directory>
|
<directory>4dev/tests</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
<coverage processUncoveredFiles="true">
|
|
||||||
<include>
|
|
||||||
<directory suffix=".php">./www/lib/CoreLibs</directory>
|
|
||||||
</include>
|
|
||||||
<!-- <report>
|
|
||||||
<html outputDirectory="build/coverage-report"/>
|
|
||||||
</report> -->
|
|
||||||
</coverage>
|
|
||||||
<!-- <source>
|
|
||||||
<include>
|
|
||||||
<directory>./www/lib/CoreLibs</directory>
|
|
||||||
</include>
|
|
||||||
</source> -->
|
|
||||||
<logging>
|
|
||||||
<!-- JUnit XML log (Most Common for CI/CD) -->
|
|
||||||
<junit outputFile="build/logs/junit.xml"/>
|
|
||||||
<!-- TestDox HTML log -->
|
|
||||||
<testdoxHtml outputFile="build/testdox.html"/>
|
|
||||||
</logging>
|
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|||||||
@@ -332,7 +332,7 @@ print "(kosrt, lower case, reverse): "
|
|||||||
|
|
||||||
print "<hr>";
|
print "<hr>";
|
||||||
$nested = [
|
$nested = [
|
||||||
'B' => 'foo', 'a', '0', 9, /** @phpstan-ignore-line This is a test for wrong index */
|
'B' => 'foo', 'a', '0', 9,
|
||||||
'1' => ['z', 'b', 'a'],
|
'1' => ['z', 'b', 'a'],
|
||||||
'd' => ['zaip', 'bar', 'baz']
|
'd' => ['zaip', 'bar', 'baz']
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -74,21 +74,9 @@ foreach ($bytes as $byte) {
|
|||||||
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
|
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
|
||||||
print "(" . number_format($byte) . "/" . $byte . ") bytes :";
|
print "(" . number_format($byte) . "/" . $byte . ") bytes :";
|
||||||
$_bytes = Byte::humanReadableByteFormat($byte);
|
$_bytes = Byte::humanReadableByteFormat($byte);
|
||||||
print '</div>';
|
print '</div><div style="width: 10%;">' . $_bytes;
|
||||||
print '<div style="width: 10%;">' . $_bytes . '</div>';
|
print '</div><div style="width: 10%;">';
|
||||||
print '<div style="width: 40%;">';
|
|
||||||
try {
|
|
||||||
print Byte::stringByteFormat($_bytes);
|
print Byte::stringByteFormat($_bytes);
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "LengthException 1: " . $e->getMessage();
|
|
||||||
try {
|
|
||||||
print "<br>S: " . Byte::stringByteFormat($_bytes, Byte::RETURN_AS_STRING);
|
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "LengthException 2: " . $e->getMessage();
|
|
||||||
} catch (\RuntimeException $e) {
|
|
||||||
print "RuntimeException 1: " . $e->getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "</div>";
|
print "</div>";
|
||||||
//
|
//
|
||||||
print "</div>";
|
print "</div>";
|
||||||
@@ -99,85 +87,13 @@ foreach ($bytes as $byte) {
|
|||||||
print "bytes [si]:";
|
print "bytes [si]:";
|
||||||
$_bytes = Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI);
|
$_bytes = Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI);
|
||||||
print '</div><div style="width: 10%;">' . $_bytes;
|
print '</div><div style="width: 10%;">' . $_bytes;
|
||||||
print '</div><div style="width: 40%;">';
|
print '</div><div style="width: 10%;">';
|
||||||
try {
|
|
||||||
print Byte::stringByteFormat($_bytes);
|
print Byte::stringByteFormat($_bytes);
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "LengthException A: " . $e->getMessage();
|
|
||||||
try {
|
|
||||||
print "<br>Ssi: " . Byte::stringByteFormat($_bytes, Byte::RETURN_AS_STRING | Byte::BYTE_FORMAT_SI);
|
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "LengthException B: " . $e->getMessage();
|
|
||||||
} catch (\RuntimeException $e) {
|
|
||||||
print "RuntimeException A: " . $e->getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "</div>";
|
print "</div>";
|
||||||
//
|
//
|
||||||
print "</div>";
|
print "</div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
$string_bytes = [
|
|
||||||
'-117.42 MB',
|
|
||||||
'242.98 MB',
|
|
||||||
'254.78 MiB',
|
|
||||||
'1 EiB',
|
|
||||||
'8 EB',
|
|
||||||
'867.36EB',
|
|
||||||
'1000EB',
|
|
||||||
'10000EB',
|
|
||||||
];
|
|
||||||
print "<b>BYTE STRING TO BYTES TESTS</b><br>";
|
|
||||||
foreach ($string_bytes as $string) {
|
|
||||||
print '<div style="display: flex; border-bottom: 1px dashed gray;">';
|
|
||||||
//
|
|
||||||
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
|
|
||||||
print "string byte ($string) to bytes :";
|
|
||||||
try {
|
|
||||||
$_bytes = Byte::stringByteFormat($string);
|
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "<br>LengthException A: " . $e->getMessage();
|
|
||||||
$_bytes = 0;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
$_bytes_string = Byte::stringByteFormat($string, Byte::RETURN_AS_STRING);
|
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "<br>LengthException B: " . $e->getMessage();
|
|
||||||
$_bytes_string = '';
|
|
||||||
} catch (\RuntimeException $e) {
|
|
||||||
print "<br>RuntimeException: " . $e->getMessage();
|
|
||||||
$_bytes_string = '';
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
$_bytes_si = Byte::stringByteFormat($string, Byte::BYTE_FORMAT_SI);
|
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "<br>LengthException A: " . $e->getMessage();
|
|
||||||
$_bytes_si = 0;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
$_bytes_string_si = Byte::stringByteFormat($string, Byte::RETURN_AS_STRING | Byte::BYTE_FORMAT_SI);
|
|
||||||
} catch (\LengthException $e) {
|
|
||||||
print "<br>LengthException B: " . $e->getMessage();
|
|
||||||
$_bytes_string_si = '';
|
|
||||||
} catch (\RuntimeException $e) {
|
|
||||||
print "<br>RuntimeException: " . $e->getMessage();
|
|
||||||
$_bytes_string_si = '';
|
|
||||||
}
|
|
||||||
print '</div>';
|
|
||||||
print '<div style="width: 20%;">'
|
|
||||||
. "F:" . number_format((int)$_bytes)
|
|
||||||
. '<br>B: ' . $_bytes
|
|
||||||
. '<br>S: ' . $_bytes_string
|
|
||||||
. "<br>Fsi:" . number_format((int)$_bytes_si)
|
|
||||||
. '<br>Bsi: ' . $_bytes_si
|
|
||||||
. '<br>Ssi: ' . $_bytes_string_si;
|
|
||||||
print '</div>';
|
|
||||||
print '<div style="width: 10%;">';
|
|
||||||
print "B: " . Byte::humanReadableByteFormat($_bytes) . "<br>";
|
|
||||||
print "Bsi: " . Byte::humanReadableByteFormat($_bytes_si, Byte::BYTE_FORMAT_SI);
|
|
||||||
print "</div>";
|
|
||||||
print "</div>";
|
|
||||||
}
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -225,36 +225,6 @@ foreach ($intervals as $interval) {
|
|||||||
print "STRINGTOTIME: $reverse_interval: " . DateTime::stringToTime($reverse_interval) . "<br>";
|
print "STRINGTOTIME: $reverse_interval: " . DateTime::stringToTime($reverse_interval) . "<br>";
|
||||||
}
|
}
|
||||||
print "<hr>";
|
print "<hr>";
|
||||||
$interval_strings = [
|
|
||||||
'10d 5h 30m 15s 123456ms',
|
|
||||||
'18999d 0h 38m 10s 1235ms',
|
|
||||||
'18999 d 0 h 38 m 10s 1235ms',
|
|
||||||
'-2h 15m 5s',
|
|
||||||
'45s 500ms',
|
|
||||||
'0s',
|
|
||||||
'0ms',
|
|
||||||
'1s 5ms',
|
|
||||||
'1s 50ms',
|
|
||||||
'1s 500ms',
|
|
||||||
'1s 5000ms',
|
|
||||||
'10day 5hour 30min 15sec 123456millis',
|
|
||||||
'10day 5hour 30min 15sec 123456millisec',
|
|
||||||
'10day 5hour 30min 15sec 123456msec',
|
|
||||||
'-2days 3hours 15minutes 30seconds 250milliseconds',
|
|
||||||
'',
|
|
||||||
' ',
|
|
||||||
'invalid',
|
|
||||||
];
|
|
||||||
foreach ($interval_strings as $interval_string) {
|
|
||||||
print "STRINGTOTIME: $interval_string: " . DateTime::stringToTime($interval_string) . "<br>";
|
|
||||||
try {
|
|
||||||
// test exception
|
|
||||||
DateTime::stringToTime($interval_string, throw_exception:true);
|
|
||||||
} catch (\InvalidArgumentException $e) {
|
|
||||||
print "ERROR: " . $e->getMessage() . "<br><pre>" . $e . "</pre><br>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "<hr>";
|
|
||||||
$check_dates = [
|
$check_dates = [
|
||||||
'2021-05-01',
|
'2021-05-01',
|
||||||
'2021-05-40'
|
'2021-05-40'
|
||||||
|
|||||||
@@ -0,0 +1,157 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
// turn on all error reporting
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', true);
|
||||||
|
define('DATABASE', 'sqlite' . DIRECTORY_SEPARATOR);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-db';
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
$sql_file = BASE . MEDIA . DATABASE . "class_test.db.sqlite.sq3";
|
||||||
|
|
||||||
|
use CoreLibs\DB\SqLite;
|
||||||
|
use CoreLibs\Debug\Support;
|
||||||
|
use CoreLibs\Convert\SetVarType;
|
||||||
|
|
||||||
|
$log = new CoreLibs\Logging\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'log_file_id' => $LOG_FILE_ID,
|
||||||
|
'log_per_date' => true,
|
||||||
|
]);
|
||||||
|
// db connection and attach logger
|
||||||
|
$db = new CoreLibs\DB\SqLite($log, "sqlite:" . $sql_file);
|
||||||
|
$db->log->debug('START', '=============================>');
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: DB: SqLite';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title></head>";
|
||||||
|
print "<body>";
|
||||||
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
echo "Create Tables on demand<br>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS test (
|
||||||
|
test_id INTEGER PRIMARY KEY,
|
||||||
|
c_text TEXT,
|
||||||
|
c_integer INTEGER,
|
||||||
|
c_integer_default INTEGER DEFAULT -1,
|
||||||
|
c_bool BOOLEAN,
|
||||||
|
c_datetime TEXT,
|
||||||
|
c_datetime_microseconds TEXT,
|
||||||
|
c_datetime_default TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
c_date TEXT,
|
||||||
|
c_julian REAL,
|
||||||
|
c_unixtime DATETIME,
|
||||||
|
c_unixtime_alt DATETIME,
|
||||||
|
c_numeric NUMERIC,
|
||||||
|
c_real REAL,
|
||||||
|
c_blob
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExec($query);
|
||||||
|
// **********************
|
||||||
|
$query = <<<SQL
|
||||||
|
CREATE TABLE IF NOT EXISTS test_no_pk (
|
||||||
|
c_text TEXT,
|
||||||
|
c_integer INTEGER
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExec($query);
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
$table = 'test';
|
||||||
|
echo "Table info for: " . $table . "<br>";
|
||||||
|
|
||||||
|
if (($table_info = $db->dbShowTableMetaData($table)) === false) {
|
||||||
|
print "Read problem for: $table<br>";
|
||||||
|
} else {
|
||||||
|
print "TABLE INFO: <pre>" . print_r($table_info, true) . "</pre><br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
echo "Insert into 'test'<br>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
INSERT INTO test (
|
||||||
|
c_text, c_integer, c_bool,
|
||||||
|
c_datetime, c_datetime_microseconds, c_date,
|
||||||
|
c_julian, c_unixtime, c_unixtime_alt,
|
||||||
|
c_numeric, c_real, c_blob
|
||||||
|
) VALUES (
|
||||||
|
?, ?, ?,
|
||||||
|
?, ?, ?,
|
||||||
|
julianday(?), ?, unixepoch(?),
|
||||||
|
?, ?, ?
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExecParams($query, [
|
||||||
|
'test', rand(1, 100), true,
|
||||||
|
date('Y-m-d H:i:s'), date_format(date_create("now"), 'Y-m-d H:i:s.u'), date('Y-m-d'),
|
||||||
|
// julianday pass through
|
||||||
|
date('Y-m-d H:i:s'),
|
||||||
|
// use "U" if no unixepoch in query
|
||||||
|
date('U'), date('Y-m-d H:i:s'),
|
||||||
|
1.5, 10.5, 'Anything'
|
||||||
|
]);
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
echo "Insert into 'test_no_pk'<br>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
INSERT INTO test_no_pk (
|
||||||
|
c_text, c_integer
|
||||||
|
) VALUES (
|
||||||
|
?, ?
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$db->dbExecParams($query, ['test no pk', rand(100, 200)]);
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
SELECT test_id, c_text, c_integer, c_integer_default, c_datetime_default
|
||||||
|
FROM test
|
||||||
|
SQL;
|
||||||
|
while (is_array($row = $db->dbReturnArray($query))) {
|
||||||
|
print "ROW: PK(test_id): " . $row["test_id"]
|
||||||
|
. ", Text: " . $row["c_text"] . ", Int: " . $row["c_integer"]
|
||||||
|
. ", Int Default: " . $row["c_integer_default"]
|
||||||
|
. ", Date Default: " . $row["c_datetime_default"]
|
||||||
|
. "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "<hr>";
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
SELECT rowid, c_text, c_integer
|
||||||
|
FROM test_no_pk
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
while (is_array($row = $db->dbReturnArray($query))) {
|
||||||
|
print "ROW[CURSOR]: PK(rowid): " . $row["rowid"]
|
||||||
|
. ", Text: " . $row["c_text"] . ", Int: " . $row["c_integer"]
|
||||||
|
. "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -68,14 +68,6 @@ function test2(): array
|
|||||||
return DebugSupport::getCallerMethodList(1);
|
return DebugSupport::getCallerMethodList(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// date stueff
|
|
||||||
print "printTime(-1): " . DebugSupport::printTime() . "<br>";
|
|
||||||
print "printTime(2): " . DebugSupport::printTime(2) . "<br>";
|
|
||||||
print "printTime(3): " . DebugSupport::printTime(3) . "<br>";
|
|
||||||
print "printTime(5): " . DebugSupport::printTime(5) . "<br>";
|
|
||||||
print "printIsoTime(): " . DebugSupport::printIsoTime() . "<br>";
|
|
||||||
print "printIsoTime(false): " . DebugSupport::printIsoTime(false) . "<br>";
|
|
||||||
|
|
||||||
print "S::GETCALLERMETHOD: " . DebugSupport::getCallerMethod(0) . "<br>";
|
print "S::GETCALLERMETHOD: " . DebugSupport::getCallerMethod(0) . "<br>";
|
||||||
print "S::GETCALLERMETHOD: " . test() . "<br>";
|
print "S::GETCALLERMETHOD: " . test() . "<br>";
|
||||||
print "S::GETCALLERMETHODLIST: <pre>" . print_r(test2(), true) . "</pre><br>";
|
print "S::GETCALLERMETHODLIST: <pre>" . print_r(test2(), true) . "</pre><br>";
|
||||||
@@ -154,7 +146,7 @@ print "LOG LEVEL: " . DebugSupport::printAr(\CoreLibs\Convert\SetVarType::setAr
|
|||||||
$new_log->getLogLevel('debug', 'on')
|
$new_log->getLogLevel('debug', 'on')
|
||||||
)) . "<br>";
|
)) . "<br>";
|
||||||
|
|
||||||
echo "<b>CLASS DEBUG CALL LEGACY</b><br>";
|
echo "<b>CLASS DEBUG CALL</b><br>";
|
||||||
|
|
||||||
// @codingStandardsIgnoreLine
|
// @codingStandardsIgnoreLine
|
||||||
class TestL
|
class TestL
|
||||||
|
|||||||
@@ -40,8 +40,6 @@ print "Log ERROR: " . $log->prAr($em->getFlagLogError()) . "<br>";
|
|||||||
print "FN: " . ml::fromName('Affe')->name . "<br>";
|
print "FN: " . ml::fromName('Affe')->name . "<br>";
|
||||||
print "NU: " . ml::fromValue(100)->name . "<br>";
|
print "NU: " . ml::fromValue(100)->name . "<br>";
|
||||||
print "NU: " . ml::fromValue(1000)->name . "<br>";
|
print "NU: " . ml::fromValue(1000)->name . "<br>";
|
||||||
print "OK.: " . ml::ok->name . "<br>";
|
|
||||||
print "OK^: " . ml::fromName('OK')->name . "<br>";
|
|
||||||
|
|
||||||
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug');
|
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug');
|
||||||
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style');
|
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style');
|
||||||
@@ -58,14 +56,6 @@ $em->setErrorMsg('100-2', 'error', 'Input wring', jump_target:['target' => 'foo-
|
|||||||
$em->setMessage('error', 'I have no id set', jump_target:['target' => 'bar-123', 'info' => 'Jump Bar']);
|
$em->setMessage('error', 'I have no id set', jump_target:['target' => 'bar-123', 'info' => 'Jump Bar']);
|
||||||
$em->setMessage('error', 'Jump empty', jump_target:['target' => 'bar-empty']);
|
$em->setMessage('error', 'Jump empty', jump_target:['target' => 'bar-empty']);
|
||||||
|
|
||||||
function inLine(\CoreLibs\Logging\ErrorMessage $em): void
|
|
||||||
{
|
|
||||||
$em->log->error('Direct log before from ', context:['function' => __FUNCTION__]);
|
|
||||||
$em->setMessage('error', 'Inline call', context:['test' => 'inLine Function']);
|
|
||||||
$em->log->error('Direct log from ', context:['function' => __FUNCTION__]);
|
|
||||||
}
|
|
||||||
inLine($em);
|
|
||||||
|
|
||||||
print "ErrorsLast: <pre>" . $log->prAr($em->getLastErrorMsg()) . "</pre>";
|
print "ErrorsLast: <pre>" . $log->prAr($em->getLastErrorMsg()) . "</pre>";
|
||||||
print "ErrorsIds: <pre>" . $log->prAr($em->getErrorIds()) . "</pre>";
|
print "ErrorsIds: <pre>" . $log->prAr($em->getErrorIds()) . "</pre>";
|
||||||
print "Errors: <pre>" . $log->prAr($em->getErrorMsg()) . "</pre>";
|
print "Errors: <pre>" . $log->prAr($em->getErrorMsg()) . "</pre>";
|
||||||
|
|||||||
@@ -38,25 +38,6 @@ print "GETFILENAMEENDING: $file: " . File::getFilenameEnding($file) . "<br>";
|
|||||||
$file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php';
|
$file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php';
|
||||||
print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "<br>";
|
print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "<br>";
|
||||||
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
|
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
|
||||||
try {
|
|
||||||
print "MIMEINFO: does_not_exists.txt " . File::getMimeType("does_not_exists.txt") . "<br>";
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
print "Error: " . get_class($e) . ": " . $e->getMessage() . "<br>";
|
|
||||||
}
|
|
||||||
|
|
||||||
$files = [
|
|
||||||
'layout/css/edit.css',
|
|
||||||
'layout/javascript/edit.jq.js',
|
|
||||||
'class_test.file.php',
|
|
||||||
getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php',
|
|
||||||
];
|
|
||||||
foreach ($files as $file) {
|
|
||||||
try {
|
|
||||||
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
print "Error: " . get_class($e) . ": " . $e->getMessage() . "<br>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ $json = '["f: {b"""ar}]';
|
|||||||
$output = Json::jsonConvertToArray($json);
|
$output = Json::jsonConvertToArray($json);
|
||||||
print "S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
print "S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
||||||
print "S::E-JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
print "S::E-JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
||||||
print "S::E Validate: " . Json::jsonValidate($json) . ": " . Json::jsonGetLastError(true) . "<br>";
|
|
||||||
|
|
||||||
// direct
|
// direct
|
||||||
$json = '{"direct": "static function call"}';
|
$json = '{"direct": "static function call"}';
|
||||||
@@ -59,24 +58,6 @@ $output = $json_class::jsonConvertToArray($json);
|
|||||||
print "J/S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
print "J/S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
||||||
print "J/S::E-JSON ERROR: " . $json_class::jsonGetLastError() . ": " . $json_class::jsonGetLastError(true) . "<br>";
|
print "J/S::E-JSON ERROR: " . $json_class::jsonGetLastError() . ": " . $json_class::jsonGetLastError(true) . "<br>";
|
||||||
|
|
||||||
echo "<hr>";
|
|
||||||
$json = '{"valid":"json","invalid":"\xB1\x31"}';
|
|
||||||
// $json = '{"valid":"json","invalid":"abc\x80def"}';
|
|
||||||
$output_no_flag = Json::jsonConvertToArray($json);
|
|
||||||
print "No Flag JSON: $json: " . DgS::printAr($output_no_flag) . "<br>";
|
|
||||||
print "No Flag JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
|
||||||
$output_flag = Json::jsonConvertToArray($json, flags:JSON_INVALID_UTF8_IGNORE);
|
|
||||||
print "No Flag JSON: $json: " . DgS::printAr($output_flag) . "<br>";
|
|
||||||
print "No Flag JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
|
||||||
$output_raw = json_decode($json, true, flags:JSON_INVALID_UTF8_IGNORE);
|
|
||||||
print "No Flag JSON RAW (F-1): $json: " . DgS::printAr($output_raw) . "<br>";
|
|
||||||
$output_raw = json_decode($json, true, flags:JSON_INVALID_UTF8_SUBSTITUTE);
|
|
||||||
print "No Flag JSON RAW (F-2): $json: " . DgS::printAr($output_raw) . "<br>";
|
|
||||||
$output_raw = json_decode($json, true);
|
|
||||||
print "No Flag JSON RAW: $json: " . DgS::printAr($output_raw) . "<br>";
|
|
||||||
echo "<hr>";
|
|
||||||
|
|
||||||
|
|
||||||
// $json = '{"foo": "bar"}';
|
// $json = '{"foo": "bar"}';
|
||||||
// $output = Jason::jsonConvertToArray($json);
|
// $output = Jason::jsonConvertToArray($json);
|
||||||
// print "S::JSON: $json: " . DgS::printAr($output) . "<br>";
|
// print "S::JSON: $json: " . DgS::printAr($output) . "<br>";
|
||||||
|
|||||||
@@ -121,12 +121,6 @@ Class TestP
|
|||||||
public function test(): void
|
public function test(): void
|
||||||
{
|
{
|
||||||
$this->log->info('TestL::test call');
|
$this->log->info('TestL::test call');
|
||||||
$this->subCall();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function subCall(): void
|
|
||||||
{
|
|
||||||
$this->log->info('TestL::sub_call call');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,20 +34,6 @@ print "<body>";
|
|||||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
$output = RandomKey::randomKeyGen(
|
|
||||||
12,
|
|
||||||
[
|
|
||||||
0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G', 7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K',
|
|
||||||
11 => 'L', 12 => 'M', 13 => 'N', 14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U',
|
|
||||||
21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b', 28 => 'c', 29 => 'd', 30 => 'e',
|
|
||||||
31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i', 35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o',
|
|
||||||
41 => 'p', 42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w', 49 => 'x', 50 => 'y',
|
|
||||||
51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3', 56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8',
|
|
||||||
61 => '9'
|
|
||||||
]
|
|
||||||
);
|
|
||||||
print "CUSTOM OUTPUT: " . $output . "<br>";
|
|
||||||
|
|
||||||
$key_length = 10;
|
$key_length = 10;
|
||||||
$key_length_b = 5;
|
$key_length_b = 5;
|
||||||
$key_lenght_long = 64;
|
$key_lenght_long = 64;
|
||||||
@@ -68,7 +54,6 @@ print "===<Br>";
|
|||||||
$_array = new CoreLibs\Create\RandomKey(['A', 'F', 'B'], ['1', '5', '9']);
|
$_array = new CoreLibs\Create\RandomKey(['A', 'F', 'B'], ['1', '5', '9']);
|
||||||
print "C->RANDOMKEYGEN(pre set): " . $_array->randomKeyGen() . "<br>";
|
print "C->RANDOMKEYGEN(pre set): " . $_array->randomKeyGen() . "<br>";
|
||||||
|
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -122,16 +122,6 @@ print "Combined strings A: "
|
|||||||
. Strings::buildCharStringFromLists(['A', 'B', 'C'], ['0', '1', '2']) . "<br>";
|
. Strings::buildCharStringFromLists(['A', 'B', 'C'], ['0', '1', '2']) . "<br>";
|
||||||
print "Combined strings B: "
|
print "Combined strings B: "
|
||||||
. Strings::buildCharStringFromLists([['F'], ['G'], 'H'], [['5', ['6']], ['0'], '1', '2']) . "<br>";
|
. Strings::buildCharStringFromLists([['F'], ['G'], 'H'], [['5', ['6']], ['0'], '1', '2']) . "<br>";
|
||||||
print "Combined strings C: "
|
|
||||||
. Strings::buildCharStringFromLists([
|
|
||||||
0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G', 7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K',
|
|
||||||
11 => 'L', 12 => 'M', 13 => 'N', 14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U',
|
|
||||||
21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b', 28 => 'c', 29 => 'd', 30 => 'e',
|
|
||||||
31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i', 35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o',
|
|
||||||
41 => 'p', 42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w', 49 => 'x', 50 => 'y',
|
|
||||||
51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3', 56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8',
|
|
||||||
61 => '9'
|
|
||||||
]) . "<br>";
|
|
||||||
|
|
||||||
$input_string = "AaBbCc";
|
$input_string = "AaBbCc";
|
||||||
print "Unique: " . Strings::removeDuplicates($input_string) . "<br>";
|
print "Unique: " . Strings::removeDuplicates($input_string) . "<br>";
|
||||||
@@ -150,28 +140,6 @@ $preg_error = Strings::isValidRegex($regex_string);
|
|||||||
print "[B] LAST PREGE ERROR: " . preg_last_error() . " -> "
|
print "[B] LAST PREGE ERROR: " . preg_last_error() . " -> "
|
||||||
. Strings::getLastRegexErrorString() . " -> " . preg_last_error_msg() . "<br>";
|
. Strings::getLastRegexErrorString() . " -> " . preg_last_error_msg() . "<br>";
|
||||||
|
|
||||||
$base_strings = [
|
|
||||||
'abcddfff',
|
|
||||||
'A-Z',
|
|
||||||
'a-z',
|
|
||||||
'A-Za-z',
|
|
||||||
'A-Df-g',
|
|
||||||
'A-D0-9',
|
|
||||||
'D-A7-0',
|
|
||||||
'A-FB-G',
|
|
||||||
'0-9',
|
|
||||||
'あ-お',
|
|
||||||
'ア-オ',
|
|
||||||
];
|
|
||||||
foreach ($base_strings as $string) {
|
|
||||||
try {
|
|
||||||
$parsed = Strings::parseCharacterRanges($string);
|
|
||||||
print "Parsed ranges for '$string': " . DgS::printAr($parsed) . "<br>";
|
|
||||||
} catch (\InvalidArgumentException $e) {
|
|
||||||
print "Error parsing ranges for '$string': " . $e->getMessage() . "<br>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -56,8 +56,6 @@ print "UNIQU ID LONG : " . Uids::uniqIdLong() . "<br>";
|
|||||||
$uuidv4 = Uids::uuidv4();
|
$uuidv4 = Uids::uuidv4();
|
||||||
if (!Uids::validateUuuidv4($uuidv4)) {
|
if (!Uids::validateUuuidv4($uuidv4)) {
|
||||||
print "Invalid UUIDv4: " . $uuidv4 . "<br>";
|
print "Invalid UUIDv4: " . $uuidv4 . "<br>";
|
||||||
} else {
|
|
||||||
print "Valid UUIDv4: " . $uuidv4 . "<br>";
|
|
||||||
}
|
}
|
||||||
if (!Uids::validateUuuidv4("foobar")) {
|
if (!Uids::validateUuuidv4("foobar")) {
|
||||||
print "Invalid UUIDv4: hard coded<Br>";
|
print "Invalid UUIDv4: hard coded<Br>";
|
||||||
|
|||||||
@@ -134,8 +134,8 @@ function setCenter(id, left, top)
|
|||||||
{
|
{
|
||||||
// get size of id
|
// get size of id
|
||||||
var dimensions = {
|
var dimensions = {
|
||||||
height: $('#' + id).height() ?? 0,
|
height: $('#' + id).height(),
|
||||||
width: $('#' + id).width() ?? 0
|
width: $('#' + id).width()
|
||||||
};
|
};
|
||||||
var type = $('#' + id).css('position');
|
var type = $('#' + id).css('position');
|
||||||
var viewport = getWindowSize();
|
var viewport = getWindowSize();
|
||||||
@@ -146,14 +146,14 @@ function setCenter(id, left, top)
|
|||||||
// console.log('Left: %s, Top: %s (%s)', parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left), parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top), parseInt((viewport.height / 2) - (dimensions.height / 2)));
|
// console.log('Left: %s, Top: %s (%s)', parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left), parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top), parseInt((viewport.height / 2) - (dimensions.height / 2)));
|
||||||
if (left) {
|
if (left) {
|
||||||
$('#' + id).css({
|
$('#' + id).css({
|
||||||
left: ((viewport.width / 2) - (dimensions.width / 2) + offset.left) + 'px'
|
left: parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left) + 'px'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (top) {
|
if (top) {
|
||||||
// if we have fixed, we do not add the offset, else it moves out of the screen
|
// if we have fixed, we do not add the offset, else it moves out of the screen
|
||||||
var top_pos = type == 'fixed' ?
|
var top_pos = type == 'fixed' ?
|
||||||
(viewport.height / 2) - (dimensions.height / 2) :
|
parseInt((viewport.height / 2) - (dimensions.height / 2)) :
|
||||||
(viewport.height / 2) - (dimensions.height / 2) + offset.top;
|
parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top);
|
||||||
$('#' + id).css({
|
$('#' + id).css({
|
||||||
top: top_pos + 'px'
|
top: top_pos + 'px'
|
||||||
});
|
});
|
||||||
@@ -1598,17 +1598,4 @@ function createNavMenu(nav_menu, header_id = 'mainHeader') // eslint-disable-lin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* HTML decode &something; entrie
|
|
||||||
* @param {string} str
|
|
||||||
* @returns string
|
|
||||||
* @deprecated use utils.js
|
|
||||||
*/
|
|
||||||
function decodeHtmlEntities(str) // eslint-disable-line no-unused-vars
|
|
||||||
{
|
|
||||||
const parser = new DOMParser();
|
|
||||||
const doc = parser.parseFromString(str, 'text/html');
|
|
||||||
return doc.documentElement.textContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|||||||
-9680
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -46,15 +46,10 @@ function runFunctionArgsArray(name, args) {
|
|||||||
fn.apply(window, args);
|
fn.apply(window, args);
|
||||||
}
|
}
|
||||||
function isObject(val) {
|
function isObject(val) {
|
||||||
return val !== null && typeof val === "object" && !Array.isArray(val);
|
if (val === null) {
|
||||||
}
|
return false;
|
||||||
function isArray(val) {
|
}
|
||||||
return val !== null && Array.isArray(val);
|
return typeof val === "function" || typeof val === "object";
|
||||||
}
|
|
||||||
function isIterable(val) {
|
|
||||||
if (val == null) return false;
|
|
||||||
if (typeof val[Symbol.iterator] === "function" && typeof val !== "string") return true;
|
|
||||||
return typeof val === "object" && val.constructor === Object;
|
|
||||||
}
|
}
|
||||||
function getObjectCount(object) {
|
function getObjectCount(object) {
|
||||||
if (!isObject(object)) {
|
if (!isObject(object)) {
|
||||||
@@ -135,7 +130,7 @@ var HtmlElementCreator = class {
|
|||||||
* @param {String} tag must set tag (div, span, etc)
|
* @param {String} tag must set tag (div, span, etc)
|
||||||
* @param {String} [id=''] optional set for id, if input, select will be used for name
|
* @param {String} [id=''] optional set for id, if input, select will be used for name
|
||||||
* @param {String} [content=''] text content inside, is skipped if sub elements exist
|
* @param {String} [content=''] text content inside, is skipped if sub elements exist
|
||||||
* @param {Array<String>} [css=[]] array for css tags
|
* @param {Array} [css=[]] array for css tags
|
||||||
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
|
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
|
||||||
* @return {Object} created element as an object
|
* @return {Object} created element as an object
|
||||||
*/
|
*/
|
||||||
@@ -163,7 +158,7 @@ var HtmlElementCreator = class {
|
|||||||
if (base.id == id) {
|
if (base.id == id) {
|
||||||
base.sub.push(deepCopyFunction(attach));
|
base.sub.push(deepCopyFunction(attach));
|
||||||
} else {
|
} else {
|
||||||
if (isArray(base.sub) && base.sub.length > 0) {
|
if (isObject(base.sub) && base.sub.length > 0) {
|
||||||
for (var i = 0; i < base.sub.length; i++) {
|
for (var i = 0; i < base.sub.length; i++) {
|
||||||
this.ael(base.sub[i], attach, id);
|
this.ael(base.sub[i], attach, id);
|
||||||
}
|
}
|
||||||
@@ -302,7 +297,7 @@ var HtmlElementCreator = class {
|
|||||||
line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
|
line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isArray(tree.css) && tree.css.length > 0) {
|
if (isObject(tree.css) && tree.css.length > 0) {
|
||||||
line += ' class="';
|
line += ' class="';
|
||||||
for (i = 0; i < tree.css.length; i++) {
|
for (i = 0; i < tree.css.length; i++) {
|
||||||
line += tree.css[i] + " ";
|
line += tree.css[i] + " ";
|
||||||
@@ -319,7 +314,7 @@ var HtmlElementCreator = class {
|
|||||||
}
|
}
|
||||||
line += ">";
|
line += ">";
|
||||||
content.push(line);
|
content.push(line);
|
||||||
if (isArray(tree.sub) && tree.sub.length > 0) {
|
if (isObject(tree.sub) && tree.sub.length > 0) {
|
||||||
if (tree.content) {
|
if (tree.content) {
|
||||||
content.push(tree.content);
|
content.push(tree.content);
|
||||||
}
|
}
|
||||||
@@ -509,11 +504,6 @@ function numberWithCommas(number) {
|
|||||||
function convertLBtoBR(string) {
|
function convertLBtoBR(string) {
|
||||||
return string.replace(/(?:\r\n|\r|\n)/g, "<br>");
|
return string.replace(/(?:\r\n|\r|\n)/g, "<br>");
|
||||||
}
|
}
|
||||||
function decodeHtmlEntities(str) {
|
|
||||||
const parser = new DOMParser();
|
|
||||||
const doc = parser.parseFromString(str, "text/html");
|
|
||||||
return doc.documentElement.textContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// src/utils/DateTimeHelpers.mjs
|
// src/utils/DateTimeHelpers.mjs
|
||||||
function getTimestamp() {
|
function getTimestamp() {
|
||||||
@@ -665,19 +655,18 @@ function getQueryStringParam(search = "", query = "", single = false) {
|
|||||||
if (search) {
|
if (search) {
|
||||||
let _params = url.searchParams.getAll(search);
|
let _params = url.searchParams.getAll(search);
|
||||||
if (_params.length == 1 || single === true) {
|
if (_params.length == 1 || single === true) {
|
||||||
return _params[0];
|
param = _params[0];
|
||||||
} else if (_params.length > 1) {
|
} else if (_params.length > 1) {
|
||||||
return _params;
|
param = _params;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let param2 = {};
|
param = {};
|
||||||
for (const [key] of url.searchParams.entries()) {
|
for (const [key] of url.searchParams.entries()) {
|
||||||
if (typeof param2[key] === "undefined") {
|
if (typeof param[key] === "undefined") {
|
||||||
let _params = url.searchParams.getAll(key);
|
let _params = url.searchParams.getAll(key);
|
||||||
param2[key] = _params.length < 2 || single === true ? _params[0] : _params;
|
param[key] = _params.length < 2 || single === true ? _params[0] : _params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return param2;
|
|
||||||
}
|
}
|
||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
@@ -1342,17 +1331,6 @@ var LoginNavMenu = class {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// src/utils/BrowserDetect.mjs
|
|
||||||
function isWebkit() {
|
|
||||||
return "GestureEvent" in window;
|
|
||||||
}
|
|
||||||
function isMobileWebKit() {
|
|
||||||
return "ongesturechange" in window;
|
|
||||||
}
|
|
||||||
function isDesktopWebKit() {
|
|
||||||
return typeof window !== "undefined" && "safari" in window && "pushNotification" in window.safari;
|
|
||||||
}
|
|
||||||
|
|
||||||
// src/utils.mjs
|
// src/utils.mjs
|
||||||
var aiob = new ActionIndicatorOverlayBox();
|
var aiob = new ActionIndicatorOverlayBox();
|
||||||
var hec = new HtmlElementCreator();
|
var hec = new HtmlElementCreator();
|
||||||
@@ -1431,9 +1409,6 @@ function numberWithCommas2(x) {
|
|||||||
function convertLBtoBR2(string) {
|
function convertLBtoBR2(string) {
|
||||||
return convertLBtoBR(string);
|
return convertLBtoBR(string);
|
||||||
}
|
}
|
||||||
function decodeHtmlEntities2(string) {
|
|
||||||
return decodeHtmlEntities(string);
|
|
||||||
}
|
|
||||||
function getTimestamp2() {
|
function getTimestamp2() {
|
||||||
return getTimestamp();
|
return getTimestamp();
|
||||||
}
|
}
|
||||||
@@ -1458,12 +1433,6 @@ function executeFunctionByName2(functionName, context) {
|
|||||||
function isObject2(val) {
|
function isObject2(val) {
|
||||||
return isObject(val);
|
return isObject(val);
|
||||||
}
|
}
|
||||||
function isArray2(val) {
|
|
||||||
return isArray(val);
|
|
||||||
}
|
|
||||||
function isIterable2(val) {
|
|
||||||
return isIterable(val);
|
|
||||||
}
|
|
||||||
function getObjectCount2(object) {
|
function getObjectCount2(object) {
|
||||||
return getObjectCount(object);
|
return getObjectCount(object);
|
||||||
}
|
}
|
||||||
@@ -1558,7 +1527,7 @@ function acssel(_element, css) {
|
|||||||
return hec.acssel(_element, css);
|
return hec.acssel(_element, css);
|
||||||
}
|
}
|
||||||
function scssel(_element, rcss, acss) {
|
function scssel(_element, rcss, acss) {
|
||||||
return hec.scssel(_element, rcss, acss);
|
hec.scssel(_element, rcss, acss);
|
||||||
}
|
}
|
||||||
function phfo(tree) {
|
function phfo(tree) {
|
||||||
return hec.phfo(tree);
|
return hec.phfo(tree);
|
||||||
@@ -1644,12 +1613,3 @@ function createActionBox(target_id = "actionBox", title = "", contents = {}, hea
|
|||||||
function adjustActionBoxHeight(target_id = "actionBox", override = 0, content_override = 0) {
|
function adjustActionBoxHeight(target_id = "actionBox", override = 0, content_override = 0) {
|
||||||
ab.adjustActionBoxHeight(target_id, override, content_override);
|
ab.adjustActionBoxHeight(target_id, override, content_override);
|
||||||
}
|
}
|
||||||
function isWebkit2() {
|
|
||||||
return isWebkit();
|
|
||||||
}
|
|
||||||
function isMobileWebKit2() {
|
|
||||||
return isMobileWebKit();
|
|
||||||
}
|
|
||||||
function isDesktopWebKit2() {
|
|
||||||
return isDesktopWebKit();
|
|
||||||
}
|
|
||||||
|
|||||||
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
@@ -17,13 +17,13 @@
|
|||||||
"repositories": {
|
"repositories": {
|
||||||
"git.egplusww.jp.Composer": {
|
"git.egplusww.jp.Composer": {
|
||||||
"type": "composer",
|
"type": "composer",
|
||||||
"url": "https://packages.omnicomproduction.jp/api/packages/Composer/composer"
|
"url": "https://git.egplusww.jp/api/packages/Composer/composer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"egrajp/smarty-extended": "^5.4",
|
"egrajp/smarty-extended": "^5.4",
|
||||||
"php": ">=8.1",
|
"php": ">=8.1",
|
||||||
"gullevek/dotenv": "^3.0",
|
"gullevek/dotenv": "^2.0",
|
||||||
"psr/log": "^2.0 || ^3.0",
|
"psr/log": "^2.0 || ^3.0",
|
||||||
"php-privacy/openpgp": "^2.1"
|
"php-privacy/openpgp": "^2.1"
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -10,16 +10,12 @@ class Email
|
|||||||
/** @var array<int,string> */
|
/** @var array<int,string> */
|
||||||
private static array $email_regex_check = [
|
private static array $email_regex_check = [
|
||||||
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
// . "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
|
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
|
||||||
// fixed pattern matching for domain
|
|
||||||
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$", // MASTER
|
|
||||||
1 => "@(.*)@(.*)", // double @
|
1 => "@(.*)@(.*)", // double @
|
||||||
2 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
|
2 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
|
||||||
// 3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
|
3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
|
||||||
3 => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$", // wrong part after @
|
4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
|
||||||
// 4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
|
5 => "\.([a-zA-Z]{2,6}){1}$", // wrong top level part
|
||||||
4 => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.", // wrong domain name part
|
|
||||||
5 => "\.[a-zA-Z]{2,6}$", // wrong top level part
|
|
||||||
6 => "@(.*)\.{2,}", // double .. in domain name part
|
6 => "@(.*)\.{2,}", // double .. in domain name part
|
||||||
7 => "@.*\.$" // ends with a dot, top level, domain missing
|
7 => "@.*\.$" // ends with a dot, top level, domain missing
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ class Encoding
|
|||||||
(($char != $r_char && (!self::$mb_error_char ||
|
(($char != $r_char && (!self::$mb_error_char ||
|
||||||
in_array(self::$mb_error_char, ['none', 'long', 'entity']))) ||
|
in_array(self::$mb_error_char, ['none', 'long', 'entity']))) ||
|
||||||
($char != $r_char && $r_char == self::$mb_error_char && self::$mb_error_char)) &&
|
($char != $r_char && $r_char == self::$mb_error_char && self::$mb_error_char)) &&
|
||||||
ord($char[0]) != 194
|
ord($char) != 194
|
||||||
) {
|
) {
|
||||||
$failed[] = $char;
|
$failed[] = $char;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,21 +58,15 @@ class File
|
|||||||
* else returns '' for any other finfo read problem
|
* else returns '' for any other finfo read problem
|
||||||
*
|
*
|
||||||
* @param string $read_file File to read, relative or absolute path
|
* @param string $read_file File to read, relative or absolute path
|
||||||
* @return string mime type
|
* @return string
|
||||||
* @throws \UnexpectedValueException if file cannot be read or is not a file
|
|
||||||
* @throws \RangeException if we cannot get a mime type and throw exception is on
|
|
||||||
*/
|
*/
|
||||||
public static function getMimeType(string $read_file): string
|
public static function getMimeType(string $read_file): string
|
||||||
{
|
{
|
||||||
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
||||||
if (!is_file($read_file) || !is_readable($read_file)) {
|
if (!is_file($read_file)) {
|
||||||
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
|
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
|
||||||
}
|
}
|
||||||
$mime_type = $finfo->file($read_file);
|
return $finfo->file($read_file) ?: '';
|
||||||
if ($mime_type === false) {
|
|
||||||
throw new \RangeException('[getMimeType] Cannot get mime type for: ' . $read_file);
|
|
||||||
}
|
|
||||||
return $mime_type;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,14 +150,14 @@ class ArrayHandler
|
|||||||
* array search simple. looks for key, value combination, if found, returns true
|
* array search simple. looks for key, value combination, if found, returns true
|
||||||
* on default does not strict check, so string '4' will match int 4 and vica versa
|
* on default does not strict check, so string '4' will match int 4 and vica versa
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array search in as array
|
* @param array<mixed> $array search in as array
|
||||||
* @param string|int $key key (key to search in)
|
* @param string|int $key key (key to search in)
|
||||||
* @param string|int|bool|array<string|int|bool> $value values list (what to find)
|
* @param string|int|bool|array<string|int|bool> $value values list (what to find)
|
||||||
* @param bool $strict [false], if set to true, will strict check key/value
|
* @param bool $strict [false], if set to true, will strict check key/value
|
||||||
* @return bool true on found, false on not found
|
* @return bool true on found, false on not found
|
||||||
*/
|
*/
|
||||||
public static function arraySearchSimple(
|
public static function arraySearchSimple(
|
||||||
array $in_array,
|
array $array,
|
||||||
string|int $key,
|
string|int $key,
|
||||||
string|int|bool|array $value,
|
string|int|bool|array $value,
|
||||||
bool $strict = false
|
bool $strict = false
|
||||||
@@ -166,7 +166,7 @@ class ArrayHandler
|
|||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
$value = [$value];
|
$value = [$value];
|
||||||
}
|
}
|
||||||
foreach ($in_array as $_key => $_value) {
|
foreach ($array as $_key => $_value) {
|
||||||
// if value is an array, we search
|
// if value is an array, we search
|
||||||
if (is_array($_value)) {
|
if (is_array($_value)) {
|
||||||
// call recursive, and return result if it is true, else continue
|
// call recursive, and return result if it is true, else continue
|
||||||
@@ -189,19 +189,19 @@ class ArrayHandler
|
|||||||
* If prefix is turned on each found group will be prefixed with the
|
* If prefix is turned on each found group will be prefixed with the
|
||||||
* search key
|
* search key
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array array to search in
|
* @param array<mixed> $array array to search in
|
||||||
* @param array<mixed> $needles keys to find in array
|
* @param array<mixed> $needles keys to find in array
|
||||||
* @param bool $flat [false] Turn on flat output
|
* @param bool $flat [false] Turn on flat output
|
||||||
* @param bool $prefix [false] Prefix found with needle key
|
* @param bool $prefix [false] Prefix found with needle key
|
||||||
* @return array<mixed> Found values
|
* @return array<mixed> Found values
|
||||||
*/
|
*/
|
||||||
public static function arraySearchKey(
|
public static function arraySearchKey(
|
||||||
array $in_array,
|
array $array,
|
||||||
array $needles,
|
array $needles,
|
||||||
bool $flat = false,
|
bool $flat = false,
|
||||||
bool $prefix = false
|
bool $prefix = false
|
||||||
): array {
|
): array {
|
||||||
$iterator = new \RecursiveArrayIterator($in_array);
|
$iterator = new \RecursiveArrayIterator($array);
|
||||||
$recursive = new \RecursiveIteratorIterator(
|
$recursive = new \RecursiveIteratorIterator(
|
||||||
$iterator,
|
$iterator,
|
||||||
\RecursiveIteratorIterator::SELF_FIRST
|
\RecursiveIteratorIterator::SELF_FIRST
|
||||||
@@ -248,7 +248,7 @@ class ArrayHandler
|
|||||||
* If not found return an array with the array block there the required key is missing,
|
* If not found return an array with the array block there the required key is missing,
|
||||||
* the path as string with seperator block set and the missing key entry
|
* the path as string with seperator block set and the missing key entry
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array
|
* @param array<mixed> $array
|
||||||
* @param string|int|float|bool $search_value
|
* @param string|int|float|bool $search_value
|
||||||
* @param string|array<string> $required_key
|
* @param string|array<string> $required_key
|
||||||
* @param ?string $search_key [null]
|
* @param ?string $search_key [null]
|
||||||
@@ -257,7 +257,7 @@ class ArrayHandler
|
|||||||
* @return array<array{content?:array<mixed>,path?:string,missing_key?:array<string>}>
|
* @return array<array{content?:array<mixed>,path?:string,missing_key?:array<string>}>
|
||||||
*/
|
*/
|
||||||
public static function findArraysMissingKey(
|
public static function findArraysMissingKey(
|
||||||
array $in_array,
|
array $array,
|
||||||
string|int|float|bool $search_value,
|
string|int|float|bool $search_value,
|
||||||
string|array $required_key,
|
string|array $required_key,
|
||||||
?string $search_key = null,
|
?string $search_key = null,
|
||||||
@@ -265,7 +265,7 @@ class ArrayHandler
|
|||||||
string $current_path = ''
|
string $current_path = ''
|
||||||
): array {
|
): array {
|
||||||
$results = [];
|
$results = [];
|
||||||
foreach ($in_array as $key => $value) {
|
foreach ($array as $key => $value) {
|
||||||
$path = $current_path ? $current_path . $path_separator . $key : $key;
|
$path = $current_path ? $current_path . $path_separator . $key : $key;
|
||||||
|
|
||||||
if (is_array($value)) {
|
if (is_array($value)) {
|
||||||
@@ -321,7 +321,7 @@ class ArrayHandler
|
|||||||
* Find key => value entry and return set with key for all matching
|
* Find key => value entry and return set with key for all matching
|
||||||
* Can search recursively through nested arrays if recursive flag is set
|
* Can search recursively through nested arrays if recursive flag is set
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array
|
* @param array<mixed> $array
|
||||||
* @param string $lookup
|
* @param string $lookup
|
||||||
* @param int|string|float|bool $search
|
* @param int|string|float|bool $search
|
||||||
* @param bool $strict [false]
|
* @param bool $strict [false]
|
||||||
@@ -332,7 +332,7 @@ class ArrayHandler
|
|||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function selectArrayFromOption(
|
public static function selectArrayFromOption(
|
||||||
array $in_array,
|
array $array,
|
||||||
string $lookup,
|
string $lookup,
|
||||||
int|string|float|bool $search,
|
int|string|float|bool $search,
|
||||||
bool $strict = false,
|
bool $strict = false,
|
||||||
@@ -342,7 +342,7 @@ class ArrayHandler
|
|||||||
string $flat_separator = self::DATA_SEPARATOR
|
string $flat_separator = self::DATA_SEPARATOR
|
||||||
): array {
|
): array {
|
||||||
// skip on empty
|
// skip on empty
|
||||||
if ($in_array == []) {
|
if ($array == []) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
// init return result
|
// init return result
|
||||||
@@ -352,7 +352,7 @@ class ArrayHandler
|
|||||||
$search = strtolower($search);
|
$search = strtolower($search);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($in_array as $key => $value) {
|
foreach ($array as $key => $value) {
|
||||||
// Handle current level search
|
// Handle current level search
|
||||||
if (isset($value[$lookup])) {
|
if (isset($value[$lookup])) {
|
||||||
$compareValue = $value[$lookup];
|
$compareValue = $value[$lookup];
|
||||||
@@ -399,14 +399,14 @@ class ArrayHandler
|
|||||||
/**
|
/**
|
||||||
* main wrapper function for next/prev key
|
* main wrapper function for next/prev key
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array array to search in
|
* @param array<mixed> $array array to search in
|
||||||
* @param int|string $key key for next/prev
|
* @param int|string $key key for next/prev
|
||||||
* @param bool $next [=true] if to search next or prev
|
* @param bool $next [=true] if to search next or prev
|
||||||
* @return int|string|null Next/prev key or null for end/first
|
* @return int|string|null Next/prev key or null for end/first
|
||||||
*/
|
*/
|
||||||
private static function arrayGetKey(array $in_array, int|string $key, bool $next = true): int|string|null
|
private static function arrayGetKey(array $array, int|string $key, bool $next = true): int|string|null
|
||||||
{
|
{
|
||||||
$keys = array_keys($in_array);
|
$keys = array_keys($array);
|
||||||
if (($position = array_search($key, $keys, true)) === false) {
|
if (($position = array_search($key, $keys, true)) === false) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -422,26 +422,26 @@ class ArrayHandler
|
|||||||
* Get previous array key from an array
|
* Get previous array key from an array
|
||||||
* null on not found
|
* null on not found
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array
|
* @param array<mixed> $array
|
||||||
* @param int|string $key
|
* @param int|string $key
|
||||||
* @return int|string|null Next key, or null for not found
|
* @return int|string|null Next key, or null for not found
|
||||||
*/
|
*/
|
||||||
public static function arrayGetPrevKey(array $in_array, int|string $key): int|string|null
|
public static function arrayGetPrevKey(array $array, int|string $key): int|string|null
|
||||||
{
|
{
|
||||||
return self::arrayGetKey($in_array, $key, false);
|
return self::arrayGetKey($array, $key, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get next array key from an array
|
* Get next array key from an array
|
||||||
* null on not found
|
* null on not found
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array
|
* @param array<mixed> $array
|
||||||
* @param int|string $key
|
* @param int|string $key
|
||||||
* @return int|string|null Next key, or null for not found
|
* @return int|string|null Next key, or null for not found
|
||||||
*/
|
*/
|
||||||
public static function arrayGetNextKey(array $in_array, int|string $key): int|string|null
|
public static function arrayGetNextKey(array $array, int|string $key): int|string|null
|
||||||
{
|
{
|
||||||
return self::arrayGetKey($in_array, $key, true);
|
return self::arrayGetKey($array, $key, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -463,27 +463,27 @@ class ArrayHandler
|
|||||||
}
|
}
|
||||||
// default key is not string
|
// default key is not string
|
||||||
$key_is_string = false;
|
$key_is_string = false;
|
||||||
$in_arrays = func_get_args();
|
$arrays = func_get_args();
|
||||||
// if last is not array, then assume it is trigger for key is always string
|
// if last is not array, then assume it is trigger for key is always string
|
||||||
if (!is_array(end($in_arrays))) {
|
if (!is_array(end($arrays))) {
|
||||||
if (array_pop($in_arrays)) {
|
if (array_pop($arrays)) {
|
||||||
$key_is_string = true;
|
$key_is_string = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check that arrays count is at least two, else we don't have enough to do anything
|
// check that arrays count is at least two, else we don't have enough to do anything
|
||||||
if (count($in_arrays) < 2) {
|
if (count($arrays) < 2) {
|
||||||
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
|
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
|
||||||
}
|
}
|
||||||
$merged = [];
|
$merged = [];
|
||||||
while ($in_arrays) {
|
while ($arrays) {
|
||||||
$in_array = array_shift($in_arrays);
|
$array = array_shift($arrays);
|
||||||
if (!is_array($in_array)) {
|
if (!is_array($array)) {
|
||||||
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
|
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
|
||||||
}
|
}
|
||||||
if (!$in_array) {
|
if (!$array) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
foreach ($in_array as $key => $value) {
|
foreach ($array as $key => $value) {
|
||||||
// if string or if key is assumed to be string do key match
|
// if string or if key is assumed to be string do key match
|
||||||
// else add new entry
|
// else add new entry
|
||||||
if (is_string($key) || $key_is_string === false) {
|
if (is_string($key) || $key_is_string === false) {
|
||||||
@@ -589,14 +589,14 @@ class ArrayHandler
|
|||||||
* converts multi dimensional array to a flat array
|
* converts multi dimensional array to a flat array
|
||||||
* does NOT preserve keys
|
* does NOT preserve keys
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array multi dimensionial array
|
* @param array<mixed> $array multi dimensionial array
|
||||||
* @return array<mixed> flattened array
|
* @return array<mixed> flattened array
|
||||||
*/
|
*/
|
||||||
public static function flattenArray(array $in_array): array
|
public static function flattenArray(array $array): array
|
||||||
{
|
{
|
||||||
$return = [];
|
$return = [];
|
||||||
array_walk_recursive(
|
array_walk_recursive(
|
||||||
$in_array,
|
$array,
|
||||||
function ($value) use (&$return) {
|
function ($value) use (&$return) {
|
||||||
$return[] = $value;
|
$return[] = $value;
|
||||||
}
|
}
|
||||||
@@ -607,13 +607,13 @@ class ArrayHandler
|
|||||||
/**
|
/**
|
||||||
* will loop through an array recursivly and write the array keys back
|
* will loop through an array recursivly and write the array keys back
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array multidemnsional array to flatten
|
* @param array<mixed> $array multidemnsional array to flatten
|
||||||
* @param array<mixed> $return recoursive pass on array of keys
|
* @param array<mixed> $return recoursive pass on array of keys
|
||||||
* @return array<mixed> flattened keys array
|
* @return array<mixed> flattened keys array
|
||||||
*/
|
*/
|
||||||
public static function flattenArrayKey(array $in_array, array $return = []): array
|
public static function flattenArrayKey(array $array, array $return = []): array
|
||||||
{
|
{
|
||||||
foreach ($in_array as $key => $sub) {
|
foreach ($array as $key => $sub) {
|
||||||
$return[] = $key;
|
$return[] = $key;
|
||||||
if (is_array($sub) && count($sub) > 0) {
|
if (is_array($sub) && count($sub) > 0) {
|
||||||
$return = self::flattenArrayKey($sub, $return);
|
$return = self::flattenArrayKey($sub, $return);
|
||||||
@@ -626,14 +626,14 @@ class ArrayHandler
|
|||||||
* as above will flatten an array, but in this case only the outmost
|
* as above will flatten an array, but in this case only the outmost
|
||||||
* leave nodes, all other keyswill be skipped
|
* leave nodes, all other keyswill be skipped
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array multidemnsional array to flatten
|
* @param array<mixed> $array multidemnsional array to flatten
|
||||||
* @return array<mixed> flattened keys array
|
* @return array<mixed> flattened keys array
|
||||||
*/
|
*/
|
||||||
public static function flattenArrayKeyLeavesOnly(array $in_array): array
|
public static function flattenArrayKeyLeavesOnly(array $array): array
|
||||||
{
|
{
|
||||||
$return = [];
|
$return = [];
|
||||||
array_walk_recursive(
|
array_walk_recursive(
|
||||||
$in_array,
|
$array,
|
||||||
function ($value, $key) use (&$return) {
|
function ($value, $key) use (&$return) {
|
||||||
$return[] = $key;
|
$return[] = $key;
|
||||||
}
|
}
|
||||||
@@ -645,14 +645,14 @@ class ArrayHandler
|
|||||||
* searches for key -> value in an array tree and writes the value one level up
|
* searches for key -> value in an array tree and writes the value one level up
|
||||||
* this will remove this leaf will all other values
|
* this will remove this leaf will all other values
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array nested array
|
* @param array<mixed> $array nested array
|
||||||
* @param string|int $search key to find that has no sub leaf
|
* @param string|int $search key to find that has no sub leaf
|
||||||
* and will be pushed up
|
* and will be pushed up
|
||||||
* @return array<mixed> modified, flattened array
|
* @return array<mixed> modified, flattened array
|
||||||
*/
|
*/
|
||||||
public static function arrayFlatForKey(array $in_array, string|int $search): array
|
public static function arrayFlatForKey(array $array, string|int $search): array
|
||||||
{
|
{
|
||||||
foreach ($in_array as $key => $value) {
|
foreach ($array as $key => $value) {
|
||||||
// if it is not an array do just nothing
|
// if it is not an array do just nothing
|
||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -660,14 +660,14 @@ class ArrayHandler
|
|||||||
// probe it has search key
|
// probe it has search key
|
||||||
if (isset($value[$search])) {
|
if (isset($value[$search])) {
|
||||||
// set as current
|
// set as current
|
||||||
$in_array[$key] = $value[$search];
|
$array[$key] = $value[$search];
|
||||||
} else {
|
} else {
|
||||||
// call up next node down
|
// call up next node down
|
||||||
// $in_array[$key] = call_user_func(__METHOD__, $value, $search);
|
// $array[$key] = call_user_func(__METHOD__, $value, $search);
|
||||||
$in_array[$key] = self::arrayFlatForKey($value, $search);
|
$array[$key] = self::arrayFlatForKey($value, $search);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $in_array;
|
return $array;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -677,13 +677,13 @@ class ArrayHandler
|
|||||||
*
|
*
|
||||||
* https://stackoverflow.com/a/369608
|
* https://stackoverflow.com/a/369608
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array Array where elements are located
|
* @param array<mixed> $array Array where elements are located
|
||||||
* @param array<mixed> $remove Elements to remove
|
* @param array<mixed> $remove Elements to remove
|
||||||
* @return array<mixed> Array with $remove elements removed
|
* @return array<mixed> Array with $remove elements removed
|
||||||
*/
|
*/
|
||||||
public static function arrayRemoveEntry(array $in_array, array $remove): array
|
public static function arrayRemoveEntry(array $array, array $remove): array
|
||||||
{
|
{
|
||||||
return array_diff($in_array, $remove);
|
return array_diff($array, $remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -693,20 +693,20 @@ class ArrayHandler
|
|||||||
* key list is a list[string]
|
* key list is a list[string]
|
||||||
* if key list is empty, return array as is
|
* if key list is empty, return array as is
|
||||||
*
|
*
|
||||||
* @param array<string,mixed> $in_array
|
* @param array<string,mixed> $array
|
||||||
* @param array<string> $key_list
|
* @param array<string> $key_list
|
||||||
* @return array<string,mixed>
|
* @return array<string,mixed>
|
||||||
*/
|
*/
|
||||||
public static function arrayReturnMatchingKeyOnly(
|
public static function arrayReturnMatchingKeyOnly(
|
||||||
array $in_array,
|
array $array,
|
||||||
array $key_list
|
array $key_list
|
||||||
): array {
|
): array {
|
||||||
// on empty return as is
|
// on empty return as is
|
||||||
if (empty($key_list)) {
|
if (empty($key_list)) {
|
||||||
return $in_array;
|
return $array;
|
||||||
}
|
}
|
||||||
return array_filter(
|
return array_filter(
|
||||||
$in_array,
|
$array,
|
||||||
fn($key) => in_array($key, $key_list),
|
fn($key) => in_array($key, $key_list),
|
||||||
ARRAY_FILTER_USE_KEY
|
ARRAY_FILTER_USE_KEY
|
||||||
);
|
);
|
||||||
@@ -748,19 +748,16 @@ class ArrayHandler
|
|||||||
* sort ascending or descending with or without lower case convert
|
* sort ascending or descending with or without lower case convert
|
||||||
* value only, will loose key connections unless preserve_keys is set to true
|
* value only, will loose key connections unless preserve_keys is set to true
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array Array to sort by values
|
* @param array<mixed> $array array to sort by values
|
||||||
* @param bool $case_insensitive [false] Sort case insensitive
|
* @param int $params sort flags
|
||||||
* @param bool $reverse [false] Reverse sort
|
|
||||||
* @param bool $maintain_keys [false] Maintain keys
|
|
||||||
* @param int $flag [SORT_REGULAR] Sort flags
|
|
||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function sortArray(
|
public static function sortArray(
|
||||||
array $in_array,
|
array $array,
|
||||||
bool $case_insensitive = false,
|
bool $case_insensitive = false,
|
||||||
bool $reverse = false,
|
bool $reverse = false,
|
||||||
bool $maintain_keys = false,
|
bool $maintain_keys = false,
|
||||||
int $flag = SORT_REGULAR
|
int $params = SORT_REGULAR
|
||||||
): array {
|
): array {
|
||||||
$fk_sort_lower_case = function (string $a, string $b): int {
|
$fk_sort_lower_case = function (string $a, string $b): int {
|
||||||
return strtolower($a) <=> strtolower($b);
|
return strtolower($a) <=> strtolower($b);
|
||||||
@@ -770,26 +767,26 @@ class ArrayHandler
|
|||||||
};
|
};
|
||||||
$case_insensitive ? (
|
$case_insensitive ? (
|
||||||
$maintain_keys ?
|
$maintain_keys ?
|
||||||
(uasort($in_array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case)) :
|
(uasort($array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case)) :
|
||||||
(usort($in_array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case))
|
(usort($array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case))
|
||||||
) :
|
) :
|
||||||
(
|
(
|
||||||
$maintain_keys ?
|
$maintain_keys ?
|
||||||
($reverse ? arsort($in_array, $flag) : asort($in_array, $flag)) :
|
($reverse ? arsort($array, $params) : asort($array, $params)) :
|
||||||
($reverse ? rsort($in_array, $flag) : sort($in_array, $flag))
|
($reverse ? rsort($array, $params) : sort($array, $params))
|
||||||
);
|
);
|
||||||
return $in_array;
|
return $array;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sort by key ascending or descending and return
|
* sort by key ascending or descending and return
|
||||||
*
|
*
|
||||||
* @param array<mixed> $in_array Array to srt
|
* @param array<mixed> $array
|
||||||
* @param bool $case_insensitive [false] Sort keys case insenstive
|
* @param bool $case_insensitive [false]
|
||||||
* @param bool $reverse [false] Reverse key sort
|
* @param bool $reverse [false]
|
||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function ksortArray(array $in_array, bool $case_insensitive = false, bool $reverse = false): array
|
public static function ksortArray(array $array, bool $case_insensitive = false, bool $reverse = false): array
|
||||||
{
|
{
|
||||||
$fk_sort_lower_case = function (string $a, string $b): int {
|
$fk_sort_lower_case = function (string $a, string $b): int {
|
||||||
return strtolower($a) <=> strtolower($b);
|
return strtolower($a) <=> strtolower($b);
|
||||||
@@ -804,12 +801,12 @@ class ArrayHandler
|
|||||||
return $b <=> $a;
|
return $b <=> $a;
|
||||||
};
|
};
|
||||||
uksort(
|
uksort(
|
||||||
$in_array,
|
$array,
|
||||||
$case_insensitive ?
|
$case_insensitive ?
|
||||||
($reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case) :
|
($reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case) :
|
||||||
($reverse ? $fk_sort_reverse : $fk_sort)
|
($reverse ? $fk_sort_reverse : $fk_sort)
|
||||||
);
|
);
|
||||||
return $in_array;
|
return $array;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ class DateTime
|
|||||||
} else {
|
} else {
|
||||||
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
||||||
$output = floor((float)$timestamp / $timegroups[$i]);
|
$output = floor((float)$timestamp / $timegroups[$i]);
|
||||||
$timestamp = $timestamp % $timegroups[$i];
|
$timestamp = (float)$timestamp % $timegroups[$i];
|
||||||
// output has days|hours|min|sec
|
// output has days|hours|min|sec
|
||||||
if ($output || $time_string) {
|
if ($output || $time_string) {
|
||||||
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
|
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
|
||||||
@@ -396,67 +396,38 @@ class DateTime
|
|||||||
* xd xh xm xs xms to a timestamp.microtime format
|
* xd xh xm xs xms to a timestamp.microtime format
|
||||||
*
|
*
|
||||||
* @param string|int|float $timestring formatted interval
|
* @param string|int|float $timestring formatted interval
|
||||||
* @param bool $throw_exception [default=false] if set to true will throw exception
|
|
||||||
* instead of returning input value as is
|
|
||||||
* @return string|int|float converted float interval, or string as is
|
* @return string|int|float converted float interval, or string as is
|
||||||
*/
|
*/
|
||||||
public static function stringToTime(
|
public static function stringToTime(string|int|float $timestring): string|int|float
|
||||||
string|int|float $timestring,
|
{
|
||||||
bool $throw_exception = false
|
|
||||||
): string|int|float {
|
|
||||||
$timestamp = 0;
|
$timestamp = 0;
|
||||||
$matches = [];
|
if (!preg_match("/(d|h|m|s|ms)/", (string)$timestring)) {
|
||||||
// preg match: 0: full string
|
|
||||||
// 2, 4, 6, 8 are the to need values
|
|
||||||
if (
|
|
||||||
!preg_match(
|
|
||||||
"/^\s*(-)?\s*"
|
|
||||||
. "((\d+)\s*d(?:ay(?:s)?)?)?\s*"
|
|
||||||
. "((\d+)\s*h(?:our(?:s)?)?)?\s*"
|
|
||||||
. "((\d+)\s*m(?:in(?:ute)?(?:s)?)?)?\s*"
|
|
||||||
. "((\d+)\s*s(?:ec(?:ond)?(?:s)?)?)?\s*"
|
|
||||||
. "((\d+)\s*m(?:illi)?s(?:ec(?:ond)?(?:s)?)?)?\s*"
|
|
||||||
. "$/",
|
|
||||||
(string)$timestring,
|
|
||||||
$matches
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
if ($throw_exception) {
|
|
||||||
throw new \InvalidArgumentException(
|
|
||||||
'Invalid time string format, cannot parse: "' . (string)$timestring . '"',
|
|
||||||
1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $timestring;
|
|
||||||
}
|
|
||||||
if (count($matches) < 2) {
|
|
||||||
if ($throw_exception) {
|
|
||||||
throw new \InvalidArgumentException(
|
|
||||||
'Invalid time string format, no interval value found: "' . (string)$timestring . '"',
|
|
||||||
2
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $timestring;
|
return $timestring;
|
||||||
}
|
}
|
||||||
|
$timestring = (string)$timestring;
|
||||||
// pos for preg match read + multiply factor
|
// pos for preg match read + multiply factor
|
||||||
$timegroups = [3 => 86400, 5 => 3600, 7 => 60, 9 => 1];
|
$timegroups = [2 => 86400, 4 => 3600, 6 => 60, 8 => 1];
|
||||||
|
$matches = [];
|
||||||
// if start with -, strip and set negative
|
// if start with -, strip and set negative
|
||||||
$negative = false;
|
$negative = false;
|
||||||
if (!empty($matches[1])) {
|
if (preg_match("/^-/", $timestring)) {
|
||||||
$negative = true;
|
$negative = true;
|
||||||
|
$timestring = substr($timestring, 1);
|
||||||
}
|
}
|
||||||
|
// preg match: 0: full string
|
||||||
|
// 2, 4, 6, 8 are the to need values
|
||||||
|
preg_match("/^((\d+)d ?)?((\d+)h ?)?((\d+)m ?)?((\d+)s ?)?((\d+)ms)?$/", $timestring, $matches);
|
||||||
// multiply the returned matches and sum them up. the last one (ms) is added with .
|
// multiply the returned matches and sum them up. the last one (ms) is added with .
|
||||||
foreach ($timegroups as $i => $time_multiply) {
|
foreach ($timegroups as $i => $time_multiply) {
|
||||||
if (isset($matches[$i]) && is_numeric($matches[$i])) {
|
if (isset($matches[$i]) && is_numeric($matches[$i])) {
|
||||||
$timestamp += (float)$matches[$i] * $time_multiply;
|
$timestamp += (float)$matches[$i] * $time_multiply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($matches[11]) && is_numeric($matches[11])) {
|
if (isset($matches[10]) && is_numeric($matches[10])) {
|
||||||
// for milliseconds, we need to divide by 1000 and add them
|
$timestamp .= '.' . $matches[10];
|
||||||
$timestamp += ((float)$matches[11] / 1000);
|
|
||||||
}
|
}
|
||||||
if ($negative) {
|
if ($negative) {
|
||||||
// cast to float so we can do a negative multiplication
|
// cast to flaot so we can do a negative multiplication
|
||||||
$timestamp = (float)$timestamp * -1;
|
$timestamp = (float)$timestamp * -1;
|
||||||
}
|
}
|
||||||
return $timestamp;
|
return $timestamp;
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ class Byte
|
|||||||
public const BYTE_FORMAT_NOSPACE = 1;
|
public const BYTE_FORMAT_NOSPACE = 1;
|
||||||
public const BYTE_FORMAT_ADJUST = 2;
|
public const BYTE_FORMAT_ADJUST = 2;
|
||||||
public const BYTE_FORMAT_SI = 4;
|
public const BYTE_FORMAT_SI = 4;
|
||||||
public const RETURN_AS_STRING = 8;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function replaces the old byteStringFormat
|
* This function replaces the old byteStringFormat
|
||||||
@@ -43,10 +42,7 @@ class Byte
|
|||||||
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
||||||
{
|
{
|
||||||
// if not numeric, return as is
|
// if not numeric, return as is
|
||||||
if (!is_numeric($bytes)) {
|
if (is_numeric($bytes)) {
|
||||||
// if anything other return as string
|
|
||||||
return (string)$bytes;
|
|
||||||
}
|
|
||||||
// flags bit wise check
|
// flags bit wise check
|
||||||
// remove space between number and suffix
|
// remove space between number and suffix
|
||||||
if ($flags & self::BYTE_FORMAT_NOSPACE) {
|
if ($flags & self::BYTE_FORMAT_NOSPACE) {
|
||||||
@@ -81,7 +77,7 @@ class Byte
|
|||||||
// labels in order of size [Y, Z]
|
// labels in order of size [Y, Z]
|
||||||
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
|
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
|
||||||
// exp position calculation
|
// exp position calculation
|
||||||
$exp = (int)floor(log($abs_bytes, $unit));
|
$exp = floor(log($abs_bytes, $unit));
|
||||||
// avoid printing out anything larger than max labels
|
// avoid printing out anything larger than max labels
|
||||||
if ($exp >= count($labels)) {
|
if ($exp >= count($labels)) {
|
||||||
$exp = count($labels) - 1;
|
$exp = count($labels) - 1;
|
||||||
@@ -107,6 +103,10 @@ class Byte
|
|||||||
} else {
|
} else {
|
||||||
return round($bytes_calc, 2) . $pre;
|
return round($bytes_calc, 2) . $pre;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// if anything other return as string
|
||||||
|
return (string)$bytes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -119,9 +119,7 @@ class Byte
|
|||||||
* @param int $flags bitwise flag with use space turned on
|
* @param int $flags bitwise flag with use space turned on
|
||||||
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
* BYTE_FORMAT_SI: use 1000 instead of 1024
|
||||||
* @return string|int|float converted value or original value
|
* @return string|int|float converted value or original value
|
||||||
* @throws \InvalidArgumentException no valid flag set
|
* @throws \InvalidArgumentException 1: no valid flag set
|
||||||
* @throws \LengthException number too large to convert to int
|
|
||||||
* @throws \RuntimeException BCMath extension not loaded if flag is set to string
|
|
||||||
*/
|
*/
|
||||||
public static function stringByteFormat(string|int|float $number, int $flags = 0): string|int|float
|
public static function stringByteFormat(string|int|float $number, int $flags = 0): string|int|float
|
||||||
{
|
{
|
||||||
@@ -131,12 +129,7 @@ class Byte
|
|||||||
} else {
|
} else {
|
||||||
$si = false;
|
$si = false;
|
||||||
}
|
}
|
||||||
if ($flags & self::RETURN_AS_STRING) {
|
if ($flags != 0 && $flags != 4) {
|
||||||
$return_as_string = true;
|
|
||||||
} else {
|
|
||||||
$return_as_string = false;
|
|
||||||
}
|
|
||||||
if ($flags != 0 && $flags != 4 && $flags != 8 && $flags != 12) {
|
|
||||||
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
|
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
|
||||||
}
|
}
|
||||||
// matches in regex
|
// matches in regex
|
||||||
@@ -149,11 +142,7 @@ class Byte
|
|||||||
strtolower((string)$number),
|
strtolower((string)$number),
|
||||||
$matches
|
$matches
|
||||||
);
|
);
|
||||||
$number_negative = false;
|
if (isset($matches[2]) && isset($matches[3])) {
|
||||||
if (!empty($matches[1])) {
|
|
||||||
$number_negative = true;
|
|
||||||
}
|
|
||||||
if (isset($matches[2])) {
|
|
||||||
// remove all non valid characters from the number
|
// remove all non valid characters from the number
|
||||||
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
||||||
// final clean up and convert to float
|
// final clean up and convert to float
|
||||||
@@ -163,48 +152,12 @@ class Byte
|
|||||||
if ($unit) {
|
if ($unit) {
|
||||||
$number = $number * pow($si ? 1000 : 1024, stripos($valid_units_, $unit[0]) ?: 0);
|
$number = $number * pow($si ? 1000 : 1024, stripos($valid_units_, $unit[0]) ?: 0);
|
||||||
}
|
}
|
||||||
// if the number is too large, we cannot convert to int directly
|
|
||||||
if ($number <= PHP_INT_MIN || $number >= PHP_INT_MAX) {
|
|
||||||
// if we do not want to convert to string
|
|
||||||
if (!$return_as_string) {
|
|
||||||
throw new \LengthException(
|
|
||||||
'Number too large be converted to int: ' . (string)$number
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// for string, check if bcmath is loaded, if not this will not work
|
|
||||||
if (!extension_loaded('bcmath')) {
|
|
||||||
throw new \RuntimeException(
|
|
||||||
'Number too large be converted to int and BCMath extension not loaded: ' . (string)$number
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// string return
|
|
||||||
if ($return_as_string) {
|
|
||||||
// return as string to avoid overflow
|
|
||||||
// $number = (string)round($number);
|
|
||||||
$number = bcmul(number_format(
|
|
||||||
$number,
|
|
||||||
12,
|
|
||||||
'.',
|
|
||||||
''
|
|
||||||
), "1");
|
|
||||||
if ($number_negative) {
|
|
||||||
$number = '-' . $number;
|
|
||||||
}
|
|
||||||
return $number;
|
|
||||||
}
|
|
||||||
// convert to INT to avoid +E output
|
// convert to INT to avoid +E output
|
||||||
$number = (int)round($number);
|
$number = (int)round($number);
|
||||||
// if negative input, keep nnegative
|
// if negative input, keep nnegative
|
||||||
if ($number_negative) {
|
if (!empty($matches[1])) {
|
||||||
$number *= -1;
|
$number *= -1;
|
||||||
}
|
}
|
||||||
// check if number is negative but should be, this is Lenght overflow
|
|
||||||
if (!$number_negative && $number < 0) {
|
|
||||||
throw new \LengthException(
|
|
||||||
'Number too large be converted to int: ' . (string)$number
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// if not matching return as is
|
// if not matching return as is
|
||||||
return $number;
|
return $number;
|
||||||
|
|||||||
@@ -957,9 +957,9 @@ class Color
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @param HWB $hwb
|
* @param HWB $hwb
|
||||||
* @return LCH
|
* @return Lch
|
||||||
*/
|
*/
|
||||||
public static function hwbToLch(HWB $hwb): LCH
|
public static function hwbToLch(HWB $hwb): Lch
|
||||||
{
|
{
|
||||||
return self::rgbToLch(
|
return self::rgbToLch(
|
||||||
self::hwbToRgb($hwb)
|
self::hwbToRgb($hwb)
|
||||||
@@ -1078,10 +1078,10 @@ class Color
|
|||||||
/**
|
/**
|
||||||
* OkLab to Lch (CIE)
|
* OkLab to Lch (CIE)
|
||||||
*
|
*
|
||||||
* @param Lab $lab
|
* @param LAB $lab
|
||||||
* @return LCH
|
* @return LCH
|
||||||
*/
|
*/
|
||||||
public static function okLabToLch(Lab $lab): LCH
|
public static function okLabToLch(LAB $lab): LCH
|
||||||
{
|
{
|
||||||
return self::labToLch(
|
return self::labToLch(
|
||||||
self::okLabToLab($lab)
|
self::okLabToLab($lab)
|
||||||
@@ -1092,9 +1092,9 @@ class Color
|
|||||||
* Lch (CIE) to OkLab
|
* Lch (CIE) to OkLab
|
||||||
*
|
*
|
||||||
* @param LCH $lch
|
* @param LCH $lch
|
||||||
* @return Lab
|
* @return LAB
|
||||||
*/
|
*/
|
||||||
public static function lchToOkLab(LCH $lch): Lab
|
public static function lchToOkLab(LCH $lch): LAB
|
||||||
{
|
{
|
||||||
return self::labToOkLab(
|
return self::labToOkLab(
|
||||||
self::lchToLab($lch)
|
self::lchToLab($lch)
|
||||||
|
|||||||
@@ -27,14 +27,10 @@ class Json
|
|||||||
* set original value as array
|
* set original value as array
|
||||||
* @return array<mixed> returns an array from the json values
|
* @return array<mixed> returns an array from the json values
|
||||||
*/
|
*/
|
||||||
public static function jsonConvertToArray(?string $json, bool $override = false, int $flags = 0): array
|
public static function jsonConvertToArray(?string $json, bool $override = false): array
|
||||||
{
|
{
|
||||||
if ($json !== null) {
|
if ($json !== null) {
|
||||||
// if flags has JSON_THROW_ON_ERROR remove it
|
$_json = json_decode($json, true);
|
||||||
if ($flags & JSON_THROW_ON_ERROR) {
|
|
||||||
$flags = $flags & ~JSON_THROW_ON_ERROR;
|
|
||||||
}
|
|
||||||
$_json = json_decode($json, true, flags:$flags);
|
|
||||||
if (self::$json_last_error = json_last_error()) {
|
if (self::$json_last_error = json_last_error()) {
|
||||||
if ($override == true) {
|
if ($override == true) {
|
||||||
// init return as array with original as element
|
// init return as array with original as element
|
||||||
@@ -59,35 +55,16 @@ class Json
|
|||||||
* Deos not throw errors
|
* Deos not throw errors
|
||||||
*
|
*
|
||||||
* @param array<mixed> $data
|
* @param array<mixed> $data
|
||||||
* @param int $flags [JSON_UNESCAPED_UNICODE] json_encode flags as is
|
* @param int $flags json_encode flags as is
|
||||||
* @return string JSON string or '{}' if false
|
* @return string JSON string or '{}' if false
|
||||||
*/
|
*/
|
||||||
public static function jsonConvertArrayTo(array $data, int $flags = JSON_UNESCAPED_UNICODE): string
|
public static function jsonConvertArrayTo(array $data, int $flags = 0): string
|
||||||
{
|
{
|
||||||
$json_string = json_encode($data, $flags) ?: '{}';
|
$json_string = json_encode($data, $flags) ?: '{}';
|
||||||
self::$json_last_error = json_last_error();
|
self::$json_last_error = json_last_error();
|
||||||
return (string)$json_string;
|
return (string)$json_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate if a json string could be decoded.
|
|
||||||
* Weill set the internval last error state and info can be read with jsonGetLastError
|
|
||||||
*
|
|
||||||
* @param string $json
|
|
||||||
* @param int $flags only JSON_INVALID_UTF8_IGNORE is currently allowed
|
|
||||||
* @return bool
|
|
||||||
* @throws \InvalidArgumentException if flags is invalid
|
|
||||||
*/
|
|
||||||
public static function jsonValidate(string $json, int $flags = 0): bool
|
|
||||||
{
|
|
||||||
if ($flags != 0 && $flags != JSON_INVALID_UTF8_IGNORE) {
|
|
||||||
throw new \InvalidArgumentException("For flag only 0 or JSON_INVALID_UTF8_IGNORE is allwed: " . $flags);
|
|
||||||
}
|
|
||||||
$json_valid = json_validate($json, flags:$flags);
|
|
||||||
self::$json_last_error = json_last_error();
|
|
||||||
return $json_valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns human readable string for json errors thrown in jsonConvertToArray
|
* returns human readable string for json errors thrown in jsonConvertToArray
|
||||||
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
||||||
|
|||||||
@@ -62,15 +62,10 @@ class Math
|
|||||||
*
|
*
|
||||||
* @param float $number Number to cubic root
|
* @param float $number Number to cubic root
|
||||||
* @return float Calculated value
|
* @return float Calculated value
|
||||||
* @throws \InvalidArgumentException if $number is negative
|
|
||||||
*/
|
*/
|
||||||
public static function cbrt(float|int $number): float
|
public static function cbrt(float|int $number): float
|
||||||
{
|
{
|
||||||
$value = pow((float)$number, 1.0 / 3);
|
return pow((float)$number, 1.0 / 3);
|
||||||
if (is_nan($value)) {
|
|
||||||
throw new \InvalidArgumentException('cube root from this number is not supported: ' . $number);
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -204,17 +199,15 @@ class Math
|
|||||||
callback: fn ($col) => is_array($row) ?
|
callback: fn ($col) => is_array($row) ?
|
||||||
array_reduce(
|
array_reduce(
|
||||||
array: $row,
|
array: $row,
|
||||||
// TODO check that v is not an array
|
callback: fn ($a, $v, $i = null) => $a + $v * (
|
||||||
callback: fn ($a, $v, $i = null) => $a + $v * ( /** @phpstan-ignore-line Possible array + int */
|
|
||||||
// if last entry missing for full copy add a 0 to it
|
// if last entry missing for full copy add a 0 to it
|
||||||
$col[$i ?? array_search($v, $row, true)] ?? 0
|
$col[$i ?? array_search($v, $row, true)] ?? 0 /** @phpstan-ignore-line */
|
||||||
),
|
),
|
||||||
initial: 0,
|
initial: 0,
|
||||||
) :
|
) :
|
||||||
array_reduce(
|
array_reduce(
|
||||||
array: $col,
|
array: $col,
|
||||||
// TODO check that v is not an array
|
callback: fn ($a, $v) => $a + $v * $row,
|
||||||
callback: fn ($a, $v) => $a + $v * $row, /** @phpstan-ignore-line Possible array + int */
|
|
||||||
initial: 0,
|
initial: 0,
|
||||||
),
|
),
|
||||||
array: $bCols,
|
array: $bCols,
|
||||||
|
|||||||
@@ -268,55 +268,6 @@ class Strings
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Split up character ranges in format A-Z, a-z, 0-9
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public static function parseCharacterRanges(string $input): array
|
|
||||||
{
|
|
||||||
// if not alphanumeric, throw value error
|
|
||||||
if (!preg_match("/^[A-Za-z0-9\-\s]+$/u", $input)) {
|
|
||||||
throw new \InvalidArgumentException(
|
|
||||||
"The input string contains invalid characters, "
|
|
||||||
. "only alphanumeric, dash (-), space and 'or' are allowed: "
|
|
||||||
. $input
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// Remove all spaces
|
|
||||||
$input = str_replace(' ', '', $input);
|
|
||||||
$result = [];
|
|
||||||
// if there is no - inside, return unique characters as array
|
|
||||||
if (strpos($input, '-') === false) {
|
|
||||||
return array_unique(mb_str_split($input));
|
|
||||||
}
|
|
||||||
// Find all patterns like "A-Z" (character-dash-character)
|
|
||||||
preg_match_all('/(.)-(.)/u', $input, $matches, PREG_SET_ORDER);
|
|
||||||
foreach ($matches as $match) {
|
|
||||||
$start = $match[1];
|
|
||||||
$end = $match[2];
|
|
||||||
// Get ASCII/Unicode values
|
|
||||||
$startOrd = ord($start[0]);
|
|
||||||
$endOrd = ord($end[0]);
|
|
||||||
// make sure start is before end
|
|
||||||
if ($startOrd > $endOrd) {
|
|
||||||
[$startOrd, $endOrd] = [$endOrd, $startOrd];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate range of characters
|
|
||||||
for ($i = $startOrd; $i <= $endOrd; $i++) {
|
|
||||||
$char = chr($i);
|
|
||||||
if (!in_array($char, $result)) {
|
|
||||||
$result[] = $char;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// make the result unique
|
|
||||||
$result = array_unique($result);
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a regex is valid. Does not return the detail regex parser error
|
* Check if a regex is valid. Does not return the detail regex parser error
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class RandomKey
|
|||||||
/** @var int character count in they key character range */
|
/** @var int character count in they key character range */
|
||||||
private static int $key_character_range_length = 0;
|
private static int $key_character_range_length = 0;
|
||||||
/** @var int default key lenghth */
|
/** @var int default key lenghth */
|
||||||
/** @deprecated Will be removed, as setting has moved to randomKeyGen */
|
/** @deprecated Will be removed */
|
||||||
private static int $key_length = 4;
|
private static int $key_length = 4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,7 +49,7 @@ class RandomKey
|
|||||||
private static function validateRandomKeyData(array ...$key_range): string
|
private static function validateRandomKeyData(array ...$key_range): string
|
||||||
{
|
{
|
||||||
$key_character_range = Strings::buildCharStringFromLists(...$key_range);
|
$key_character_range = Strings::buildCharStringFromLists(...$key_range);
|
||||||
if (strlen($key_character_range) <= 1) {
|
if (strlen(self::$key_character_range) <= 1) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
return $key_character_range;
|
return $key_character_range;
|
||||||
@@ -107,7 +107,7 @@ class RandomKey
|
|||||||
* @param int $key_length key length
|
* @param int $key_length key length
|
||||||
* @return bool true for valid, false for invalid length
|
* @return bool true for valid, false for invalid length
|
||||||
*/
|
*/
|
||||||
private static function validateRandomKeyLength(int $key_length): bool
|
private static function validateRandomKeyLenght(int $key_length): bool
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
$key_length > 0 &&
|
$key_length > 0 &&
|
||||||
@@ -125,12 +125,12 @@ class RandomKey
|
|||||||
*
|
*
|
||||||
* @param int $key_length key length
|
* @param int $key_length key length
|
||||||
* @return bool true/false for set status
|
* @return bool true/false for set status
|
||||||
* @deprecated This function does no longer set the key length, the randomKeyGen parameter has to be used
|
* @deprecated This function does no longer set the key length, the randomKeyGen parameter has to b used
|
||||||
*/
|
*/
|
||||||
public static function setRandomKeyLength(int $key_length): bool
|
public static function setRandomKeyLength(int $key_length): bool
|
||||||
{
|
{
|
||||||
// only if valid int key with valid length
|
// only if valid int key with valid length
|
||||||
if (self::validateRandomKeyLength($key_length) === true) {
|
if (self::validateRandomKeyLenght($key_length) === true) {
|
||||||
self::$key_length = $key_length;
|
self::$key_length = $key_length;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@@ -176,7 +176,7 @@ class RandomKey
|
|||||||
$key_character_range_length = self::getRandomKeyDataLength();
|
$key_character_range_length = self::getRandomKeyDataLength();
|
||||||
}
|
}
|
||||||
// if not valid key length, fallback to default
|
// if not valid key length, fallback to default
|
||||||
if (!self::validateRandomKeyLength($key_length)) {
|
if (!self::validateRandomKeyLenght($key_length)) {
|
||||||
$key_length = self::KEY_LENGTH_DEFAULT;
|
$key_length = self::KEY_LENGTH_DEFAULT;
|
||||||
}
|
}
|
||||||
// create random string
|
// create random string
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class Uids
|
|||||||
*/
|
*/
|
||||||
public static function validateUuuidv4(string $uuidv4): bool
|
public static function validateUuuidv4(string $uuidv4): bool
|
||||||
{
|
{
|
||||||
if (!preg_match("/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i", $uuidv4)) {
|
if (!preg_match("/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/", $uuidv4)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -2232,9 +2232,9 @@ class IO
|
|||||||
$milliseconds = $matches[13] ?? '';
|
$milliseconds = $matches[13] ?? '';
|
||||||
|
|
||||||
// clean up, hide entries that have 00 in the time group
|
// clean up, hide entries that have 00 in the time group
|
||||||
$hour = !empty($hour) ? preg_replace('/^0/', '', $hour) : '';
|
$hour = $hour != '00' ? preg_replace('/^0/', '', $hour) : '';
|
||||||
$minutes = !empty($minutes) ? preg_replace('/^0/', '', $minutes) : '';
|
$minutes = $minutes != '00' ? preg_replace('/^0/', '', $minutes) : '';
|
||||||
$seconds = !empty($seconds) ? preg_replace('/^0/', '', $seconds) : '';
|
$seconds = $seconds != '00' ? preg_replace('/^0/', '', $seconds) : '';
|
||||||
|
|
||||||
// strip any leading or trailing spaces
|
// strip any leading or trailing spaces
|
||||||
$time_string = trim(
|
$time_string = trim(
|
||||||
@@ -2562,27 +2562,21 @@ class IO
|
|||||||
// set field names
|
// set field names
|
||||||
$this->cursor_ext[$query_hash]['field_names'] = [];
|
$this->cursor_ext[$query_hash]['field_names'] = [];
|
||||||
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
||||||
if (
|
$this->cursor_ext[$query_hash]['field_names'][] =
|
||||||
($field_name = $this->db_functions->__dbFieldName(
|
$this->db_functions->__dbFieldName(
|
||||||
$this->cursor_ext[$query_hash]['cursor'],
|
$this->cursor_ext[$query_hash]['cursor'],
|
||||||
$i
|
$i
|
||||||
)) !== false
|
);
|
||||||
) {
|
|
||||||
$this->cursor_ext[$query_hash]['field_names'][] = $field_name;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
|
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
|
||||||
// field types
|
// field types
|
||||||
$this->cursor_ext[$query_hash]['field_types'] = [];
|
$this->cursor_ext[$query_hash]['field_types'] = [];
|
||||||
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
||||||
if (
|
$this->cursor_ext[$query_hash]['field_types'][] =
|
||||||
($field_type = $this->db_functions->__dbFieldType(
|
$this->db_functions->__dbFieldType(
|
||||||
$this->cursor_ext[$query_hash]['cursor'],
|
$this->cursor_ext[$query_hash]['cursor'],
|
||||||
$i
|
$i
|
||||||
)) !== false
|
);
|
||||||
) {
|
|
||||||
$this->cursor_ext[$query_hash]['field_types'][] = $field_type;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$this->field_types = $this->cursor_ext[$query_hash]['field_types'];
|
$this->field_types = $this->cursor_ext[$query_hash]['field_types'];
|
||||||
// combined name => type
|
// combined name => type
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AUTHOR: Clemens Schwaighofer
|
||||||
|
* CREATED: Ymd
|
||||||
|
* DESCRIPTION:
|
||||||
|
* DescriptionHere
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\DB\Interface;
|
||||||
|
|
||||||
|
interface DatabaseInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Table meta data
|
||||||
|
* Note that if columns have multi
|
||||||
|
*
|
||||||
|
* @param string $table
|
||||||
|
* @return array<array<string,mixed>>|false
|
||||||
|
*/
|
||||||
|
public function dbShowTableMetaData(string $table): array|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for reading or simple execution, no return data
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return int|false
|
||||||
|
*/
|
||||||
|
public function dbExec(string $query): int|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a simple query and return its statement
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbQuery(string $query): \PDOStatement|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute one query with params
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbExecParams(string $query, array $params): \PDOStatement|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbPrepare(string $query): \PDOStatement|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* execute a cursor
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function dbCursorExecute(\PDOStatement $cursor, array $params): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return array with data, when finshed return false
|
||||||
|
* also returns false on error
|
||||||
|
*
|
||||||
|
* TODO: This is currently a one time run
|
||||||
|
* if the same query needs to be run again, the cursor_ext must be reest
|
||||||
|
* with dbCacheReset
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return array<mixed>|false
|
||||||
|
*/
|
||||||
|
public function dbReturnArray(string $query, array $params = []): array|false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get current db handler
|
||||||
|
* this is for raw access
|
||||||
|
*
|
||||||
|
* @return \PDO
|
||||||
|
*/
|
||||||
|
public function getDbh(): \PDO;
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -536,7 +536,7 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
$connection_string[] = 'sslmode=' . $db_ssl;
|
$connection_string[] = 'sslmode=' . $db_ssl;
|
||||||
}
|
}
|
||||||
// connect
|
// connect
|
||||||
$this->dbh = @pg_connect(join(' ', $connection_string));
|
$this->dbh = pg_connect(join(' ', $connection_string));
|
||||||
return $this->dbh;
|
return $this->dbh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,432 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AUTHOR: Clemens Schwaighofer
|
||||||
|
* CREATED: 2024/8/21
|
||||||
|
* DESCRIPTION:
|
||||||
|
* SQL Lite interface
|
||||||
|
* Note: This is a very simple library and in future should perhaps merge with the master
|
||||||
|
* CoreLibs SQL interface
|
||||||
|
*
|
||||||
|
* TODO: This should move to the CoreLibs\DB\IO class as a sub type for "sqlite" next to "pgsql"
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\DB;
|
||||||
|
|
||||||
|
use CoreLibs\Create\Hash;
|
||||||
|
|
||||||
|
class SqLite implements Interface\DatabaseInterface
|
||||||
|
{
|
||||||
|
/** @var \CoreLibs\Logging\Logging logging */
|
||||||
|
public \CoreLibs\Logging\Logging $log;
|
||||||
|
|
||||||
|
/** @var string database connection string */
|
||||||
|
private string $dsn;
|
||||||
|
/** @var \PDO database handler */
|
||||||
|
private \PDO $dbh;
|
||||||
|
/** @var PDOStatement|false one cursor, for internal handling */
|
||||||
|
// private \PDOStatement|false $cursor;
|
||||||
|
/** @var array<string,mixed> extended cursoers string index with content */
|
||||||
|
private array $cursor_ext = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init database system
|
||||||
|
*
|
||||||
|
* @param \CoreLibs\Logging\Logging $log
|
||||||
|
* @param string $dsn
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
\CoreLibs\Logging\Logging $log,
|
||||||
|
string $dsn
|
||||||
|
) {
|
||||||
|
$this->log = $log;
|
||||||
|
// open new connection
|
||||||
|
if ($this->__connectToDB($dsn) === false) {
|
||||||
|
throw new \ErrorException("Cannot load database: " . $dsn, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// MARK: PRIVATE METHODS
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a cursor dump with all info
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @return string|false
|
||||||
|
*/
|
||||||
|
private function __dbGetCursorDump(\PDOStatement $cursor): string|false
|
||||||
|
{
|
||||||
|
// get the cursor info
|
||||||
|
ob_start();
|
||||||
|
$cursor->debugDumpParams();
|
||||||
|
$cursor_dump = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
return $cursor_dump;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch rows from a cursor (post execute)
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @return array<mixed>|false
|
||||||
|
*/
|
||||||
|
private function __dbFetchArray(\PDOStatement $cursor): array|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// on empty array return false
|
||||||
|
// TODO make that more elegant?
|
||||||
|
return empty($row = $cursor->fetch(mode:\PDO::FETCH_NAMED)) ? false : $row;
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot fetch from cursor",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"DumpParams" => $this->__dbGetCursorDump($cursor),
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: open database
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open database
|
||||||
|
* reports errors for wrong DSN or failed connection
|
||||||
|
*
|
||||||
|
* @param string $dsn
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function __connectToDB(string $dsn): bool
|
||||||
|
{
|
||||||
|
// check if dsn starts with ":"
|
||||||
|
if (!str_starts_with($dsn, "sqlite:")) {
|
||||||
|
$this->log->error(
|
||||||
|
"Invalid dsn string",
|
||||||
|
[
|
||||||
|
"dsn" => $dsn
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// TODO: if not ":memory:" check if path to file is writeable by system
|
||||||
|
// avoid double open
|
||||||
|
if (!empty($this->dsn) && $dsn == $this->dsn && $this->dbh instanceof \PDO) {
|
||||||
|
$this->log->info(
|
||||||
|
"Connection already establisehd with this dsn",
|
||||||
|
[
|
||||||
|
"dsn" => $dsn,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// TODO: check that folder is writeable
|
||||||
|
// set DSN and open connection
|
||||||
|
$this->dsn = $dsn;
|
||||||
|
try {
|
||||||
|
$this->dbh = new \PDO($this->dsn);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot open database",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// MARK: PUBLIC METHODS
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
// MARK: db meta data (table info)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table meta data
|
||||||
|
* Note that if columns have multi
|
||||||
|
*
|
||||||
|
* @param string $table
|
||||||
|
* @return array<array<string,mixed>>|false
|
||||||
|
*/
|
||||||
|
public function dbShowTableMetaData(string $table): array|false
|
||||||
|
{
|
||||||
|
$table_info = [];
|
||||||
|
$query = <<<SQL
|
||||||
|
SELECT
|
||||||
|
ti.cid, ti.name, ti.type, ti.'notnull', ti.dflt_value, ti.pk,
|
||||||
|
il_ii.idx_name, il_ii.idx_unique, il_ii.idx_origin, il_ii.idx_partial
|
||||||
|
FROM
|
||||||
|
sqlite_schema AS m,
|
||||||
|
pragma_table_info(m.name) AS ti
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
il.name AS idx_name, il.'unique' AS idx_unique, il.origin AS idx_origin, il.partial AS idx_partial,
|
||||||
|
ii.cid AS tbl_cid
|
||||||
|
FROM
|
||||||
|
sqlite_schema AS m,
|
||||||
|
pragma_index_list(m.name) AS il,
|
||||||
|
pragma_index_info(il.name) AS ii
|
||||||
|
WHERE m.name = ?1
|
||||||
|
) AS il_ii ON (ti.cid = il_ii.tbl_cid)
|
||||||
|
WHERE
|
||||||
|
m.name = ?1
|
||||||
|
SQL;
|
||||||
|
while (is_array($row = $this->dbReturnArray($query, [$table]))) {
|
||||||
|
$table_info[] = [
|
||||||
|
'cid' => $row['cid'],
|
||||||
|
'name' => $row['name'],
|
||||||
|
'type' => $row['type'],
|
||||||
|
'notnull' => $row['notnull'],
|
||||||
|
'dflt_value' => $row['dflt_value'],
|
||||||
|
'pk' => $row['pk'],
|
||||||
|
'idx_name' => $row['idx_name'],
|
||||||
|
'idx_unique' => $row['idx_unique'],
|
||||||
|
'idx_origin' => $row['idx_origin'],
|
||||||
|
'idx_partial' => $row['idx_partial'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$table_info) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $table_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db exec
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for reading or simple execution, no return data
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return int|false
|
||||||
|
*/
|
||||||
|
public function dbExec(string $query): int|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return $this->dbh->exec($query);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot execute query",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"query" => $query,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db query
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a simple query and return its statement
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbQuery(string $query): \PDOStatement|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return $this->dbh->query($query, \PDO::FETCH_NAMED);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot run query",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"query" => $query,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db prepare & execute calls
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute one query with params
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbExecParams(string $query, array $params): \PDOStatement|false
|
||||||
|
{
|
||||||
|
// prepare query
|
||||||
|
if (($cursor = $this->dbPrepare($query)) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// execute the query, on failure return false
|
||||||
|
if ($this->dbCursorExecute($cursor, $params) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare query
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return \PDOStatement|false
|
||||||
|
*/
|
||||||
|
public function dbPrepare(string $query): \PDOStatement|false
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// store query with cursor so we can reference?
|
||||||
|
return $this->dbh->prepare($query);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot open cursor",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"query" => $query,
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* execute a cursor
|
||||||
|
*
|
||||||
|
* @param \PDOStatement $cursor
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function dbCursorExecute(\PDOStatement $cursor, array $params): bool
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return $cursor->execute($params);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
// write error log
|
||||||
|
$this->log->error(
|
||||||
|
"Cannot execute prepared query",
|
||||||
|
[
|
||||||
|
"dsn" => $this->dsn,
|
||||||
|
"params" => $params,
|
||||||
|
"DumpParams" => $this->__dbGetCursorDump($cursor),
|
||||||
|
"PDOException" => $e
|
||||||
|
]
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: db return array
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns hash for query
|
||||||
|
* Hash is used in all internal storage systems for return data
|
||||||
|
*
|
||||||
|
* @param string $query The query to create the hash from
|
||||||
|
* @param array<mixed> $params If the query is params type we need params
|
||||||
|
* data to create a unique call one, optional
|
||||||
|
* @return string Hash, as set by hash long
|
||||||
|
*/
|
||||||
|
public function dbGetQueryHash(string $query, array $params = []): string
|
||||||
|
{
|
||||||
|
return Hash::__hashLong(
|
||||||
|
$query . (
|
||||||
|
$params !== [] ?
|
||||||
|
'#' . json_encode($params) : ''
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* resets all data stored to this query
|
||||||
|
* @param string $query The Query whose cache should be cleaned
|
||||||
|
* @param array<mixed> $params If the query is params type we need params
|
||||||
|
* data to create a unique call one, optional
|
||||||
|
* @return bool False if query not found, true if success
|
||||||
|
*/
|
||||||
|
public function dbCacheReset(string $query, array $params = []): bool
|
||||||
|
{
|
||||||
|
$query_hash = $this->dbGetQueryHash($query, $params);
|
||||||
|
// clears cache for this query
|
||||||
|
if (empty($this->cursor_ext[$query_hash]['query'])) {
|
||||||
|
$this->log->error('Cannot reset cursor_ext with given query and params', [
|
||||||
|
"query" => $query,
|
||||||
|
"params" => $params,
|
||||||
|
]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unset($this->cursor_ext[$query_hash]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return array with data, when finshed return false
|
||||||
|
* also returns false on error
|
||||||
|
*
|
||||||
|
* TODO: This is currently a one time run
|
||||||
|
* if the same query needs to be run again, the cursor_ext must be reest
|
||||||
|
* with dbCacheReset
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @param array<mixed> $params
|
||||||
|
* @return array<mixed>|false
|
||||||
|
*/
|
||||||
|
public function dbReturnArray(string $query, array $params = []): array|false
|
||||||
|
{
|
||||||
|
$query_hash = $this->dbGetQueryHash($query, $params);
|
||||||
|
if (!isset($this->cursor_ext[$query_hash])) {
|
||||||
|
$this->cursor_ext[$query_hash] = [
|
||||||
|
// cursor null: unset, if set \PDOStatement
|
||||||
|
'cursor' => null,
|
||||||
|
// the query used in this call
|
||||||
|
'query' => $query,
|
||||||
|
// parameter
|
||||||
|
'params' => $params,
|
||||||
|
// how many rows have been read from db
|
||||||
|
'read_rows' => 0,
|
||||||
|
// when fetch array or cache read returns false
|
||||||
|
// in loop read that means dbReturn retuns false without error
|
||||||
|
'finished' => false,
|
||||||
|
];
|
||||||
|
if (!empty($params)) {
|
||||||
|
if (($cursor = $this->dbExecParams($query, $params)) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (($cursor = $this->dbQuery($query)) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->cursor_ext[$query_hash]['cursor'] = $cursor;
|
||||||
|
}
|
||||||
|
// flag finished if row is false
|
||||||
|
$row = $this->__dbFetchArray($this->cursor_ext[$query_hash]['cursor']);
|
||||||
|
if ($row === false) {
|
||||||
|
$this->cursor_ext[$query_hash]['finished'] = true;
|
||||||
|
} else {
|
||||||
|
$this->cursor_ext[$query_hash]['read_rows']++;
|
||||||
|
}
|
||||||
|
return $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK other interface
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get current db handler
|
||||||
|
* this is for raw access
|
||||||
|
*
|
||||||
|
* @return \PDO
|
||||||
|
*/
|
||||||
|
public function getDbh(): \PDO
|
||||||
|
{
|
||||||
|
return $this->dbh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -263,11 +263,11 @@ class ConvertPlaceholder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add the connectors back (1), and the data sets only if no replacement will be done
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
return $params_lookup[$match]/* ??
|
return $params_lookup[$match] ??
|
||||||
throw new \RuntimeException(
|
throw new \RuntimeException(
|
||||||
'Cannot lookup ' . $match . ' in params lookup list',
|
'Cannot lookup ' . $match . ' in params lookup list',
|
||||||
211
|
211
|
||||||
)*/;
|
);
|
||||||
},
|
},
|
||||||
$converted_placeholders['original']['query']
|
$converted_placeholders['original']['query']
|
||||||
);
|
);
|
||||||
@@ -327,11 +327,11 @@ class ConvertPlaceholder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add the connectors back (1), and the data sets only if no replacement will be done
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
return $params_lookup[$match]/* ??
|
return $params_lookup[$match] ??
|
||||||
throw new \RuntimeException(
|
throw new \RuntimeException(
|
||||||
'Cannot lookup ' . $match . ' in params lookup list',
|
'Cannot lookup ' . $match . ' in params lookup list',
|
||||||
231
|
231
|
||||||
)*/;
|
);
|
||||||
},
|
},
|
||||||
$converted_placeholders['original']['query']
|
$converted_placeholders['original']['query']
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ class FileWriter
|
|||||||
if (!is_writeable($folder)) {
|
if (!is_writeable($folder)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!is_dir($folder)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// if last is not / then add
|
// if last is not / then add
|
||||||
self::$debug_folder = rtrim($folder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
if (substr($folder, -1, 1) != DIRECTORY_SEPARATOR) {
|
||||||
|
$folder .= DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
self::$debug_folder = $folder;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,36 +33,6 @@ class Support
|
|||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* print ISO type datetime with microseconds and timezone
|
|
||||||
* Y-m-dTH:i:s.uP
|
|
||||||
* if no micro time the ".u" part is omitted
|
|
||||||
*
|
|
||||||
* @param bool $set_micro_time
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function printIsoTime(bool $set_micro_time = true): string
|
|
||||||
{
|
|
||||||
$datetime = new \DateTime();
|
|
||||||
|
|
||||||
// Format the DateTime object to ISO 8601 with microseconds
|
|
||||||
// 'Y-m-d\TH:i:s.uP' is the format string:
|
|
||||||
// Y: Full year (e.g., 2025)
|
|
||||||
// m: Month (01-12)
|
|
||||||
// d: Day of the month (01-31)
|
|
||||||
// T: Literal 'T' to separate date and time (escaped with a backslash)
|
|
||||||
// H: Hour (00-23)
|
|
||||||
// i: Minute (00-59)
|
|
||||||
// s: Second (00-59)
|
|
||||||
// u: Microseconds (e.g., 654321)
|
|
||||||
// P: Difference to Greenwich time (GMT) with colon (e.g., +09:00)
|
|
||||||
if ($set_micro_time) {
|
|
||||||
return $datetime->format('Y-m-d\TH:i:s.uP');
|
|
||||||
} else {
|
|
||||||
return $datetime->format('Y-m-d\TH:i:sP');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* prints a html formatted (pre) data
|
* prints a html formatted (pre) data
|
||||||
*
|
*
|
||||||
@@ -134,8 +104,8 @@ class Support
|
|||||||
* Convert bool value to string value. Short name alias for printBool
|
* Convert bool value to string value. Short name alias for printBool
|
||||||
*
|
*
|
||||||
* @param bool $bool Bool value to be transformed
|
* @param bool $bool Bool value to be transformed
|
||||||
* @param string $true [=true] Override default string 'true'
|
* @param string $true [='true'] Override default string 'true'
|
||||||
* @param string $false [=false] Override default string 'false'
|
* @param string $false [=false'] Override default string 'false'
|
||||||
* @return string $true or $false string for true/false bool
|
* @return string $true or $false string for true/false bool
|
||||||
*/
|
*/
|
||||||
public static function prBl(
|
public static function prBl(
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ class L10n
|
|||||||
* @param string $locale language name, if not set, try previous set
|
* @param string $locale language name, if not set, try previous set
|
||||||
* @param string $domain set name for mo file, if not set, try previous set
|
* @param string $domain set name for mo file, if not set, try previous set
|
||||||
* @param string $path path, if not set try to get from paths array, else self
|
* @param string $path path, if not set try to get from paths array, else self
|
||||||
* @param string $override_encoding if locale does not have encoding set, use this one
|
* @param string $override_encoding if locale does not env encoding set, use this one
|
||||||
* @return GetTextReader the main gettext reader object
|
* @return GetTextReader the main gettext reader object
|
||||||
*/
|
*/
|
||||||
public function getTranslator(
|
public function getTranslator(
|
||||||
@@ -301,7 +301,7 @@ class L10n
|
|||||||
* Get the local as array same to the GetLocale::setLocale return
|
* Get the local as array same to the GetLocale::setLocale return
|
||||||
* This does not set from outside, but only what is set in the l10n class
|
* This does not set from outside, but only what is set in the l10n class
|
||||||
*
|
*
|
||||||
* @return array{locale:string,lang:string,lang_short:string,domain:string,encoding:string,path:string}
|
* @return array{locale: string, lang: string, lang_short: string, domain: string, encoding: string, path: string}
|
||||||
*/
|
*/
|
||||||
public function getLocaleAsArray(): array
|
public function getLocaleAsArray(): array
|
||||||
{
|
{
|
||||||
@@ -321,7 +321,7 @@ class L10n
|
|||||||
* parse the locale string for further processing
|
* parse the locale string for further processing
|
||||||
*
|
*
|
||||||
* @param string $locale Locale to parse
|
* @param string $locale Locale to parse
|
||||||
* @return array{lang:string|null,country:string|null,charset:string|null,modifier:string|null} parsed locale
|
* @return array<string,string|null> array with lang, country, charset, modifier
|
||||||
*/
|
*/
|
||||||
public static function parseLocale(string $locale = ''): array
|
public static function parseLocale(string $locale = ''): array
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -131,7 +131,6 @@ class ErrorMessage
|
|||||||
// set a jump target
|
// set a jump target
|
||||||
$this->setJumpTarget($jump_target['target'] ?? null, $jump_target['info'] ?? null, $level);
|
$this->setJumpTarget($jump_target['target'] ?? null, $jump_target['info'] ?? null, $level);
|
||||||
// write to log for abort/crash
|
// write to log for abort/crash
|
||||||
$this->log->setErrorMessageCallSetErrorMsg();
|
|
||||||
switch ($level) {
|
switch ($level) {
|
||||||
case 'notice':
|
case 'notice':
|
||||||
$this->log->notice($message ?? $str, array_merge([
|
$this->log->notice($message ?? $str, array_merge([
|
||||||
@@ -211,7 +210,6 @@ class ErrorMessage
|
|||||||
?bool $log_error = null,
|
?bool $log_error = null,
|
||||||
?bool $log_warning = null,
|
?bool $log_warning = null,
|
||||||
): void {
|
): void {
|
||||||
$this->log->setErrorMessageCallSetMessage();
|
|
||||||
$this->setErrorMsg(
|
$this->setErrorMsg(
|
||||||
$error_id ?? '',
|
$error_id ?? '',
|
||||||
$level,
|
$level,
|
||||||
@@ -291,7 +289,7 @@ class ErrorMessage
|
|||||||
*/
|
*/
|
||||||
public function getLastErrorMsg(): array
|
public function getLastErrorMsg(): array
|
||||||
{
|
{
|
||||||
return $this->error_str[array_key_last($this->error_str) ?? -1] ?? [
|
return $this->error_str[array_key_last($this->error_str)] ?? [
|
||||||
'level' => '',
|
'level' => '',
|
||||||
'str' => '',
|
'str' => '',
|
||||||
'id' => '',
|
'id' => '',
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ enum Flag: int
|
|||||||
/**
|
/**
|
||||||
* Get internal name from int value
|
* Get internal name from int value
|
||||||
*
|
*
|
||||||
* @param value-of<self::VALUES> $value
|
* @param int $value
|
||||||
* @return self
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromValue(int $value): self
|
public static function fromValue(int $value): self
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ enum Level: int
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
|
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
|
||||||
* @return self
|
* @return static
|
||||||
*/
|
*/
|
||||||
public static function fromName(string $name): self
|
public static function fromName(string $name): self
|
||||||
{
|
{
|
||||||
@@ -104,7 +104,7 @@ enum Level: int
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param value-of<self::VALUES> $value
|
* @param value-of<self::VALUES> $value
|
||||||
* @return self
|
* @return static
|
||||||
*/
|
*/
|
||||||
public static function fromValue(int $value): self
|
public static function fromValue(int $value): self
|
||||||
{
|
{
|
||||||
@@ -112,7 +112,7 @@ enum Level: int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the passed $level is included in set level
|
* Returns true if the passed $level is higher or equal to $this
|
||||||
*
|
*
|
||||||
* @param Level $level
|
* @param Level $level
|
||||||
* @return bool
|
* @return bool
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ namespace CoreLibs\Logging\Logger;
|
|||||||
|
|
||||||
enum MessageLevel: int
|
enum MessageLevel: int
|
||||||
{
|
{
|
||||||
case noset = 0;
|
|
||||||
case ok = 100;
|
case ok = 100;
|
||||||
case success = 150; // special for file uploads
|
case success = 150; // special for file uploads
|
||||||
case info = 200;
|
case info = 200;
|
||||||
|
|||||||
@@ -29,19 +29,11 @@ use Stringable;
|
|||||||
class Logging
|
class Logging
|
||||||
{
|
{
|
||||||
/** @var int minimum size for a max file size, so we don't set 1 byte, 10kb */
|
/** @var int minimum size for a max file size, so we don't set 1 byte, 10kb */
|
||||||
public const int MIN_LOG_MAX_FILESIZE = 10 * 1024;
|
public const MIN_LOG_MAX_FILESIZE = 10 * 1024;
|
||||||
/** @var string log file extension, not changeable */
|
/** @var string log file extension, not changeable */
|
||||||
private const string LOG_FILE_NAME_EXT = "log";
|
private const LOG_FILE_NAME_EXT = "log";
|
||||||
/** @var string log file block separator, not changeable */
|
/** @var string log file block separator, not changeable */
|
||||||
private const string LOG_FILE_BLOCK_SEPARATOR = '.';
|
private const LOG_FILE_BLOCK_SEPARATOR = '.';
|
||||||
/** @var int the base stack trace level for the line number */
|
|
||||||
private const int DEFAULT_STACK_TRACE_LEVEL_LINE = 1;
|
|
||||||
|
|
||||||
/** @var array<string,int> */
|
|
||||||
private const array STACK_OVERRIDE_CHECK = [
|
|
||||||
'setErrorMsg' => 2,
|
|
||||||
'setMessage' => 3,
|
|
||||||
];
|
|
||||||
|
|
||||||
// MARK: OPTION array
|
// MARK: OPTION array
|
||||||
// NOTE: the second party array{} hs some errors
|
// NOTE: the second party array{} hs some errors
|
||||||
@@ -104,11 +96,6 @@ class Logging
|
|||||||
'type' => 'bool', 'mandatory' => false,
|
'type' => 'bool', 'mandatory' => false,
|
||||||
'default' => false, 'deprecated' => true, 'use' => 'log_per_date'
|
'default' => false, 'deprecated' => true, 'use' => 'log_per_date'
|
||||||
],
|
],
|
||||||
// if turned off uses old time format without time zone
|
|
||||||
'log_time_format_iso' => [
|
|
||||||
'type' => 'bool', 'mandatory' => false,
|
|
||||||
'default' => true, 'deprecated' => false
|
|
||||||
]
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// options
|
// options
|
||||||
@@ -146,12 +133,6 @@ class Logging
|
|||||||
/** @var string Y-m-d file in file name */
|
/** @var string Y-m-d file in file name */
|
||||||
private string $log_file_date = '';
|
private string $log_file_date = '';
|
||||||
|
|
||||||
// speical flags for ErrorMessage calls
|
|
||||||
/** @var bool Flag to set if called from ErrorMessage::setErrorMsg */
|
|
||||||
private bool $error_message_call_set_error_msg = false;
|
|
||||||
/** @var bool Flag to set if called from ErrorMessage::setMessage */
|
|
||||||
private bool $error_message_call_set_message = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1: create a new log file per run (time stamp + unique ID)
|
* 1: create a new log file per run (time stamp + unique ID)
|
||||||
* 2: add Y-m-d and do automatic daily rotation
|
* 2: add Y-m-d and do automatic daily rotation
|
||||||
@@ -641,44 +622,14 @@ class Logging
|
|||||||
$file_line = '';
|
$file_line = '';
|
||||||
$caller_class_method = '-';
|
$caller_class_method = '-';
|
||||||
$traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
$traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
||||||
$stack_trace_start_level_line = self::DEFAULT_STACK_TRACE_LEVEL_LINE;
|
// print "[" . $level->getName() . "] [$message] prepareLog:<br>" . Support::printAr($traces);
|
||||||
// set stack trace level +1 if called from ErrorMessage::setMessage
|
|
||||||
if ($this->error_message_call_set_message) {
|
|
||||||
$stack_trace_start_level_line = 3;
|
|
||||||
} elseif ($this->error_message_call_set_error_msg) {
|
|
||||||
$stack_trace_start_level_line = 2;
|
|
||||||
}
|
|
||||||
// if we have line > default, then check if valid, else reset to default
|
|
||||||
if ($stack_trace_start_level_line > self::DEFAULT_STACK_TRACE_LEVEL_LINE) {
|
|
||||||
// check if function at level is one of the override checks
|
|
||||||
$fn_check = $traces[$stack_trace_start_level_line]['function'] ?? '';
|
|
||||||
if (
|
|
||||||
!isset(self::STACK_OVERRIDE_CHECK[$fn_check]) ||
|
|
||||||
self::STACK_OVERRIDE_CHECK[$fn_check] != $stack_trace_start_level_line
|
|
||||||
) {
|
|
||||||
$stack_trace_start_level_line = self::DEFAULT_STACK_TRACE_LEVEL_LINE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->error_message_call_set_message = false;
|
|
||||||
$this->error_message_call_set_error_msg = false;
|
|
||||||
// set stack trace level +1 if called from ErrorMessage::setMessage
|
|
||||||
// print "[" . $level->getName() . "] [$message] [" . $stack_trace_start_level_line . "] "
|
|
||||||
// . "prepareLog:<br>" . Support::printAr($traces);
|
|
||||||
// file + line: call not this but one before (the one that calls this)
|
// file + line: call not this but one before (the one that calls this)
|
||||||
// start from this level, if unset fall down until we are at null
|
// start from this level, if unset fall down until we are at null
|
||||||
// NOTE this has to be pushed to 3 for setMessage wrap calls
|
$start_trace_level = 2;
|
||||||
for ($trace_level = $stack_trace_start_level_line; $trace_level >= 0; $trace_level--) {
|
for ($trace_level = $start_trace_level; $trace_level >= 0; $trace_level--) {
|
||||||
if (!isset($traces[$trace_level])) {
|
if (isset($traces[$trace_level])) {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$file_line = ($traces[$trace_level]['file'] ?? $traces[$trace_level]['function'])
|
$file_line = ($traces[$trace_level]['file'] ?? $traces[$trace_level]['function'])
|
||||||
. ':' . ($traces[$trace_level]['line'] ?? '-');
|
. ':' . ($traces[$trace_level]['line'] ?? '-');
|
||||||
// call function is one stack level above
|
|
||||||
$trace_level++;
|
|
||||||
// skip setting if we are in the top level already
|
|
||||||
if (!isset($traces[$trace_level])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// as namespace\class->method
|
// as namespace\class->method
|
||||||
$caller_class_method =
|
$caller_class_method =
|
||||||
// get the last call before we are in the Logging class
|
// get the last call before we are in the Logging class
|
||||||
@@ -689,17 +640,13 @@ class Logging
|
|||||||
. $traces[$trace_level]['function'];
|
. $traces[$trace_level]['function'];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// if not line is set
|
}
|
||||||
if (empty($file_line)) {
|
if (empty($file_line)) {
|
||||||
$file_line = System::getPageName(System::FULL_PATH);
|
$file_line = System::getPageName(System::FULL_PATH);
|
||||||
}
|
}
|
||||||
// print "CLASS: " . $class . "<br>";
|
// print "CLASS: " . $class . "<br>";
|
||||||
// get timestamp
|
// get timestamp
|
||||||
if (!empty($this->options['log_time_format_iso'])) {
|
|
||||||
$timestamp = Support::printIsoTime();
|
|
||||||
} else {
|
|
||||||
$timestamp = Support::printTime();
|
$timestamp = Support::printTime();
|
||||||
}
|
|
||||||
|
|
||||||
// if group id is empty replace it with current level
|
// if group id is empty replace it with current level
|
||||||
$group_str = $level->getName();
|
$group_str = $level->getName();
|
||||||
@@ -1061,30 +1008,6 @@ class Logging
|
|||||||
return $this->log_max_filesize;
|
return $this->log_max_filesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
|
||||||
// MARK: ErrorMessage class overrides
|
|
||||||
// *********************************************************************
|
|
||||||
|
|
||||||
/**
|
|
||||||
* call if called from Error Message setMessage wrapper
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function setErrorMessageCallSetMessage(): void
|
|
||||||
{
|
|
||||||
$this->error_message_call_set_message = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* call if called from Error Message setMessage wrapper
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function setErrorMessageCallSetErrorMsg(): void
|
|
||||||
{
|
|
||||||
$this->error_message_call_set_error_msg = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
// MARK: OPTIONS CALLS
|
// MARK: OPTIONS CALLS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
@@ -1552,15 +1475,14 @@ class Logging
|
|||||||
Level::Error, Level::Critical, Level::Alert, Level::Emergency
|
Level::Error, Level::Critical, Level::Alert, Level::Emergency
|
||||||
] as $l
|
] as $l
|
||||||
) {
|
) {
|
||||||
print "Check: " . $this->log_level->getName() . " | " . $l->getName() . "<br>";
|
|
||||||
if ($this->log_level->isHigherThan($l)) {
|
if ($this->log_level->isHigherThan($l)) {
|
||||||
print "L(gt): " . $this->log_level->getName() . " > " . $l->getName() . "<br>";
|
print "L: " . $this->log_level->getName() . " > " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
if ($this->log_level->includes($l)) {
|
if ($this->log_level->includes($l)) {
|
||||||
print "L(le): " . $this->log_level->getName() . " <= " . $l->getName() . "<br>";
|
print "L: " . $this->log_level->getName() . " <= " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
if ($this->log_level->isLowerThan($l)) {
|
if ($this->log_level->isLowerThan($l)) {
|
||||||
print "L(lt): " . $this->log_level->getName() . " < " . $l->getName() . "<br>";
|
print "L: " . $this->log_level->getName() . " < " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
echo "<br>";
|
echo "<br>";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,11 +178,11 @@ class Elements
|
|||||||
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
||||||
function ($matches) {
|
function ($matches) {
|
||||||
return self::createUrl(
|
return self::createUrl(
|
||||||
$matches[1],
|
$matches[1] ?? '',
|
||||||
$matches[2],
|
$matches[2] ?? '',
|
||||||
$matches[3],
|
$matches[3] ?? '',
|
||||||
$matches[4],
|
$matches[4] ?? '',
|
||||||
$matches[5],
|
$matches[5] ?? '',
|
||||||
$matches[7] ?? '',
|
$matches[7] ?? '',
|
||||||
$matches[9] ?? ''
|
$matches[9] ?? ''
|
||||||
);
|
);
|
||||||
@@ -232,15 +232,8 @@ class Elements
|
|||||||
* @param string $class style sheet
|
* @param string $class style sheet
|
||||||
* @return string correct string for url href process
|
* @return string correct string for url href process
|
||||||
*/
|
*/
|
||||||
private static function createUrl(
|
private static function createUrl($href, $atag, $_1, $_2, $_3, $name, $class): string
|
||||||
string $href,
|
{
|
||||||
string $atag,
|
|
||||||
string $_1,
|
|
||||||
string $_2,
|
|
||||||
string $_3,
|
|
||||||
string $name,
|
|
||||||
string $class
|
|
||||||
): string {
|
|
||||||
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
|
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
|
||||||
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
|
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
|
||||||
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
|
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
|
||||||
@@ -257,8 +250,11 @@ class Elements
|
|||||||
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
|
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
|
||||||
} elseif ($href && !$atag) {
|
} elseif ($href && !$atag) {
|
||||||
return "href=##QUOT##$_1$_2$_3##QUOT##";
|
return "href=##QUOT##$_1$_2$_3##QUOT##";
|
||||||
}
|
} elseif ($atag) {
|
||||||
return $atag . $_2 . $_3;
|
return $atag . $_2 . $_3;
|
||||||
|
} else {
|
||||||
|
return $href;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -273,15 +269,8 @@ class Elements
|
|||||||
* @param string $class style sheet
|
* @param string $class style sheet
|
||||||
* @return string created html email a href string
|
* @return string created html email a href string
|
||||||
*/
|
*/
|
||||||
private static function createEmail(
|
private static function createEmail($mailto, $atag, $_1, $_2, $_3, $title, $class)
|
||||||
string $mailto,
|
{
|
||||||
string $atag,
|
|
||||||
string $_1,
|
|
||||||
string $_2,
|
|
||||||
string $_3,
|
|
||||||
string $title,
|
|
||||||
string $class
|
|
||||||
): string {
|
|
||||||
$email = $_1 . "@" . $_2 . "." . $_3;
|
$email = $_1 . "@" . $_2 . "." . $_3;
|
||||||
if (!$mailto && !$atag) {
|
if (!$mailto && !$atag) {
|
||||||
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
|
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
|
||||||
@@ -289,8 +278,12 @@ class Elements
|
|||||||
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
|
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
|
||||||
} elseif ($mailto && !$atag) {
|
} elseif ($mailto && !$atag) {
|
||||||
return "mailto:" . $email;
|
return "mailto:" . $email;
|
||||||
}
|
} elseif ($atag) {
|
||||||
return $atag . $email;
|
return $atag . $email;
|
||||||
|
} else {
|
||||||
|
// else just return email as is
|
||||||
|
return $email;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -365,6 +365,9 @@ class Image
|
|||||||
imagepng($thumb, $thumbnail_write_path . $thumbnail);
|
imagepng($thumb, $thumbnail_write_path . $thumbnail);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// free up resources (in case we are called in a loop)
|
||||||
|
imagedestroy($source);
|
||||||
|
imagedestroy($thumb);
|
||||||
} else {
|
} else {
|
||||||
throw new \RuntimeException(
|
throw new \RuntimeException(
|
||||||
'Invalid source image file. Only JPEG/PNG are allowed: ' . $filename,
|
'Invalid source image file. Only JPEG/PNG are allowed: ' . $filename,
|
||||||
@@ -540,6 +543,8 @@ class Image
|
|||||||
imagepng($img, $filename);
|
imagepng($img, $filename);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// clean up image if we have an image
|
||||||
|
imagedestroy($img);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -614,6 +614,8 @@ class Curl implements Interface\RequestsInterface
|
|||||||
// print "CURLINFO_HEADER_OUT: <pre>" . curl_getinfo($handle, CURLINFO_HEADER_OUT) . "</pre>";
|
// print "CURLINFO_HEADER_OUT: <pre>" . curl_getinfo($handle, CURLINFO_HEADER_OUT) . "</pre>";
|
||||||
// get response code and bail on not authorized
|
// get response code and bail on not authorized
|
||||||
$http_response = $this->handleCurlResponse($handle, $http_result, $options['http_errors']);
|
$http_response = $this->handleCurlResponse($handle, $http_result, $options['http_errors']);
|
||||||
|
// close handler
|
||||||
|
$this->handleCurlClose($handle);
|
||||||
// return response and result
|
// return response and result
|
||||||
return [
|
return [
|
||||||
'code' => (string)$http_response,
|
'code' => (string)$http_response,
|
||||||
@@ -836,6 +838,17 @@ class Curl implements Interface\RequestsInterface
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* close the current curl handle
|
||||||
|
*
|
||||||
|
* @param \CurlHandle $handle
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function handleCurlClose(\CurlHandle $handle): void
|
||||||
|
{
|
||||||
|
curl_close($handle);
|
||||||
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
// MARK: PUBLIC METHODS
|
// MARK: PUBLIC METHODS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
@@ -954,10 +967,11 @@ class Curl implements Interface\RequestsInterface
|
|||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
unset($this->config['headers'][$header_key]);
|
unset($this->config['headers'][$header_key]);
|
||||||
unset($this->headers_named[strtolower($header_key)]);
|
unset($this->headers_named[$header_key]);
|
||||||
} elseif (
|
} elseif (
|
||||||
// right side is array, and value is anything string or array
|
// string value, array keys = in
|
||||||
// if right side is string, and we give value array, we do nothing
|
// or both array and not a full match in the one before
|
||||||
|
(is_string($value) || is_array($value)) &&
|
||||||
is_array($this->config['headers'][$header_key])
|
is_array($this->config['headers'][$header_key])
|
||||||
) {
|
) {
|
||||||
// part remove of key, value must be array
|
// part remove of key, value must be array
|
||||||
@@ -965,14 +979,10 @@ class Curl implements Interface\RequestsInterface
|
|||||||
$value = [$value];
|
$value = [$value];
|
||||||
}
|
}
|
||||||
// array values so we rewrite the key pos
|
// array values so we rewrite the key pos
|
||||||
/** @var array<int|string,string> $headers */
|
$this->config['headers'][$header_key] = array_values(array_diff(
|
||||||
$headers = $this->config['headers'][$header_key];
|
$this->config['headers'][$header_key],
|
||||||
$this->config['headers'][$header_key] = array_values(
|
|
||||||
array_diff(
|
|
||||||
$headers,
|
|
||||||
$value
|
$value
|
||||||
)
|
));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user