From 531dd64c3fe4ea3025482280e73f49cbb6e90f32 Mon Sep 17 00:00:00 2001 From: mscherer Date: Fri, 20 Jan 2023 13:29:34 +0100 Subject: [PATCH] Fix up datetime PHPStan error. --- .../Common/Config/XmlToArrayConverter.php | 2 +- .../Behavior/Delegate/DelegateBehavior.php | 2 +- .../SortableBehaviorObjectBuilderModifier.php | 1 + .../SortableBehaviorQueryBuilderModifier.php | 4 +- .../Om/TableMapLoaderScriptBuilder.php | 3 +- .../DataFetcher/AbstractDataFetcher.php | 1 + src/Propel/Runtime/Util/PropelDateTime.php | 61 +++++++++++++------ 7 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/Propel/Common/Config/XmlToArrayConverter.php b/src/Propel/Common/Config/XmlToArrayConverter.php index 88a72c3715..9e08c6778a 100644 --- a/src/Propel/Common/Config/XmlToArrayConverter.php +++ b/src/Propel/Common/Config/XmlToArrayConverter.php @@ -62,7 +62,7 @@ public static function convert(string $xmlToParse): array libxml_clear_errors(); libxml_use_internal_errors($currentInternalErrors); - if (count($errors) > 0) { + if ($xml === false || count($errors) > 0) { throw new XmlParseException($errors); } diff --git a/src/Propel/Generator/Behavior/Delegate/DelegateBehavior.php b/src/Propel/Generator/Behavior/Delegate/DelegateBehavior.php index f049771abc..47582e2c45 100644 --- a/src/Propel/Generator/Behavior/Delegate/DelegateBehavior.php +++ b/src/Propel/Generator/Behavior/Delegate/DelegateBehavior.php @@ -193,7 +193,7 @@ public function objectCall(ObjectBuilder $builder): string public function objectFilter(string &$script): void { $p = new PhpParser($script, true); - $text = $p->findMethod('toArray'); + $text = (string)$p->findMethod('toArray'); $matches = []; preg_match('/(\$result = \[([^;]+)\];)/U', $text, $matches); if (!$matches) { diff --git a/src/Propel/Generator/Behavior/Sortable/SortableBehaviorObjectBuilderModifier.php b/src/Propel/Generator/Behavior/Sortable/SortableBehaviorObjectBuilderModifier.php index 61ba3774f9..4dceb115b4 100644 --- a/src/Propel/Generator/Behavior/Sortable/SortableBehaviorObjectBuilderModifier.php +++ b/src/Propel/Generator/Behavior/Sortable/SortableBehaviorObjectBuilderModifier.php @@ -289,6 +289,7 @@ public function objectFilter(string &$script, AbstractOMBuilder $builder): void $script = str_replace($search, $replace, $script); } } else { + /** @var string $scope */ $scope = current($this->behavior->getScopes()); $name = strtolower($this->behavior->getTable()->getColumn($scope)->getName()); diff --git a/src/Propel/Generator/Behavior/Sortable/SortableBehaviorQueryBuilderModifier.php b/src/Propel/Generator/Behavior/Sortable/SortableBehaviorQueryBuilderModifier.php index 229fe90569..a1ea67a9e9 100644 --- a/src/Propel/Generator/Behavior/Sortable/SortableBehaviorQueryBuilderModifier.php +++ b/src/Propel/Generator/Behavior/Sortable/SortableBehaviorQueryBuilderModifier.php @@ -166,8 +166,10 @@ static public function sortableApplyScopeCriteria(Criteria \$criteria, \$scope, "; } } else { + /** @var string $scope */ + $scope = current($this->behavior->getScopes()); $script .= " - \$criteria->\$method({$this->tableMapClassName}::" . Column::CONSTANT_PREFIX . strtoupper(current($this->behavior->getScopes())) . ", \$scope, Criteria::EQUAL); + \$criteria->\$method({$this->tableMapClassName}::" . Column::CONSTANT_PREFIX . strtoupper($scope) . ", \$scope, Criteria::EQUAL); "; } diff --git a/src/Propel/Generator/Builder/Om/TableMapLoaderScriptBuilder.php b/src/Propel/Generator/Builder/Om/TableMapLoaderScriptBuilder.php index 026b7ae00b..edf41accdf 100644 --- a/src/Propel/Generator/Builder/Om/TableMapLoaderScriptBuilder.php +++ b/src/Propel/Generator/Builder/Om/TableMapLoaderScriptBuilder.php @@ -121,13 +121,14 @@ protected function sortRecursive(array &$array): void /** * @param \Propel\Generator\Model\Table $table * - * @return string + * @return class-string<\Propel\Runtime\Map\TableMap> */ protected function getFullyQualifiedTableMapClassName(Table $table): string { $builder = new TableMapBuilder($table); $builder->setGeneratorConfig($this->generatorConfig); + /** @var class-string<\Propel\Runtime\Map\TableMap> */ return $builder->getFullyQualifiedClassName(); } diff --git a/src/Propel/Runtime/DataFetcher/AbstractDataFetcher.php b/src/Propel/Runtime/DataFetcher/AbstractDataFetcher.php index 03b552c2d6..183dded89f 100644 --- a/src/Propel/Runtime/DataFetcher/AbstractDataFetcher.php +++ b/src/Propel/Runtime/DataFetcher/AbstractDataFetcher.php @@ -49,6 +49,7 @@ public function getDataObject() */ public function fetchColumn($index = null) { + /** @var array|null $next */ $next = $this->fetch(); if (!$next) { diff --git a/src/Propel/Runtime/Util/PropelDateTime.php b/src/Propel/Runtime/Util/PropelDateTime.php index fdb53a4fb0..c4493bbd5d 100644 --- a/src/Propel/Runtime/Util/PropelDateTime.php +++ b/src/Propel/Runtime/Util/PropelDateTime.php @@ -121,28 +121,51 @@ public static function newInstance($value, ?DateTimeZone $timeZone = null, strin // because DateTime('') == DateTime('now') -- which is unexpected return null; } + try { - if (static::isTimestamp($value)) { // if it's a unix timestamp - $format = 'U'; - if (strpos($value, '.')) { - //with milliseconds - $format = 'U.u'; - } - - $dateTimeObject = DateTime::createFromFormat($format, $value, new DateTimeZone('UTC')); - // timezone must be explicitly specified and then changed - // because of a DateTime bug: http://bugs.php.net/bug.php?id=43003 - $dateTimeObject->setTimeZone(new DateTimeZone(date_default_timezone_get())); + $dateTimeObject = static::createDateTime($value, $timeZone, $dateTimeClass); + } catch (Exception $e) { + $value = var_export($value, true); + + throw new PropelException('Error parsing date/time value `' . $value . '`: ' . $e->getMessage(), 0, $e); + } + + return $dateTimeObject; + } + + /** + * @param mixed $value + * @param \DateTimeZone|null $timeZone + * @param string $dateTimeClass + * + * @throws \Exception + * + * @return mixed + */ + protected static function createDateTime($value, ?DateTimeZone $timeZone = null, string $dateTimeClass = 'DateTime') + { + if (static::isTimestamp($value)) { // if it's a unix timestamp + $format = 'U'; + if (strpos($value, '.')) { + //with milliseconds + $format = 'U.u'; + } + + $dateTimeObject = DateTime::createFromFormat($format, $value, new DateTimeZone('UTC')); + if ($dateTimeObject === false) { + throw new Exception(sprintf('Cannot create DateTime from format `%s`', $format)); + } + + // timezone must be explicitly specified and then changed + // because of a DateTime bug: http://bugs.php.net/bug.php?id=43003 + $dateTimeObject->setTimeZone(new DateTimeZone(date_default_timezone_get())); + } else { + if ($timeZone === null) { + // stupid DateTime constructor signature + $dateTimeObject = new $dateTimeClass($value); } else { - if ($timeZone === null) { - // stupid DateTime constructor signature - $dateTimeObject = new $dateTimeClass($value); - } else { - $dateTimeObject = new $dateTimeClass($value, $timeZone); - } + $dateTimeObject = new $dateTimeClass($value, $timeZone); } - } catch (Exception $e) { - throw new PropelException('Error parsing date/time value: ' . var_export($value, true), 0, $e); } return $dateTimeObject;