Compare commits

...
24 Commits
Author SHA1 Message Date
cliphouse 369f2e2586 Immutable hash for arrays, add not sort keys flag 2026-09-18 21:53:36 +09:00
cliphouse 3a33f07ae7 Add DB:IO strip non assoc entries from result
if we have a mixed result, strip all int key (non assoc) entries from the result
2026-09-18 18:56:43 +09:00
cliphouse 0b057864ae Hash: immutable hash over array
with sorted keys, but arrays stay unsorted
2026-09-18 18:36:40 +09:00
cliphouse 2bb405d741 Add tests for new array functions, other minro fixes for phan && phpstan checks 2026-09-18 17:33:44 +09:00
cliphouse c38ff8b405 Merge branch 'development' into feature/TTD-2662/function-add-to-ArrayCombined 2026-09-18 15:44:01 +09:00
cliphouse 66d5f6247b Add eslint packages 2026-09-18 15:43:01 +09:00
cliphouse 74da813832 Add logging to phpunit.xml 2026-06-25 19:08:57 +09:00
cliphouse 8c7e2782ae DB IO PgSQL supress warnings if we cannot connect 2026-06-25 18:22:13 +09:00
cliphouse 7bc7674021 Cleaned up all warnings for phpunit tests 2026-06-25 18:10:18 +09:00
cliphouse 3f02bee643 Test updates with skip for DB, URL check skip and lookup fix
curl fix for printing out response, we just want true/false if connect worked
skip curl tests where we need a base url
skip any DB tests if there is no DB
update the caller method list test
2026-06-25 17:24:45 +09:00
cliphouse e3306a096f Tests updates: DB try catch for the ACL test, curl setup fix
curl init alone is not enought to validate a url.

for DB conneciton use try/catch to get errors and skip test
2026-06-25 16:40:10 +09:00
cliphouse d66fce374c Update tests for fsetFolder 2026-06-25 16:26:15 +09:00
cliphouse 7e01886ad8 Test updates: add timezone, some fixes for debug callers 2026-06-25 15:52:53 +09:00
cliphouse e1109e925b phpstan fixes 2026-06-25 14:12:47 +09:00
cliphouse 6c67ab6259 Update for humanReadableByteFormat, update edit.jq.js
edit.jq.js: remove deprecated function decodeHtmlEntities, use utils.js instead

update for humanReadableByteFormat to return non numeric first and then proceed with
the convert
2026-05-27 09:00:48 +09:00
cliphouse c467ed326c Logger Level returns self 2026-05-20 18:46:57 +09:00
cliphouse 40cd64f667 Update JS Utils to v1.1.0, back add html entities convert to Javascript 2026-05-20 18:45:54 +09:00
Clemens Schwaighofer 05dae1031a Locale files test update, L10n PHPdoc typo fix 2026-05-12 14:49:07 +09:00
Clemens Schwaighofer 82ba2a189a L10n update for PHPdoc array descriptions
Make the PHPdoc array description detailed for the parseLocale method
2026-05-12 11:39:19 +09:00
Clemens Schwaighofer a8755c8c0f phpstan check fixes 2026-05-11 15:31:59 +09:00
Clemens Schwaighofer 85f7e114b0 Add throw exception to get mime info if there is no mime type found
Instead of returning empty
2026-05-11 13:38:17 +09:00
Clemens Schwaighofer 6b1261b157 Update dotenv to v3 2026-04-20 16:19:19 +09:00
Clemens Schwaighofer b695c3ffdc phive updates 2026-04-20 10:36:53 +09:00
Clemens Schwaighofer e2362418aa phive updates 2026-04-20 10:36:26 +09:00
59 changed files with 1089 additions and 340 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ node_modules/
**/composer.lock
**/vendor/
tools/
**/.env
**/configs/.env
**/.target
package-lock.json
build/
+4 -4
View File
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<phive xmlns="https://phar.io/phive">
<phar name="phpunit" version="~9.6" installed="9.6.31" location="./tools/phpunit" copy="false"/>
<phar name="phpunit" version="~9.6" installed="9.6.34" location="./tools/phpunit" copy="false"/>
<phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/>
<phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/>
<phar name="phpstan" version="^2.0" installed="2.1.33" location="./tools/phpstan" copy="false"/>
<phar name="phpstan" version="^2.0" installed="2.2.2" location="./tools/phpstan" copy="false"/>
<phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/>
<phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" 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.9.1" location="./tools/phpDocumentor" copy="false"/>
<phar name="php-cs-fixer" version="^3.34.1" installed="3.92.4" location="./tools/php-cs-fixer" copy="false"/>
<phar name="phpdocumentor" version="^3.4.2" installed="3.10.0" 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"/>
</phive>
+3 -3
View File
@@ -8,11 +8,11 @@
msgid ""
msgstr ""
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
"Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+3 -3
View File
@@ -8,11 +8,11 @@
msgid ""
msgstr ""
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
"Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+3 -3
View File
@@ -8,11 +8,11 @@
msgid ""
msgstr ""
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
"Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+3 -3
View File
@@ -8,11 +8,11 @@
msgid ""
msgstr ""
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
"Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -12,6 +12,8 @@ use PHPUnit\Framework\TestCase;
*/
final class CoreLibsAAASetupDataTest extends TestCase
{
public const TIME_ZONE = 'Asia/Tokyo';
/**
* Covers nothing
*
@@ -34,6 +36,9 @@ final class CoreLibsAAASetupDataTest extends TestCase
BASE,
'BASE Path set check'
);
// if time zone is not set, errors can happen
ini_set('date.timezone', self::TIME_ZONE);
}
}
+21 -15
View File
@@ -80,21 +80,27 @@ final class CoreLibsACLLoginTest extends TestCase
'log_file_id' => 'CoreLibs-ACL-Login-Test',
]);
// test database we need to connect do, if not possible this test is skipped
self::$db = new \CoreLibs\DB\IO(
[
'db_name' => $db_name,
'db_user' => $db_user,
'db_pass' => $db_password,
'db_host' => $db_host,
'db_port' => 5432,
'db_schema' => 'public',
'db_type' => 'pgsql',
'db_encoding' => '',
'db_ssl' => 'allow', // allow, disable, require, prefer
'db_debug' => true,
],
self::$log
);
try {
self::$db = new \CoreLibs\DB\IO(
[
'db_name' => $db_name,
'db_user' => $db_user,
'db_pass' => $db_password,
'db_host' => $db_host,
'db_port' => 5432,
'db_schema' => 'public',
'db_type' => 'pgsql',
'db_encoding' => '',
'db_ssl' => 'allow', // allow, disable, require, prefer
'db_debug' => true,
],
self::$log
);
} catch (\Exception $e) {
self::markTestSkipped(
'Cannot connect to Test DB for ACL\Login test: ' . $e->getMessage()
);
}
// ALWAYS drop DB and RECREATE DB
// 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;
@@ -15,6 +15,12 @@ if [ ! -f "${load_sql}" ]; then
echo 1;
exit 1;
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_name="${3}";
db_host="${4}";
@@ -24,25 +30,25 @@ if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
exit 2;
fi;
# drop database, on error exit with 3
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1;
if [ $? -ne 0 ]; then
dropdb -U "${db_user}" -h "${db_host}" "${db_name}" 2>&1;
if [ ! $? ]; then
echo 3;
exit 3;
fi;
# create database, on error exit with 4
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1;
if [ $? -ne 0 ]; then
createdb -U "${db_user}" -O "${db_user}" -h "${db_host}" -E utf8 "${db_name}" 2>&1;
if [ ! $? ]; then
echo 4;
exit 4;
fi;
# if error 5 thrown, test with enabled below
if [ ! -z "${5}" ]; then
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
if [ -n "${5}" ]; then
psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}";
else
# 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;
if [ $? -ne 0 ]; then
if [ ! $? ]; then
echo 5;
exit 5;
fi;
@@ -16,7 +16,7 @@ use PHPUnit\Framework\TestCase;
*/
final class CoreLibsCombinedArrayHandlerTest extends TestCase
{
// we use that for all
/** @var array<mixed> we use that for all */
public static $array = [
'a' => [
'b' => 'bar',
@@ -51,7 +51,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function arraySearchRecursiveProvider(): array
{
@@ -110,7 +110,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function arraySearchRecursiveAllProvider(): array
{
@@ -182,7 +182,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function arraySearchSimpleProvider(): array
{
@@ -383,7 +383,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function arraySearchKeyProvider(): array
{
@@ -565,7 +565,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* provides array listing for the merge test
*
* @return array
* @return array<mixed>
*/
public function arrayMergeRecursiveProvider(): array
{
@@ -602,7 +602,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* for warning checks
*
* @return array
* @return array<mixed>
*/
public function arrayMergeRecursiveProviderWarning(): array
{
@@ -634,7 +634,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function arrayCompareProvider(): array
{
@@ -665,7 +665,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function inArrayAnyProvider(): array
{
@@ -688,6 +688,11 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
];
}
/**
* Undocumented function
*
* @return array<mixed>
*/
public function genAssocArrayProvider(): array
{
return [
@@ -764,7 +769,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function flattenArrayProvider(): array
{
@@ -808,7 +813,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* use the flattenArrayProvider and replace 1 with 2 array pos
*
* @return array
* @return array<mixed>
*/
public function flattenArrayKeyProvider(): array
{
@@ -825,7 +830,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* use the flattenArrayProvider and replace 1 with array pos
*
* @return array
* @return array<mixed>
*/
public function flattenArrayKeyLeavesOnlyProvider(): array
{
@@ -842,7 +847,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @return array
* @return array<mixed>
*/
public function arrayFlatForKeyProvider(): array
{
@@ -906,6 +911,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
];
}
// MARK: arraySearchRecursive
/**
* Undocumented function
*
@@ -926,6 +933,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arraySearchRecursiveAll
/**
* Undocumented function
*
@@ -947,6 +956,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arraySearchSimple
/**
* Undocumented function
*
@@ -969,6 +980,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arraySearchKey
/**
* Undocumented function
*
@@ -1007,6 +1020,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arrayMergeRecursive
/**
* Undocumented function
*
@@ -1031,6 +1046,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arrayMergeRecursive
/**
* Undocumented function
*
@@ -1063,6 +1080,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
restore_error_handler();
}
// MARK: arrayDiff
/**
* Undocumented function
*
@@ -1083,6 +1102,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: inArrayAny
/**
* Undocumented function
*
@@ -1103,6 +1124,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: genAssocArray
/**
* Undocumented function
*
@@ -1125,6 +1148,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: flattenArray
/**
* Undocumented function
*
@@ -1144,6 +1169,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: flattenArrayKey
/**
* Undocumented function
*
@@ -1163,6 +1190,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: flattenArrayKeyLeavesOnly
/**
* Undocumented function
*
@@ -1182,6 +1211,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arrayFlatForKey
/**
* Undocumented function
*
@@ -1202,6 +1233,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arrayGetPrevKey, arrayGetNextKey
/**
* Undocumented function
*
@@ -1266,7 +1299,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/**
* Undocumented function
*
* @covers ::arrayGetPrevKey, ::arrayGetNextKey
* @covers ::arrayGetPrevKey
* @covers ::arrayGetNextKey
* @dataProvider providerArrayGetNextPrevKey
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
*
@@ -1294,6 +1328,13 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arrayReturnMatchingKeyOnly
/**
* Undocumented function
*
* @return array
*/
public function providerReturnMatchingKeyOnley(): array
{
return [
@@ -1379,6 +1420,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: arrayModifyKey
/**
* provider for arrayModifyKey
*
@@ -1491,6 +1534,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: sortArray
/**
* sort
*
@@ -1710,7 +1755,9 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
}
}
/**
// MARK: ksortArray
/**
* sort
*
* @return array
@@ -1866,6 +1913,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
}
}
// MARK: findArraysMissingKey
/**
* Undocumented function
*
@@ -2033,6 +2082,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
);
}
// MARK: selectArrayFromOption
/**
* Undocumented function
*
@@ -2378,6 +2429,316 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
$result
);
}
// MARK: getRandomEntryFromArrayProvider
/**
* Get random entry from array provider
*
* @return array<mixed>
*/
public function getRandomEntryFromArrayProvider(): array
{
return [
'empty array' => [
[],
],
'single element array' => [
['only'],
],
'multiple elements array' => [
['first', 'second', 'third'],
],
];
}
/**
* Undocumented function
*
* @covers ::getRandomEntryFromArray
* @dataProvider getRandomEntryFromArrayProvider
* @testdox getRandomEntryFromArray get random value from array [$_dataName]
*
* @param array $input
* @return void
*/
public function testGetRandomEntryFromArray(array $input): void
{
$result = \CoreLibs\Combined\ArrayHandler::getRandomEntryFromArray($input);
if (empty($input)) {
$this->assertNull($result);
} else {
$this->assertContains($result, $input);
}
}
// MARK: removeArrayEntryByValue
/**
* Remove array entry by value provider
*
* @return array<mixed>
*/
public function removeArrayEntryByValueProvider(): array
{
return [
'empty array' => [
[],
'',
null,
[],
],
'single element array' => [
['only'],
'only',
null,
[]
],
'single element array, not found' => [
['only'],
'foo',
null,
['only']
],
'multiple elements array' => [
['first', 'second', 'third'],
'second',
null,
['first', 'third'],
],
'array with multiple identical elements' => [
['first', 'second', 'first', 'third'],
'first',
null,
['second', 'third'],
],
'array with multiple identical elements, other remove' => [
['first', 'second', 'first', 'third'],
'second',
null,
['first', 'first', 'third'],
],
'array with key value entries' => [
[
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3',
],
'value2',
null,
[
'key1' => 'value1',
'key3' => 'value3',
]
],
'nested array, array match' => [
[
['first', 'second'],
['third', 'fourth'],
],
['third', 'fourth'],
null,
[
['first', 'second'],
],
],
'strict test, off' => [
['3', 3,],
'3',
null,
[],
],
'strict test, on' => [
['3', 3,],
'3',
true,
[3,],
],
'strict test bool, off' => [
['false', false, 0],
false,
null,
['false'],
],
'strict test bool, on' => [
['false', false, 0],
false,
true,
['false', 0],
],
'strict test float, off' => [
['3.14', 3.14],
3.14,
null,
[],
],
'strict test float, on' => [
['3.14', 3.14],
3.14,
true,
['3.14'],
],
'stric test float and int, off' => [
['1.0', '1', 1.0, 1],
1,
null,
[],
],
'stric test float and int, on' => [
['1.0', '1', 1.0, 1],
1,
true,
['1.0', '1', 1.0],
],
];
}
/**
* Test for removeArrayEntryByValue function
*
* @covers ::removeArrayEntryByValue
* @dataProvider removeArrayEntryByValueProvider
* @testdox removeArrayEntryByValue Remove $value from array $input, with $strict [$_dataName]
*
* @param array $input
* @param string|int|float|bool|array $value
* @param bool|null $strict
* @param array $expected
* @return void
*/
public function testRemoveArrayEntryByValue(
array $input,
string|int|float|bool|array $value,
?bool $strict,
array $expected
): void {
if ($strict !== null) {
$result = \CoreLibs\Combined\ArrayHandler::removeArrayEntryByValue($input, $value, $strict);
} else {
$result = \CoreLibs\Combined\ArrayHandler::removeArrayEntryByValue($input, $value);
}
$this->assertEquals(array_values($expected), array_values($result));
}
// MARK: addStringToEachValueInArray
/**
* Data provider for addStringToEachValueInArray tests.
*
* @return array
*/
public function addStringToEachValueInArrayProvider(): array
{
return [
'empty array' => [
[],
'string',
null,
[],
],
'empty string to add' => [
['a', 'b'],
'',
null,
['a', 'b'],
],
'prefix true' => [
['a', 'b'],
'pre_',
true,
['pre_a', 'pre_b'],
],
'prefix false' => [
['a', 'b'],
'_suf',
false,
['a_suf', 'b_suf'],
],
'mixed values' => [
['a', 'b', 'c', 5, 6],
'X',
true,
['Xa', 'Xb', 'Xc', 'X5', 'X6'],
]
];
}
/**
* Test for addStringToEachValueInArray function
*
* @covers ::addStringToEachValueInArray
* @dataProvider addStringToEachValueInArrayProvider
* @testdox addStringToEachValueInArray Add $string_to_add to each value in $array, with $prefix [$_dataName]
*
* @param array $array
* @param string $string_to_add
* @param bool|null $prefix
* @param array|null $expected
* @return void
*/
public function testAddStringToEachValueInArray(
array $array,
string $string_to_add,
?bool $prefix,
?array $expected
) {
if ($prefix == null) {
$result = \CoreLibs\Combined\ArrayHandler::addStringToEachValueInArray($array, $string_to_add);
} else {
$result = \CoreLibs\Combined\ArrayHandler::addStringToEachValueInArray($array, $string_to_add, $prefix);
}
$this->assertEquals($expected, $result);
}
// MARK: createSortedArrayByKey
/**
* Data provider for createSortedArrayByKey tests.
*
* @return array
*/
public function createSortedArrayByKeyProvider(): array
{
return [
'empty' => [
[],
[],
],
'flat array' => [
['b' => 2, 'a' => 1, 'c' => 3],
['a' => 1, 'b' => 2, 'c' => 3],
],
'nested array' => [
['b' => 2, 'a' => 1, 'c' => ['d' => 4, 'b' => 2]],
['a' => 1, 'b' => 2, 'c' => ['b' => 2, 'd' => 4]],
],
'deeply nested array' => [
['b' => 2, 'a' => 1, 'c' => ['d' => 4, 'b' => 2, 'e' => ['g' => 7, 'f' => 6]]],
['a' => 1, 'b' => 2, 'c' => ['b' => 2, 'd' => 4, 'e' => ['f' => 6, 'g' => 7]]],
],
'mixed key type' => [
['b' => 2, 1 => 'one', 'a' => 1],
[1 => 'one', 'a' => 1, 'b' => 2],
],
];
}
/**
* Test for createSortedArrayByKey function
*
* @covers ::createSortedArrayByKey
* @dataProvider createSortedArrayByKeyProvider
* @testdox createSortedArrayByKey Sort the array by keys recursively [$_dataName]
*
* @param array $input
* @param array $expected
* @return void
*/
public function testCreateSortedArrayByKey(array $input, array $expected): void
{
$result = \CoreLibs\Combined\ArrayHandler::createSortedArrayByKey($input);
$this->assertEquals($expected, $result);
}
}
// __END__
@@ -1,4 +1,4 @@
<?php
<?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
@@ -71,15 +71,16 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
*
* @covers ::dateStringFormat
* @dataProvider timestampProvider
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
* @testdox dateStringFormat $input (mt $flag_show_micro, float mt $flag_micro_as_float) will be $expected [$_dataName]
*
* @param int|float $input
* @param bool $flag
* @param bool $flag_show_micro
* @param bool $flag_micro_as_float
* @param string $expected
* @return void
*/
public function testDateStringFormat(
$input,
int|float $input,
bool $flag_show_micro,
bool $flag_micro_as_float,
string $expected
@@ -101,7 +101,7 @@ final class CoreLibsConvertColorTest extends TestCase
* @covers ::rgbToHwb
* @covers ::hsbToRgb
* @covers ::hslToRgb
* @covers ::hwebToRgb
* @covers ::hwbToRgb
* @testdox Convert from and to RGB via HSL, HWB, HSB/V
*
* @return void
@@ -298,7 +298,6 @@ final class CoreLibsConvertColorTest extends TestCase
/**
* Undocumented function
*
* @covers ::returnAsHex()
* @testdox Convert from and to RGB via hex
*
* @return void
@@ -342,8 +341,6 @@ final class CoreLibsConvertColorTest extends TestCase
/**
* linear RGB conversion tests
*
* @covers ::fromLinear
* @covers ::toLinear
* @testdox Convert from and to RGB linear conversion check
*
* @return void
@@ -933,7 +930,6 @@ final class CoreLibsConvertColorTest extends TestCase
/**
* Undocumented function
*
* @covers ::__get
* @testdox Exception handling for RGB general calls
*
* @return void
@@ -958,7 +954,6 @@ final class CoreLibsConvertColorTest extends TestCase
/**
* Undocumented function
*
* @covers ::setFromHex
* @testdox Exception handling for RGB setFromHex failues
*
* @return void
@@ -1086,7 +1081,6 @@ final class CoreLibsConvertColorTest extends TestCase
/**
* Undocumented function
*
* @covers ::__get
* @testdox Exception handling for Lab general calls
*
* @return void
@@ -1120,7 +1114,6 @@ final class CoreLibsConvertColorTest extends TestCase
/**
* Undocumented function
*
* @covers ::__get
* @testdox Exception handling for LCH general calls
*
* @return void
@@ -1155,7 +1148,6 @@ final class CoreLibsConvertColorTest extends TestCase
/**
* Undocumented function
*
* @covers ::__get
* @testdox Exception handling for XYZ general calls
*
* @return void
@@ -277,6 +277,38 @@ final class CoreLibsConvertJsonTest extends TestCase
);
}
/**
* 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
*
@@ -671,7 +671,7 @@ final class CoreLibsConvertStringsTest extends TestCase
/**
* Undocumented function
*
* @covers ::isValidRegexSimple
* @covers ::isValidRegex
* @dataProvider isValidRegexSimpleProvider
* @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName]
*
@@ -421,6 +421,100 @@ final class CoreLibsCreateHashTest extends TestCase
'hash hmac valid'
);
}
// MARK: generateImmutableHashForArray
/**
* Data provider for testGenerateImmutableHashForArray.
*
* @return array
*/
public function generateImmutableHashForArrayProvider(): array
{
return [
'Empty array' => [
[],
null,
'064f01fe',
],
'Simple array' => [
['key' => 'value'],
null,
'78f40899',
],
'flat array a' => [
[0, 1, 'b', 'c', 'a'],
null,
'ccec0f5b',
],
'flat array b' => [
['b', 'c', 'a', 1, 0],
null,
'c6040f5b',
],
'flat array b, not sorted' => [
['b', 'c', 'a', 1, 0],
false,
'c6040f5b',
],
'key array a' => [
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
null,
'01f11355',
],
'key array a, not sorted' => [
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
false,
'04911355',
],
'key array b' => [
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
null,
'01f11355',
],
'key array b, not sorted' => [
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
false,
'01f11355',
],
'complex nested array' => [
[
'level1' => [
'level2' => [
'level3' => 'value'
]
]
],
null,
'd8de1565',
]
];
}
/**
* Test for generating an immutable hash from an array.
*
* @covers ::generateImmutableHashForArray
* @dataProvider generateImmutableHashForArrayProvider
* @testdox generate immutable hash for array with result $expected [$_dataName]
*
* @param array<mixed> $input
* @param string $expected
*/
public function testGenerateImmutableHashForArray(array $input, ?bool $sort_keys, string $expected): void
{
if ($sort_keys === null) {
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::generateImmutableHashForArray($input)
);
} else {
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::generateImmutableHashForArray($input, $sort_keys)
);
}
}
}
// __END__
@@ -87,7 +87,7 @@ final class CoreLibsCreateRandomKeyTest extends TestCase
/**
* Undocumented function
*
* @covers ::randomKeyGeyn
* @covers ::randomKeyGen
* @dataProvider randomKeyGenProvider
* @testdox randomKeyGen use $input key length $expected [$_dataName]
*
@@ -78,7 +78,6 @@ final class CoreLibsCreateSessionTest extends TestCase
/**
* Test session start
*
* @covers ::startSession
* @dataProvider sessionProvider
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
*
@@ -121,7 +121,6 @@ final class CoreLibsCreateUidsTest extends TestCase
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
*
* @covers ::uuidv4
* @covers ::validateUuidv4
* @testdox uuidv4 check that return is matching regex [$_dataName]
*
* @return void
+63 -8
View File
@@ -123,10 +123,16 @@ final class CoreLibsDBIOTest extends TestCase
'log_file_id' => 'CoreLibs-DB-IO-Test',
]);
// will be true, default logging is true
$db = new \CoreLibs\DB\IO(
self::$db_config['valid'],
self::$log
);
try {
$db = new \CoreLibs\DB\IO(
self::$db_config['valid'],
self::$log
);
} catch (\Exception $e) {
self::markTestSkipped(
'Cannot connect to Test DB for DB\IO test: ' . $e->getMessage()
);
}
if (!$db->dbGetConnectionStatus()) {
self::markTestSkipped(
'Cannot connect to valid Test DB for DB\IO test.'
@@ -543,8 +549,6 @@ final class CoreLibsDBIOTest extends TestCase
/**
* Test dbSetDbug, dbGetDebug
*
* @covers ::dbGetDbug
* @covers ::dbSetDebug
* @testdox Set and Get Debug flag
*
* @return void
@@ -1003,6 +1007,59 @@ final class CoreLibsDBIOTest extends TestCase
$db->dbClose();
}
// MARK: stripAssocOnly
/**
* Data provider for stripAssocOnly tests
*
* @return array<mixed>
*/
public function stripAssocOnlyProvider(): array
{
return [
'empty' => [
[],
[]
],
'int only' => [
[0 => 'foo', 1 => 'bar'],
[],
],
'mixed' => [
[0 => 'foo', 'col_a' => 'foo', 1 => 'bar', 'col_b' => 'bar'],
['col_a' => 'foo', 'col_b' => 'bar'],
],
'key only' => [
['col_a' => 'foo', 'col_b' => 'bar'],
['col_a' => 'foo', 'col_b' => 'bar'],
]
];
}
/**
* Test for stripAssocOnly function
*
* @covers ::stripAssocOnly
* @dataProvider stripAssocOnlyProvider
* @testdox strip assoc non string entries from return [$_dataName]
*
* @param array<mixed> $input
* @param array<string,mixed> $expected
* @return void
*/
public function testStripAssocOnly(array $input, array $expected): void
{
$db = new \CoreLibs\DB\IO(
self::$db_config['valid'],
self::$log
);
$this->assertEquals(
$expected,
$db->stripAssocOnly($input)
);
$db->dbClose();
}
// - string escape tests
// dbEscapeString, dbEscapeLiteral, dbEscapeIdentifier,
@@ -3021,8 +3078,6 @@ final class CoreLibsDBIOTest extends TestCase
* @covers ::dbReturnParams
* @covers ::dbCacheReset
* @covers ::dbGetCursorExt
* @covers ::dbCursorPos
* @covers ::dbCursorNumRows
* @dataProvider dbReturnProvider
* @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName]
*
@@ -13,29 +13,6 @@ use PHPUnit\Framework\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
*
@@ -85,18 +62,59 @@ final class CoreLibsDebugFileWriterTest extends TestCase
/**
* Undocumented function
*
* @dataProvider fsetFolderProvider
* @testdox fsetFolder $input will match $expected [$_dataName]
* @testdox fsetFolder test correct return code
*
* @param string $input
* @param boolean $expected
* @return void
*/
public function testFsetFolder(string $input, bool $expected): void
public function testFsetFolder(): 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(
$expected,
\CoreLibs\Debug\FileWriter::fsetFolder($input)
false,
\CoreLibs\Debug\FileWriter::fsetFolder($test_file)
);
// 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)
);
}
+35 -22
View File
@@ -48,8 +48,8 @@ final class CoreLibsDebugSupportTest extends TestCase
* @dataProvider printTimeProvider
* @testdox printTime test with $microtime and match to regex [$_dataName]
*
* @param int|null $mircrotime
* @param string $expected
* @param ?int $microtime
* @param string $regex
* @return void
*/
public function testPrintTime(?int $microtime, string $regex): void
@@ -460,10 +460,8 @@ final class CoreLibsDebugSupportTest extends TestCase
* Undocumented function
*
* @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]
*
* @param string $expected
* @return void
*/
public function testGetCallerFileLine(): void
@@ -471,15 +469,19 @@ final class CoreLibsDebugSupportTest extends TestCase
// regex prefix with path "/../" and then fixed vendor + \d+
// or phar start if phiev installed
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
// phar:///usr/local/bin/phpunit/phpunit/Framework/TestCase.php
$regex = "/^("
. "\/.*\/vendor\/phpunit\/phpunit\/src"
. "|"
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
. "|"
. "phar:\/\/\/usr\/local\/bin\/phpunit\/phpunit"
. ")"
. "\/Framework\/TestCase.php:\d+$/";
$this->assertMatchesRegularExpression(
$regex,
Support::getCallerFileLine()
Support::getCallerFileLine(),
'Failed for: ' . Support::getCallerFileLine()
);
}
@@ -522,7 +524,7 @@ final class CoreLibsDebugSupportTest extends TestCase
$this->assertEquals(
$expected,
$compare,
'assert expected 10'
'assert expected 10: ' . print_r($compare, true)
);
break;
case 11:
@@ -545,27 +547,38 @@ final class CoreLibsDebugSupportTest extends TestCase
$this->assertEquals(
$expected,
$compare,
'assert expected 11'
'assert expected 11: ' . print_r($compare, true)
);
break;
case 12:
// add two "run" before "runBare"
array_splice(
$expected,
7,
0,
['run']
);
array_splice(
$expected,
0,
0,
['include']
);
// 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"
array_splice(
$expected,
7,
0,
['run']
);
array_splice(
$expected,
0,
0,
['include']
);
}
$this->assertEquals(
$expected,
$compare,
'assert expected 12'
'assert expected 12: ' . print_r($compare, true)
);
break;
default:
@@ -589,7 +602,7 @@ final class CoreLibsDebugSupportTest extends TestCase
if ($call_stack < 8) {
$this->assertFalse(true, 'getCallStack too low: 8');
} else {
$this->assertTrue(true, 'getCallSteck ok');
$this->assertTrue(true, 'getCallStack ok');
}
// just test top entry
$first = array_shift($call_stack);
+1
View File
@@ -0,0 +1 @@
test.env
@@ -442,7 +442,6 @@ final class CoreLibsLanguageL10nTest extends TestCase
* init check and connected change translation
*
* @covers ::getTranslator
* @covers ::l10nReloadMOfile
* @dataProvider getTranslatorProvider
* @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName]
*
@@ -639,7 +638,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
* plural and plural context
*
* @covers ::__n
* @covers ::__pn
* @covers ::__np
* @dataProvider ngettextProvider
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
*
@@ -865,6 +864,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
string $value,
string $expected
): void {
$old_value = null;
switch ($type) {
case 'global':
$GLOBALS[$var] = $value;
@@ -1101,11 +1101,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
* fuctions check
* TODO: others d/dn/dp/dnp gettext functions
*
* @covers __setlocale
* @covers __bindtextdomain
* @covers __bind_textdomain_codeset
* @covers __textdomain
* @covers __gettext
* @covers _setlocale
* @covers _bindtextdomain
* @covers _bind_textdomain_codeset
* @covers _textdomain
* @covers _gettext
* @covers __
* @dataProvider functionsProvider
* @testdox check functions with locale $locale and domain $domain [$_dataName]
@@ -514,7 +514,6 @@ final class CoreLibsLoggingLoggingTest extends TestCase
/**
* Undocumented function
*
* @covers Logger\Flag
* @testdox Logger\Flag enum test
*
* @return void
@@ -828,6 +827,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
// clean all data in folder first
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
$log_status = false;
switch ($level->value) {
case 200:
$log_status = $log->info($message);
@@ -851,7 +851,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
$log_status = $log->emergency($message);
break;
}
$this->assertTrue($log_status, 'log write successful');
$this->assertTrue($log_status, 'log write unsuccessful for level: ' . $level->getName());
$file_content = file_get_contents(
$log->getLogFolder() . $log->getLogFile()
) ?: '';
@@ -334,7 +334,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/**
* test encrypt/decrypt produce correct output
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess
@@ -370,7 +369,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/**
* test encrypt/decrypt produce correct output
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess
@@ -397,7 +395,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/**
* test encrypt/decrypt produce correct output
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess
@@ -424,7 +421,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/**
* test encrypt/decrypt produce correct output
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess
@@ -469,7 +465,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/**
* Test decryption with wrong key
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptFailed
@@ -496,7 +491,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/**
* Test decryption with wrong key
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptFailed
@@ -521,7 +515,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/**
* Test decryption with wrong key
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptFailed
@@ -104,7 +104,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/**
* test encrypt/decrypt produce correct output
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess
@@ -132,7 +131,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/**
* test encrypt/decrypt produce correct output
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess
@@ -158,7 +156,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/**
* test encrypt/decrypt produce correct output
*
* @covers ::generateRandomKey
* @covers ::encryptKey
* @covers ::decryptKey
* @dataProvider providerEncryptDecryptSuccess
@@ -202,7 +199,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/**
* Test decryption with wrong key
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptFailed
@@ -228,7 +224,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/**
* Test decryption with wrong key
*
* @covers ::generateRandomKey
* @covers ::encrypt
* @covers ::decrypt
* @dataProvider providerEncryptFailed
@@ -252,7 +247,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/**
* Test decryption with wrong key
*
* @covers ::generateRandomKey
* @covers ::encryptKey
* @covers ::decryptKey
* @dataProvider providerEncryptFailed
@@ -42,7 +42,6 @@ final class CoreLibsTemplateHtmlBuilderElementTest extends TestCase
/**
* Undocumented function
*
* @covers ::Element
* @covers ::buildHtml
* @covers ::getTag
* @covers ::getId
@@ -58,6 +58,11 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
if ($handle === false) {
continue;
}
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$status = curl_exec($handle);
if ($status === false) {
continue;
}
$this->url_basic = $url;
// print "Open: $url\n";
break;
@@ -459,20 +464,19 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
/**
* set setup + header, base uri change
*
* @covers ::Curl
* @covers ::setBaseUri
* @covers ::addHeader
* @covers ::removeHEader
* @covers ::setHeaders
* @covers ::removeHeaders
* @dataProvider providerUrlRequestsCurlSetup
* @testdox UrlRequests\Curl Class setup tasks [$_dataName]
*
* @param null|array $config
* @param array $expected
* @param null|string $new_base_uri
* @param null|array $set_header
* @param null|bool $set_header_add
* @param null|array $remove_header
* @param null|array $expected_change
* @param null|array $config
* @param array<string,mixed> $expected_set
* @param null|string $new_base_uri
* @param null|array $set_header
* @param null|bool $set_header_add
* @param null|array $remove_header
* @param null|array $expected_change
* @return void
*/
public function testUrlRequestsCurlSetupConfig(
@@ -492,10 +496,18 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
};
// if ($new_base_uri === null && $set_header === null && $remove_header === null) {
// }
$this->assertEquals($expected_set, $curl->getConfig(), 'Class setup config mismatch');
$this->assertEquals(
$expected_set,
$curl->getConfig(),
'Class setup config mismatch'
);
if ($new_base_uri !== null) {
$curl->setBaseUri($new_base_uri);
$this->assertEquals($expected_change, $curl->getConfig(), 'new base_uri not matching');
$this->assertEquals(
$expected_change,
$curl->getConfig(),
'new base_uri not matching'
);
}
if ($set_header !== null) {
if ($set_header_add !== null) {
@@ -503,11 +515,19 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
} else {
$curl->setHeaders($set_header);
}
$this->assertEquals($expected_change, $curl->getConfig(), 'new headers not matching');
$this->assertEquals(
$expected_change,
$curl->getConfig(),
'new headers not matching'
);
}
if ($remove_header !== null) {
$curl->removeHeaders($remove_header);
$this->assertEquals($expected_change, $curl->getConfig(), 'removed headers not matching');
$this->assertEquals(
$expected_change,
$curl->getConfig(),
'removed headers not matching'
);
}
}
@@ -877,7 +897,7 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
string $return_content
) {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing: GET');
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl();
// options
@@ -960,6 +980,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/
public function testUrlRequestsCurlRequestMultiple()
{
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl();
// get
$response = $curl->get($this->url_basic, [
@@ -1051,6 +1074,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/
public function testUrlRequestsCurlAuthHeader()
{
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl([
"auth" => ["user", "pass", "basic"],
"http_errors" => false,
@@ -1117,6 +1143,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/
public function testExceptionInvalidHeaderKey(): void
{
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl();
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/InvalidHeaderKey/");
@@ -1137,6 +1166,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/
public function testExceptionInvalidHeaderValue(): void
{
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl();
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/InvalidHeaderValue/");
@@ -1186,6 +1218,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/
public function testExceptionBadRequest(): void
{
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/ClientError/");
@@ -1207,6 +1242,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/
public function testExceptionBadRequestEnable(): void
{
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]);
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/ClientError/");
@@ -1229,6 +1267,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/
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
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
$response = $curl->request('get', $this->url_basic, [
+8
View File
@@ -124,3 +124,11 @@ The development for those files is located in a different repository
General: <https://[service]/CodeBlocks/JavaScript.utils>
Org: <https://[serverice]/[org]/Code-Blocks.JavaScript.utils>
### Update NPM packages
```sh
npm-check-updates
ncu -u
npm install
```
+4
View File
@@ -18,6 +18,10 @@ export default [
globals: {
...globals.browser,
...globals.jquery
},
parserOptions: {
ecmaVersion: 2022,
sourceType: "script",
}
}},
pluginJs.configs.recommended,
+4 -4
View File
@@ -9,9 +9,9 @@
"license": "",
"description": "Core Libraries",
"devDependencies": {
"@eslint/js": "^9.20.0",
"esbuild": "^0.25.0",
"eslint": "^9.20.1",
"globals": "^15.15.0"
"@eslint/js": "^10.0.1",
"esbuild": "^0.28.1",
"eslint": "^10.5.0",
"globals": "^17.7.0"
}
}
+6
View File
@@ -23,4 +23,10 @@
<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>
+19
View File
@@ -38,6 +38,25 @@ print "GETFILENAMEENDING: $file: " . File::getFilenameEnding($file) . "<br>";
$file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php';
print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($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>";
+14
View File
@@ -103,6 +103,20 @@ foreach ($hash_types as $hash_type) {
// print "UNIQU ID SHORT : " . Hash::__uniqId() . "<br>";
// print "UNIQU ID LONG : " . Hash::__uniqIdLong() . "<br>";
$tests = [
// array diff
[0, 1, 'b', 'c', 'a'],
['b', 'c', 'a', 1, 0],
// key set arrays DO NOT diff
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
];
foreach ($tests as $test) {
print "IMMUTABLE HASH FOR ARRAY: " . Hash::generateImmutableHashForArray($test) . "<br>";
print "IMMUTABLE HASH FOR ARRAY: " . Hash::generateImmutableHashForArray($test, sort_keys:false) . "<br>";
print "SERIALIZED HASH FOR ARRAY: " . hash(Hash::DEFAULT_HASH, serialize($test)) . "<br>";
}
print "</body></html>";
// __END__
+13
View File
@@ -1598,4 +1598,17 @@ 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 */
+16 -7
View File
@@ -135,7 +135,7 @@ var HtmlElementCreator = class {
* @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} [content=''] text content inside, is skipped if sub elements exist
* @param {Array} [css=[]] array for css tags
* @param {Array<String>} [css=[]] array for css tags
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
* @return {Object} created element as an object
*/
@@ -509,6 +509,11 @@ function numberWithCommas(number) {
function convertLBtoBR(string) {
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
function getTimestamp() {
@@ -660,18 +665,19 @@ function getQueryStringParam(search = "", query = "", single = false) {
if (search) {
let _params = url.searchParams.getAll(search);
if (_params.length == 1 || single === true) {
param = _params[0];
return _params[0];
} else if (_params.length > 1) {
param = _params;
return _params;
}
} else {
param = {};
let param2 = {};
for (const [key] of url.searchParams.entries()) {
if (typeof param[key] === "undefined") {
if (typeof param2[key] === "undefined") {
let _params = url.searchParams.getAll(key);
param[key] = _params.length < 2 || single === true ? _params[0] : _params;
param2[key] = _params.length < 2 || single === true ? _params[0] : _params;
}
}
return param2;
}
return param;
}
@@ -1425,6 +1431,9 @@ function numberWithCommas2(x) {
function convertLBtoBR2(string) {
return convertLBtoBR(string);
}
function decodeHtmlEntities2(string) {
return decodeHtmlEntities(string);
}
function getTimestamp2() {
return getTimestamp();
}
@@ -1549,7 +1558,7 @@ function acssel(_element, css) {
return hec.acssel(_element, css);
}
function scssel(_element, rcss, acss) {
hec.scssel(_element, rcss, acss);
return hec.scssel(_element, rcss, acss);
}
function phfo(tree) {
return hec.phfo(tree);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -23,7 +23,7 @@
"require": {
"egrajp/smarty-extended": "^5.4",
"php": ">=8.1",
"gullevek/dotenv": "^2.0",
"gullevek/dotenv": "^3.0",
"psr/log": "^2.0 || ^3.0",
"php-privacy/openpgp": "^2.1"
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9 -3
View File
@@ -58,15 +58,21 @@ class File
* else returns '' for any other finfo read problem
*
* @param string $read_file File to read, relative or absolute path
* @return string
* @return string mime type
* @throws \UnexpectedValueException if file cannot be read or is not a file
* @throws \RangeException if we cannot get a mime type
*/
public static function getMimeType(string $read_file): string
{
$finfo = new \finfo(FILEINFO_MIME_TYPE);
if (!is_file($read_file)) {
if (!is_file($read_file) || !is_readable($read_file)) {
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
}
return $finfo->file($read_file) ?: '';
$mime_type = $finfo->file($read_file);
if ($mime_type === false) {
throw new \RangeException('[getMimeType] Cannot get mime type for: ' . $read_file);
}
return $mime_type;
}
}
+11 -6
View File
@@ -475,8 +475,7 @@ class ArrayHandler
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
}
$merged = [];
while ($in_arrays) {
$in_array = array_shift($in_arrays);
foreach ($in_arrays as $in_array) {
if (!is_array($in_array)) {
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
}
@@ -813,7 +812,6 @@ class ArrayHandler
}
/**
* TODO: move to CoreLibs ArrayCombined
* return one random entry from an array (value)
* the return entry is null if the incoming array is empty
* the array can also be an array of arrays
@@ -831,9 +829,7 @@ class ArrayHandler
}
/**
* TODO: move to CoreLibs ArrayCombined
* find and remove one value
* on default removes only the first entry
* on default does not strict compare
*
* @param array<mixed> $array
@@ -846,6 +842,9 @@ class ArrayHandler
string|int|float|bool|array $value,
bool $strict = false,
): array {
if (empty($array)) {
return $array;
}
return array_filter($array, function ($element) use ($value, $strict) {
return $strict ?
$element !== $value :
@@ -854,7 +853,6 @@ class ArrayHandler
}
/**
* TODO: move to CoreLibs ArrayCombined
* add a string to each element in an array, default is at the end of the value,
* can be switched with the prefix flag
*
@@ -865,6 +863,10 @@ class ArrayHandler
*/
public static function addStringToEachValueInArray(array $array, string $string_to_add, bool $prefix = false): array
{
// nothing set, skip
if (empty($string_to_add) || empty($array)) {
return $array;
}
return array_map(function ($value) use ($string_to_add, $prefix) {
return $prefix ?
$string_to_add . $value :
@@ -880,6 +882,9 @@ class ArrayHandler
*/
public static function createSortedArrayByKey(array $data): array
{
if (empty($data)) {
return $data;
}
// Sort by keys
ksort($data);
+2 -2
View File
@@ -133,7 +133,7 @@ class DateTime
} else {
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
$output = floor((float)$timestamp / $timegroups[$i]);
$timestamp = (float)$timestamp % $timegroups[$i];
$timestamp = $timestamp % $timegroups[$i];
// output has days|hours|min|sec
if ($output || $time_string) {
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
@@ -453,7 +453,7 @@ class DateTime
}
if (isset($matches[11]) && is_numeric($matches[11])) {
// for milliseconds, we need to divide by 1000 and add them
$timestamp += (float)($matches[11] / 1000);
$timestamp += ((float)$matches[11] / 1000);
}
if ($negative) {
// cast to float so we can do a negative multiplication
+62 -63
View File
@@ -43,71 +43,70 @@ class Byte
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
{
// if not numeric, return as is
if (is_numeric($bytes)) {
// flags bit wise check
// remove space between number and suffix
if ($flags & self::BYTE_FORMAT_NOSPACE) {
$space = false;
} else {
$space = true;
}
// use sprintf instead of round
if ($flags & self::BYTE_FORMAT_ADJUST) {
$adjust = true;
} else {
$adjust = false;
}
// use SI 1000 mod and not 1024 mod
if ($flags & self::BYTE_FORMAT_SI) {
$si = true;
} else {
$si = false;
}
if ($flags > 7) {
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
}
// si or normal
$unit = $si ? 1000 : 1024;
// always positive
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs((float)$bytes);
// smaller than unit is always B
if ($abs_bytes < $unit) {
return $bytes . 'B';
}
// labels in order of size [Y, Z]
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
// exp position calculation
$exp = (int)floor(log($abs_bytes, $unit));
// avoid printing out anything larger than max labels
if ($exp >= count($labels)) {
$exp = count($labels) - 1;
}
// deviation calculation
$dev = pow($unit, $exp) * ($unit - 0.05);
// shift the exp +1 for on the border units
if (
$exp < 6 &&
$abs_bytes > ($dev - (((int)$dev & 0xfff) == 0xd00 ? 52 : 0))
) {
$exp++;
}
// label name, including leading space if flagged
$pre = ($space ? ' ' : '') . ($labels[$exp] ?? '>E') . ($si ? 'i' : '') . 'B';
$bytes_calc = $abs_bytes / pow($unit, $exp);
// if original is negative, reverse
if ($bytes < 0) {
$bytes_calc *= -1;
}
if ($adjust) {
return sprintf("%.2f%s", $bytes_calc, $pre);
} else {
return round($bytes_calc, 2) . $pre;
}
} else {
if (!is_numeric($bytes)) {
// if anything other return as string
return (string)$bytes;
}
// flags bit wise check
// remove space between number and suffix
if ($flags & self::BYTE_FORMAT_NOSPACE) {
$space = false;
} else {
$space = true;
}
// use sprintf instead of round
if ($flags & self::BYTE_FORMAT_ADJUST) {
$adjust = true;
} else {
$adjust = false;
}
// use SI 1000 mod and not 1024 mod
if ($flags & self::BYTE_FORMAT_SI) {
$si = true;
} else {
$si = false;
}
if ($flags > 7) {
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
}
// si or normal
$unit = $si ? 1000 : 1024;
// always positive
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs((float)$bytes);
// smaller than unit is always B
if ($abs_bytes < $unit) {
return $bytes . 'B';
}
// labels in order of size [Y, Z]
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
// exp position calculation
$exp = (int)floor(log($abs_bytes, $unit));
// avoid printing out anything larger than max labels
if ($exp >= count($labels)) {
$exp = count($labels) - 1;
}
// deviation calculation
$dev = pow($unit, $exp) * ($unit - 0.05);
// shift the exp +1 for on the border units
if (
$exp < 6 &&
$abs_bytes > ($dev - (((int)$dev & 0xfff) == 0xd00 ? 52 : 0))
) {
$exp++;
}
// label name, including leading space if flagged
$pre = ($space ? ' ' : '') . ($labels[$exp] ?? '>E') . ($si ? 'i' : '') . 'B';
$bytes_calc = $abs_bytes / pow($unit, $exp);
// if original is negative, reverse
if ($bytes < 0) {
$bytes_calc *= -1;
}
if ($adjust) {
return sprintf("%.2f%s", $bytes_calc, $pre);
} else {
return round($bytes_calc, 2) . $pre;
}
}
/**
@@ -154,7 +153,7 @@ class Byte
if (!empty($matches[1])) {
$number_negative = true;
}
if (isset($matches[2]) && isset($matches[3])) {
if (isset($matches[2])) {
// remove all non valid characters from the number
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
// final clean up and convert to float
+6 -6
View File
@@ -957,9 +957,9 @@ class Color
* Undocumented function
*
* @param HWB $hwb
* @return Lch
* @return LCH
*/
public static function hwbToLch(HWB $hwb): Lch
public static function hwbToLch(HWB $hwb): LCH
{
return self::rgbToLch(
self::hwbToRgb($hwb)
@@ -1078,10 +1078,10 @@ class Color
/**
* OkLab to Lch (CIE)
*
* @param LAB $lab
* @param Lab $lab
* @return LCH
*/
public static function okLabToLch(LAB $lab): LCH
public static function okLabToLch(Lab $lab): LCH
{
return self::labToLch(
self::okLabToLab($lab)
@@ -1092,9 +1092,9 @@ class Color
* Lch (CIE) to OkLab
*
* @param LCH $lch
* @return LAB
* @return Lab
*/
public static function lchToOkLab(LCH $lch): LAB
public static function lchToOkLab(LCH $lch): Lab
{
return self::labToOkLab(
self::lchToLab($lch)
+5 -1
View File
@@ -74,11 +74,15 @@ class Json
* 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
* @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;
+23
View File
@@ -8,6 +8,8 @@ declare(strict_types=1);
namespace CoreLibs\Create;
use CoreLibs\Combined\ArrayHandler;
class Hash
{
/** @var string default short hash -> deprecated use STANDARD_HASH_SHORT */
@@ -210,6 +212,27 @@ class Hash
{
return self::hash($string, self::STANDARD_HASH);
}
/**
* generate a hash over any array data
* optional will not sort keys and so create hashes based on the original data.
* for correct array comapre it is recommended to keep sort keys on
*
* @param array<mixed> $data
* @param bool $sort_keys [true] Whether to sort the array keys before hashing
* @return string
*/
public static function generateImmutableHashForArray(array $data, bool $sort_keys = true): string
{
// Create a sorted copy to ensure consistent hashing
// Generate hash using serialize for better accuracy
return hash(
self::DEFAULT_HASH,
serialize(
$sort_keys ? ArrayHandler::createSortedArrayByKey($data) : $data
)
);
}
}
// __END__
+5 -5
View File
@@ -154,11 +154,11 @@ class RandomKey
* if override key length is set, it will check on valid key and use this
* this will not set the class key length variable
*
* @param int $key_length [default=-1] key length override,
* if not set use default [LEGACY]
* @param array<string> $key_range a list of key ranges as array,
* if not set use previous set data
* @return string random key
* @param int $key_length [default=-1] key length override,
* if not set use default [LEGACY]
* @param array<string> ...$key_range a list of key ranges as array,
* if not set use previous set data
* @return string random key
*/
public static function randomKeyGen(
int $key_length = self::KEY_LENGTH_DEFAULT,
+51 -31
View File
@@ -520,7 +520,7 @@ class IO
}
// *************************************************************
// PRIVATE METHODS
// MARK: PRIVATE METHODS
// *************************************************************
/**
@@ -1703,11 +1703,11 @@ class IO
}
// *************************************************************
// PUBLIC METHODS
// MARK: PUBLIC METHODS
// *************************************************************
// ***************************
// CLOSE, STATUS, SETTINGS VARIABLE READ
// MARK: CLOSE, STATUS, SETTINGS VARIABLE READ
// ***************************
/**
@@ -1950,7 +1950,7 @@ class IO
}
// ***************************
// DEBUG DATA DUMP
// MARK: DEBUG DATA DUMP
// ***************************
/**
@@ -1978,7 +1978,7 @@ class IO
}
// ***************************
// CHECK QUERY TYPE
// MARK: CHECK QUERY TYPE
// ***************************
/**
@@ -2035,7 +2035,7 @@ class IO
}
// ***************************
// DATA WRITE CONVERSION
// MARK: DATA WRITE CONVERSION
// ***************************
/**
@@ -2156,7 +2156,7 @@ class IO
}
// ***************************
// DATA READ/WRITE CONVERSION
// MARK: DATA READ/WRITE CONVERSION
// ***************************
/**
@@ -2194,7 +2194,7 @@ class IO
}
// ***************************
// DATA READ CONVERSION
// MARK: DATA READ CONVERSION
// ***************************
/**
@@ -2232,9 +2232,9 @@ class IO
$milliseconds = $matches[13] ?? '';
// clean up, hide entries that have 00 in the time group
$hour = $hour != '00' ? preg_replace('/^0/', '', $hour) : '';
$minutes = $minutes != '00' ? preg_replace('/^0/', '', $minutes) : '';
$seconds = $seconds != '00' ? preg_replace('/^0/', '', $seconds) : '';
$hour = !empty($hour) ? preg_replace('/^0/', '', $hour) : '';
$minutes = !empty($minutes) ? preg_replace('/^0/', '', $minutes) : '';
$seconds = !empty($seconds) ? preg_replace('/^0/', '', $seconds) : '';
// strip any leading or trailing spaces
$time_string = trim(
@@ -2263,8 +2263,22 @@ class IO
return is_array($__db_array_parse) ? $__db_array_parse : [];
}
/**
* Will strip all single numberic entries from the array.
* This is for database return
*
* @param array<mixed> $res
* @return array<string,mixed>
*/
public function stripAssocOnly(array $res): array
{
return array_filter($res, function ($key) {
return !is_numeric($key);
}, ARRAY_FILTER_USE_KEY);
}
// ***************************
// TABLE META DATA READ
// MARK: TABLE META DATA READ
// ***************************
/**
@@ -2290,7 +2304,7 @@ class IO
}
// ***************************
// QUERY EXECUSION AND DATA READ
// MARK: QUERY EXECUSION AND DATA READ
// ***************************
/**
@@ -2562,21 +2576,27 @@ class IO
// set field names
$this->cursor_ext[$query_hash]['field_names'] = [];
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
$this->cursor_ext[$query_hash]['field_names'][] =
$this->db_functions->__dbFieldName(
if (
($field_name = $this->db_functions->__dbFieldName(
$this->cursor_ext[$query_hash]['cursor'],
$i
);
)) !== false
) {
$this->cursor_ext[$query_hash]['field_names'][] = $field_name;
}
}
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
// field types
$this->cursor_ext[$query_hash]['field_types'] = [];
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
$this->cursor_ext[$query_hash]['field_types'][] =
$this->db_functions->__dbFieldType(
if (
($field_type = $this->db_functions->__dbFieldType(
$this->cursor_ext[$query_hash]['cursor'],
$i
);
)) !== false
) {
$this->cursor_ext[$query_hash]['field_types'][] = $field_type;
}
}
$this->field_types = $this->cursor_ext[$query_hash]['field_types'];
// combined name => type
@@ -2921,7 +2941,7 @@ class IO
}
// ***************************
// CURSOR RETURN
// MARK: CURSOR RETURN
// ***************************
/**
@@ -2935,7 +2955,7 @@ class IO
}
// ***************************
// CURSOR EXT CACHE RESET
// MARK: CURSOR EXT CACHE RESET
// ***************************
/**
@@ -2965,7 +2985,7 @@ class IO
}
// ***************************
// CURSOR EXT DATA CHECK
// MARK: CURSOR EXT DATA CHECK
// ***************************
/**
@@ -3060,7 +3080,7 @@ class IO
}
// ***************************
// MAXIMUM QUERY EXECUTION CHECK HELPERS
// MARK: MAXIMUM QUERY EXECUTION CHECK HELPERS
// ***************************
/**
@@ -3096,7 +3116,7 @@ class IO
}
// ***************************
// PREPARED QUERY WORK
// MARK: PREPARED QUERY WORK
// ***************************
/**
@@ -3373,7 +3393,7 @@ class IO
}
// ***************************
// ASYNCHRONUS EXECUTION/CHECK
// MARK: ASYNCHRONUS EXECUTION/CHECK
// ***************************
/**
@@ -3533,7 +3553,7 @@ class IO
}
// ***************************
// COMPLEX WRITE WITH CONFIG ARRAYS
// MARK: COMPLEX WRITE WITH CONFIG ARRAYS
// ***************************
// ** REMARK **
@@ -3714,7 +3734,7 @@ class IO
}
// ***************************
// INTERNAL SETTINGS READ/CHANGE
// MARK: INTERNAL SETTINGS READ/CHANGE
// ***************************
/**
@@ -4042,7 +4062,7 @@ class IO
}
// ***************************
// QUERY DATA AND DB HANDLER
// MARK: QUERY DATA AND DB HANDLER
// ***************************
/**
@@ -4145,7 +4165,7 @@ class IO
}
// ***************************
// INTERNAL VARIABLES READ POST QUERY RUN
// MARK: INTERNAL VARIABLES READ POST QUERY RUN
// ***************************
/**
@@ -4436,7 +4456,7 @@ class IO
}
// ***************************
// ERROR AND WARNING DATA
// MARK: ERROR AND WARNING DATA
// ***************************
/**
@@ -4493,7 +4513,7 @@ class IO
}
// ***************************
// DEPEREACTED CALLS
// MARK: DEPEREACTED CALLS
// all call below are no longer in use and throw deprecated errors
// ***************************
+1 -1
View File
@@ -536,7 +536,7 @@ class PgSQL implements Interface\SqlFunctions
$connection_string[] = 'sslmode=' . $db_ssl;
}
// connect
$this->dbh = pg_connect(join(' ', $connection_string));
$this->dbh = @pg_connect(join(' ', $connection_string));
return $this->dbh;
}
@@ -290,7 +290,7 @@ class ConvertPlaceholder
}
$match = $matches[self::MATCHING_POS];
// only count pos up for actual replacements we will do
if (!empty($match)) {
if (strlen((string)$match) > 0) {
$pos++;
$params_lookup[] = '$' . $pos;
}
+4 -4
View File
@@ -32,11 +32,11 @@ class FileWriter
if (!is_writeable($folder)) {
return false;
}
// if last is not / then add
if (substr($folder, -1, 1) != DIRECTORY_SEPARATOR) {
$folder .= DIRECTORY_SEPARATOR;
if (!is_dir($folder)) {
return false;
}
self::$debug_folder = $folder;
// if last is not / then add
self::$debug_folder = rtrim($folder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
return true;
}
+3 -3
View File
@@ -146,7 +146,7 @@ class L10n
* @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 $path path, if not set try to get from paths array, else self
* @param string $override_encoding if locale does not env encoding set, use this one
* @param string $override_encoding if locale does not have encoding set, use this one
* @return GetTextReader the main gettext reader object
*/
public function getTranslator(
@@ -301,7 +301,7 @@ class L10n
* 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
*
* @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
{
@@ -321,7 +321,7 @@ class L10n
* parse the locale string for further processing
*
* @param string $locale Locale to parse
* @return array<string,string|null> array with lang, country, charset, modifier
* @return array{lang:string|null,country:string|null,charset:string|null,modifier:string|null} parsed locale
*/
public static function parseLocale(string $locale = ''): array
{
+2 -2
View File
@@ -86,7 +86,7 @@ enum Level: int
/**
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
* @return static
* @return self
*/
public static function fromName(string $name): self
{
@@ -104,7 +104,7 @@ enum Level: int
/**
* @param value-of<self::VALUES> $value
* @return static
* @return self
*/
public static function fromValue(int $value): self
{
+25 -18
View File
@@ -178,11 +178,11 @@ class Elements
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) {
return self::createUrl(
$matches[1] ?? '',
$matches[2] ?? '',
$matches[3] ?? '',
$matches[4] ?? '',
$matches[5] ?? '',
$matches[1],
$matches[2],
$matches[3],
$matches[4],
$matches[5],
$matches[7] ?? '',
$matches[9] ?? ''
);
@@ -232,8 +232,15 @@ class Elements
* @param string $class style sheet
* @return string correct string for url href process
*/
private static function createUrl($href, $atag, $_1, $_2, $_3, $name, $class): string
{
private static function createUrl(
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");
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
@@ -250,11 +257,8 @@ class Elements
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
} elseif ($href && !$atag) {
return "href=##QUOT##$_1$_2$_3##QUOT##";
} elseif ($atag) {
return $atag . $_2 . $_3;
} else {
return $href;
}
return $atag . $_2 . $_3;
}
/**
@@ -269,8 +273,15 @@ class Elements
* @param string $class style sheet
* @return string created html email a href string
*/
private static function createEmail($mailto, $atag, $_1, $_2, $_3, $title, $class)
{
private static function createEmail(
string $mailto,
string $atag,
string $_1,
string $_2,
string $_3,
string $title,
string $class
): string {
$email = $_1 . "@" . $_2 . "." . $_3;
if (!$mailto && !$atag) {
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
@@ -278,12 +289,8 @@ class Elements
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
} elseif ($mailto && !$atag) {
return "mailto:" . $email;
} elseif ($atag) {
return $atag . $email;
} else {
// else just return email as is
return $email;
}
return $atag . $email;
}
}
+11 -8
View File
@@ -954,11 +954,10 @@ class Curl implements Interface\RequestsInterface
)
) {
unset($this->config['headers'][$header_key]);
unset($this->headers_named[$header_key]);
unset($this->headers_named[strtolower($header_key)]);
} elseif (
// string value, array keys = in
// or both array and not a full match in the one before
(is_string($value) || is_array($value)) &&
// right side is array, and value is anything string or array
// if right side is string, and we give value array, we do nothing
is_array($this->config['headers'][$header_key])
) {
// part remove of key, value must be array
@@ -966,10 +965,14 @@ class Curl implements Interface\RequestsInterface
$value = [$value];
}
// array values so we rewrite the key pos
$this->config['headers'][$header_key] = array_values(array_diff(
$this->config['headers'][$header_key],
$value
));
/** @var array<int|string,string> $headers */
$headers = $this->config['headers'][$header_key];
$this->config['headers'][$header_key] = array_values(
array_diff(
$headers,
$value
)
);
}
}
}