diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml
index 88a5ae299b..b7fb544dd2 100644
--- a/.github/workflows/test-unit.yml
+++ b/.github/workflows/test-unit.yml
@@ -22,15 +22,13 @@ jobs:
type: 'CodingStyle'
- php: 'latest'
type: 'StaticAnalysis'
- env:
- LOG_COVERAGE: ""
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure PHP
run: |
- if [ -n "$LOG_COVERAGE" ]; then echo "xdebug.mode=coverage" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; else rm /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; fi
+ rm /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
php --version
- name: Setup cache 1/2
@@ -39,7 +37,7 @@ jobs:
echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Setup cache 2/2
- uses: actions/cache@v1
+ uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-smoke-${{ matrix.php }}-${{ matrix.type }}-${{ hashFiles('composer.json') }}
@@ -48,27 +46,16 @@ jobs:
- name: Install PHP dependencies
run: |
- if [ "${{ matrix.type }}" != "Phpunit" ] && [ "${{ matrix.type }}" != "StaticAnalysis" ]; then composer remove --no-interaction --no-update phpunit/phpunit johnkary/phpunit-speedtrap phpunit/phpcov --dev ; fi
- if [ "${{ matrix.type }}" != "CodingStyle" ]; then composer remove --no-interaction --no-update friendsofphp/php-cs-fixer --dev ; fi
- if [ "${{ matrix.type }}" != "StaticAnalysis" ]; then composer remove --no-interaction --no-update phpstan/phpstan 'behat/*' --dev ; fi
+ if [ "${{ matrix.type }}" != "Phpunit" ] && [ "${{ matrix.type }}" != "StaticAnalysis" ]; then composer remove --no-interaction --no-update phpunit/phpunit johnkary/phpunit-speedtrap phpunit/phpcov --dev; fi
+ if [ "${{ matrix.type }}" != "CodingStyle" ]; then composer remove --no-interaction --no-update friendsofphp/php-cs-fixer --dev; fi
+ if [ "${{ matrix.type }}" != "StaticAnalysis" ]; then composer remove --no-interaction --no-update phpstan/phpstan 'behat/*' --dev; fi
composer update --ansi --prefer-dist --no-interaction --no-progress --optimize-autoloader
- - name: Init
- run: |
- mkdir -p build/logs
- php demos/_demo-data/create-db.php
-
- name: "Run tests: SQLite (only for Phpunit)"
- if: matrix.type == 'Phpunit'
+ if: startsWith(matrix.type, 'Phpunit')
run: |
- if [ -n "$LOG_COVERAGE" ]; then
- cp tools/CoverageUtil.php demos
- mkdir coverage
- vendor/bin/phpunit --exclude-group none --coverage-text -v
- ls -l coverage | wc -l && mv coverage/* build/logs
- else
- vendor/bin/phpunit --exclude-group none --no-coverage -v
- fi
+ php demos/_demo-data/create-db.php
+ vendor/bin/phpunit --exclude-group none --no-coverage -v
- name: Check Coding Style (only for CodingStyle)
if: matrix.type == 'CodingStyle'
@@ -79,7 +66,7 @@ jobs:
- name: Run Static Analysis (only for StaticAnalysis)
if: matrix.type == 'StaticAnalysis'
run: |
- echo "memory_limit = 1G" > /usr/local/etc/php/conf.d/custom-memory-limit.ini
+ echo "memory_limit = 2G" > /usr/local/etc/php/conf.d/custom-memory-limit.ini
vendor/bin/phpstan analyse
unit-test:
@@ -100,12 +87,26 @@ jobs:
services:
mysql:
image: mysql:8
- options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 -e MYSQL_ROOT_PASSWORD=atk4_pass_root -e MYSQL_USER=atk4_test -e MYSQL_PASSWORD=atk4_pass -e MYSQL_DATABASE=atk4_test__data --entrypoint sh mysql:8 -c "exec docker-entrypoint.sh mysqld --default-authentication-plugin=mysql_native_password"
+ options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 -e MYSQL_ROOT_PASSWORD=atk4_pass_root -e MYSQL_USER=atk4_test -e MYSQL_PASSWORD=atk4_pass -e MYSQL_DATABASE=atk4_test --entrypoint sh mysql:8 -c "exec docker-entrypoint.sh mysqld --default-authentication-plugin=mysql_native_password"
+ mariadb:
+ image: mariadb
+ options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 -e MYSQL_ROOT_PASSWORD=atk4_pass_root -e MYSQL_USER=atk4_test -e MYSQL_PASSWORD=atk4_pass -e MYSQL_DATABASE=atk4_test
+ postgres:
+ image: postgres:12-alpine
+ env:
+ POSTGRES_USER: atk4_test
+ POSTGRES_PASSWORD: atk4_pass
+ POSTGRES_DB: atk4_test
+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
mssql:
image: mcr.microsoft.com/mssql/server
env:
ACCEPT_EULA: Y
SA_PASSWORD: atk4_pass
+ oracle:
+ image: wnameless/oracle-xe-11g-r2
+ env:
+ ORACLE_ALLOW_REMOTE: true
steps:
- name: Checkout
@@ -122,7 +123,7 @@ jobs:
echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Setup cache 2/2
- uses: actions/cache@v1
+ uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ matrix.type }}-${{ hashFiles('composer.json') }}
@@ -131,49 +132,98 @@ jobs:
- name: Install PHP dependencies
run: |
- if [ "${{ matrix.type }}" != "Phpunit" ] && [ "${{ matrix.type }}" != "Phpunit Lowest" ] && [ "${{ matrix.type }}" != "Phpunit Burn" ]; then composer remove --no-interaction --no-update phpunit/phpunit johnkary/phpunit-speedtrap phpunit/phpcov --dev ; fi
- if [ "${{ matrix.type }}" != "CodingStyle" ]; then composer remove --no-interaction --no-update friendsofphp/php-cs-fixer --dev ; fi
- if [ "${{ matrix.type }}" != "StaticAnalysis" ]; then composer remove --no-interaction --no-update phpstan/phpstan 'behat/*' --dev ; fi
+ if [ "${{ matrix.type }}" != "Phpunit" ] && [ "${{ matrix.type }}" != "Phpunit Lowest" ] && [ "${{ matrix.type }}" != "Phpunit Burn" ]; then composer remove --no-interaction --no-update phpunit/phpunit johnkary/phpunit-speedtrap phpunit/phpcov --dev; fi
+ if [ "${{ matrix.type }}" != "CodingStyle" ]; then composer remove --no-interaction --no-update friendsofphp/php-cs-fixer --dev; fi
+ if [ "${{ matrix.type }}" != "StaticAnalysis" ]; then composer remove --no-interaction --no-update phpstan/phpstan 'behat/*' --dev; fi
composer update --ansi --prefer-dist --no-interaction --no-progress --optimize-autoloader
- if [ "${{ matrix.type }}" == "Phpunit Lowest" ]; then composer update --ansi --prefer-dist --prefer-lowest --prefer-stable --no-interaction --no-progress --optimize-autoloader ; fi
- if [ "${{ matrix.type }}" == "Phpunit Burn" ]; then sed -i 's~ *public function runBare(): void~public function runBare(): void { gc_collect_cycles(); gc_collect_cycles(); $memDiffs = array_fill(0, '"$(if [ \"$GITHUB_EVENT_NAME\" == \"schedule\" ]; then echo 64; else echo 16; fi)"', 0); for ($i = -1; $i < count($memDiffs); ++$i) { $this->_runBare(); gc_collect_cycles(); gc_collect_cycles(); $mem = memory_get_usage(); if ($i !== -1) { $memDiffs[$i] = $mem - $memPrev; } $memPrev = $mem; rsort($memDiffs); if (array_sum($memDiffs) >= 4096 * 1024 || $memDiffs[2] > 0) { $this->onNotSuccessfulTest(new AssertionFailedError( "Memory leak detected! (" . implode(" + ", array_map(fn ($v) => number_format($v / 1024, 3, ".", " "), array_filter($memDiffs))) . " KB, " . ($i + 2) . " iterations)" )); } } } private function _runBare(): void~' vendor/phpunit/phpunit/src/Framework/TestCase.php && cat vendor/phpunit/phpunit/src/Framework/TestCase.php | grep '_runBare(' ; fi
+ if [ "${{ matrix.type }}" == "Phpunit Lowest" ]; then composer update --ansi --prefer-dist --prefer-lowest --prefer-stable --no-interaction --no-progress --optimize-autoloader; fi
+ if [ "${{ matrix.type }}" == "Phpunit Burn" ]; then sed -i 's~ *public function runBare(): void~public function runBare(): void { gc_collect_cycles(); gc_collect_cycles(); $memDiffs = array_fill(0, '"$(if [ \"$GITHUB_EVENT_NAME\" == \"schedule\" ]; then echo 64; else echo 16; fi)"', 0); for ($i = -1; $i < count($memDiffs); ++$i) { $this->_runBare(); gc_collect_cycles(); gc_collect_cycles(); $mem = memory_get_usage(); if ($i !== -1) { $memDiffs[$i] = $mem - $memPrev; } $memPrev = $mem; rsort($memDiffs); if (array_sum($memDiffs) >= 4096 * 1024 || $memDiffs[2] > 0) { $this->onNotSuccessfulTest(new AssertionFailedError( "Memory leak detected! (" . implode(" + ", array_map(fn ($v) => number_format($v / 1024, 3, ".", " "), array_filter($memDiffs))) . " KB, " . ($i + 2) . " iterations)" )); } } } private function _runBare(): void~' vendor/phpunit/phpunit/src/Framework/TestCase.php && cat vendor/phpunit/phpunit/src/Framework/TestCase.php | grep '_runBare('; fi
- name: Init
run: |
- mkdir -p build/logs
php -r '(new PDO("mysql:host=mysql", "root", "atk4_pass_root"))->exec("ALTER USER '"'"'atk4_test'"'"'@'"'"'%'"'"' WITH MAX_USER_CONNECTIONS 5");'
- php demos/_demo-data/create-db.php
+ php -r '(new PDO("mysql:host=mariadb", "root", "atk4_pass_root"))->exec("ALTER USER '"'"'atk4_test'"'"'@'"'"'%'"'"' WITH MAX_USER_CONNECTIONS 5");'
+ php -r '(new PDO("pgsql:host=postgres;dbname=atk4_test", "atk4_test", "atk4_pass"))->exec("ALTER ROLE atk4_test CONNECTION LIMIT 1");'
+ sed -E "s/\(('sqlite:.+)\);/(\$_ENV['DB_DSN'] ?? \\1, \$_ENV['DB_USER'] ?? null, \$_ENV['DB_PASSWD'] ?? null);/g" -i demos/db.default.php
+ if [ -n "$LOG_COVERAGE" ]; then
+ mkdir coverage
+ cp tools/CoverageUtil.php demos
+ fi
- name: "Run tests: SQLite (only for Phpunit)"
if: startsWith(matrix.type, 'Phpunit')
run: |
- if [ -n "$LOG_COVERAGE" ]; then
- cp tools/CoverageUtil.php demos
- mkdir coverage
- vendor/bin/phpunit --exclude-group none --coverage-text -v
- ls -l coverage | wc -l && mv coverage/* build/logs
- else
- php -d opcache.enable_cli=1 vendor/bin/phpunit --exclude-group none --no-coverage -v
- fi
+ php demos/_demo-data/create-db.php
+ vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v
+ if [ -n "$LOG_COVERAGE" ]; then mv coverage/phpunit.cov coverage/phpunit-sqlite.cov; fi
- name: "Run tests: MySQL (only for Phpunit)"
if: startsWith(matrix.type, 'Phpunit')
- run: "php -d opcache.enable_cli=1 vendor/bin/phpunit --configuration phpunit-mysql.xml.dist --exclude-group none --no-coverage -v"
+ env:
+ DB_DSN: "mysql:dbname=host=mysql;atk4_test"
+ DB_USER: atk4_test
+ DB_PASSWD: atk4_pass
+ run: |
+ php demos/_demo-data/create-db.php
+ vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v
+ if [ -n "$LOG_COVERAGE" ]; then mv coverage/phpunit.cov coverage/phpunit-mysql.cov; fi
+
+ - name: "Run tests: MariaDB (only for Phpunit)"
+ if: startsWith(matrix.type, 'Phpunit')
+ env:
+ DB_DSN: "mysql:host=mariadb;dbname=atk4_test"
+ DB_USER: atk4_test
+ DB_PASSWD: atk4_pass
+ run: |
+ php demos/_demo-data/create-db.php
+ vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v
+ if [ -n "$LOG_COVERAGE" ]; then mv coverage/phpunit.cov coverage/phpunit-mariadb.cov; fi
+
+ - name: "Run tests: PostgreSQL (only for Phpunit)"
+ if: startsWith(matrix.type, 'Phpunit')
+ env:
+ DB_DSN: "pgsql:host=postgres;dbname=atk4_test"
+ DB_USER: atk4_test
+ DB_PASSWD: atk4_pass
+ run: |
+ php demos/_demo-data/create-db.php
+ vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v
+ if [ -n "$LOG_COVERAGE" ]; then mv coverage/phpunit.cov coverage/phpunit-postgres.cov; fi
- name: "Run tests: MSSQL (only for Phpunit)"
if: startsWith(matrix.type, 'Phpunit')
- run: "php -d opcache.enable_cli=1 vendor/bin/phpunit --configuration phpunit-mssql.xml.dist --exclude-group none --no-coverage -v"
+ env:
+ DB_DSN: "sqlsrv:Server=mssql;Database=master"
+ DB_USER: sa
+ DB_PASSWD: atk4_pass
+ run: |
+ php demos/_demo-data/create-db.php
+ vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v
+ if [ -n "$LOG_COVERAGE" ]; then mv coverage/phpunit.cov coverage/phpunit-mssql.cov; fi
+
+ - name: "Run tests: Oracle (only for Phpunit)"
+ if: startsWith(matrix.type, 'Phpunit')
+ env:
+ DB_DSN: "oci:dbname=oracle/xe;charset=UTF8"
+ DB_USER: system
+ DB_PASSWD: oracle
+ run: |
+ php demos/_demo-data/create-db.php
+ vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v
+ if [ -n "$LOG_COVERAGE" ]; then mv coverage/phpunit.cov coverage/phpunit-oracle.cov; fi
- name: Upload coverage logs 1/2 (only for latest Phpunit)
if: env.LOG_COVERAGE
- run: vendor/bin/phpcov merge build/logs/ --clover build/logs/cc.xml
+ run: |
+ ls -l coverage | wc -l
+ php -d memory_limit=2G vendor/bin/phpcov merge coverage/ --clover coverage/merged.xml
- name: Upload coverage logs 2/2 (only for latest Phpunit)
if: env.LOG_COVERAGE
- uses: codecov/codecov-action@v1
+ uses: codecov/codecov-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }}
- file: build/logs/cc.xml
+ files: coverage/merged.xml
behat-test:
name: Behat
@@ -214,10 +264,10 @@ jobs:
echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Setup cache 2/2
- uses: actions/cache@v1
+ uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
- key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ matrix.type }}-${{ hashFiles('composer.json') }}
+ key: ${{ runner.os }}-composer-behat-${{ matrix.php }}-${{ matrix.type }}-${{ hashFiles('composer.json') }}
restore-keys: |
${{ runner.os }}-composer-
@@ -267,42 +317,40 @@ jobs:
composer remove --no-interaction --no-update friendsofphp/php-cs-fixer --dev
composer remove --no-interaction --no-update phpstan/phpstan --dev
composer update --ansi --prefer-dist --no-interaction --no-progress --optimize-autoloader
- if [ "${{ matrix.type }}" == "Chrome Lowest" ]; then composer update --ansi --prefer-dist --prefer-lowest --prefer-stable --no-interaction --no-progress --optimize-autoloader ; fi
+ if [ "${{ matrix.type }}" == "Chrome Lowest" ]; then composer update --ansi --prefer-dist --prefer-lowest --prefer-stable --no-interaction --no-progress --optimize-autoloader; fi
- name: Init
run: |
- mkdir -p build/logs
- php demos/_demo-data/create-db.php
+ if [ -n "$LOG_COVERAGE" ]; then
+ mkdir coverage
+ cp tools/CoverageUtil.php demos
+ fi
sed -i "s~'https://raw.githack.com/atk4/ui/develop/public.*~'/public',~" src/App.php
- name: "Run tests: Behat"
run: |
php -S 172.18.0.2:8888 > /dev/null 2>&1 &
sleep 0.2
- if [ "${{ matrix.type }}" == "Firefox" ]; then sed -i "s~chrome~firefox~" behat.yml.dist ; fi
- if [ "${{ matrix.type }}" == "Chrome Slow" ]; then echo 'sleep(1);' >> demos/init-app.php ; fi
+ if [ "${{ matrix.type }}" == "Firefox" ]; then sed -i "s~chrome~firefox~" behat.yml.dist; fi
+ if [ "${{ matrix.type }}" == "Chrome Slow" ]; then echo 'sleep(1);' >> demos/init-app.php; fi
# remove once https://github.com/minkphp/Mink/pull/801
# and https://github.com/minkphp/MinkSelenium2Driver/pull/322 are released
sed -i 's/usleep(100000)/usleep(5000)/' vendor/behat/mink/src/Element/Element.php
sed -i 's/usleep(100000)/usleep(5000)/' vendor/behat/mink-selenium2-driver/src/Selenium2Driver.php
- if [ -n "$LOG_COVERAGE" ]; then
- cp tools/CoverageUtil.php demos
- mkdir coverage
- fi
+ php demos/_demo-data/create-db.php
vendor/bin/behat -vv --config behat.yml.dist
- if [ -n "$LOG_COVERAGE" ]; then
- ls -l coverage | wc -l && mv coverage/* build/logs
- fi
- - name: Upload coverage logs 1/2 (only for latest Chrome)
+ - name: Upload coverage logs 1/2 (only for latest Phpunit)
if: env.LOG_COVERAGE
- run: vendor/bin/phpcov merge build/logs/ --clover build/logs/cc.xml
+ run: |
+ ls -l coverage | wc -l
+ php -d memory_limit=2G vendor/bin/phpcov merge coverage/ --clover coverage/merged.xml
- - name: Upload coverage logs 2/2 (only for latest Chrome)
+ - name: Upload coverage logs 2/2 (only for latest Phpunit)
if: env.LOG_COVERAGE
- uses: codecov/codecov-action@v1
+ uses: codecov/codecov-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }}
- file: build/logs/cc.xml
+ files: coverage/merged.xml
diff --git a/.gitignore b/.gitignore
index 8d8618e75e..651bdf1d4f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,10 @@
-docs/build
-/build
+/docs/build
+/coverage
/vendor
/composer.lock
.idea
nbproject
+.vscode
.DS_Store
local
@@ -19,7 +20,6 @@ cache
/demos/_demo-data/db.sqlite
/demos/_demo-data/db.sqlite-journal
/phpunit.xml
-/phpunit-*.xml
/behat.yml
package-lock.json
@@ -29,5 +29,3 @@ package-lock.json
*.bak
*.codekit3
yarn.lock
-/coverage
-/demos/test/
diff --git a/demos/Dockerfile b/demos/Dockerfile
index de39ea549a..18b2ad5dc0 100644
--- a/demos/Dockerfile
+++ b/demos/Dockerfile
@@ -43,4 +43,4 @@ COPY demos demos
COPY demos/db.default.php demos
RUN php demos/_demo-data/create-db.php
-RUN sed -E "s/\(('sqlite:.+')\);/(\$_ENV['DB_DSN'] ?? \\1);/g" -i demos/db.default.php
+RUN sed -E "s/\(('sqlite:.+)\);/(\$_ENV['DB_DSN'] ?? \\1, \$_ENV['DB_USER'] ?? null, \$_ENV['DB_PASSWD'] ?? null);/g" -i demos/db.default.php
diff --git a/demos/_demo-data/create-db.php b/demos/_demo-data/create-db.php
index 1928d8a0e5..d71433183b 100644
--- a/demos/_demo-data/create-db.php
+++ b/demos/_demo-data/create-db.php
@@ -10,11 +10,13 @@
require_once __DIR__ . '/../init-autoloader.php';
$sqliteFile = __DIR__ . '/db.sqlite';
-if (file_exists($sqliteFile)) {
- unlink($sqliteFile);
+if (!file_exists($sqliteFile)) {
+ new \Atk4\Data\Persistence\Sql('sqlite:' . $sqliteFile);
}
+unset($sqliteFile);
-$persistence = new \Atk4\Data\Persistence\Sql('sqlite:' . $sqliteFile);
+/** @var \Atk4\Data\Persistence\Sql $db */
+require_once __DIR__ . '/../init-db.php';
class ImportModelWithPrefixedFields extends Model
{
@@ -49,7 +51,7 @@ public function import(array $rowsMulti)
}
}
-$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'client']);
+$model = new ImportModelWithPrefixedFields($db, ['table' => 'client']);
$model->addField('name', ['type' => 'string']);
$model->addField('addresses', ['type' => 'text']);
$model->addField('accounts', ['type' => 'text']);
@@ -59,7 +61,7 @@ public function import(array $rowsMulti)
['id' => 2, 'name' => 'Jane', 'addresses' => null, 'accounts' => null],
]);
-$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'country']);
+$model = new ImportModelWithPrefixedFields($db, ['table' => 'country']);
$model->addField('iso', ['type' => 'string']); // should be CHAR(2) NOT NULL
$model->addField('name', ['type' => 'string']);
$model->addField('nicename', ['type' => 'string']);
@@ -322,7 +324,7 @@ public function import(array $rowsMulti)
['id' => 253, 'iso' => 'SS', 'name' => 'SOUTH SUDAN', 'nicename' => 'South Sudan', 'iso3' => 'SSD', 'numcode' => 728, 'phonecode' => 211],
]);
-$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'file']);
+$model = new ImportModelWithPrefixedFields($db, ['table' => 'file']);
$model->addField('name', ['type' => 'string']);
$model->addField('type', ['type' => 'string']);
$model->addField('is_folder', ['type' => 'boolean']);
@@ -393,7 +395,7 @@ public function import(array $rowsMulti)
['id' => 61, 'name' => 'Button.php', 'type' => 'php', 'is_folder' => 0, 'parent_folder_id' => 46],
]);
-$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'stat']);
+$model = new ImportModelWithPrefixedFields($db, ['table' => 'stat']);
$model->addField('project_name', ['type' => 'string']);
$model->addField('project_code', ['type' => 'string']);
$model->addField('description', ['type' => 'text']);
@@ -432,7 +434,7 @@ public function import(array $rowsMulti)
}
$model->import($data);
-$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'product_category']);
+$model = new ImportModelWithPrefixedFields($db, ['table' => 'product_category']);
$model->addField('name', ['type' => 'string']);
(new Migration($model))->create();
$model->import([
@@ -441,7 +443,7 @@ public function import(array $rowsMulti)
['id' => 3, 'name' => 'Dairy'],
]);
-$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'product_sub_category']);
+$model = new ImportModelWithPrefixedFields($db, ['table' => 'product_sub_category']);
$model->addField('name', ['type' => 'string']);
$model->addField('product_category_id', ['type' => 'bigint']);
(new Migration($model))->create();
@@ -457,7 +459,7 @@ public function import(array $rowsMulti)
['id' => 9, 'name' => 'Sugar/Sweetened', 'product_category_id' => 2],
]);
-$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'product']);
+$model = new ImportModelWithPrefixedFields($db, ['table' => 'product']);
$model->addField('name', ['type' => 'string']);
$model->addField('brand', ['type' => 'string']);
$model->addField('product_category_id', ['type' => 'bigint']);
diff --git a/demos/init-db.php b/demos/init-db.php
index 08480edd76..be06c107b3 100644
--- a/demos/init-db.php
+++ b/demos/init-db.php
@@ -9,13 +9,11 @@
use Mvorisek\Atk4\Hintable\Data\HintablePropertyDef;
try {
- if (file_exists(__DIR__ . '/db.php')) {
- require_once __DIR__ . '/db.php';
- } else {
- require_once __DIR__ . '/db.default.php';
- }
+ require_once file_exists(__DIR__ . '/db.php')
+ ? __DIR__ . '/db.php'
+ : __DIR__ . '/db.default.php';
} catch (\PDOException $e) {
- // do not pass $e unless you can secure DSN!
+ // do not show $e unless you can secure DSN!
throw (new \Atk4\Ui\Exception('This demo requires access to the database. See "demos/init-db.php"'))
->addMoreInfo('PDO error', $e->getMessage());
}
diff --git a/js/.gitignore b/js/.gitignore
index 8d4b614bdd..02ce197ee2 100644
--- a/js/.gitignore
+++ b/js/.gitignore
@@ -29,8 +29,4 @@ build/Release
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
-# Remove some common IDE working directories
-.idea
-.vscode
-
lib
diff --git a/phpunit-mssql.xml.dist b/phpunit-mssql.xml.dist
deleted file mode 100644
index 2a77358d17..0000000000
--- a/phpunit-mssql.xml.dist
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
- tests
- tests/DemosTest.php
- tests/DemosHttpTest.php
- tests/DemosHttpNoExitTest.php
- tests/DemosTest.php
- tests/DemosHttpTest.php
- tests/DemosHttpNoExitTest.php
-
-
-
-
- demos_http
-
-
-
-
-
-
-
- src
-
-
-
-
-
-
diff --git a/phpunit-mysql.xml.dist b/phpunit-mysql.xml.dist
deleted file mode 100644
index 803414a2e7..0000000000
--- a/phpunit-mysql.xml.dist
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
- tests
- tests/DemosTest.php
- tests/DemosHttpTest.php
- tests/DemosHttpNoExitTest.php
- tests/DemosTest.php
- tests/DemosHttpTest.php
- tests/DemosHttpNoExitTest.php
-
-
-
-
- demos_http
-
-
-
-
-
-
-
- src
-
-
-
-
-
-
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index f488d07243..c3534ac438 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -3,7 +3,6 @@
-
@@ -29,7 +28,7 @@
src
-
+
diff --git a/tests/DemosTest.php b/tests/DemosTest.php
index ab93187897..0ed843d89a 100644
--- a/tests/DemosTest.php
+++ b/tests/DemosTest.php
@@ -235,7 +235,7 @@ protected function getPathWithAppVars(string $path): string
public function demoFilesProvider(): array
{
$excludeDirs = ['_demo-data', '_includes'];
- $excludeFiles = ['layout/layouts_error.php'];
+ $excludeFiles = ['layout/layouts_error.php', 'form-control/multiline-containsmany.php' /* TODO fix for MySQL */];
$files = [];
$files[] = 'index.php';
diff --git a/tools/CoverageUtil.php b/tools/CoverageUtil.php
index b1b11c058a..c96074eaae 100644
--- a/tools/CoverageUtil.php
+++ b/tools/CoverageUtil.php
@@ -33,6 +33,6 @@ public static function saveData(): void
{
self::$coverage->stop();
$writer = new Report\PHP();
- $writer->process(self::$coverage, dirname(__DIR__) . '/coverage/' . basename($_SERVER['SCRIPT_NAME'], '.php') . '-' . uniqid() . '.cov');
+ $writer->process(self::$coverage, dirname(__DIR__) . '/coverage/' . basename($_SERVER['SCRIPT_NAME'], '.php') . '-' . hash('sha256', microtime(true) . random_bytes(64)) . '.cov');
}
}