Merge branch 'master' into dx-more-helpful-exception-message

This commit is contained in:
Andrii Dembitskyi 2022-03-18 05:25:51 -04:00 committed by GitHub
commit e2609c9bef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 255 additions and 209 deletions

View File

@ -1,6 +1,6 @@
name: Spout CI name: Spout CI
on: push on: [push, pull_request]
jobs: jobs:
tests-on-php-latest: tests-on-php-latest:
@ -8,7 +8,7 @@ jobs:
matrix: matrix:
operating-system: [ubuntu-latest, windows-latest, macos-latest] operating-system: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.operating-system }} runs-on: ${{ matrix.operating-system }}
name: Tests - PHP 8.0 on ${{ matrix.operating-system }} name: Tests - PHP 8.1 on ${{ matrix.operating-system }}
env: env:
extensions: zip, xmlreader, dom extensions: zip, xmlreader, dom
cache-key: cache-matrix-v1 # can be any string, change to clear the extension cache. cache-key: cache-matrix-v1 # can be any string, change to clear the extension cache.
@ -20,7 +20,7 @@ jobs:
id: extcache id: extcache
uses: shivammathur/cache-extensions@v1 uses: shivammathur/cache-extensions@v1
with: with:
php-version: '8.0' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
key: ${{ env.cache-key }} key: ${{ env.cache-key }}
@ -34,7 +34,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with: with:
php-version: '8.0' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
- name: Get composer cache directory - name: Get composer cache directory
@ -59,7 +59,7 @@ jobs:
tests-on-older-php: tests-on-older-php:
strategy: strategy:
matrix: matrix:
php-versions: ['7.3', '7.4'] php-versions: ['7.3', '7.4', '8.0']
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Tests - PHP ${{ matrix.php-versions }} name: Tests - PHP ${{ matrix.php-versions }}
env: env:
@ -123,7 +123,7 @@ jobs:
id: extcache id: extcache
uses: shivammathur/cache-extensions@v1 uses: shivammathur/cache-extensions@v1
with: with:
php-version: '7.4' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
key: ${{ env.cache-key }} key: ${{ env.cache-key }}
@ -137,7 +137,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: '7.4' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
- name: Get composer cache directory - name: Get composer cache directory
@ -182,7 +182,7 @@ jobs:
id: extcache id: extcache
uses: shivammathur/cache-extensions@v1 uses: shivammathur/cache-extensions@v1
with: with:
php-version: '8.0' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
key: ${{ env.cache-key }} key: ${{ env.cache-key }}
@ -196,7 +196,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: '8.0' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
- name: Get composer cache directory - name: Get composer cache directory
@ -232,7 +232,7 @@ jobs:
id: extcache id: extcache
uses: shivammathur/cache-extensions@v1 uses: shivammathur/cache-extensions@v1
with: with:
php-version: '8.0' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
key: ${{ env.cache-key }} key: ${{ env.cache-key }}
@ -246,7 +246,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: '8.0' php-version: '8.1'
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}
tools: phpstan tools: phpstan
@ -267,4 +267,4 @@ jobs:
run: composer install --no-progress --prefer-dist --optimize-autoloader run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Static Analysis using PHPStan - name: Static Analysis using PHPStan
run: phpstan analyse --no-progress src tests run: ./vendor/bin/phpstan analyse -c phpstan.neon --no-progress

9
phpstan.neon Normal file
View File

@ -0,0 +1,9 @@
parameters:
level: 4
paths:
- src
- tests
excludePaths:
# Exclude these files that are OK
- src/Spout/Reader/Common/Creator/ReaderEntityFactory.php
- src/Spout/Writer/Common/Creator/WriterEntityFactory.php

View File

@ -1,38 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.5/phpunit.xsd" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
bootstrap="tests/bootstrap.php" bootstrap="tests/bootstrap.php"
colors="true" colors="true"
convertErrorsToExceptions="false" convertErrorsToExceptions="false"
convertWarningsToExceptions="false" convertWarningsToExceptions="false"
defaultTestSuite="unit-tests" defaultTestSuite="unit-tests"
verbose="false"> verbose="false">
<php> <php>
<ini name="error_reporting" value="-1" /> <ini name="error_reporting" value="-1"/>
</php> </php>
<testsuites> <testsuites>
<testsuite name="unit-tests">
<directory>tests/</directory>
</testsuite>
</testsuites>
<testsuite name="unit-tests"> <groups>
<directory>tests/</directory> <exclude>
</testsuite> <group>perf-tests</group>
</exclude>
</groups>
</testsuites> <coverage>
<include>
<groups> <directory suffix=".php">src/</directory>
<exclude> </include>
<group>perf-tests</group> <exclude>
</exclude> <directory>src/Spout/Autoloader</directory>
</groups> </exclude>
</coverage>
<filter>
<whitelist>
<directory suffix=".php">src/</directory>
<exclude>
<directory>src/Spout/Autoloader</directory>
</exclude>
</whitelist>
</filter>
</phpunit> </phpunit>

View File

@ -66,7 +66,7 @@ class Style
/** @var bool Whether the wrap text property was set */ /** @var bool Whether the wrap text property was set */
private $hasSetWrapText = false; private $hasSetWrapText = false;
/** @var Border */ /** @var Border|null */
private $border; private $border;
/** @var bool Whether border properties should be applied */ /** @var bool Whether border properties should be applied */
@ -78,7 +78,7 @@ class Style
/** @var bool */ /** @var bool */
private $hasSetBackgroundColor = false; private $hasSetBackgroundColor = false;
/** @var string Format */ /** @var string|null Format */
private $format; private $format;
/** @var bool */ /** @var bool */
@ -110,7 +110,7 @@ class Style
} }
/** /**
* @return Border * @return Border|null
*/ */
public function getBorder() public function getBorder()
{ {
@ -467,7 +467,7 @@ class Style
} }
/** /**
* @return string * @return string|null
*/ */
public function getFormat() public function getFormat()
{ {

View File

@ -9,7 +9,7 @@ namespace Box\Spout\Common\Helper;
class CellTypeHelper class CellTypeHelper
{ {
/** /**
* @param $value * @param mixed|null $value
* @return bool Whether the given value is considered "empty" * @return bool Whether the given value is considered "empty"
*/ */
public static function isEmpty($value) public static function isEmpty($value)
@ -18,7 +18,7 @@ class CellTypeHelper
} }
/** /**
* @param $value * @param mixed $value
* @return bool Whether the given value is a non empty string * @return bool Whether the given value is a non empty string
*/ */
public static function isNonEmptyString($value) public static function isNonEmptyString($value)
@ -30,7 +30,7 @@ class CellTypeHelper
* Returns whether the given value is numeric. * Returns whether the given value is numeric.
* A numeric value is from type "integer" or "double" ("float" is not returned by gettype). * A numeric value is from type "integer" or "double" ("float" is not returned by gettype).
* *
* @param $value * @param mixed $value
* @return bool Whether the given value is numeric * @return bool Whether the given value is numeric
*/ */
public static function isNumeric($value) public static function isNumeric($value)
@ -44,7 +44,7 @@ class CellTypeHelper
* Returns whether the given value is boolean. * Returns whether the given value is boolean.
* "true"/"false" and 0/1 are not booleans. * "true"/"false" and 0/1 are not booleans.
* *
* @param $value * @param mixed $value
* @return bool Whether the given value is boolean * @return bool Whether the given value is boolean
*/ */
public static function isBoolean($value) public static function isBoolean($value)
@ -55,13 +55,13 @@ class CellTypeHelper
/** /**
* Returns whether the given value is a DateTime or DateInterval object. * Returns whether the given value is a DateTime or DateInterval object.
* *
* @param $value * @param mixed $value
* @return bool Whether the given value is a DateTime or DateInterval object * @return bool Whether the given value is a DateTime or DateInterval object
*/ */
public static function isDateTimeOrDateInterval($value) public static function isDateTimeOrDateInterval($value)
{ {
return ( return (
$value instanceof \DateTime || $value instanceof \DateTimeInterface ||
$value instanceof \DateInterval $value instanceof \DateInterval
); );
} }

View File

@ -82,7 +82,7 @@ class GlobalFunctionsHelper
* @param int|null $length * @param int|null $length
* @param string|null $delimiter * @param string|null $delimiter
* @param string|null $enclosure * @param string|null $enclosure
* @return array * @return array|false
*/ */
public function fgetcsv($handle, $length = null, $delimiter = null, $enclosure = null) public function fgetcsv($handle, $length = null, $delimiter = null, $enclosure = null)
{ {
@ -103,7 +103,7 @@ class GlobalFunctionsHelper
* @param array $fields * @param array $fields
* @param string|null $delimiter * @param string|null $delimiter
* @param string|null $enclosure * @param string|null $enclosure
* @return int * @return int|false
*/ */
public function fputcsv($handle, array $fields, $delimiter = null, $enclosure = null) public function fputcsv($handle, array $fields, $delimiter = null, $enclosure = null)
{ {
@ -243,10 +243,10 @@ class GlobalFunctionsHelper
* @see basename() * @see basename()
* *
* @param string $path * @param string $path
* @param string|null $suffix * @param string $suffix
* @return string * @return string
*/ */
public function basename($path, $suffix = null) public function basename($path, $suffix = '')
{ {
return \basename($path, $suffix); return \basename($path, $suffix);
} }

View File

@ -88,7 +88,7 @@ class StringHelper
* @see https://wiki.php.net/rfc/locale_independent_float_to_string for the changed behavior in PHP8. * @see https://wiki.php.net/rfc/locale_independent_float_to_string for the changed behavior in PHP8.
* *
* @param int|float $numericValue * @param int|float $numericValue
* @return string * @return int|float|string
*/ */
public function formatNumericValue($numericValue) public function formatNumericValue($numericValue)
{ {

View File

@ -3,6 +3,9 @@
namespace Box\Spout\Reader\CSV; namespace Box\Spout\Reader\CSV;
use Box\Spout\Common\Exception\IOException; use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Helper\GlobalFunctionsHelper;
use Box\Spout\Common\Manager\OptionsManagerInterface;
use Box\Spout\Reader\Common\Creator\InternalEntityFactoryInterface;
use Box\Spout\Reader\Common\Entity\Options; use Box\Spout\Reader\Common\Entity\Options;
use Box\Spout\Reader\CSV\Creator\InternalEntityFactory; use Box\Spout\Reader\CSV\Creator\InternalEntityFactory;
use Box\Spout\Reader\ReaderAbstract; use Box\Spout\Reader\ReaderAbstract;
@ -22,6 +25,23 @@ class Reader extends ReaderAbstract
/** @var string Original value for the "auto_detect_line_endings" INI value */ /** @var string Original value for the "auto_detect_line_endings" INI value */
protected $originalAutoDetectLineEndings; protected $originalAutoDetectLineEndings;
/** @var bool Whether the code is running with PHP >= 8.1 */
private $isRunningAtLeastPhp81;
/**
* @param OptionsManagerInterface $optionsManager
* @param GlobalFunctionsHelper $globalFunctionsHelper
* @param InternalEntityFactoryInterface $entityFactory
*/
public function __construct(
OptionsManagerInterface $optionsManager,
GlobalFunctionsHelper $globalFunctionsHelper,
InternalEntityFactoryInterface $entityFactory
) {
parent::__construct($optionsManager, $globalFunctionsHelper, $entityFactory);
$this->isRunningAtLeastPhp81 = \version_compare(PHP_VERSION, '8.1.0') >= 0;
}
/** /**
* Sets the field delimiter for the CSV. * Sets the field delimiter for the CSV.
* Needs to be called before opening the reader. * Needs to be called before opening the reader.
@ -84,8 +104,11 @@ class Reader extends ReaderAbstract
*/ */
protected function openReader($filePath) protected function openReader($filePath)
{ {
$this->originalAutoDetectLineEndings = \ini_get('auto_detect_line_endings'); // "auto_detect_line_endings" is deprecated in PHP 8.1
\ini_set('auto_detect_line_endings', '1'); if (!$this->isRunningAtLeastPhp81) {
$this->originalAutoDetectLineEndings = \ini_get('auto_detect_line_endings');
\ini_set('auto_detect_line_endings', '1');
}
$this->filePointer = $this->globalFunctionsHelper->fopen($filePath, 'r'); $this->filePointer = $this->globalFunctionsHelper->fopen($filePath, 'r');
if (!$this->filePointer) { if (!$this->filePointer) {
@ -119,10 +142,13 @@ class Reader extends ReaderAbstract
*/ */
protected function closeReader() protected function closeReader()
{ {
if ($this->filePointer) { if (is_resource($this->filePointer)) {
$this->globalFunctionsHelper->fclose($this->filePointer); $this->globalFunctionsHelper->fclose($this->filePointer);
} }
\ini_set('auto_detect_line_endings', $this->originalAutoDetectLineEndings); // "auto_detect_line_endings" is deprecated in PHP 8.1
if (!$this->isRunningAtLeastPhp81) {
\ini_set('auto_detect_line_endings', $this->originalAutoDetectLineEndings);
}
} }
} }

View File

@ -21,7 +21,7 @@ class RowIterator implements IteratorInterface
*/ */
public const MAX_READ_BYTES_PER_LINE = 0; public const MAX_READ_BYTES_PER_LINE = 0;
/** @var resource Pointer to the CSV file to read */ /** @var resource|null Pointer to the CSV file to read */
protected $filePointer; protected $filePointer;
/** @var int Number of read rows */ /** @var int Number of read rows */
@ -84,7 +84,7 @@ class RowIterator implements IteratorInterface
* *
* @return void * @return void
*/ */
public function rewind() public function rewind() : void
{ {
$this->rewindAndSkipBom(); $this->rewindAndSkipBom();
@ -114,7 +114,7 @@ class RowIterator implements IteratorInterface
* *
* @return bool * @return bool
*/ */
public function valid() public function valid() : bool
{ {
return ($this->filePointer && !$this->hasReachedEndOfFile); return ($this->filePointer && !$this->hasReachedEndOfFile);
} }
@ -126,7 +126,7 @@ class RowIterator implements IteratorInterface
* @throws \Box\Spout\Common\Exception\EncodingConversionException If unable to convert data to UTF-8 * @throws \Box\Spout\Common\Exception\EncodingConversionException If unable to convert data to UTF-8
* @return void * @return void
*/ */
public function next() public function next() : void
{ {
$this->hasReachedEndOfFile = $this->globalFunctionsHelper->feof($this->filePointer); $this->hasReachedEndOfFile = $this->globalFunctionsHelper->feof($this->filePointer);
@ -146,8 +146,8 @@ class RowIterator implements IteratorInterface
} while ($this->shouldReadNextRow($rowData)); } while ($this->shouldReadNextRow($rowData));
if ($rowData !== false) { if ($rowData !== false) {
// str_replace will replace NULL values by empty strings // array_map will replace NULL values by empty strings
$rowDataBufferAsArray = \str_replace(null, null, $rowData); $rowDataBufferAsArray = array_map(function ($value) { return (string) $value; }, $rowData);
$this->rowBuffer = $this->entityFactory->createRowFromArray($rowDataBufferAsArray); $this->rowBuffer = $this->entityFactory->createRowFromArray($rowDataBufferAsArray);
$this->numReadRows++; $this->numReadRows++;
} else { } else {
@ -224,7 +224,7 @@ class RowIterator implements IteratorInterface
* *
* @return Row|null * @return Row|null
*/ */
public function current() public function current() : ?Row
{ {
return $this->rowBuffer; return $this->rowBuffer;
} }
@ -235,7 +235,7 @@ class RowIterator implements IteratorInterface
* *
* @return int * @return int
*/ */
public function key() public function key() : int
{ {
return $this->numReadRows; return $this->numReadRows;
} }
@ -245,7 +245,7 @@ class RowIterator implements IteratorInterface
* *
* @return void * @return void
*/ */
public function end() public function end() : void
{ {
// do nothing // do nothing
} }

View File

@ -10,7 +10,7 @@ use Box\Spout\Reader\IteratorInterface;
*/ */
class SheetIterator implements IteratorInterface class SheetIterator implements IteratorInterface
{ {
/** @var \Box\Spout\Reader\CSV\Sheet The CSV unique "sheet" */ /** @var Sheet The CSV unique "sheet" */
protected $sheet; protected $sheet;
/** @var bool Whether the unique "sheet" has already been read */ /** @var bool Whether the unique "sheet" has already been read */
@ -30,7 +30,7 @@ class SheetIterator implements IteratorInterface
* *
* @return void * @return void
*/ */
public function rewind() public function rewind() : void
{ {
$this->hasReadUniqueSheet = false; $this->hasReadUniqueSheet = false;
} }
@ -41,7 +41,7 @@ class SheetIterator implements IteratorInterface
* *
* @return bool * @return bool
*/ */
public function valid() public function valid() : bool
{ {
return (!$this->hasReadUniqueSheet); return (!$this->hasReadUniqueSheet);
} }
@ -52,7 +52,7 @@ class SheetIterator implements IteratorInterface
* *
* @return void * @return void
*/ */
public function next() public function next() : void
{ {
$this->hasReadUniqueSheet = true; $this->hasReadUniqueSheet = true;
} }
@ -61,9 +61,9 @@ class SheetIterator implements IteratorInterface
* Return the current element * Return the current element
* @see http://php.net/manual/en/iterator.current.php * @see http://php.net/manual/en/iterator.current.php
* *
* @return \Box\Spout\Reader\CSV\Sheet * @return Sheet
*/ */
public function current() public function current() : Sheet
{ {
return $this->sheet; return $this->sheet;
} }
@ -74,7 +74,7 @@ class SheetIterator implements IteratorInterface
* *
* @return int * @return int
*/ */
public function key() public function key() : int
{ {
return 1; return 1;
} }
@ -84,7 +84,7 @@ class SheetIterator implements IteratorInterface
* *
* @return void * @return void
*/ */
public function end() public function end() : void
{ {
// do nothing // do nothing
} }

View File

@ -45,7 +45,7 @@ class ReaderFactory
/** /**
* This creates an instance of the appropriate reader, given the type of the file to be read * This creates an instance of the appropriate reader, given the type of the file to be read
* *
* @param string $readerType Type of the reader to instantiate * @param string $readerType Type of the reader to instantiate
* @throws \Box\Spout\Common\Exception\UnsupportedTypeException * @throws \Box\Spout\Common\Exception\UnsupportedTypeException
* @return ReaderInterface * @return ReaderInterface
*/ */

View File

@ -105,7 +105,7 @@ class InternalEntityFactory implements InternalEntityFactoryInterface
} }
/** /**
* @param $xmlReader * @param XMLReader $xmlReader
* @return XMLProcessor * @return XMLProcessor
*/ */
private function createXMLProcessor($xmlReader) private function createXMLProcessor($xmlReader)

View File

@ -64,7 +64,7 @@ class CellValueFormatter
* Returns the (unescaped) correctly marshalled, cell value associated to the given XML node. * Returns the (unescaped) correctly marshalled, cell value associated to the given XML node.
* @see http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#refTable13 * @see http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#refTable13
* *
* @param \DOMNode $node * @param \DOMElement $node
* @throws InvalidValueException If the node value is not valid * @throws InvalidValueException If the node value is not valid
* @return string|int|float|bool|\DateTime|\DateInterval The value associated with the cell, empty string if cell's type is void/undefined * @return string|int|float|bool|\DateTime|\DateInterval The value associated with the cell, empty string if cell's type is void/undefined
*/ */
@ -96,7 +96,7 @@ class CellValueFormatter
/** /**
* Returns the cell String value. * Returns the cell String value.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return string The value associated with the cell * @return string The value associated with the cell
*/ */
protected function formatStringCellValue($node) protected function formatStringCellValue($node)
@ -115,7 +115,7 @@ class CellValueFormatter
} }
/** /**
* @param $pNode * @param \DOMNode $pNode
* @return string * @return string
*/ */
private function extractTextValueFromNode($pNode) private function extractTextValueFromNode($pNode)
@ -159,7 +159,7 @@ class CellValueFormatter
* *
* @see https://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#__RefHeading__1415200_253892949 * @see https://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#__RefHeading__1415200_253892949
* *
* @param \DOMNode $node The XML node representing a whitespace * @param \DOMElement $node The XML node representing a whitespace
* @return string The corresponding whitespace value * @return string The corresponding whitespace value
*/ */
private function transformWhitespaceNode($node) private function transformWhitespaceNode($node)
@ -173,7 +173,7 @@ class CellValueFormatter
/** /**
* Returns the cell Numeric value from the given node. * Returns the cell Numeric value from the given node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return int|float The value associated with the cell * @return int|float The value associated with the cell
*/ */
protected function formatFloatCellValue($node) protected function formatFloatCellValue($node)
@ -190,7 +190,7 @@ class CellValueFormatter
/** /**
* Returns the cell Boolean value from the given node. * Returns the cell Boolean value from the given node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return bool The value associated with the cell * @return bool The value associated with the cell
*/ */
protected function formatBooleanCellValue($node) protected function formatBooleanCellValue($node)
@ -203,7 +203,7 @@ class CellValueFormatter
/** /**
* Returns the cell Date value from the given node. * Returns the cell Date value from the given node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @throws InvalidValueException If the value is not a valid date * @throws InvalidValueException If the value is not a valid date
* @return \DateTime|string The value associated with the cell * @return \DateTime|string The value associated with the cell
*/ */
@ -234,7 +234,7 @@ class CellValueFormatter
/** /**
* Returns the cell Time value from the given node. * Returns the cell Time value from the given node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @throws InvalidValueException If the value is not a valid time * @throws InvalidValueException If the value is not a valid time
* @return \DateInterval|string The value associated with the cell * @return \DateInterval|string The value associated with the cell
*/ */
@ -265,7 +265,7 @@ class CellValueFormatter
/** /**
* Returns the cell Currency value from the given node. * Returns the cell Currency value from the given node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return string The value associated with the cell (e.g. "100 USD" or "9.99 EUR") * @return string The value associated with the cell (e.g. "100 USD" or "9.99 EUR")
*/ */
protected function formatCurrencyCellValue($node) protected function formatCurrencyCellValue($node)
@ -279,7 +279,7 @@ class CellValueFormatter
/** /**
* Returns the cell Percentage value from the given node. * Returns the cell Percentage value from the given node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return int|float The value associated with the cell * @return int|float The value associated with the cell
*/ */
protected function formatPercentageCellValue($node) protected function formatPercentageCellValue($node)

View File

@ -69,7 +69,7 @@ class Reader extends ReaderAbstract
*/ */
protected function closeReader() protected function closeReader()
{ {
if ($this->zip) { if ($this->zip !== null) {
$this->zip->close(); $this->zip->close();
} }
} }

View File

@ -56,7 +56,7 @@ class RowIterator implements IteratorInterface
/** @var Row The currently processed row */ /** @var Row The currently processed row */
protected $currentlyProcessedRow; protected $currentlyProcessedRow;
/** @var Row Buffer used to store the current row, while checking if there are more rows to read */ /** @var Row|null Buffer used to store the current row, while checking if there are more rows to read */
protected $rowBuffer; protected $rowBuffer;
/** @var bool Indicates whether all rows have been read */ /** @var bool Indicates whether all rows have been read */
@ -68,7 +68,7 @@ class RowIterator implements IteratorInterface
/** @var int Row index to be processed next (one-based) */ /** @var int Row index to be processed next (one-based) */
protected $nextRowIndexToBeProcessed = 1; protected $nextRowIndexToBeProcessed = 1;
/** @var Cell Last processed cell (because when reading cell at column N+1, cell N is processed) */ /** @var Cell|null Last processed cell (because when reading cell at column N+1, cell N is processed) */
protected $lastProcessedCell; protected $lastProcessedCell;
/** @var int Number of times the last processed row should be repeated */ /** @var int Number of times the last processed row should be repeated */
@ -118,7 +118,7 @@ class RowIterator implements IteratorInterface
* @throws \Box\Spout\Reader\Exception\IteratorNotRewindableException If the iterator is rewound more than once * @throws \Box\Spout\Reader\Exception\IteratorNotRewindableException If the iterator is rewound more than once
* @return void * @return void
*/ */
public function rewind() public function rewind() : void
{ {
// Because sheet and row data is located in the file, we can't rewind both the // Because sheet and row data is located in the file, we can't rewind both the
// sheet iterator and the row iterator, as XML file cannot be read backwards. // sheet iterator and the row iterator, as XML file cannot be read backwards.
@ -142,7 +142,7 @@ class RowIterator implements IteratorInterface
* *
* @return bool * @return bool
*/ */
public function valid() public function valid() : bool
{ {
return (!$this->hasReachedEndOfFile); return (!$this->hasReachedEndOfFile);
} }
@ -155,7 +155,7 @@ class RowIterator implements IteratorInterface
* @throws \Box\Spout\Common\Exception\IOException If unable to read the sheet data XML * @throws \Box\Spout\Common\Exception\IOException If unable to read the sheet data XML
* @return void * @return void
*/ */
public function next() public function next() : void
{ {
if ($this->doesNeedDataForNextRowToBeProcessed()) { if ($this->doesNeedDataForNextRowToBeProcessed()) {
$this->readDataForNextRow(); $this->readDataForNextRow();
@ -225,6 +225,7 @@ class RowIterator implements IteratorInterface
$currentNumColumnsRepeated = $this->getNumColumnsRepeatedForCurrentNode($xmlReader); $currentNumColumnsRepeated = $this->getNumColumnsRepeatedForCurrentNode($xmlReader);
// NOTE: expand() will automatically decode all XML entities of the child nodes // NOTE: expand() will automatically decode all XML entities of the child nodes
/** @var \DOMElement $node */
$node = $xmlReader->expand(); $node = $xmlReader->expand();
$currentCell = $this->getCell($node); $currentCell = $this->getCell($node);
@ -316,7 +317,7 @@ class RowIterator implements IteratorInterface
/** /**
* Returns the cell with (unescaped) correctly marshalled, cell value associated to the given XML node. * Returns the cell with (unescaped) correctly marshalled, cell value associated to the given XML node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return Cell The cell set with the associated with the cell * @return Cell The cell set with the associated with the cell
*/ */
protected function getCell($node) protected function getCell($node)
@ -339,7 +340,7 @@ class RowIterator implements IteratorInterface
* row data yet (as we still need to apply the "num-columns-repeated" attribute). * row data yet (as we still need to apply the "num-columns-repeated" attribute).
* *
* @param Row $currentRow * @param Row $currentRow
* @param Cell $lastReadCell The last read cell * @param Cell|null $lastReadCell The last read cell
* @return bool Whether the row is empty * @return bool Whether the row is empty
*/ */
protected function isEmptyRow($currentRow, $lastReadCell) protected function isEmptyRow($currentRow, $lastReadCell)
@ -356,7 +357,7 @@ class RowIterator implements IteratorInterface
* *
* @return Row * @return Row
*/ */
public function current() public function current() : Row
{ {
return $this->rowBuffer; return $this->rowBuffer;
} }
@ -367,7 +368,7 @@ class RowIterator implements IteratorInterface
* *
* @return int * @return int
*/ */
public function key() public function key() : int
{ {
return $this->lastRowIndexProcessed; return $this->lastRowIndexProcessed;
} }
@ -377,7 +378,7 @@ class RowIterator implements IteratorInterface
* *
* @return void * @return void
*/ */
public function end() public function end() : void
{ {
$this->xmlReader->close(); $this->xmlReader->close();
} }

View File

@ -108,6 +108,7 @@ class SheetIterator implements IteratorInterface
$sheetsVisibility = []; $sheetsVisibility = [];
$this->xmlReader->readUntilNodeFound(self::XML_NODE_AUTOMATIC_STYLES); $this->xmlReader->readUntilNodeFound(self::XML_NODE_AUTOMATIC_STYLES);
/** @var \DOMElement $automaticStylesNode */
$automaticStylesNode = $this->xmlReader->expand(); $automaticStylesNode = $this->xmlReader->expand();
$tableStyleNodes = $automaticStylesNode->getElementsByTagNameNS(self::XML_STYLE_NAMESPACE, self::XML_NODE_STYLE_TABLE_PROPERTIES); $tableStyleNodes = $automaticStylesNode->getElementsByTagNameNS(self::XML_STYLE_NAMESPACE, self::XML_NODE_STYLE_TABLE_PROPERTIES);

View File

@ -53,7 +53,7 @@ abstract class ReaderAbstract implements ReaderInterface
/** /**
* Closes the reader. To be used after reading the file. * Closes the reader. To be used after reading the file.
* *
* @return ReaderAbstract * @return void
*/ */
abstract protected function closeReader(); abstract protected function closeReader();
@ -233,7 +233,7 @@ abstract class ReaderAbstract implements ReaderInterface
$this->closeReader(); $this->closeReader();
$sheetIterator = $this->getConcreteSheetIterator(); $sheetIterator = $this->getConcreteSheetIterator();
if ($sheetIterator) { if ($sheetIterator !== null) {
$sheetIterator->end(); $sheetIterator->end();
} }

View File

@ -152,7 +152,7 @@ class InternalEntityFactory implements InternalEntityFactoryInterface
} }
/** /**
* @param $xmlReader * @param XMLReader $xmlReader
* @return XMLProcessor * @return XMLProcessor
*/ */
public function createXMLProcessor($xmlReader) public function createXMLProcessor($xmlReader)

View File

@ -21,7 +21,7 @@ class ManagerFactory
/** @var CachingStrategyFactory */ /** @var CachingStrategyFactory */
private $cachingStrategyFactory; private $cachingStrategyFactory;
/** @var WorkbookRelationshipsManager */ /** @var WorkbookRelationshipsManager|null */
private $cachedWorkbookRelationshipsManager; private $cachedWorkbookRelationshipsManager;
/** /**

View File

@ -66,7 +66,7 @@ class CellValueFormatter
/** /**
* Returns the (unescaped) correctly marshalled, cell value associated to the given XML node. * Returns the (unescaped) correctly marshalled, cell value associated to the given XML node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @throws InvalidValueException If the value is not valid * @throws InvalidValueException If the value is not valid
* @return string|int|float|bool|\DateTime The value associated with the cell * @return string|int|float|bool|\DateTime The value associated with the cell
*/ */
@ -102,7 +102,7 @@ class CellValueFormatter
/** /**
* Returns the cell's string value from a node's nested value node * Returns the cell's string value from a node's nested value node
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return string The value associated with the cell * @return string The value associated with the cell
*/ */
protected function getVNodeValue($node) protected function getVNodeValue($node)
@ -117,7 +117,7 @@ class CellValueFormatter
/** /**
* Returns the cell String value where string is inline. * Returns the cell String value where string is inline.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return string The value associated with the cell * @return string The value associated with the cell
*/ */
protected function formatInlineStringCellValue($node) protected function formatInlineStringCellValue($node)

View File

@ -84,7 +84,7 @@ class CachingStrategyFactory
$memoryAvailable = $this->getMemoryLimitInKB(); $memoryAvailable = $this->getMemoryLimitInKB();
if ($memoryAvailable === -1) { if ((int) $memoryAvailable === -1) {
// if cannot get memory limit or if memory limit set as unlimited, don't trust and play safe // if cannot get memory limit or if memory limit set as unlimited, don't trust and play safe
$isInMemoryStrategyUsageSafe = ($sharedStringsUniqueCount < self::MAX_NUM_STRINGS_PER_TEMP_FILE); $isInMemoryStrategyUsageSafe = ($sharedStringsUniqueCount < self::MAX_NUM_STRINGS_PER_TEMP_FILE);
} else { } else {

View File

@ -32,7 +32,7 @@ class FileBasedStrategy implements CachingStrategyInterface
*/ */
protected $maxNumStringsPerTempFile; protected $maxNumStringsPerTempFile;
/** @var resource Pointer to the last temp file a shared string was written to */ /** @var resource|null Pointer to the last temp file a shared string was written to */
protected $tempFilePointer; protected $tempFilePointer;
/** /**

View File

@ -179,6 +179,7 @@ class SharedStringsManager
$sharedStringValue = ''; $sharedStringValue = '';
// NOTE: expand() will automatically decode all XML entities of the child nodes // NOTE: expand() will automatically decode all XML entities of the child nodes
/** @var \DOMElement $siNode */
$siNode = $xmlReader->expand(); $siNode = $xmlReader->expand();
$textNodes = $siNode->getElementsByTagName(self::XML_NODE_T); $textNodes = $siNode->getElementsByTagName(self::XML_NODE_T);
@ -241,7 +242,7 @@ class SharedStringsManager
*/ */
public function cleanup() public function cleanup()
{ {
if ($this->cachingStrategy) { if ($this->cachingStrategy !== null) {
$this->cachingStrategy->clearCache(); $this->cachingStrategy->clearCache();
} }
} }

View File

@ -60,10 +60,10 @@ class StyleManager
/** @var array Array containing the IDs of built-in number formats indicating a date */ /** @var array Array containing the IDs of built-in number formats indicating a date */
protected $builtinNumFmtIdIndicatingDates; protected $builtinNumFmtIdIndicatingDates;
/** @var array Array containing a mapping NUM_FMT_ID => FORMAT_CODE */ /** @var array|null Array containing a mapping NUM_FMT_ID => FORMAT_CODE */
protected $customNumberFormats; protected $customNumberFormats;
/** @var array Array containing a mapping STYLE_ID => [STYLE_ATTRIBUTES] */ /** @var array|null Array containing a mapping STYLE_ID => [STYLE_ATTRIBUTES] */
protected $stylesAttributes; protected $stylesAttributes;
/** @var array Cache containing a mapping NUM_FMT_ID => IS_DATE_FORMAT. Used to avoid lots of recalculations */ /** @var array Cache containing a mapping NUM_FMT_ID => IS_DATE_FORMAT. Used to avoid lots of recalculations */

View File

@ -34,7 +34,7 @@ class WorkbookRelationshipsManager
/** @var InternalEntityFactory Factory to create entities */ /** @var InternalEntityFactory Factory to create entities */
private $entityFactory; private $entityFactory;
/** @var array Cache of the already read workbook relationships: [TYPE] => [FILE_NAME] */ /** @var array|null Cache of the already read workbook relationships: [TYPE] => [FILE_NAME] */
private $cachedWorkbookRelationships; private $cachedWorkbookRelationships;
/** /**

View File

@ -119,11 +119,11 @@ class Reader extends ReaderAbstract
*/ */
protected function closeReader() protected function closeReader()
{ {
if ($this->zip) { if ($this->zip !== null) {
$this->zip->close(); $this->zip->close();
} }
if ($this->sharedStringsManager) { if ($this->sharedStringsManager !== null) {
$this->sharedStringsManager->cleanup(); $this->sharedStringsManager->cleanup();
} }
} }

View File

@ -139,7 +139,7 @@ class RowIterator implements IteratorInterface
* @throws \Box\Spout\Common\Exception\IOException If the sheet data XML cannot be read * @throws \Box\Spout\Common\Exception\IOException If the sheet data XML cannot be read
* @return void * @return void
*/ */
public function rewind() public function rewind() : void
{ {
$this->xmlReader->close(); $this->xmlReader->close();
@ -163,7 +163,7 @@ class RowIterator implements IteratorInterface
* *
* @return bool * @return bool
*/ */
public function valid() public function valid() : bool
{ {
return (!$this->hasReachedEndOfFile); return (!$this->hasReachedEndOfFile);
} }
@ -176,7 +176,7 @@ class RowIterator implements IteratorInterface
* @throws \Box\Spout\Common\Exception\IOException If unable to read the sheet data XML * @throws \Box\Spout\Common\Exception\IOException If unable to read the sheet data XML
* @return void * @return void
*/ */
public function next() public function next() : void
{ {
$this->nextRowIndexToBeProcessed++; $this->nextRowIndexToBeProcessed++;
@ -276,6 +276,7 @@ class RowIterator implements IteratorInterface
$currentColumnIndex = $this->getColumnIndex($xmlReader); $currentColumnIndex = $this->getColumnIndex($xmlReader);
// NOTE: expand() will automatically decode all XML entities of the child nodes // NOTE: expand() will automatically decode all XML entities of the child nodes
/** @var \DOMElement $node */
$node = $xmlReader->expand(); $node = $xmlReader->expand();
$cell = $this->getCell($node); $cell = $this->getCell($node);
@ -352,7 +353,7 @@ class RowIterator implements IteratorInterface
/** /**
* Returns the cell with (unescaped) correctly marshalled, cell value associated to the given XML node. * Returns the cell with (unescaped) correctly marshalled, cell value associated to the given XML node.
* *
* @param \DOMNode $node * @param \DOMElement $node
* @return Cell The cell set with the associated with the cell * @return Cell The cell set with the associated with the cell
*/ */
protected function getCell($node) protected function getCell($node)
@ -374,7 +375,7 @@ class RowIterator implements IteratorInterface
* *
* @return Row|null * @return Row|null
*/ */
public function current() public function current() : ?Row
{ {
$rowToBeProcessed = $this->rowBuffer; $rowToBeProcessed = $this->rowBuffer;
@ -399,7 +400,7 @@ class RowIterator implements IteratorInterface
* *
* @return int * @return int
*/ */
public function key() public function key() : int
{ {
// TODO: This should return $this->nextRowIndexToBeProcessed // TODO: This should return $this->nextRowIndexToBeProcessed
// but to avoid a breaking change, the return value for // but to avoid a breaking change, the return value for
@ -414,7 +415,7 @@ class RowIterator implements IteratorInterface
* *
* @return void * @return void
*/ */
public function end() public function end() : void
{ {
$this->xmlReader->close(); $this->xmlReader->close();
} }

View File

@ -11,7 +11,7 @@ class Worksheet
/** @var string Path to the XML file that will contain the sheet data */ /** @var string Path to the XML file that will contain the sheet data */
private $filePath; private $filePath;
/** @var resource Pointer to the sheet data file (e.g. xl/worksheets/sheet1.xml) */ /** @var resource|null Pointer to the sheet data file (e.g. xl/worksheets/sheet1.xml) */
private $filePointer; private $filePointer;
/** @var Sheet The "external" sheet */ /** @var Sheet The "external" sheet */

View File

@ -88,10 +88,10 @@ class StyleMerger
if (!$style->hasSetCellAlignment() && $baseStyle->shouldApplyCellAlignment()) { if (!$style->hasSetCellAlignment() && $baseStyle->shouldApplyCellAlignment()) {
$styleToUpdate->setCellAlignment($baseStyle->getCellAlignment()); $styleToUpdate->setCellAlignment($baseStyle->getCellAlignment());
} }
if (!$style->getBorder() && $baseStyle->shouldApplyBorder()) { if ($style->getBorder() === null && $baseStyle->shouldApplyBorder()) {
$styleToUpdate->setBorder($baseStyle->getBorder()); $styleToUpdate->setBorder($baseStyle->getBorder());
} }
if (!$style->getFormat() && $baseStyle->shouldApplyFormat()) { if ($style->getFormat() === null && $baseStyle->shouldApplyFormat()) {
$styleToUpdate->setFormat($baseStyle->getFormat()); $styleToUpdate->setFormat($baseStyle->getFormat());
} }
if (!$style->shouldApplyBackgroundColor() && $baseStyle->shouldApplyBackgroundColor()) { if (!$style->shouldApplyBackgroundColor() && $baseStyle->shouldApplyBackgroundColor()) {

View File

@ -23,7 +23,7 @@ use Box\Spout\Writer\Exception\WriterException;
*/ */
abstract class WorkbookManagerAbstract implements WorkbookManagerInterface abstract class WorkbookManagerAbstract implements WorkbookManagerInterface
{ {
/** @var Workbook The workbook to manage */ /** @var Workbook|null The workbook to manage */
protected $workbook; protected $workbook;
/** @var OptionsManagerInterface */ /** @var OptionsManagerInterface */
@ -92,7 +92,7 @@ abstract class WorkbookManagerAbstract implements WorkbookManagerInterface
abstract protected function getWorksheetFilePath(Sheet $sheet); abstract protected function getWorksheetFilePath(Sheet $sheet);
/** /**
* @return Workbook * @return Workbook|null
*/ */
public function getWorkbook() public function getWorkbook()
{ {

View File

@ -17,7 +17,7 @@ use Box\Spout\Writer\Exception\WriterException;
interface WorkbookManagerInterface interface WorkbookManagerInterface
{ {
/** /**
* @return Workbook * @return Workbook|null
*/ */
public function getWorkbook(); public function getWorkbook();

View File

@ -30,7 +30,7 @@ class HelperFactory extends \Box\Spout\Common\Creator\HelperFactory
} }
/** /**
* @param $entityFactory * @param InternalEntityFactory $entityFactory
* @return ZipHelper * @return ZipHelper
*/ */
private function createZipHelper($entityFactory) private function createZipHelper($entityFactory)

View File

@ -86,7 +86,7 @@ class WorksheetManager implements WorksheetManagerInterface
* Returns the table XML root node as string. * Returns the table XML root node as string.
* *
* @param Worksheet $worksheet * @param Worksheet $worksheet
* @return string <table> node as string * @return string "<table>" node as string
*/ */
public function getTableElementStartAsString(Worksheet $worksheet) public function getTableElementStartAsString(Worksheet $worksheet)
{ {

View File

@ -169,7 +169,7 @@ abstract class WriterAbstract implements WriterInterface
*/ */
protected function throwIfFilePointerIsNotAvailable() protected function throwIfFilePointerIsNotAvailable()
{ {
if (!$this->filePointer) { if (!is_resource($this->filePointer)) {
throw new IOException('File pointer has not be opened'); throw new IOException('File pointer has not be opened');
} }
} }

View File

@ -9,7 +9,6 @@ use Box\Spout\Common\Manager\OptionsManagerInterface;
use Box\Spout\Writer\Common\Creator\ManagerFactoryInterface; use Box\Spout\Writer\Common\Creator\ManagerFactoryInterface;
use Box\Spout\Writer\Common\Entity\Options; use Box\Spout\Writer\Common\Entity\Options;
use Box\Spout\Writer\Common\Entity\Sheet; use Box\Spout\Writer\Common\Entity\Sheet;
use Box\Spout\Writer\Common\Entity\Worksheet;
use Box\Spout\Writer\Common\Manager\WorkbookManagerInterface; use Box\Spout\Writer\Common\Manager\WorkbookManagerInterface;
use Box\Spout\Writer\Exception\SheetNotFoundException; use Box\Spout\Writer\Exception\SheetNotFoundException;
use Box\Spout\Writer\Exception\WriterAlreadyOpenedException; use Box\Spout\Writer\Exception\WriterAlreadyOpenedException;
@ -25,7 +24,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
/** @var ManagerFactoryInterface */ /** @var ManagerFactoryInterface */
private $managerFactory; private $managerFactory;
/** @var WorkbookManagerInterface */ /** @var WorkbookManagerInterface|null */
private $workbookManager; private $workbookManager;
/** /**
@ -66,7 +65,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
*/ */
protected function openWriter() protected function openWriter()
{ {
if (!$this->workbookManager) { if ($this->workbookManager === null) {
$this->workbookManager = $this->managerFactory->createWorkbookManager($this->optionsManager); $this->workbookManager = $this->managerFactory->createWorkbookManager($this->optionsManager);
$this->workbookManager->addNewSheetAndMakeItCurrent(); $this->workbookManager->addNewSheetAndMakeItCurrent();
} }
@ -85,7 +84,6 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
$externalSheets = []; $externalSheets = [];
$worksheets = $this->workbookManager->getWorksheets(); $worksheets = $this->workbookManager->getWorksheets();
/** @var Worksheet $worksheet */
foreach ($worksheets as $worksheet) { foreach ($worksheets as $worksheet) {
$externalSheets[] = $worksheet->getExternalSheet(); $externalSheets[] = $worksheet->getExternalSheet();
} }
@ -143,7 +141,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
*/ */
protected function throwIfWorkbookIsNotAvailable() protected function throwIfWorkbookIsNotAvailable()
{ {
if (!$this->workbookManager->getWorkbook()) { if ($this->workbookManager->getWorkbook() === null) {
throw new WriterNotOpenedException('The writer must be opened before performing this action.'); throw new WriterNotOpenedException('The writer must be opened before performing this action.');
} }
} }
@ -162,7 +160,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
*/ */
protected function closeWriter() protected function closeWriter()
{ {
if ($this->workbookManager) { if ($this->workbookManager !== null) {
$this->workbookManager->close($this->filePointer); $this->workbookManager->close($this->filePointer);
} }
} }

View File

@ -91,8 +91,7 @@ class ManagerFactory implements ManagerFactoryInterface
$styleMerger, $styleMerger,
$sharedStringsManager, $sharedStringsManager,
$stringsEscaper, $stringsEscaper,
$stringsHelper, $stringsHelper
$this->entityFactory
); );
} }

View File

@ -59,7 +59,7 @@ EOD;
*/ */
protected function throwIfSharedStringsFilePointerIsNotAvailable() protected function throwIfSharedStringsFilePointerIsNotAvailable()
{ {
if (!$this->sharedStringsFilePointer) { if (!is_resource($this->sharedStringsFilePointer)) {
throw new IOException('Unable to open shared strings file for writing.'); throw new IOException('Unable to open shared strings file for writing.');
} }
} }

View File

@ -2,6 +2,7 @@
namespace Box\Spout\Writer\XLSX\Manager\Style; namespace Box\Spout\Writer\XLSX\Manager\Style;
use Box\Spout\Common\Entity\Style\BorderPart;
use Box\Spout\Common\Entity\Style\Color; use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Common\Entity\Style\Style; use Box\Spout\Common\Entity\Style\Style;
use Box\Spout\Writer\XLSX\Helper\BorderHelper; use Box\Spout\Writer\XLSX\Helper\BorderHelper;
@ -186,7 +187,7 @@ EOD;
$content .= '<border><left/><right/><top/><bottom/></border>'; $content .= '<border><left/><right/><top/><bottom/></border>';
foreach ($registeredBorders as $styleId) { foreach ($registeredBorders as $styleId) {
/** @var \Box\Spout\Common\Entity\Style\Style $style */ /** @var Style $style */
$style = $this->styleRegistry->getStyleFromStyleId($styleId); $style = $this->styleRegistry->getStyleFromStyleId($styleId);
$border = $style->getBorder(); $border = $style->getBorder();
$content .= '<border>'; $content .= '<border>';
@ -196,7 +197,7 @@ EOD;
foreach ($sortOrder as $partName) { foreach ($sortOrder as $partName) {
if ($border->hasPart($partName)) { if ($border->hasPart($partName)) {
/** @var $part \Box\Spout\Common\Entity\Style\BorderPart */ /** @var BorderPart $part */
$part = $border->getPart($partName); $part = $border->getPart($partName);
$content .= BorderHelper::serializeBorderPart($part); $content .= BorderHelper::serializeBorderPart($part);
} }

View File

@ -10,7 +10,6 @@ use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Helper\Escaper\XLSX as XLSXEscaper; use Box\Spout\Common\Helper\Escaper\XLSX as XLSXEscaper;
use Box\Spout\Common\Helper\StringHelper; use Box\Spout\Common\Helper\StringHelper;
use Box\Spout\Common\Manager\OptionsManagerInterface; use Box\Spout\Common\Manager\OptionsManagerInterface;
use Box\Spout\Writer\Common\Creator\InternalEntityFactory;
use Box\Spout\Writer\Common\Entity\Options; use Box\Spout\Writer\Common\Entity\Options;
use Box\Spout\Writer\Common\Entity\Worksheet; use Box\Spout\Writer\Common\Entity\Worksheet;
use Box\Spout\Writer\Common\Helper\CellHelper; use Box\Spout\Writer\Common\Helper\CellHelper;
@ -60,9 +59,6 @@ EOD;
/** @var StringHelper String helper */ /** @var StringHelper String helper */
private $stringHelper; private $stringHelper;
/** @var InternalEntityFactory Factory to create entities */
private $entityFactory;
/** /**
* WorksheetManager constructor. * WorksheetManager constructor.
* *
@ -73,7 +69,6 @@ EOD;
* @param SharedStringsManager $sharedStringsManager * @param SharedStringsManager $sharedStringsManager
* @param XLSXEscaper $stringsEscaper * @param XLSXEscaper $stringsEscaper
* @param StringHelper $stringHelper * @param StringHelper $stringHelper
* @param InternalEntityFactory $entityFactory
*/ */
public function __construct( public function __construct(
OptionsManagerInterface $optionsManager, OptionsManagerInterface $optionsManager,
@ -82,8 +77,7 @@ EOD;
StyleMerger $styleMerger, StyleMerger $styleMerger,
SharedStringsManager $sharedStringsManager, SharedStringsManager $sharedStringsManager,
XLSXEscaper $stringsEscaper, XLSXEscaper $stringsEscaper,
StringHelper $stringHelper, StringHelper $stringHelper
InternalEntityFactory $entityFactory
) { ) {
$this->shouldUseInlineStrings = $optionsManager->getOption(Options::SHOULD_USE_INLINE_STRINGS); $this->shouldUseInlineStrings = $optionsManager->getOption(Options::SHOULD_USE_INLINE_STRINGS);
$this->rowManager = $rowManager; $this->rowManager = $rowManager;
@ -92,7 +86,6 @@ EOD;
$this->sharedStringsManager = $sharedStringsManager; $this->sharedStringsManager = $sharedStringsManager;
$this->stringsEscaper = $stringsEscaper; $this->stringsEscaper = $stringsEscaper;
$this->stringHelper = $stringHelper; $this->stringHelper = $stringHelper;
$this->entityFactory = $entityFactory;
} }
/** /**

View File

@ -7,7 +7,7 @@ use Box\Spout\Common\Entity\Style\Style;
class RowTest extends \PHPUnit\Framework\TestCase class RowTest extends \PHPUnit\Framework\TestCase
{ {
/** /**
* @return \PHPUnit_Framework_MockObject_MockObject|Style * @return \PHPUnit\Framework\MockObject\MockObject|Style
*/ */
private function getStyleMock() private function getStyleMock()
{ {
@ -15,7 +15,7 @@ class RowTest extends \PHPUnit\Framework\TestCase
} }
/** /**
* @return \PHPUnit_Framework_MockObject_MockObject|Cell * @return \PHPUnit\Framework\MockObject\MockObject|Cell
*/ */
private function getCellMock() private function getCellMock()
{ {

View File

@ -113,7 +113,7 @@ class BorderTest extends TestCase
$border->addPart($borderPart); $border->addPart($borderPart);
$this->assertCount(1, $border->getParts()); $this->assertCount(1, $border->getParts());
/** @var $part BorderPart */ /** @var BorderPart $part */
$part = $border->getParts()[$allowedName]; $part = $border->getParts()[$allowedName];
$this->assertEquals($allowedStyle, $part->getStyle()); $this->assertEquals($allowedStyle, $part->getStyle());

View File

@ -68,15 +68,15 @@ class EncodingHelperTest extends TestCase
$this->expectException(EncodingConversionException::class); $this->expectException(EncodingConversionException::class);
$helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper') $helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper')
->setMethods(['iconv', 'mb_convert_encoding']) ->onlyMethods(['iconv', 'mb_convert_encoding'])
->getMock(); ->getMock();
$helperStub->method('iconv')->willReturn(false); $helperStub->method('iconv')->willReturn(false);
$helperStub->method('mb_convert_encoding')->willReturn(false); $helperStub->method('mb_convert_encoding')->willReturn(false);
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->setConstructorArgs([$helperStub]) ->setConstructorArgs([$helperStub])
->setMethods(['canUseIconv', 'canUseMbString']) ->onlyMethods(['canUseIconv', 'canUseMbString'])
->getMock(); ->getMock();
$encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv); $encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv);
$encodingHelperStub->method('canUseMbString')->willReturn(true); $encodingHelperStub->method('canUseMbString')->willReturn(true);
@ -91,10 +91,10 @@ class EncodingHelperTest extends TestCase
{ {
$this->expectException(EncodingConversionException::class); $this->expectException(EncodingConversionException::class);
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['canUseIconv', 'canUseMbString']) ->onlyMethods(['canUseIconv', 'canUseMbString'])
->getMock(); ->getMock();
$encodingHelperStub->method('canUseIconv')->willReturn(false); $encodingHelperStub->method('canUseIconv')->willReturn(false);
$encodingHelperStub->method('canUseMbString')->willReturn(false); $encodingHelperStub->method('canUseMbString')->willReturn(false);
@ -110,10 +110,10 @@ class EncodingHelperTest extends TestCase
*/ */
public function testAttemptConversionToUTF8ShouldReturnReencodedString($shouldUseIconv) public function testAttemptConversionToUTF8ShouldReturnReencodedString($shouldUseIconv)
{ {
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->setConstructorArgs([new GlobalFunctionsHelper()]) ->setConstructorArgs([new GlobalFunctionsHelper()])
->setMethods(['canUseIconv', 'canUseMbString']) ->onlyMethods(['canUseIconv', 'canUseMbString'])
->getMock(); ->getMock();
$encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv); $encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv);
$encodingHelperStub->method('canUseMbString')->willReturn(true); $encodingHelperStub->method('canUseMbString')->willReturn(true);
@ -129,10 +129,10 @@ class EncodingHelperTest extends TestCase
*/ */
public function testAttemptConversionToUTF8ShouldBeNoopWhenTargetIsUTF8() public function testAttemptConversionToUTF8ShouldBeNoopWhenTargetIsUTF8()
{ {
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['canUseIconv']) ->onlyMethods(['canUseIconv'])
->getMock(); ->getMock();
$encodingHelperStub->expects($this->never())->method('canUseIconv'); $encodingHelperStub->expects($this->never())->method('canUseIconv');
@ -151,15 +151,15 @@ class EncodingHelperTest extends TestCase
$this->expectException(EncodingConversionException::class); $this->expectException(EncodingConversionException::class);
$helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper') $helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper')
->setMethods(['iconv', 'mb_convert_encoding']) ->onlyMethods(['iconv', 'mb_convert_encoding'])
->getMock(); ->getMock();
$helperStub->method('iconv')->willReturn(false); $helperStub->method('iconv')->willReturn(false);
$helperStub->method('mb_convert_encoding')->willReturn(false); $helperStub->method('mb_convert_encoding')->willReturn(false);
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->setConstructorArgs([$helperStub]) ->setConstructorArgs([$helperStub])
->setMethods(['canUseIconv', 'canUseMbString']) ->onlyMethods(['canUseIconv', 'canUseMbString'])
->getMock(); ->getMock();
$encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv); $encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv);
$encodingHelperStub->method('canUseMbString')->willReturn(true); $encodingHelperStub->method('canUseMbString')->willReturn(true);
@ -174,10 +174,10 @@ class EncodingHelperTest extends TestCase
{ {
$this->expectException(EncodingConversionException::class); $this->expectException(EncodingConversionException::class);
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['canUseIconv', 'canUseMbString']) ->onlyMethods(['canUseIconv', 'canUseMbString'])
->getMock(); ->getMock();
$encodingHelperStub->method('canUseIconv')->willReturn(false); $encodingHelperStub->method('canUseIconv')->willReturn(false);
$encodingHelperStub->method('canUseMbString')->willReturn(false); $encodingHelperStub->method('canUseMbString')->willReturn(false);
@ -193,10 +193,10 @@ class EncodingHelperTest extends TestCase
*/ */
public function testAttemptConversionFromUTF8ShouldReturnReencodedString($shouldUseIconv) public function testAttemptConversionFromUTF8ShouldReturnReencodedString($shouldUseIconv)
{ {
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->setConstructorArgs([new GlobalFunctionsHelper()]) ->setConstructorArgs([new GlobalFunctionsHelper()])
->setMethods(['canUseIconv', 'canUseMbString']) ->onlyMethods(['canUseIconv', 'canUseMbString'])
->getMock(); ->getMock();
$encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv); $encodingHelperStub->method('canUseIconv')->willReturn($shouldUseIconv);
$encodingHelperStub->method('canUseMbString')->willReturn(true); $encodingHelperStub->method('canUseMbString')->willReturn(true);
@ -212,10 +212,10 @@ class EncodingHelperTest extends TestCase
*/ */
public function testAttemptConversionFromUTF8ShouldBeNoopWhenTargetIsUTF8() public function testAttemptConversionFromUTF8ShouldBeNoopWhenTargetIsUTF8()
{ {
/** @var EncodingHelper $encodingHelperStub */ /** @var EncodingHelper|\PHPUnit\Framework\MockObject\MockObject $encodingHelperStub */
$encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper') $encodingHelperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\EncodingHelper')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['canUseIconv']) ->onlyMethods(['canUseIconv'])
->getMock(); ->getMock();
$encodingHelperStub->expects($this->never())->method('canUseIconv'); $encodingHelperStub->expects($this->never())->method('canUseIconv');

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
*/ */
class FileSystemHelperTest extends TestCase class FileSystemHelperTest extends TestCase
{ {
/** @var \Box\Spout\Writer\XLSX\Helper\FileSystemHelper */ /** @var FileSystemHelper */
protected $fileSystemHelper; protected $fileSystemHelper;
/** /**

View File

@ -47,9 +47,9 @@ class ReaderTest extends TestCase
{ {
$this->expectException(IOException::class); $this->expectException(IOException::class);
/** @var \Box\Spout\Common\Helper\GlobalFunctionsHelper|\PHPUnit_Framework_MockObject_MockObject $helperStub */ /** @var \Box\Spout\Common\Helper\GlobalFunctionsHelper|\PHPUnit\Framework\MockObject\MockObject $helperStub */
$helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper') $helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper')
->setMethods(['is_readable']) ->onlyMethods(['is_readable'])
->getMock(); ->getMock();
$helperStub->method('is_readable')->willReturn(false); $helperStub->method('is_readable')->willReturn(false);
@ -66,9 +66,9 @@ class ReaderTest extends TestCase
{ {
$this->expectException(IOException::class); $this->expectException(IOException::class);
/** @var \Box\Spout\Common\Helper\GlobalFunctionsHelper|\PHPUnit_Framework_MockObject_MockObject $helperStub */ /** @var \Box\Spout\Common\Helper\GlobalFunctionsHelper|\PHPUnit\Framework\MockObject\MockObject $helperStub */
$helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper') $helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper')
->setMethods(['fopen']) ->onlyMethods(['fopen'])
->getMock(); ->getMock();
$helperStub->method('fopen')->willReturn(false); $helperStub->method('fopen')->willReturn(false);
@ -304,9 +304,9 @@ class ReaderTest extends TestCase
$allRows = []; $allRows = [];
$resourcePath = $this->getResourcePath($fileName); $resourcePath = $this->getResourcePath($fileName);
/** @var \Box\Spout\Common\Helper\GlobalFunctionsHelper|\PHPUnit_Framework_MockObject_MockObject $helperStub */ /** @var \Box\Spout\Common\Helper\GlobalFunctionsHelper|\PHPUnit\Framework\MockObject\MockObject $helperStub */
$helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper') $helperStub = $this->getMockBuilder('\Box\Spout\Common\Helper\GlobalFunctionsHelper')
->setMethods(['function_exists']) ->onlyMethods(['function_exists'])
->getMock(); ->getMock();
$returnValueMap = [ $returnValueMap = [

View File

@ -79,7 +79,7 @@ class CellValueFormatterTest extends TestCase
->method('getAttribute') ->method('getAttribute')
->will($this->returnValueMap([ ->will($this->returnValueMap([
[CellValueFormatter::XML_ATTRIBUTE_TYPE, CellValueFormatter::CELL_TYPE_NUMERIC], [CellValueFormatter::XML_ATTRIBUTE_TYPE, CellValueFormatter::CELL_TYPE_NUMERIC],
[CellValueFormatter::XML_ATTRIBUTE_STYLE_ID, 123], [CellValueFormatter::XML_ATTRIBUTE_STYLE_ID, '123'],
])); ]));
$nodeMock $nodeMock
@ -88,7 +88,7 @@ class CellValueFormatterTest extends TestCase
->with(CellValueFormatter::XML_NODE_VALUE) ->with(CellValueFormatter::XML_NODE_VALUE)
->will($this->returnValue($nodeListMock)); ->will($this->returnValue($nodeListMock));
/** @var StyleManager|\PHPUnit_Framework_MockObject_MockObject $styleManagerMock */ /** @var StyleManager|\PHPUnit\Framework\MockObject\MockObject $styleManagerMock */
$styleManagerMock = $this->createMock(StyleManager::class); $styleManagerMock = $this->createMock(StyleManager::class);
$styleManagerMock $styleManagerMock
@ -149,7 +149,7 @@ class CellValueFormatterTest extends TestCase
*/ */
public function testFormatNumericCellValueWithNumbers($value, $expectedFormattedValue, $expectedType) public function testFormatNumericCellValueWithNumbers($value, $expectedFormattedValue, $expectedType)
{ {
/** @var StyleManager|\PHPUnit_Framework_MockObject_MockObject $styleManagerMock */ /** @var StyleManager|\PHPUnit\Framework\MockObject\MockObject $styleManagerMock */
$styleManagerMock = $this->createMock(StyleManager::class); $styleManagerMock = $this->createMock(StyleManager::class);
$styleManagerMock $styleManagerMock
->expects($this->once()) ->expects($this->once())

View File

@ -36,11 +36,11 @@ class CachingStrategyFactoryTest extends TestCase
*/ */
public function testCreateBestCachingStrategy($sharedStringsUniqueCount, $memoryLimitInKB, $expectedStrategyClassName) public function testCreateBestCachingStrategy($sharedStringsUniqueCount, $memoryLimitInKB, $expectedStrategyClassName)
{ {
/** @var CachingStrategyFactory|\PHPUnit_Framework_MockObject_MockObject $factoryStub */ /** @var CachingStrategyFactory|\PHPUnit\Framework\MockObject\MockObject $factoryStub */
$factoryStub = $this $factoryStub = $this
->getMockBuilder('\Box\Spout\Reader\XLSX\Manager\SharedStringsCaching\CachingStrategyFactory') ->getMockBuilder('\Box\Spout\Reader\XLSX\Manager\SharedStringsCaching\CachingStrategyFactory')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['getMemoryLimitInKB']) ->onlyMethods(['getMemoryLimitInKB'])
->getMock(); ->getMock();
$factoryStub->method('getMemoryLimitInKB')->willReturn($memoryLimitInKB); $factoryStub->method('getMemoryLimitInKB')->willReturn($memoryLimitInKB);
@ -84,11 +84,11 @@ class CachingStrategyFactoryTest extends TestCase
*/ */
public function testGetMemoryLimitInKB($memoryLimitFormatted, $expectedMemoryLimitInKB) public function testGetMemoryLimitInKB($memoryLimitFormatted, $expectedMemoryLimitInKB)
{ {
/** @var CachingStrategyFactory|\PHPUnit_Framework_MockObject_MockObject $factoryStub */ /** @var CachingStrategyFactory|\PHPUnit\Framework\MockObject\MockObject $factoryStub */
$factoryStub = $this $factoryStub = $this
->getMockBuilder('\Box\Spout\Reader\XLSX\Manager\SharedStringsCaching\CachingStrategyFactory') ->getMockBuilder('\Box\Spout\Reader\XLSX\Manager\SharedStringsCaching\CachingStrategyFactory')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['getMemoryLimitFromIni']) ->onlyMethods(['getMemoryLimitFromIni'])
->getMock(); ->getMock();
$factoryStub->method('getMemoryLimitFromIni')->willReturn($memoryLimitFormatted); $factoryStub->method('getMemoryLimitFromIni')->willReturn($memoryLimitFormatted);

View File

@ -19,7 +19,7 @@ class SharedStringsManagerTest extends TestCase
{ {
use TestUsingResource; use TestUsingResource;
/** @var SharedStringsManager */ /** @var SharedStringsManager|null */
private $sharedStringsManager; private $sharedStringsManager;
/** /**

View File

@ -21,10 +21,10 @@ class StyleManagerTest extends TestCase
$workbookRelationshipsManager = $this->createMock(WorkbookRelationshipsManager::class); $workbookRelationshipsManager = $this->createMock(WorkbookRelationshipsManager::class);
$workbookRelationshipsManager->method('hasStylesXMLFile')->willReturn(true); $workbookRelationshipsManager->method('hasStylesXMLFile')->willReturn(true);
/** @var StyleManager $styleManager */ /** @var StyleManager|\PHPUnit\Framework\MockObject\MockObject $styleManager */
$styleManager = $this->getMockBuilder('\Box\Spout\Reader\XLSX\Manager\StyleManager') $styleManager = $this->getMockBuilder('\Box\Spout\Reader\XLSX\Manager\StyleManager')
->setConstructorArgs(['/path/to/file.xlsx', $workbookRelationshipsManager, $entityFactory]) ->setConstructorArgs(['/path/to/file.xlsx', $workbookRelationshipsManager, $entityFactory])
->setMethods(['getCustomNumberFormats', 'getStylesAttributes']) ->onlyMethods(['getCustomNumberFormats', 'getStylesAttributes'])
->getMock(); ->getMock();
$styleManager->method('getStylesAttributes')->willReturn($styleAttributes); $styleManager->method('getStylesAttributes')->willReturn($styleAttributes);

View File

@ -95,7 +95,6 @@ class ReflectionHelper
* *
* @param object $object * @param object $object
* @param string $methodName * @param string $methodName
* @param *mixed|null $params
* *
* @return mixed|null * @return mixed|null
*/ */

View File

@ -193,7 +193,7 @@ class WriterTest extends TestCase
* @param string $fieldDelimiter * @param string $fieldDelimiter
* @param string $fieldEnclosure * @param string $fieldEnclosure
* @param bool $shouldAddBOM * @param bool $shouldAddBOM
* @return string|null * @return string
*/ */
private function writeToCsvFileAndReturnWrittenContent($allRows, $fileName, $fieldDelimiter = ',', $fieldEnclosure = '"', $shouldAddBOM = true) private function writeToCsvFileAndReturnWrittenContent($allRows, $fileName, $fieldDelimiter = ',', $fieldEnclosure = '"', $shouldAddBOM = true)
{ {

View File

@ -348,6 +348,7 @@ class WriterTest extends TestCase
$fileName = 'test_add_row_should_use_number_columns_repeated.ods'; $fileName = 'test_add_row_should_use_number_columns_repeated.ods';
$this->writeToODSFile($this->createRowsFromValues([$dataRow]), $fileName); $this->writeToODSFile($this->createRowsFromValues([$dataRow]), $fileName);
/** @var \DOMElement $sheetXmlNode */
$sheetXmlNode = $this->getSheetXmlNode($fileName, 1); $sheetXmlNode = $this->getSheetXmlNode($fileName, 1);
$tableCellNodes = $sheetXmlNode->getElementsByTagName('table-cell'); $tableCellNodes = $sheetXmlNode->getElementsByTagName('table-cell');

View File

@ -88,6 +88,7 @@ class WriterWithStyleTest extends TestCase
$this->assertCount(3, $cellStyleElements, 'There should be 3 separate cell styles, including the default one.'); $this->assertCount(3, $cellStyleElements, 'There should be 3 separate cell styles, including the default one.');
// Second font should contain data from the first created style // Second font should contain data from the first created style
/** @var \DOMElement $customFont1Element */
$customFont1Element = $cellStyleElements[1]; $customFont1Element = $cellStyleElements[1];
$this->assertFirstChildHasAttributeEquals('bold', $customFont1Element, 'text-properties', 'fo:font-weight'); $this->assertFirstChildHasAttributeEquals('bold', $customFont1Element, 'text-properties', 'fo:font-weight');
$this->assertFirstChildHasAttributeEquals('italic', $customFont1Element, 'text-properties', 'fo:font-style'); $this->assertFirstChildHasAttributeEquals('italic', $customFont1Element, 'text-properties', 'fo:font-style');
@ -95,6 +96,7 @@ class WriterWithStyleTest extends TestCase
$this->assertFirstChildHasAttributeEquals('solid', $customFont1Element, 'text-properties', 'style:text-line-through-style'); $this->assertFirstChildHasAttributeEquals('solid', $customFont1Element, 'text-properties', 'style:text-line-through-style');
// Third font should contain data from the second created style // Third font should contain data from the second created style
/** @var \DOMElement $customFont2Element */
$customFont2Element = $cellStyleElements[2]; $customFont2Element = $cellStyleElements[2];
$this->assertFirstChildHasAttributeEquals('15pt', $customFont2Element, 'text-properties', 'fo:font-size'); $this->assertFirstChildHasAttributeEquals('15pt', $customFont2Element, 'text-properties', 'fo:font-size');
$this->assertFirstChildHasAttributeEquals('#' . Color::RED, $customFont2Element, 'text-properties', 'fo:color'); $this->assertFirstChildHasAttributeEquals('#' . Color::RED, $customFont2Element, 'text-properties', 'fo:color');
@ -397,7 +399,7 @@ class WriterWithStyleTest extends TestCase
/** /**
* @param string $fileName * @param string $fileName
* @return \DOMNode[] * @return \DOMElement[]
*/ */
private function getCellElementsFromContentXmlFile($fileName) private function getCellElementsFromContentXmlFile($fileName)
{ {
@ -410,7 +412,9 @@ class WriterWithStyleTest extends TestCase
while ($xmlReader->read()) { while ($xmlReader->read()) {
if ($xmlReader->isPositionedOnStartingNode('table:table-cell') && $xmlReader->getAttribute('office:value-type') !== null) { if ($xmlReader->isPositionedOnStartingNode('table:table-cell') && $xmlReader->getAttribute('office:value-type') !== null) {
$cellElements[] = $xmlReader->expand(); /** @var \DOMElement $cellElement */
$cellElement = $xmlReader->expand();
$cellElements[] = $cellElement;
} }
} }
@ -421,7 +425,7 @@ class WriterWithStyleTest extends TestCase
/** /**
* @param string $fileName * @param string $fileName
* @return \DOMNode[] * @return \DOMElement[]
*/ */
private function getCellStyleElementsFromContentXmlFile($fileName) private function getCellStyleElementsFromContentXmlFile($fileName)
{ {
@ -434,7 +438,9 @@ class WriterWithStyleTest extends TestCase
while ($xmlReader->read()) { while ($xmlReader->read()) {
if ($xmlReader->isPositionedOnStartingNode('style:style') && $xmlReader->getAttribute('style:family') === 'table-cell') { if ($xmlReader->isPositionedOnStartingNode('style:style') && $xmlReader->getAttribute('style:family') === 'table-cell') {
$cellStyleElements[] = $xmlReader->expand(); /** @var \DOMElement $cellStyleElement */
$cellStyleElement = $xmlReader->expand();
$cellStyleElements[] = $cellStyleElement;
} }
} }
@ -446,7 +452,7 @@ class WriterWithStyleTest extends TestCase
/** /**
* @param string $fileName * @param string $fileName
* @param string $section * @param string $section
* @return \DomNode * @return \DOMElement
*/ */
private function getXmlSectionFromStylesXmlFile($fileName, $section) private function getXmlSectionFromStylesXmlFile($fileName, $section)
{ {
@ -456,12 +462,15 @@ class WriterWithStyleTest extends TestCase
$xmlReader->openFileInZip($resourcePath, 'styles.xml'); $xmlReader->openFileInZip($resourcePath, 'styles.xml');
$xmlReader->readUntilNodeFound($section); $xmlReader->readUntilNodeFound($section);
return $xmlReader->expand(); /** @var \DOMElement $element */
$element = $xmlReader->expand();
return $element;
} }
/** /**
* @param string $expectedValue * @param string $expectedValue
* @param \DOMNode $parentElement * @param \DOMElement $parentElement
* @param string $childTagName * @param string $childTagName
* @param string $attributeName * @param string $attributeName
* @return void * @return void

View File

@ -40,7 +40,7 @@ class StyleManagerTest extends TestCase
{ {
$styleRegistryMock = $this->getMockBuilder(StyleRegistry::class) $styleRegistryMock = $this->getMockBuilder(StyleRegistry::class)
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['getFillIdForStyleId', 'getBorderIdForStyleId']) ->onlyMethods(['getFillIdForStyleId', 'getBorderIdForStyleId'])
->getMock(); ->getMock();
$styleRegistryMock $styleRegistryMock

View File

@ -102,7 +102,7 @@ class WriterPerfTest extends TestCase
/** /**
* @param string $filePath * @param string $filePath
* @return string * @return int
*/ */
private function getLasRowNumberForFile($filePath) private function getLasRowNumberForFile($filePath)
{ {

View File

@ -92,6 +92,7 @@ class WriterWithStyleTest extends TestCase
$this->assertEquals(3, $fontElements->length, 'There should be 3 associated "font" elements, including the default one.'); $this->assertEquals(3, $fontElements->length, 'There should be 3 associated "font" elements, including the default one.');
// First font should be the default one // First font should be the default one
/** @var \DOMElement $defaultFontElement */
$defaultFontElement = $fontElements->item(0); $defaultFontElement = $fontElements->item(0);
$this->assertChildrenNumEquals(3, $defaultFontElement, 'The default font should only have 3 properties.'); $this->assertChildrenNumEquals(3, $defaultFontElement, 'The default font should only have 3 properties.');
$this->assertFirstChildHasAttributeEquals((string) OptionsManager::DEFAULT_FONT_SIZE, $defaultFontElement, 'sz', 'val'); $this->assertFirstChildHasAttributeEquals((string) OptionsManager::DEFAULT_FONT_SIZE, $defaultFontElement, 'sz', 'val');
@ -99,6 +100,7 @@ class WriterWithStyleTest extends TestCase
$this->assertFirstChildHasAttributeEquals(OptionsManager::DEFAULT_FONT_NAME, $defaultFontElement, 'name', 'val'); $this->assertFirstChildHasAttributeEquals(OptionsManager::DEFAULT_FONT_NAME, $defaultFontElement, 'name', 'val');
// Second font should contain data from the first created style // Second font should contain data from the first created style
/** @var \DOMElement $secondFontElement */
$secondFontElement = $fontElements->item(1); $secondFontElement = $fontElements->item(1);
$this->assertChildrenNumEquals(7, $secondFontElement, 'The font should only have 7 properties (4 custom styles + 3 default styles).'); $this->assertChildrenNumEquals(7, $secondFontElement, 'The font should only have 7 properties (4 custom styles + 3 default styles).');
$this->assertChildExists($secondFontElement, 'b'); $this->assertChildExists($secondFontElement, 'b');
@ -110,6 +112,7 @@ class WriterWithStyleTest extends TestCase
$this->assertFirstChildHasAttributeEquals(OptionsManager::DEFAULT_FONT_NAME, $secondFontElement, 'name', 'val'); $this->assertFirstChildHasAttributeEquals(OptionsManager::DEFAULT_FONT_NAME, $secondFontElement, 'name', 'val');
// Third font should contain data from the second created style // Third font should contain data from the second created style
/** @var \DOMElement $thirdFontElement */
$thirdFontElement = $fontElements->item(2); $thirdFontElement = $fontElements->item(2);
$this->assertChildrenNumEquals(3, $thirdFontElement, 'The font should only have 3 properties.'); $this->assertChildrenNumEquals(3, $thirdFontElement, 'The font should only have 3 properties.');
$this->assertFirstChildHasAttributeEquals('15', $thirdFontElement, 'sz', 'val'); $this->assertFirstChildHasAttributeEquals('15', $thirdFontElement, 'sz', 'val');
@ -394,10 +397,14 @@ class WriterWithStyleTest extends TestCase
'3 cell xfs present - a default one and two custom ones' '3 cell xfs present - a default one and two custom ones'
); );
$firstCustomId = $styleXfsElements->childNodes->item(1)->getAttribute('fillId'); /** @var \DOMElement $styleXfsElementChild1 */
$styleXfsElementChild1 = $styleXfsElements->childNodes->item(1);
$firstCustomId = $styleXfsElementChild1->getAttribute('fillId');
$this->assertEquals(2, (int) $firstCustomId, 'The first custom fill id should have the index 2'); $this->assertEquals(2, (int) $firstCustomId, 'The first custom fill id should have the index 2');
$secondCustomId = $styleXfsElements->childNodes->item(2)->getAttribute('fillId'); /** @var \DOMElement $styleXfsElementChild2 */
$styleXfsElementChild2 = $styleXfsElements->childNodes->item(2);
$secondCustomId = $styleXfsElementChild2->getAttribute('fillId');
$this->assertEquals(2, (int) $secondCustomId, 'The second custom fill id should have the index 2'); $this->assertEquals(2, (int) $secondCustomId, 'The second custom fill id should have the index 2');
} }
@ -468,7 +475,6 @@ class WriterWithStyleTest extends TestCase
$borderParts = $borderNode->childNodes; $borderParts = $borderNode->childNodes;
$ordering = []; $ordering = [];
/** @var \DOMText $part */
foreach ($borderParts as $part) { foreach ($borderParts as $part) {
if ($part instanceof \DOMElement) { if ($part instanceof \DOMElement) {
$ordering[] = $part->nodeName; $ordering[] = $part->nodeName;
@ -607,7 +613,7 @@ class WriterWithStyleTest extends TestCase
/** /**
* @param string $fileName * @param string $fileName
* @param string $section * @param string $section
* @return \DomElement * @return \DOMElement
*/ */
private function getXmlSectionFromStylesXmlFile($fileName, $section) private function getXmlSectionFromStylesXmlFile($fileName, $section)
{ {
@ -617,6 +623,7 @@ class WriterWithStyleTest extends TestCase
$xmlReader->openFileInZip($resourcePath, 'xl/styles.xml'); $xmlReader->openFileInZip($resourcePath, 'xl/styles.xml');
$xmlReader->readUntilNodeFound($section); $xmlReader->readUntilNodeFound($section);
/** @var \DOMElement $xmlSection */
$xmlSection = $xmlReader->expand(); $xmlSection = $xmlReader->expand();
$xmlReader->close(); $xmlReader->close();
@ -626,7 +633,7 @@ class WriterWithStyleTest extends TestCase
/** /**
* @param string $fileName * @param string $fileName
* @return \DOMNode[] * @return \DOMElement[]
*/ */
private function getCellElementsFromSheetXmlFile($fileName) private function getCellElementsFromSheetXmlFile($fileName)
{ {
@ -639,7 +646,9 @@ class WriterWithStyleTest extends TestCase
while ($xmlReader->read()) { while ($xmlReader->read()) {
if ($xmlReader->isPositionedOnStartingNode('c')) { if ($xmlReader->isPositionedOnStartingNode('c')) {
$cellElements[] = $xmlReader->expand(); /** @var \DOMElement $cellElement */
$cellElement = $xmlReader->expand();
$cellElements[] = $cellElement;
} }
} }
@ -650,7 +659,7 @@ class WriterWithStyleTest extends TestCase
/** /**
* @param string $expectedValue * @param string $expectedValue
* @param \DOMNode $parentElement * @param \DOMElement $parentElement
* @param string $childTagName * @param string $childTagName
* @param string $attributeName * @param string $attributeName
* @return void * @return void
@ -662,7 +671,7 @@ class WriterWithStyleTest extends TestCase
/** /**
* @param int $expectedNumber * @param int $expectedNumber
* @param \DOMNode $parentElement * @param \DOMElement $parentElement
* @param string $message * @param string $message
* @return void * @return void
*/ */
@ -672,7 +681,7 @@ class WriterWithStyleTest extends TestCase
} }
/** /**
* @param \DOMNode $parentElement * @param \DOMElement $parentElement
* @param string $childTagName * @param string $childTagName
* @return void * @return void
*/ */