Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
use PHP 7.1 types
Browse files Browse the repository at this point in the history
JanTvrdik committed Jan 20, 2024
1 parent b768b3e commit 87ec8d7
Showing 35 changed files with 329 additions and 397 deletions.
18 changes: 9 additions & 9 deletions src/Bridges/Dibi/Dibi3Adapter.php
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@

namespace Nextras\Migrations\Bridges\Dibi;

use DateTime;
use DateTimeInterface;
use Dibi;
use Nextras\Migrations\IDbal;

@@ -26,45 +26,45 @@ public function __construct(Dibi\Connection $dibi)
}


public function query($sql)
public function query(string $sql): array
{
$result = $this->conn->nativeQuery($sql);
$result->setRowClass(null);
return $result->fetchAll();
}


public function exec($sql)
public function exec(string $sql): int
{
return $this->conn->nativeQuery($sql);
}


public function escapeString($value)
public function escapeString(string $value): string
{
return $this->conn->getDriver()->escapeText($value);
}


public function escapeInt($value)
public function escapeInt(int $value): string
{
return (string) (int) $value;
return (string) $value;
}


public function escapeBool($value)
public function escapeBool(bool $value): string
{
return $this->conn->getDriver()->escapeBool($value);
}


public function escapeDateTime(DateTime $value)
public function escapeDateTime(DateTimeInterface $value): string
{
return $this->conn->getDriver()->escapeDateTime($value);
}


public function escapeIdentifier($value)
public function escapeIdentifier(string $value): string
{
return $this->conn->getDriver()->escapeIdentifier($value);
}
19 changes: 19 additions & 0 deletions src/Bridges/Dibi/Dibi4Adapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php declare(strict_types = 1);

/**
* This file is part of the Nextras community extensions of Nette Framework
*
* @license New BSD License
* @link https://github.com/nextras/migrations
*/

namespace Nextras\Migrations\Bridges\Dibi;


class Dibi4Adapter extends Dibi3Adapter
{
public function exec(string $sql): int
{
return $this->conn->nativeQuery($sql)->getRowCount();
}
}
21 changes: 13 additions & 8 deletions src/Bridges/Dibi/DibiAdapter.php
Original file line number Diff line number Diff line change
@@ -9,11 +9,13 @@

namespace Nextras\Migrations\Bridges\Dibi;

use DateTime;
use DateTimeInterface;
use dibi;
use LogicException;
use Nextras\Migrations\IDbal;

use function version_compare;


class DibiAdapter implements IDbal
{
@@ -26,49 +28,52 @@ public function __construct($conn)
if (version_compare(dibi::VERSION, '3.0.0', '>=')) {
$this->innerAdapter = new Dibi3Adapter($conn);

} elseif (version_compare(dibi::VERSION, '4.0.0', '>=')) {
$this->innerAdapter = new Dibi4Adapter($conn);

} else {
throw new LogicException('Unsupported dibi version');
}
}


public function query($sql)
public function query(string $sql): array
{
return $this->innerAdapter->query($sql);
}


public function exec($sql)
public function exec(string $sql): int
{
return $this->innerAdapter->exec($sql);
}


public function escapeString($value)
public function escapeString(string $value): string
{
return $this->innerAdapter->escapeString($value);
}


public function escapeInt($value)
public function escapeInt(int $value): string
{
return $this->innerAdapter->escapeInt($value);
}


public function escapeBool($value)
public function escapeBool(bool $value): string
{
return $this->innerAdapter->escapeBool($value);
}


public function escapeDateTime(DateTime $value)
public function escapeDateTime(DateTimeInterface $value): string
{
return $this->innerAdapter->escapeDateTime($value);
}


public function escapeIdentifier($value)
public function escapeIdentifier(string $value): string
{
return $this->innerAdapter->escapeIdentifier($value);
}
16 changes: 8 additions & 8 deletions src/Bridges/DoctrineDbal/DoctrineAdapter.php
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@

namespace Nextras\Migrations\Bridges\DoctrineDbal;

use DateTime;
use DateTimeInterface;
use Doctrine;
use Nextras\Migrations\IDbal;

@@ -26,47 +26,47 @@ public function __construct(Doctrine\DBAL\Connection $conn)
}


public function query($sql)
public function query(string $sql): array
{
return method_exists($this->conn, 'fetchAllAssociative')
? $this->conn->fetchAllAssociative($sql)
: $this->conn->fetchAll($sql);
}


public function exec($sql)
public function exec(string $sql): int
{
return method_exists($this->conn, 'executeStatement')
? $this->conn->executeStatement($sql)
: $this->conn->exec($sql);
}


public function escapeString($value)
public function escapeString(string $value): string
{
return $this->conn->quote($value, 'string');
}


public function escapeInt($value)
public function escapeInt(int $value): string
{
return $this->conn->quote($value, 'integer');
}


public function escapeBool($value)
public function escapeBool(bool $value): string
{
return $this->conn->quote($value, 'boolean');
}


public function escapeDateTime(DateTime $value)
public function escapeDateTime(DateTimeInterface $value): string
{
return $this->conn->quote($value, 'datetime');
}


public function escapeIdentifier($value)
public function escapeIdentifier(string $value): string
{
return $this->conn->quoteIdentifier($value);
}
20 changes: 5 additions & 15 deletions src/Bridges/DoctrineOrm/StructureDiffGenerator.php
Original file line number Diff line number Diff line change
@@ -25,30 +25,20 @@ class StructureDiffGenerator implements IDiffGenerator
private $ignoredQueriesFile;


/**
* @param EntityManagerInterface $entityManager
* @param string|NULL $ignoredQueriesFile
*/
public function __construct(EntityManagerInterface $entityManager, $ignoredQueriesFile = null)
public function __construct(EntityManagerInterface $entityManager, ?string $ignoredQueriesFile = null)
{
$this->entityManager = $entityManager;
$this->ignoredQueriesFile = $ignoredQueriesFile;
}


/**
* @return string
*/
public function getExtension()
public function getExtension(): string
{
return 'sql';
}


/**
* @return string
*/
public function generateContent()
public function generateContent(): string
{
$queries = array_diff($this->getUpdateQueries(), $this->getIgnoredQueries());
$content = $queries ? (implode(";\n", $queries) . ";\n") : '';
@@ -60,7 +50,7 @@ public function generateContent()
/**
* @return string[]
*/
protected function getUpdateQueries()
protected function getUpdateQueries(): array
{
$cache = $this->entityManager->getConfiguration()->getMetadataCacheImpl();
if ($cache instanceof ClearableCache) {
@@ -78,7 +68,7 @@ protected function getUpdateQueries()
/**
* @return string[]
*/
protected function getIgnoredQueries()
protected function getIgnoredQueries(): array
{
if ($this->ignoredQueriesFile === null) {
return [];
14 changes: 7 additions & 7 deletions src/Bridges/NetteDI/MigrationsExtension.php
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@ class MigrationsExtension extends Nette\DI\CompilerExtension
/** attributes = ['for' => names of target migration extensions, 'extension' => name of handled file extension] */
const TAG_EXTENSION_HANDLER = 'nextras.migrations.extensionHandler';

/** @var array */
/** @var array<string, mixed> */
public $defaults = [
'dir' => null,
'phpParams' => [],
@@ -40,30 +40,30 @@ class MigrationsExtension extends Nette\DI\CompilerExtension
'ignoredQueriesFile' => null,
];

/** @var array */
/** @var array<string, class-string> */
protected $dbals = [
'dibi' => Nextras\Migrations\Bridges\Dibi\DibiAdapter::class,
'dibi3' => Nextras\Migrations\Bridges\Dibi\Dibi3Adapter::class,
'dibi4' => Nextras\Migrations\Bridges\Dibi\Dibi3Adapter::class,
'dibi4' => Nextras\Migrations\Bridges\Dibi\Dibi4Adapter::class,
'doctrine' => Nextras\Migrations\Bridges\DoctrineDbal\DoctrineAdapter::class,
'nette' => Nextras\Migrations\Bridges\NetteDatabase\NetteAdapter::class,
'nextras' => Nextras\Migrations\Bridges\NextrasDbal\NextrasAdapter::class,
];

/** @var array */
/** @var array<string, class-string> */
protected $drivers = [
'mysql' => Nextras\Migrations\Drivers\MySqlDriver::class,
'pgsql' => Nextras\Migrations\Drivers\PgSqlDriver::class,
];

/** @var array */
/** @var array<string, class-string> */
protected $printers = [
'console' => Nextras\Migrations\Printers\Console::class,
'psrLog' => Nextras\Migrations\Bridges\PsrLog\PsrLogPrinter::class,
];


public function loadConfiguration()
public function loadConfiguration(): void
{
$config = $this->validateConfig($this->defaults);

@@ -109,7 +109,7 @@ public function loadConfiguration()
}


public function beforeCompile()
public function beforeCompile(): void
{
$builder = $this->getContainerBuilder();
$config = $this->validateConfig($this->defaults);
16 changes: 8 additions & 8 deletions src/Bridges/NetteDatabase/NetteAdapter.php
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@

namespace Nextras\Migrations\Bridges\NetteDatabase;

use DateTime;
use DateTimeInterface;
use Nette;
use Nextras\Migrations\IDbal;
use PDO;
@@ -27,7 +27,7 @@ public function __construct(Nette\Database\Connection $ndb)
}


public function query($sql)
public function query(string $sql): array
{
return array_map(
function ($row) { return (array) $row; },
@@ -36,37 +36,37 @@ function ($row) { return (array) $row; },
}


public function exec($sql)
public function exec(string $sql): int
{
return $this->conn->query($sql)->getRowCount();
}


public function escapeString($value)
public function escapeString(string $value): string
{
return $this->conn->quote($value, PDO::PARAM_STR);
}


public function escapeInt($value)
public function escapeInt(int $value): string
{
return $this->conn->quote((string) $value, PDO::PARAM_INT);
}


public function escapeBool($value)
public function escapeBool(bool $value): string
{
return $this->escapeString((string) (int) $value);
}


public function escapeDateTime(DateTime $value)
public function escapeDateTime(DateTimeInterface $value): string
{
return $this->conn->getSupplementalDriver()->formatDateTime($value);
}


public function escapeIdentifier($value)
public function escapeIdentifier(string $value): string
{
return $this->conn->getSupplementalDriver()->delimite($value);
}
16 changes: 8 additions & 8 deletions src/Bridges/NextrasDbal/NextrasAdapter.php
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@

namespace Nextras\Migrations\Bridges\NextrasDbal;

use DateTime;
use DateTimeInterface;
use Nextras\Dbal\Connection;
use Nextras\Dbal\Drivers\IDriver;
use Nextras\Dbal\Result\Row;
@@ -42,7 +42,7 @@ public function __construct(Connection $connection)
}


public function query($sql)
public function query(string $sql): array
{
return array_map(
function (Row $row) { return $row->toArray(); },
@@ -51,14 +51,14 @@ function (Row $row) { return $row->toArray(); },
}


public function exec($sql)
public function exec(string $sql): int
{
$this->conn->query('%raw', $sql);
return $this->conn->getAffectedRows();
}


public function escapeString($value)
public function escapeString(string $value): string
{
if ($this->version >= 2) {
return $this->conn->getDriver()->convertStringToSql($value);
@@ -68,13 +68,13 @@ public function escapeString($value)
}


public function escapeInt($value)
public function escapeInt(int $value): string
{
return (string) (int) $value;
}


public function escapeBool($value)
public function escapeBool(bool $value): string
{
if ($this->version >= 5) {
return $this->conn->getPlatform()->formatBool($value);
@@ -86,7 +86,7 @@ public function escapeBool($value)
}


public function escapeDateTime(DateTime $value)
public function escapeDateTime(DateTimeInterface $value): string
{
if ($this->version >= 5) {
return $this->conn->getPlatform()->formatDateTime($value);
@@ -98,7 +98,7 @@ public function escapeDateTime(DateTime $value)
}


public function escapeIdentifier($value)
public function escapeIdentifier(string $value): string
{
if ($this->version >= 5) {
return $this->conn->getPlatform()->formatIdentifier($value);
12 changes: 6 additions & 6 deletions src/Bridges/PsrLog/PsrLogPrinter.php
Original file line number Diff line number Diff line change
@@ -27,13 +27,13 @@ public function __construct(LoggerInterface $logger)
}


public function printIntro($mode)
public function printIntro(string $mode): void
{
$this->logger->info("Nextras Migrations: started in $mode mode");
}


public function printToExecute(array $toExecute)
public function printToExecute(array $toExecute): void
{
$count = count($toExecute);

@@ -46,7 +46,7 @@ public function printToExecute(array $toExecute)
}


public function printExecute(File $file, $count, $time)
public function printExecute(File $file, int $count, float $time): void
{
$this->logger->info("Nextras Migrations: {$file->group->name}/{$file->name} successfully executed", [
'queryCount' => $count,
@@ -55,19 +55,19 @@ public function printExecute(File $file, $count, $time)
}


public function printDone()
public function printDone(): void
{
$this->logger->info('Nextras Migrations: done');
}


public function printError(Exception $e)
public function printError(Exception $e): void
{
throw $e;
}


public function printSource($code)
public function printSource(string $code): void
{
$this->logger->debug("Nextras Migrations: init source:\n\n$code");
}
Original file line number Diff line number Diff line change
@@ -17,23 +17,23 @@

class NextrasMigrationsExtension extends Extension
{
/** @var array */
/** @var array<string, class-string> */
protected $dbals = [
'dibi' => Nextras\Migrations\Bridges\Dibi\DibiAdapter::class,
'dibi3' => Nextras\Migrations\Bridges\Dibi\Dibi3Adapter::class,
'dibi4' => Nextras\Migrations\Bridges\Dibi\Dibi3Adapter::class,
'dibi4' => Nextras\Migrations\Bridges\Dibi\Dibi4Adapter::class,
'doctrine' => Nextras\Migrations\Bridges\DoctrineDbal\DoctrineAdapter::class,
'nette' => Nextras\Migrations\Bridges\NetteDatabase\NetteAdapter::class,
'nextras' => Nextras\Migrations\Bridges\NextrasDbal\NextrasAdapter::class,
];

/** @var array */
/** @var array<string, class-string> */
protected $drivers = [
'mysql' => Nextras\Migrations\Drivers\MySqlDriver::class,
'pgsql' => Nextras\Migrations\Drivers\PgSqlDriver::class,
];

/** @var array */
/** @var array<string, class-string> */
protected $printers = [
'console' => Nextras\Migrations\Printers\Console::class,
'psrLog' => Nextras\Migrations\Bridges\PsrLog\PsrLogPrinter::class,
11 changes: 3 additions & 8 deletions src/Bridges/SymfonyConsole/BaseCommand.php
Original file line number Diff line number Diff line change
@@ -29,16 +29,11 @@ abstract class BaseCommand extends Command
protected $printer;


/**
* @param IDriver $driver
* @param IConfiguration $config
* @param IPrinter|NULL $printer
*/
public function __construct(IDriver $driver, IConfiguration $config, IPrinter $printer = NULL)
public function __construct(IDriver $driver, IConfiguration $config, ?IPrinter $printer = null)
{
$this->driver = $driver;
$this->config = $config;
$this->printer = $printer ?: new Console();
$this->printer = $printer ?? new Console();
parent::__construct();
}

@@ -48,7 +43,7 @@ public function __construct(IDriver $driver, IConfiguration $config, IPrinter $p
* @param IConfiguration $config
* @return int
*/
protected function runMigrations($mode, $config)
protected function runMigrations(string $mode, IConfiguration $config)
{
$runner = new Runner($this->driver, $this->printer);
$runner->run($mode, $config);
18 changes: 6 additions & 12 deletions src/Configurations/Configuration.php
Original file line number Diff line number Diff line change
@@ -19,16 +19,16 @@
*/
class Configuration implements IConfiguration
{
/** @var Group[] */
/** @var list<Group> */
private $groups;

/** @var IExtensionHandler[] (extension => IExtensionHandler) */
/** @var array<string, IExtensionHandler> (extension => IExtensionHandler) */
private $extensionHandlers;


/**
* @param Group[] $groups
* @param IExtensionHandler[] $extensionHandlers (extension => IExtensionHandler)
* @param list<Group> $groups
* @param array<string, IExtensionHandler> $extensionHandlers (extension => IExtensionHandler)
*/
public function __construct(array $groups, array $extensionHandlers)
{
@@ -37,19 +37,13 @@ public function __construct(array $groups, array $extensionHandlers)
}


/**
* @return Group[]
*/
public function getGroups()
public function getGroups(): array
{
return $this->groups;
}


/**
* @return IExtensionHandler[] (extension => IExtensionHandler)
*/
public function getExtensionHandlers()
public function getExtensionHandlers(): array
{
return $this->extensionHandlers;
}
39 changes: 11 additions & 28 deletions src/Configurations/DefaultConfiguration.php
Original file line number Diff line number Diff line change
@@ -33,29 +33,26 @@ class DefaultConfiguration implements IConfiguration
/** @var bool */
protected $withDummyData;

/** @var array */
/** @var array<string, mixed> */
protected $phpParams;

/** @var Group[] */
/** @var list<Group> */
protected $groups;

/** @var IExtensionHandler[] */
/** @var array<string, IExtensionHandler> */
protected $handlers;

/** @var IDiffGenerator|NULL */
/** @var ?IDiffGenerator */
protected $structureDiffGenerator;

/** @var IDiffGenerator|NULL */
/** @var ?IDiffGenerator */
protected $dummyDataDiffGenerator;


/**
* @param string $dir
* @param IDriver $driver
* @param bool $withDummyData
* @param array $phpParams
* @param array<string, mixed> $phpParams
*/
public function __construct($dir, IDriver $driver, $withDummyData = true, array $phpParams = [])
public function __construct(string $dir, IDriver $driver, bool $withDummyData = true, array $phpParams = [])
{
$this->dir = $dir;
$this->driver = $driver;
@@ -64,10 +61,7 @@ public function __construct($dir, IDriver $driver, $withDummyData = true, array
}


/**
* @return Group[]
*/
public function getGroups()
public function getGroups(): array
{
if ($this->groups === null) {
$structures = new Group();
@@ -97,10 +91,7 @@ public function getGroups()
}


/**
* @return array|IExtensionHandler[] (extension => IExtensionHandler)
*/
public function getExtensionHandlers()
public function getExtensionHandlers(): array
{
if ($this->handlers === null) {
$this->handlers = [
@@ -113,21 +104,13 @@ public function getExtensionHandlers()
}


/**
* @param IDiffGenerator|NULL $generator
* @return void
*/
public function setStructureDiffGenerator(IDiffGenerator $generator = null)
public function setStructureDiffGenerator(?IDiffGenerator $generator = null): void
{
$this->structureDiffGenerator = $generator;
}


/**
* @param IDiffGenerator|NULL $generator
* @return void
*/
public function setDummyDataDiffGenerator(IDiffGenerator $generator = null)
public function setDummyDataDiffGenerator(?IDiffGenerator $generator = null): void
{
$this->dummyDataDiffGenerator = $generator;
}
24 changes: 17 additions & 7 deletions src/Controllers/BaseController.php
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
use Nextras\Migrations\Entities\Group;
use Nextras\Migrations\IDriver;
use Nextras\Migrations\IExtensionHandler;
use Nextras\Migrations\IPrinter;


abstract class BaseController
@@ -23,7 +24,7 @@ abstract class BaseController
/** @var string */
protected $mode;

/** @var array (name => Group) */
/** @var array<string, Group> (name => Group) */
protected $groups;


@@ -36,10 +37,13 @@ public function __construct(IDriver $driver)
}


abstract public function run();
abstract public function run(): void;


public function addGroup($name, $dir, array $dependencies = [])
/**
* @param list<string> $dependencies
*/
public function addGroup(string $name, string $dir, array $dependencies = []): self
{
$group = new Group;
$group->name = $name;
@@ -52,32 +56,38 @@ public function addGroup($name, $dir, array $dependencies = [])
}


public function addExtension($extension, IExtensionHandler $handler)
public function addExtension(string $extension, IExtensionHandler $handler): self
{
$this->runner->addExtensionHandler($extension, $handler);
return $this;
}


protected function registerGroups()
/**
* @return list<string>
*/
protected function registerGroups(): array
{
$enabled = [];

foreach ($this->groups as $group) {
$this->runner->addGroup($group);

if ($group->enabled) {
$enabled[] = $group->name;
}
}

return $enabled;
}


protected function setupPhp()
protected function setupPhp(): void
{
@set_time_limit(0);
@ini_set('memory_limit', '1G');
}


abstract protected function createPrinter();
abstract protected function createPrinter(): IPrinter;
}
9 changes: 5 additions & 4 deletions src/Controllers/ConsoleController.php
Original file line number Diff line number Diff line change
@@ -10,12 +10,13 @@
namespace Nextras\Migrations\Controllers;

use Nextras\Migrations\Engine;
use Nextras\Migrations\IPrinter;
use Nextras\Migrations\Printers;


class ConsoleController extends BaseController
{
public function run()
public function run(): void
{
$this->processArguments();
$this->printHeader();
@@ -24,7 +25,7 @@ public function run()
}


private function printHeader()
private function printHeader(): void
{
if ($this->mode === Engine\Runner::MODE_INIT) {
printf("-- Migrations init\n");
@@ -35,7 +36,7 @@ private function printHeader()
}


private function processArguments()
private function processArguments(): void
{
$arguments = array_slice($_SERVER['argv'], 1);
$help = count($arguments) === 0;
@@ -88,7 +89,7 @@ private function processArguments()
}


protected function createPrinter()
protected function createPrinter(): IPrinter
{
return new Printers\Console();
}
24 changes: 14 additions & 10 deletions src/Controllers/HttpController.php
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
namespace Nextras\Migrations\Controllers;

use Nextras\Migrations\Engine;
use Nextras\Migrations\IPrinter;
use Nextras\Migrations\Printers;


@@ -22,14 +23,14 @@ class HttpController extends BaseController
private $error;


public function run()
public function run(): void
{
$this->processArguments();
$this->executeAction();
}


private function processArguments()
private function processArguments(): void
{
if (isset($_GET['action'])) {
if ($_GET['action'] === 'run' || $_GET['action'] === 'css') {
@@ -87,14 +88,14 @@ private function processArguments()
}


private function executeAction()
private function executeAction(): void
{
$method = 'action' . ucfirst($this->action);
$this->$method();
}


private function actionIndex()
private function actionIndex(): void
{
$combinations = $this->getGroupsCombinations();
$this->printHeader();
@@ -122,7 +123,7 @@ private function actionIndex()
}


private function actionRun()
private function actionRun(): void
{
$groups = $this->registerGroups();
$groups = implode(' + ', $groups);
@@ -135,22 +136,25 @@ private function actionRun()
}


private function actionCss()
private function actionCss(): void
{
header('Content-Type: text/css', true);
readfile(__DIR__ . '/templates/main.css');
}


private function actionError()
private function actionError(): void
{
$this->printHeader();
echo "<h1>Migrations – error</h1>\n";
echo "<div class=\"error-message\">" . nl2br(htmlspecialchars($this->error), false) . "</div>\n";
}


private function getGroupsCombinations()
/**
* @return list<list<string>>
*/
private function getGroupsCombinations(): array
{
$groups = [];
$index = 1;
@@ -183,13 +187,13 @@ private function getGroupsCombinations()
}


private function printHeader()
private function printHeader(): void
{
readfile(__DIR__ . '/templates/header.phtml');
}


protected function createPrinter()
protected function createPrinter(): IPrinter
{
return new Printers\HtmlDump();
}
15 changes: 4 additions & 11 deletions src/Drivers/BaseDriver.php
Original file line number Diff line number Diff line change
@@ -31,18 +31,14 @@ abstract class BaseDriver implements IDriver
protected $tableNameQuoted;


/**
* @param IDbal $dbal
* @param string $tableName
*/
public function __construct(IDbal $dbal, $tableName = 'migrations')
public function __construct(IDbal $dbal, string $tableName = 'migrations')
{
$this->dbal = $dbal;
$this->tableName = $tableName;
}


public function setupConnection()
public function setupConnection(): void
{
$this->tableNameQuoted = $this->dbal->escapeIdentifier($this->tableName);
}
@@ -56,11 +52,8 @@ public function setupConnection()
* @author Michael Moravec
* @author Jan Skrasek
* @license Apache License
*
* @param string $path
* @return int number of executed queries
*/
public function loadFile($path)
public function loadFile(string $path): int
{
$content = @file_get_contents($path);
if ($content === false) {
@@ -103,7 +96,7 @@ public function loadFile($path)
break;

} elseif ($found) { // find matching quote or comment end
$endRe = isset($endReTable[$found]) ? $endReTable[$found] : '(' . (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\.") . '|\z)s';
$endRe = $endReTable[$found] ?? '(' . (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\.") . '|\z)s';
while (preg_match($endRe, $content, $match, PREG_OFFSET_CAPTURE, $parseOffset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
$s = $match[0][0];
if (strlen($s) === 0) {
31 changes: 17 additions & 14 deletions src/Drivers/MySqlDriver.php
Original file line number Diff line number Diff line change
@@ -22,7 +22,10 @@
*/
class MySqlDriver extends BaseDriver implements IDriver
{
public function setupConnection()
private const LOCK_NAME = 'Nextras.Migrations';


public function setupConnection(): void
{
parent::setupConnection();
$this->dbal->exec('SET NAMES "utf8mb4"');
@@ -32,7 +35,7 @@ public function setupConnection()
}


public function emptyDatabase()
public function emptyDatabase(): void
{
$rows = $this->dbal->query('SELECT DATABASE() AS `name`');
$dbName = $this->dbal->escapeIdentifier($rows[0]['name']);
@@ -46,25 +49,25 @@ public function emptyDatabase()
}


public function beginTransaction()
public function beginTransaction(): void
{
$this->dbal->exec('START TRANSACTION');
}


public function commitTransaction()
public function commitTransaction(): void
{
$this->dbal->exec('COMMIT');
}


public function rollbackTransaction()
public function rollbackTransaction(): void
{
$this->dbal->exec('ROLLBACK');
}


public function lock()
public function lock(): void
{
$lock = $this->dbal->escapeString(self::LOCK_NAME);
$result = (int) $this->dbal->query("SELECT GET_LOCK(SHA1(CONCAT($lock, '-', DATABASE())), 3) AS `result`")[0]['result'];
@@ -74,7 +77,7 @@ public function lock()
}


public function unlock()
public function unlock(): void
{
$lock = $this->dbal->escapeString(self::LOCK_NAME);
$result = (int) $this->dbal->query("SELECT RELEASE_LOCK(SHA1(CONCAT($lock, '-', DATABASE()))) AS `result`")[0]['result'];
@@ -84,19 +87,19 @@ public function unlock()
}


public function createTable()
public function createTable(): void
{
$this->dbal->exec($this->getInitTableSource());
}


public function dropTable()
public function dropTable(): void
{
$this->dbal->exec("DROP TABLE {$this->tableNameQuoted}");
}


public function insertMigration(Migration $migration)
public function insertMigration(Migration $migration): void
{
$this->dbal->exec("
INSERT INTO {$this->tableNameQuoted}
@@ -113,7 +116,7 @@ public function insertMigration(Migration $migration)
}


public function markMigrationAsReady(Migration $migration)
public function markMigrationAsReady(Migration $migration): void
{
$this->dbal->exec("
UPDATE {$this->tableNameQuoted}
@@ -123,7 +126,7 @@ public function markMigrationAsReady(Migration $migration)
}


public function getAllMigrations()
public function getAllMigrations(): array
{
$migrations = [];
$result = $this->dbal->query("SELECT * FROM {$this->tableNameQuoted} ORDER BY `executed`");
@@ -153,7 +156,7 @@ public function getAllMigrations()
}


public function getInitTableSource()
public function getInitTableSource(): string
{
return preg_replace('#^\t{3}#m', '', trim("
CREATE TABLE IF NOT EXISTS {$this->tableNameQuoted} (
@@ -170,7 +173,7 @@ public function getInitTableSource()
}


public function getInitMigrationsSource(array $files)
public function getInitMigrationsSource(array $files): string
{
$out = '';
foreach ($files as $file) {
35 changes: 15 additions & 20 deletions src/Drivers/PgSqlDriver.php
Original file line number Diff line number Diff line change
@@ -30,51 +30,46 @@ class PgSqlDriver extends BaseDriver implements IDriver
protected $schemaQuoted;


/**
* @param IDbal $dbal
* @param string $tableName
* @param string $schema
*/
public function __construct(IDbal $dbal, $tableName = 'migrations', $schema = 'public')
public function __construct(IDbal $dbal, string $tableName = 'migrations', string $schema = 'public')
{
parent::__construct($dbal, $tableName);
$this->schema = $schema;
}


public function setupConnection()
public function setupConnection(): void
{
parent::setupConnection();
$this->schemaQuoted = $this->dbal->escapeIdentifier($this->schema);
}


public function emptyDatabase()
public function emptyDatabase(): void
{
$this->dbal->exec("DROP SCHEMA IF EXISTS {$this->schemaQuoted} CASCADE");
$this->dbal->exec("CREATE SCHEMA {$this->schemaQuoted}");
}


public function beginTransaction()
public function beginTransaction(): void
{
$this->dbal->exec('START TRANSACTION');
}


public function commitTransaction()
public function commitTransaction(): void
{
$this->dbal->exec('COMMIT');
}


public function rollbackTransaction()
public function rollbackTransaction(): void
{
$this->dbal->exec('ROLLBACK');
}


public function lock()
public function lock(): void
{
try {
$this->dbal->exec('SELECT pg_advisory_lock(-2099128779216184107)');
@@ -85,7 +80,7 @@ public function lock()
}


public function unlock()
public function unlock(): void
{
try {
$this->dbal->exec('SELECT pg_advisory_unlock(-2099128779216184107)');
@@ -96,19 +91,19 @@ public function unlock()
}


public function createTable()
public function createTable(): void
{
$this->dbal->exec($this->getInitTableSource());
}


public function dropTable()
public function dropTable(): void
{
$this->dbal->exec("DROP TABLE {$this->schemaQuoted}.{$this->tableNameQuoted}");
}


public function insertMigration(Migration $migration)
public function insertMigration(Migration $migration): void
{
$rows = $this->dbal->query("
INSERT INTO {$this->schemaQuoted}.{$this->tableNameQuoted}" . '
@@ -126,7 +121,7 @@ public function insertMigration(Migration $migration)
}


public function markMigrationAsReady(Migration $migration)
public function markMigrationAsReady(Migration $migration): void
{
$this->dbal->exec("
UPDATE {$this->schemaQuoted}.{$this->tableNameQuoted}" . '
@@ -136,7 +131,7 @@ public function markMigrationAsReady(Migration $migration)
}


public function getAllMigrations()
public function getAllMigrations(): array
{
$migrations = [];
$result = $this->dbal->query("SELECT * FROM {$this->schemaQuoted}.{$this->tableNameQuoted} ORDER BY \"executed\"");
@@ -166,7 +161,7 @@ public function getAllMigrations()
}


public function getInitTableSource()
public function getInitTableSource(): string
{
return preg_replace('#^\t{3}#m', '', trim("
CREATE TABLE IF NOT EXISTS {$this->schemaQuoted}.{$this->tableNameQuoted} (" . '
@@ -183,7 +178,7 @@ public function getInitTableSource()
}


public function getInitMigrationsSource(array $files)
public function getInitMigrationsSource(array $files): string
{
$out = '';
foreach ($files as $file) {
2 changes: 1 addition & 1 deletion src/Engine/Finder.php
Original file line number Diff line number Diff line change
@@ -145,7 +145,7 @@ protected function getFilesRecursive($dir)

/**
* @param string $dir
* @return array
* @return list<string>
*/
protected function getItems($dir)
{
73 changes: 48 additions & 25 deletions src/Engine/OrderResolver.php
Original file line number Diff line number Diff line change
@@ -18,14 +18,13 @@
class OrderResolver
{
/**
* @param Migration[] $migrations
* @param Group[] $groups
* @param File[] $files
* @param string $mode
* @return File[]
* @param list<Migration> $migrations
* @param list<Group> $groups
* @param list<File> $files
* @return list<File>
* @throws LogicException
*/
public function resolve(array $migrations, array $groups, array $files, $mode)
public function resolve(array $migrations, array $groups, array $files, string $mode): array
{
$groups = $this->getAssocGroups($groups);
$this->validateGroups($groups);
@@ -107,13 +106,13 @@ public function resolve(array $migrations, array $groups, array $files, $mode)


/**
* @param File[] $files
* @param array $groups (name => Group)
* @return File[] sorted
* @param list<File> $files
* @param array<string, Group> $groups (name => Group)
* @return list<File> sorted
*/
protected function sortFiles(array $files, array $groups)
protected function sortFiles(array $files, array $groups): array
{
usort($files, function (File $a, File $b) use ($groups) {
usort($files, function (File $a, File $b) use ($groups): int {
$cmp = strcmp($a->name, $b->name);
if ($cmp === 0 && $a !== $b) {
$cmpA = $this->isGroupDependentOn($groups, $a->group, $b->group);
@@ -144,16 +143,14 @@ protected function sortFiles(array $files, array $groups)
/**
* Returns true if groupA depends on groupB.
*
* @param array $groups (name => Group)
* @param Group $groupA
* @param Group $groupB
* @return bool
* @param array<string, Group> $groups (name => Group)
*/
protected function isGroupDependentOn(array $groups, Group $groupA, Group $groupB)
protected function isGroupDependentOn(array $groups, Group $groupA, Group $groupB): bool
{
$visited = [];
$queue = $groupB->dependencies;
$queue[] = $groupB->name;

while ($node = array_shift($queue)) {
if (isset($visited[$node])) {
continue;
@@ -168,74 +165,100 @@ protected function isGroupDependentOn(array $groups, Group $groupA, Group $group
$queue[] = $dep;
}
}

return false;
}


protected function getAssocMigrations(array $migrations)
/**
* @param list<Migration> $migrations
* @return array<string, array<string, Migration>> (group => (filename => Migration))
*/
protected function getAssocMigrations(array $migrations): array
{
$assoc = [];

foreach ($migrations as $migration) {
$assoc[$migration->group][$migration->filename] = $migration;
}

return $assoc;
}


protected function getAssocGroups(array $groups)
/**
* @param list<Group> $groups
* @return array<string, Group> (name => Group)
*/
protected function getAssocGroups(array $groups): array
{
$assoc = [];

foreach ($groups as $group) {
$assoc[$group->name] = $group;
}

return $assoc;
}


protected function getAssocFiles(array $files)
/**
* @param list<File> $files
* @return array<string, array<string, File>> (group => (filename => File))
*/
protected function getAssocFiles(array $files): array
{
$assoc = [];

foreach ($files as $file) {
$assoc[$file->group->name][$file->name] = $file;
}

return $assoc;
}


protected function getFlatFiles(array $files)
/**
* @param array<string, array<string, File>> $files
* @return list<File>
*/
protected function getFlatFiles(array $files): array
{
$flat = [];

foreach ($files as $tmp) {
foreach ($tmp as $file) {
$flat[] = $file;
}
}

return $flat;
}


/**
* @param File[] $files
* @return File[] first file for each group
* @param list<File> $files
* @return array<string, File> (group => File)
*/
protected function getFirstFiles(array $files)
{
$firstFiles = [];

foreach ($files as $file) {
if (!isset($firstFiles[$file->group->name])) {
$firstFiles[$file->group->name] = $file;
}
}

return $firstFiles;
}


/**
* @param Group[] $groups
* @return void
* @param array<Group> $groups
* @throws LogicException
*/
private function validateGroups(array $groups)
private function validateGroups(array $groups): void
{
foreach ($groups as $group) {
foreach ($group->dependencies as $dependency) {
30 changes: 10 additions & 20 deletions src/Engine/Runner.php
Original file line number Diff line number Diff line change
@@ -33,10 +33,10 @@ class Runner
/** @var IPrinter */
private $printer;

/** @var array (extension => IExtensionHandler) */
/** @var array<string, IExtensionHandler> (extension => IExtensionHandler) */
private $extensionsHandlers = [];

/** @var Group[] */
/** @var list<Group> */
private $groups = [];

/** @var IDriver */
@@ -58,19 +58,14 @@ public function __construct(IDriver $driver, IPrinter $printer)
}


public function addGroup(Group $group)
public function addGroup(Group $group): self
{
$this->groups[] = $group;
return $this;
}


/**
* @param string $extension
* @param IExtensionHandler $handler
* @return self
*/
public function addExtensionHandler($extension, IExtensionHandler $handler)
public function addExtensionHandler(string $extension, IExtensionHandler $handler): self
{
if (isset($this->extensionsHandlers[$extension])) {
throw new LogicException("Extension '$extension' has already been defined.");
@@ -82,11 +77,9 @@ public function addExtensionHandler($extension, IExtensionHandler $handler)


/**
* @param string $mode self::MODE_CONTINUE|self::MODE_RESET|self::MODE_INIT
* @param IConfiguration $config
* @return void
* @param self::MODE_* $mode
*/
public function run($mode = self::MODE_CONTINUE, IConfiguration $config = null)
public function run(string $mode = self::MODE_CONTINUE, ?IConfiguration $config = null): void
{
if ($config) {
foreach ($config->getGroups() as $group) {
@@ -142,24 +135,20 @@ public function run($mode = self::MODE_CONTINUE, IConfiguration $config = null)
}


/**
* @param string $name
* @return IExtensionHandler
*/
public function getExtension($name)
public function getExtension(string $name): IExtensionHandler
{
if (!isset($this->extensionsHandlers[$name])) {
throw new LogicException("Extension '$name' not found.");
}

return $this->extensionsHandlers[$name];
}


/**
* @param File $file
* @return int number of executed queries
*/
protected function execute(File $file)
protected function execute(File $file): int
{
$this->driver->beginTransaction();

@@ -173,6 +162,7 @@ protected function execute(File $file)

try {
$queriesCount = $this->getExtension($file->extension)->execute($file);

} catch (\Exception $e) {
$this->driver->rollbackTransaction();
throw new ExecutionException(sprintf('Executing migration "%s" has failed.', $file->path), 0, $e);
20 changes: 8 additions & 12 deletions src/Extensions/PhpHandler.php
Original file line number Diff line number Diff line change
@@ -20,12 +20,12 @@
*/
class PhpHandler implements IExtensionHandler
{
/** @var array name => value */
/** @var array<string, mixed> name => value */
private $params;


/**
* @param array $params name => value
* @param array<string, mixed> $params (name => value)
*/
public function __construct(array $params = [])
{
@@ -34,37 +34,33 @@ public function __construct(array $params = [])


/**
* @param string $name
* @param mixed $value
* @return self
*/
public function addParameter($name, $value)
public function addParameter(string $name, $value): self
{
$this->params[$name] = $value;
return $this;
}


/**
* @return array (name => value)
* @return array<string, mixed> (name => value)
*/
public function getParameters()
public function getParameters(): array
{
return $this->params;
}


/**
* @param File $file
* @return int number of queries
*/
public function execute(File $file)
public function execute(File $file): int
{
extract($this->params, EXTR_SKIP);
$count = @include $file->path;

if ($count === false) {
throw new IOException("Cannot include file '{$file->path}'.");
}

return $count;
}
}
11 changes: 3 additions & 8 deletions src/Extensions/SqlHandler.php
Original file line number Diff line number Diff line change
@@ -24,25 +24,20 @@ class SqlHandler implements IExtensionHandler
private $driver;


/**
* @param IDriver $driver
*/
public function __construct(IDriver $driver)
{
$this->driver = $driver;
}


/**
* @param File $file
* @return int number of queries
*/
public function execute(File $file)
public function execute(File $file): int
{
$count = $this->driver->loadFile($file->path);

if ($count === 0) {
throw new LogicException("{$file->path} is empty");
}

return $count;
}
}
8 changes: 4 additions & 4 deletions src/IConfiguration.php
Original file line number Diff line number Diff line change
@@ -18,13 +18,13 @@
interface IConfiguration
{
/**
* @return Group[]
* @return list<Group>
*/
public function getGroups();
public function getGroups(): array;


/**
* @return array (extension => IExtensionHandler)
* @return array<string, IExtensionHandler> (extension => IExtensionHandler)
*/
public function getExtensionHandlers();
public function getExtensionHandlers(): array;
}
41 changes: 9 additions & 32 deletions src/IDbal.php
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@

namespace Nextras\Migrations;

use DateTime;
use DateTimeInterface;


/**
@@ -18,51 +18,28 @@
interface IDbal
{
/**
* @param string $sql
* @return array list of rows represented by assoc. arrays
* @return array<int, array<string, mixed>> list of rows represented by assoc. arrays
*/
function query($sql);
public function query(string $sql): array;


/**
* @param string $sql
* @return int number of affected rows
*/
function exec($sql);
public function exec(string $sql): int;


/**
* @param string $value
* @return string escaped string wrapped in quotes
*/
function escapeString($value);
public function escapeString(string $value): string;


/**
* @param int $value
* @return string
*/
function escapeInt($value);
public function escapeInt(int $value): string;


/**
* @param bool $value
* @return string
*/
function escapeBool($value);
public function escapeBool(bool $value): string;


/**
* @param DateTime $value
* @return string
*/
function escapeDateTime(DateTime $value);

public function escapeDateTime(DateTimeInterface $value): string;

/**
* @param string $value
* @return string
*/
function escapeIdentifier($value);

public function escapeIdentifier(string $value): string;
}
7 changes: 3 additions & 4 deletions src/IDiffGenerator.php
Original file line number Diff line number Diff line change
@@ -12,15 +12,14 @@

interface IDiffGenerator
{

/**
* @return string
* @return string file extension
*/
function getExtension();
public function getExtension(): string;


/**
* @return string SQL (semicolon-separated queries)
*/
function generateContent();
public function generateContent(): string;
}
50 changes: 18 additions & 32 deletions src/IDriver.php
Original file line number Diff line number Diff line change
@@ -18,112 +18,98 @@
*/
interface IDriver
{
/** @const shared lock identifier */
const LOCK_NAME = 'Nextras.Migrations';


/**
* Setups the connection, such as encoding, default schema, etc.
*/
function setupConnection();
public function setupConnection(): void;


/**
* Drops the database / schema. Should removes all db objects (tables, views, procedures, sequences, ...)
*
* @return mixed
* Drops the database / schema. Should remove all db objects (tables, views, procedures, sequences, ...)
*/
function emptyDatabase();
public function emptyDatabase(): void;


/**
* Loads and executes SQL queries from given file.
*
* @param string $path
* @return int number of executed queries
*/
function loadFile($path);
public function loadFile(string $path): int;


/**
* Starts transaction.
*/
function beginTransaction();
public function beginTransaction(): void;


/**
* Commit transaction.
*/
function commitTransaction();
public function commitTransaction(): void;


/**
* Rollback transaction.
*/
function rollbackTransaction();
public function rollbackTransaction(): void;


/**
* Locks database for running migrations.
*/
function lock();
public function lock(): void;


/**
* Unlocks database.
*/
function unlock();
public function unlock(): void;


/**
* Creates migration table.
*/
function createTable();
public function createTable(): void;


/**
* Drop migration table.
*/
function dropTable();
public function dropTable(): void;


/**
* Inserts migration info into migration table.
*
* @param Migration $migration
*/
function insertMigration(Migration $migration);
public function insertMigration(Migration $migration): void;


/**
* Updated migration as executed.
*
* @param Migration $migration
*/
function markMigrationAsReady(Migration $migration);
public function markMigrationAsReady(Migration $migration): void;


/**
* Returns all migrations stored in migration table sorted by time.
*
* @return Migration[]
* @return list<Migration>
*/
function getAllMigrations();
public function getAllMigrations(): array;


/**
* Returns source code for migration table initialization.
*
* @return string
*/
function getInitTableSource();
public function getInitTableSource(): string;


/**
* Returns source code for migration table data initialization.
*
* @param File[] $files
* @return string
* @param list<File> $files
*/
function getInitMigrationsSource(array $files);
public function getInitMigrationsSource(array $files): string;
}
3 changes: 1 addition & 2 deletions src/IExtensionHandler.php
Original file line number Diff line number Diff line change
@@ -19,8 +19,7 @@
interface IExtensionHandler
{
/**
* @param File $file
* @return int number of queries
*/
function execute(File $file);
public function execute(File $file): int;
}
27 changes: 9 additions & 18 deletions src/IPrinter.php
Original file line number Diff line number Diff line change
@@ -18,51 +18,42 @@
interface IPrinter
{
/**
* Print general info about mode.
* - reset = Database has been wiped.
* - continue = Running new migrations.
*
* @param string $mode
* Prints general info about mode.
*/
function printIntro($mode);
public function printIntro(string $mode): void;


/**
* List of migrations which should be executed has been completed.
*
* @param File[] $toExecute
* @param list<File> $toExecute
*/
function printToExecute(array $toExecute);
public function printToExecute(array $toExecute): void;


/**
* A migration has been successfully executed.
*
* @param File $file
* @param int $count number of executed queries
* @param float $time elapsed time in milliseconds
* @param float $time elapsed time in seconds
*/
function printExecute(File $file, $count, $time);
public function printExecute(File $file, int $count, float $time): void;


/**
* All migrations have been successfully executed.
*/
function printDone();
public function printDone(): void;


/**
* An error has occurred during execution of a migration.
*
* @param Exception $e
*/
function printError(Exception $e);
public function printError(Exception $e): void;


/**
* Prints init source code.
*
* @param string $code
*/
function printSource($code);
public function printSource(string $code): void;
}
49 changes: 18 additions & 31 deletions src/Printers/Console.php
Original file line number Diff line number Diff line change
@@ -36,14 +36,14 @@ public function __construct()
}


public function printIntro($mode)
public function printIntro(string $mode): void
{
$this->output('Nextras Migrations');
$this->output(strtoupper($mode), self::COLOR_INTRO);
}


public function printToExecute(array $toExecute)
public function printToExecute(array $toExecute): void
{
if ($toExecute) {
$count = count($toExecute);
@@ -54,30 +54,30 @@ public function printToExecute(array $toExecute)
}


public function printExecute(File $file, $count, $time)
public function printExecute(File $file, int $count, float $time): void
{
$this->output(
'- ' . $file->group->name . '/' . $file->name . '; '
. $this->color($count, self::COLOR_INFO) . ' queries; '
. $this->color(sprintf('%0.3f', $time), self::COLOR_INFO) . ' s'
. $this->colorize((string) $count, self::COLOR_INFO) . ' queries; '
. $this->colorize(sprintf('%0.3f', $time), self::COLOR_INFO) . ' s'
);
}


public function printDone()
public function printDone(): void
{
$this->output('OK', self::COLOR_SUCCESS);
}


public function printError(Exception $e)
public function printError(Exception $e): void
{
$this->output('ERROR: ' . $e->getMessage(), self::COLOR_ERROR);
throw $e;
}


public function printSource($code)
public function printSource(string $code): void
{
$this->output($code);
}
@@ -87,40 +87,27 @@ public function printSource($code)
* Prints text to a console, optionally in a specific color.
*
* @param string $s
* @param string|NULL $color self::COLOR_*
* @param string|null $color self::COLOR_*
*/
protected function output($s, $color = null)
protected function output(string $s, ?string $color = null): void
{
if ($color === null || !$this->useColors) {
echo "$s\n";
} else {
echo $this->color($s, $color) . "\n";
}
echo $this->colorize($s, $color) . "\n";
}


/**
* @param string $s
* @param string $color
* @return string
*/
protected function color($s, $color)
protected function colorize(string $s, ?string $color): string
{
if (!$this->useColors) {
return $s;
}
return "\033[{$color}m$s\033[22;39m";
return $this->useColors && $color !== null ? "\033[{$color}m$s\033[22;39m" : $s;
}


/**
* @return bool TRUE if terminal support colors, FALSE otherwise
* @license New BSD License
* @author David Grudl
* @return bool true if terminal support colors, false otherwise
*/
protected function detectColorSupport()
protected function detectColorSupport(): bool
{
return (getenv('ConEmuANSI') === 'ON' || getenv('ANSICON') !== false
|| (defined('STDOUT') && function_exists('posix_isatty') && posix_isatty(STDOUT)));
return (function_exists('posix_isatty') && posix_isatty(STDOUT))
|| (function_exists('stream_isatty') && stream_isatty(STDOUT))
|| (function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support(STDOUT));
}
}
12 changes: 6 additions & 6 deletions src/Printers/DevNull.php
Original file line number Diff line number Diff line change
@@ -21,32 +21,32 @@
*/
class DevNull implements IPrinter
{
public function printIntro($mode)
public function printIntro(string $mode): void
{
}


public function printToExecute(array $toExecute)
public function printToExecute(array $toExecute): void
{
}


public function printExecute(File $file, $count, $time)
public function printExecute(File $file, int $count, float $time): void
{
}


public function printDone()
public function printDone(): void
{
}


public function printError(Exception $e)
public function printError(Exception $e): void
{
}


public function printSource($code)
public function printSource(string $code): void
{
}
}
21 changes: 8 additions & 13 deletions src/Printers/HtmlDump.php
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@ class HtmlDump implements IPrinter
private $index;


public function printIntro($mode)
public function printIntro(string $mode): void
{
if ($mode === Runner::MODE_RESET) {
$this->output(' RESET: All tables, views and data has been destroyed!');
@@ -37,7 +37,7 @@ public function printIntro($mode)
}


public function printToExecute(array $toExecute)
public function printToExecute(array $toExecute): void
{
if ($toExecute) {
$this->output(' ' . count($toExecute) . ' migrations need to be executed.');
@@ -50,9 +50,9 @@ public function printToExecute(array $toExecute)
}


public function printExecute(File $file, $count, $time)
public function printExecute(File $file, int $count, float $time): void
{
$format = '%0' . strlen($this->count) . 'd';
$format = '%0' . strlen((string) $this->count) . 'd';
$name = htmlspecialchars($file->group->name . '/' . $file->name);
$this->output(sprintf(
$format . '/' . $format . ': <strong>%s</strong> (%d %s, %0.3f s)',
@@ -61,31 +61,26 @@ public function printExecute(File $file, $count, $time)
}


public function printDone()
public function printDone(): void
{
$this->output('OK', 'success');
}


public function printError(Exception $e)
public function printError(Exception $e): void
{
$this->output('ERROR: ' . htmlspecialchars($e->getMessage()), 'error');
throw $e;
}


public function printSource($code)
public function printSource(string $code): void
{
$this->output($code);
}


/**
* @param string $s HTML string
* @param string $class
* @return void
*/
protected function output($s, $class = 'info')
protected function output(string $s, string $class = 'info'): void
{
echo "<div class=\"$class\">$s</div>\n";
}
4 changes: 3 additions & 1 deletion src/exceptions.php
Original file line number Diff line number Diff line change
@@ -9,11 +9,13 @@

namespace Nextras\Migrations;

use Throwable;


/**
* Marker interface.
*/
interface Exception
interface Exception extends Throwable
{
}

2 changes: 1 addition & 1 deletion tests/inc/TestPrinter.php
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ public function __construct()
}


protected function output($s, $color = NULL)
protected function output(string $s, string $color = null): void
{
$this->lines[] = preg_replace('#; \d+\.\d+ s#', '; XX s', $s);
$this->out .= "$s\n";

0 comments on commit 87ec8d7

Please sign in to comment.