summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md4
-rw-r--r--src/AbstractCsv.php22
-rw-r--r--src/Config/Controls.php45
-rw-r--r--src/Config/Output.php32
-rw-r--r--src/Reader.php15
-rw-r--r--test/ControlsTest.php39
-rw-r--r--test/StreamFilterTest.php34
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()