diff options
-rw-r--r-- | CHANGELOG.md | 4 | ||||
-rw-r--r-- | src/AbstractCsv.php | 22 | ||||
-rw-r--r-- | src/Config/Controls.php | 45 | ||||
-rw-r--r-- | src/Config/Output.php | 32 | ||||
-rw-r--r-- | src/Reader.php | 15 | ||||
-rw-r--r-- | test/ControlsTest.php | 39 | ||||
-rw-r--r-- | test/StreamFilterTest.php | 34 |
7 files changed, 68 insertions, 123 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f589be..f260493 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All Notable changes to `League\Csv` will be documented in this file ### Added - `Reader::fetchPairs` -- `Reader::setReturnType` and `Reader::getReturnType` to enable modifying some extract method return type +- `QueryFilter::setReturnType` and `QueryFilter::getReturnType` to enable modifying some extract method return type ### Deprecated @@ -19,6 +19,8 @@ All Notable changes to `League\Csv` will be documented in this file ### Removed +- `Controls::setFlags` +- `Controls::getFlags` - `Controls::detectDelimiterList` - `Reader::query` - The `$newline` argument from `AbstractCsv::createFromString` diff --git a/src/AbstractCsv.php b/src/AbstractCsv.php index 1e93c31..27ba772 100644 --- a/src/AbstractCsv.php +++ b/src/AbstractCsv.php @@ -93,13 +93,6 @@ abstract class AbstractCsv implements JsonSerializable, IteratorAggregate protected $open_mode; /** - * Default SplFileObject flags settings - * - * @var int - */ - protected $defaultFlags; - - /** * Creates a new instance * * The path must be an SplFileInfo object @@ -111,8 +104,6 @@ abstract class AbstractCsv implements JsonSerializable, IteratorAggregate */ protected function __construct($path, $open_mode = 'r+') { - $this->defaultFlags = SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY; - $this->flags = $this->defaultFlags; $this->open_mode = strtolower($open_mode); $this->path = $path; $this->initStreamFilter($this->path); @@ -127,7 +118,7 @@ abstract class AbstractCsv implements JsonSerializable, IteratorAggregate } /** - * Returns the CSV Iterator + * Returns the inner SplFileObject * * @return SplFileObject */ @@ -139,20 +130,22 @@ abstract class AbstractCsv implements JsonSerializable, IteratorAggregate $iterator = new SplFileObject($this->getStreamFilterPath(), $this->open_mode); } $iterator->setCsvControl($this->delimiter, $this->enclosure, $this->escape); - $iterator->setFlags($this->flags); + $iterator->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); return $iterator; } /** - * Returns the CSV Iterator for conversion + * Returns the CSV Iterator * * @return Iterator */ - protected function getConversionIterator() + protected function getCsvIterator() { + $this->addFilter(function ($row) { + return is_array($row) && $row != [null]; + }); $iterator = $this->getIterator(); - $iterator->setFlags($this->defaultFlags); $iterator = $this->applyBomStripping($iterator); $iterator = $this->applyIteratorFilter($iterator); $iterator = $this->applyIteratorSortBy($iterator); @@ -274,7 +267,6 @@ abstract class AbstractCsv implements JsonSerializable, IteratorAggregate $csv->enclosure = $this->enclosure; $csv->escape = $this->escape; $csv->encodingFrom = $this->encodingFrom; - $csv->flags = $this->flags; $csv->input_bom = $this->input_bom; $csv->output_bom = $this->output_bom; $csv->newline = $this->newline; diff --git a/src/Config/Controls.php b/src/Config/Controls.php index b54d74f..195af6f 100644 --- a/src/Config/Controls.php +++ b/src/Config/Controls.php @@ -48,13 +48,6 @@ trait Controls protected $escape = '\\'; /** - * the SplFileObject flags holder - * - * @var int - */ - protected $flags; - - /** * newline character * * @var string @@ -133,6 +126,11 @@ trait Controls } /** + * @inheritdoc + */ + abstract protected function filterInteger($int, $minValue, $errorMessage); + + /** * Returns the CSV Iterator * * @return SplFileObject @@ -198,39 +196,6 @@ trait Controls } /** - * Sets the Flags associated to the CSV SplFileObject - * - * @param int $flags - * - * @throws InvalidArgumentException If the argument is not a valid integer - * - * @return $this - */ - public function setFlags($flags) - { - $flags = $this->filterInteger($flags, 0, 'you should use a `SplFileObject` Constant'); - $this->flags = $flags | SplFileObject::READ_CSV; - - return $this; - } - - /** - * @inheritdoc - */ - abstract protected function filterInteger($int, $minValue, $errorMessage); - - /** - * Returns the file Flags - * - * @return int - */ - public function getFlags() - { - return $this->flags; - } - - - /** * Sets the newline sequence characters * * @param string $newline diff --git a/src/Config/Output.php b/src/Config/Output.php index 306d3e4..fc0e13a 100644 --- a/src/Config/Output.php +++ b/src/Config/Output.php @@ -47,20 +47,6 @@ trait Output protected $output_bom; /** - * Returns the CSV Iterator - * - * @return Iterator - */ - abstract protected function getConversionIterator(); - - /** - * Returns the CSV Iterator - * - * @return Iterator - */ - abstract public function getIterator(); - - /** * Sets the CSV encoding charset * * @param string $str @@ -146,6 +132,13 @@ trait Output } /** + * Returns the CSV Iterator + * + * @return Iterator + */ + abstract public function getIterator(); + + /** * Outputs all data on the CSV file * * @param string $filename CSV downloaded name if present adds extra headers @@ -210,10 +203,17 @@ trait Output */ public function jsonSerialize() { - return iterator_to_array($this->convertToUtf8($this->getConversionIterator()), false); + return iterator_to_array($this->convertToUtf8($this->getCsvIterator()), false); } /** + * Returns the CSV Iterator + * + * @return Iterator + */ + abstract protected function getCsvIterator(); + + /** * Convert Csv file into UTF-8 * * @param Iterator $iterator @@ -265,7 +265,7 @@ trait Output { $doc = new DomDocument('1.0', 'UTF-8'); $root = $doc->createElement($root_name); - $iterator = $this->convertToUtf8($this->getConversionIterator()); + $iterator = $this->convertToUtf8($this->getCsvIterator()); foreach ($iterator as $row) { $item = $doc->createElement($row_name); array_walk($row, function ($value) use (&$item, $doc, $cell_name) { diff --git a/src/Reader.php b/src/Reader.php index f45b1bf..9cae134 100644 --- a/src/Reader.php +++ b/src/Reader.php @@ -42,14 +42,7 @@ class Reader extends AbstractCsv */ public function fetch(callable $callable = null) { - $this->addFilter(function ($row) { - return is_array($row); - }); - $iterator = $this->getIterator(); - $iterator = $this->applyBomStripping($iterator); - $iterator = $this->applyIteratorFilter($iterator); - $iterator = $this->applyIteratorSortBy($iterator); - $iterator = $this->applyIteratorInterval($iterator); + $iterator = $this->getCsvIterator(); return $this->applyCallable($iterator, $callable); } @@ -315,9 +308,9 @@ class Reader extends AbstractCsv */ protected function getRow($offset) { - $csv = $this->getIterator(); - $csv->setFlags($this->getFlags() & ~SplFileObject::READ_CSV); - $iterator = new LimitIterator($csv, $offset, 1); + $iterator = $this->getIterator(); + $iterator->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); + $iterator = new LimitIterator($iterator, $offset, 1); $iterator->rewind(); $res = $iterator->current(); diff --git a/test/ControlsTest.php b/test/ControlsTest.php index f80364a..0e25a60 100644 --- a/test/ControlsTest.php +++ b/test/ControlsTest.php @@ -162,22 +162,6 @@ class ControlsTest extends AbstractTestCase $this->csv->setEncodingFrom(''); } - /** - * @expectedException InvalidArgumentException - * @expectedExceptionMessage you should use a `SplFileObject` Constant - */ - public function testSetFlags() - { - $this->assertSame(SplFileObject::READ_CSV, $this->csv->getFlags() & SplFileObject::READ_CSV); - $this->assertSame(SplFileObject::SKIP_EMPTY, $this->csv->getFlags() & SplFileObject::SKIP_EMPTY); - $this->assertSame(SplFileObject::READ_AHEAD, $this->csv->getFlags() & SplFileObject::READ_AHEAD); - $this->csv->setFlags(SplFileObject::DROP_NEW_LINE); - $this->assertSame(SplFileObject::DROP_NEW_LINE, $this->csv->getFlags() & SplFileObject::DROP_NEW_LINE); - $this->assertSame(SplFileObject::READ_CSV, $this->csv->getFlags() & SplFileObject::READ_CSV); - - $this->csv->setFlags(-3); - } - public function testCustomNewline() { $csv = Writer::createFromFileObject(new SplTempFileObject()); @@ -187,36 +171,29 @@ class ControlsTest extends AbstractTestCase } /** - * @param $flag - * @param $line_count * @dataProvider appliedFlagsProvider - * @skipIfHHVM */ - public function testAppliedFlags($flag, $line_count) + public function testAppliedFlags($flag, $fetch_count) { $path = __DIR__.'/data/tmp.txt'; $obj = new SplFileObject($path, 'w+'); $obj->fwrite("1st\n2nd\n"); + $obj->setFlags($flag); $reader = Reader::createFromFileObject($obj); - $reader->setFlags($flag); - $this->assertCount($line_count, $reader->fetchAll()); - unlink($path); + $this->assertCount($fetch_count, $reader->fetchAll()); } public function appliedFlagsProvider() { return [ - 'NONE' => [0, 3], - 'DROP_NEW_LINE' => [SplFileObject::DROP_NEW_LINE, 3], - 'READ_AHEAD' => [SplFileObject::READ_AHEAD, 3], + 'NONE' => [0, 2], + 'DROP_NEW_LINE' => [SplFileObject::READ_AHEAD | SplFileObject::DROP_NEW_LINE, 2], + 'READ_AHEAD' => [SplFileObject::READ_AHEAD, 2], 'SKIP_EMPTY' => [SplFileObject::SKIP_EMPTY, 2], - 'READ_AHEAD|DROP_NEW_LINE' => [SplFileObject::READ_AHEAD | SplFileObject::DROP_NEW_LINE, 3], + 'READ_AHEAD|DROP_NEW_LINE' => [SplFileObject::READ_AHEAD | SplFileObject::DROP_NEW_LINE, 2], 'READ_AHEAD|SKIP_EMPTY' => [SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY, 2], 'DROP_NEW_LINE|SKIP_EMPTY' => [SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY, 2], - 'READ_AHEAD|DROP_NEW_LINE|SKIP_EMPTY' => [ - SplFileObject::READ_AHEAD | SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY, - 2, - ], + 'READ_AHEAD|DROP_NEW_LINE|SKIP_EMPTY' => [SplFileObject::READ_AHEAD | SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY, 2], ]; } } diff --git a/test/StreamFilterTest.php b/test/StreamFilterTest.php index fe81c48..e576a02 100644 --- a/test/StreamFilterTest.php +++ b/test/StreamFilterTest.php @@ -9,7 +9,7 @@ use SplFileObject; use SplTempFileObject; /** - * @group csv + * @group stream */ class StreamFilterTest extends AbstractTestCase { @@ -57,7 +57,7 @@ class StreamFilterTest extends AbstractTestCase /** * @expectedException LogicException */ - public function testFailedprependStreamFilter() + public function testFailPrependStreamFilter() { $csv = Reader::createFromFileObject(new SplTempFileObject()); $this->assertFalse($csv->isActiveStreamFilter()); @@ -77,7 +77,23 @@ class StreamFilterTest extends AbstractTestCase /** * @expectedException OutOfBoundsException */ - public function testaddMultipleStreamFilter() + public function testSetInvalidStreamFilterMode() + { + $csv = Reader::createFromPath(__DIR__.'/data/foo.csv'); + $csv->setStreamFilterMode(34); + } + + public function testClearAttachedStreamFilters() + { + $csv = Reader::createFromPath(__DIR__.'/data/foo.csv'); + $csv->appendStreamFilter('string.tolower'); + $csv->appendStreamFilter('string.rot13'); + $csv->appendStreamFilter('string.toupper'); + $csv->clearStreamFilter(); + $this->assertFalse($csv->hasStreamFilter('string.rot13')); + } + + public function testAddMultipleStreamFilter() { $csv = Reader::createFromPath(__DIR__.'/data/foo.csv'); $csv->appendStreamFilter('string.tolower'); @@ -86,21 +102,21 @@ class StreamFilterTest extends AbstractTestCase $this->assertTrue($csv->hasStreamFilter('string.tolower')); $csv->removeStreamFilter('string.tolower'); $this->assertFalse($csv->hasStreamFilter('string.tolower')); - - foreach ($csv->getIterator() as $row) { + foreach ($csv as $row) { $this->assertSame($row, ['WBUA', 'QBR', 'WBUA.QBR@RKNZCYR.PBZ']); } - $csv->clearStreamFilter(); - $this->assertFalse($csv->hasStreamFilter('string.rot13')); + } + public function testSwithingStreamFilterMode() + { + $csv = Reader::createFromPath(__DIR__.'/data/foo.csv'); $csv->appendStreamFilter('string.toupper'); $this->assertSame(STREAM_FILTER_READ, $csv->getStreamFilterMode()); $csv->setStreamFilterMode(STREAM_FILTER_WRITE); $this->assertSame(STREAM_FILTER_WRITE, $csv->getStreamFilterMode()); - foreach ($csv->getIterator() as $row) { + foreach ($csv as $row) { $this->assertSame($row, ['john', 'doe', 'john.doe@example.com']); } - $csv->setStreamFilterMode(34); } public function testGetFilterPath() |