Compare commits

..

1 commit
master ... 1

Author SHA1 Message Date
Simon Vieille ed90282ef7 deblan/csv dependency 2017-01-11 15:41:10 +01:00
13 changed files with 50 additions and 157 deletions

2
.gitignore vendored
View file

@ -1 +1,3 @@
*.swp
tags
vendor vendor

25
Jenkinsfile vendored
View file

@ -1,25 +0,0 @@
pipeline {
agent any
stages {
stage('PHP 7.1') {
steps {
sh '/usr/local/bin/composer-php7.1 install'
sh 'php7.1 /usr/local/bin/phpunit-7'
}
}
stage('PHP 7.3') {
steps {
sh '/usr/local/bin/composer-php7.3 update'
sh 'php7.3 /usr/local/bin/phpunit-9'
}
}
stage('PHP 7.4') {
steps {
sh '/usr/local/bin/composer-php7.4 update'
sh 'php7.4 /usr/local/bin/phpunit-9'
}
}
}
}

View file

@ -21,4 +21,3 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -1,4 +0,0 @@
.PHONY: tests
tests:
phpunit

View file

@ -1,7 +1,7 @@
csv-validator csv-validator
============= =============
[![Build Status](https://ci.gitnet.fr/buildStatus/icon?job=Gitnet%2Fcsv-validator%2F3)](https://ci.gitnet.fr/job/Gitnet/job/csv-validator/job/3/) ![](https://phpci.gitnet.fr//build-status/image/1)
CSV validator library CSV validator library
@ -45,7 +45,7 @@ $validator->addFieldConstraint(0, new Email());
$validator->addFieldConstraint(1, new Date()); $validator->addFieldConstraint(1, new Date());
// Validate the legend // Validate the legend
$validator->setExpectedHeaders(['foo', 'bar', 'bim']); $validator->setExpectedLegend(array('foo', 'bar', 'bim'));
// An line must contain 3 columns // An line must contain 3 columns
$validator->addDataConstraint(new Callback(function($data, ExecutionContextInterface $context) { $validator->addDataConstraint(new Callback(function($data, ExecutionContextInterface $context) {
@ -55,10 +55,10 @@ $validator->addDataConstraint(new Callback(function($data, ExecutionContextInter
})); }));
// Initialisation of the parser // Initialisation of the parser
$parser = new CsvParser(); $parser = new CsvParser(__DIR__.'/tests/fixtures/example.csv');
$parser->setHasHeaders(true); $parser->setHasLegend(true);
$validator->validate($parser->parseFile(__DIR__.'/tests/fixtures/example.csv')); $validator->validate($parser);
if ($validator->isValid() === false) { if ($validator->isValid() === false) {
foreach ($validator->getErrors() as $error) { foreach ($validator->getErrors() as $error) {
@ -80,39 +80,6 @@ EOF;
} }
``` ```
Run `example.php` and see results:
```
<ul>
<li>Line: 1</li>
<li>Column: </li>
<li>
<p>Invalid legend.</p>
</li>
</ul>
<ul>
<li>Line: 4</li>
<li>Column: </li>
<li>
<p>The line must contain 3 columns</p>
</li>
</ul>
<ul>
<li>Line: 2</li>
<li>Column: 1</li>
<li>
<p>This value is not a valid email address.</p>
</li>
</ul>
<ul>
<li>Line: 3</li>
<li>Column: 2</li>
<li>
<p>This value is not a valid date.</p>
</li>
</ul>
```
Contributors Contributors
------------ ------------

View file

@ -15,8 +15,8 @@
}, },
"minimum-stability": "dev", "minimum-stability": "dev",
"require": { "require": {
"php": "^7.1.3", "php": ">=5.6.0",
"symfony/validator": "^4", "symfony/validator": "2.*",
"deblan/csv": "v2.0.*|v3.*" "deblan/csv": "v1.2"
} }
} }

View file

@ -2,6 +2,7 @@
use Deblan\Csv\CsvParser; use Deblan\Csv\CsvParser;
use Deblan\CsvValidator\Validator; use Deblan\CsvValidator\Validator;
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Date; use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\Validator\Constraints\Callback; use Symfony\Component\Validator\Constraints\Callback;
@ -19,20 +20,20 @@ $validator->addFieldConstraint(0, new Email());
$validator->addFieldConstraint(1, new Date()); $validator->addFieldConstraint(1, new Date());
// Validate the legend // Validate the legend
$validator->setExpectedHeaders(['foo', 'bar', 'bim']); $validator->setExpectedLegend(array('foo', 'bar', 'bim'));
// An line must contain 3 columns // An line must contain 3 columns
$validator->addDataConstraint(new Callback(function ($data, ExecutionContextInterface $context) { $validator->addDataConstraint(new Callback(function($data, ExecutionContextInterface $context) {
if (count($data) !== 6) { // 6 because of the legend (3 fields * 2) if (count($data) !== 6) { // 6 because of the legend (3 fields * 2)
$context->addViolation('The line must contain 3 columns'); $context->addViolation('The line must contain 3 columns');
} }
})); }));
// Initialisation of the parser // Initialisation of the parser
$parser = new CsvParser(); $parser = new CsvParser(__DIR__.'/tests/fixtures/example.csv');
$parser->setHasHeaders(true); $parser->setHasLegend(true);
$validator->validate($parser->parseFile(__DIR__.'/tests/fixtures/example.csv')); $validator->validate($parser);
if ($validator->isValid() === false) { if ($validator->isValid() === false) {
foreach ($validator->getErrors() as $error) { foreach ($validator->getErrors() as $error) {

View file

@ -7,6 +7,7 @@
convertWarningsToExceptions = "true" convertWarningsToExceptions = "true"
processIsolation = "false" processIsolation = "false"
stopOnFailure = "false" stopOnFailure = "false"
syntaxCheck = "false"
bootstrap = "vendor/autoload.php" > bootstrap = "vendor/autoload.php" >
<testsuites> <testsuites>

View file

@ -49,7 +49,7 @@ class Validator
/** /**
* @var array * @var array
*/ */
protected $expectedHeaders = []; protected $expectedLegend = [];
/** /**
* Constructor. * Constructor.
@ -105,9 +105,9 @@ class Validator
* *
* @return Validator * @return Validator
*/ */
public function setExpectedHeaders(array $legend) public function setExpectedLegend(array $legend)
{ {
$this->expectedHeaders = $legend; $this->expectedLegend = $legend;
return $this; return $this;
} }
@ -121,13 +121,13 @@ class Validator
{ {
if ($this->parser !== $parser) { if ($this->parser !== $parser) {
$this->parser = $parser; $this->parser = $parser;
$this->parser->parse();
$this->errors = []; $this->errors = [];
$this->hasValidate = false;
} elseif ($this->hasValidate) { } elseif ($this->hasValidate) {
return; return;
} }
$this->validateHeaders(); $this->validateLegend();
$this->validateDatas(); $this->validateDatas();
$this->validateFields(); $this->validateFields();
@ -137,17 +137,17 @@ class Validator
/** /**
* Validates the legend. * Validates the legend.
*/ */
protected function validateHeaders() protected function validateLegend()
{ {
if (!$this->parser->getHasHeaders()) { if (!$this->parser->getHasLegend()) {
return; return;
} }
if (empty($this->expectedHeaders)) { if (empty($this->expectedLegend)) {
return; return;
} }
if ($this->parser->getHeaders() !== $this->expectedHeaders) { if ($this->parser->getLegend() !== $this->expectedLegend) {
$this->mergeErrorMessage('Invalid legend.', 1); $this->mergeErrorMessage('Invalid legend.', 1);
} }
} }
@ -294,7 +294,7 @@ class Validator
*/ */
protected function getTrueLine($line) protected function getTrueLine($line)
{ {
if ($this->parser->getHasHeaders()) { if ($this->parser->getHasLegend()) {
++$line; ++$line;
} }

View file

@ -1,46 +0,0 @@
<?php
use PHPUnit\Framework\TestCase;
/**
* class ExampleTest.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class ExampleTest extends TestCase
{
public function testExemple()
{
$content = shell_exec('php -f '.__DIR__.'/../example.php');
$this->assertEquals('<ul>
<li>Line: 1</li>
<li>Column: </li>
<li>
<p>Invalid legend.</p>
</li>
</ul>
<ul>
<li>Line: 4</li>
<li>Column: </li>
<li>
<p>The line must contain 3 columns</p>
</li>
</ul>
<ul>
<li>Line: 2</li>
<li>Column: 1</li>
<li>
<p>This value is not a valid email address.</p>
</li>
</ul>
<ul>
<li>Line: 3</li>
<li>Column: 2</li>
<li>
<p>This value is not a valid date.</p>
</li>
</ul>
', $content);
}
}

View file

@ -1,36 +1,35 @@
<?php <?php
use PHPUnit\Framework\TestCase;
use Deblan\Csv\CsvParser; use Deblan\Csv\CsvParser;
use Deblan\CsvValidator\Validator; use Deblan\CsvValidator\Validator;
use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\Email;
class ValidatorTest extends TestCase class ValidatorTest extends \PHPUnit_Framework_TestCase
{ {
public function testViolation() public function testViolation()
{ {
$parser = $this->generateParser('example.csv'); $parser = $this->generateParser('example.csv');
$validator = $this->generateValidator($parser); $validator = $this->generateValidator($parser);
$this->expectException('\RuntimeException'); $this->setExpectedException('\RuntimeException');
$validator->isValid(); $validator->isValid();
} }
public function testExpectedHeaders() public function testExpectedLegend()
{ {
$parser = $this->generateParser('example.csv'); $parser = $this->generateParser('example.csv');
$parser->setHasHeaders(true); $parser->setHasLegend(true);
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->setExpectedHeaders(['foo', 'bar', 'boo']); $validator->setExpectedLegend(['foo', 'bar', 'boo']);
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(true, $validator->isValid()); $this->assertEquals(true, $validator->isValid());
$this->assertEquals(0, count($validator->getErrors())); $this->assertEquals(0, count($validator->getErrors()));
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->setExpectedHeaders(['bad', 'legend']); $validator->setExpectedLegend(['bad', 'legend']);
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(false, $validator->isValid()); $this->assertEquals(false, $validator->isValid());
$this->assertEquals(1, count($validator->getErrors())); $this->assertEquals(1, count($validator->getErrors()));
} }
@ -39,7 +38,7 @@ class ValidatorTest extends TestCase
{ {
$parser = $this->generateParser('example.csv'); $parser = $this->generateParser('example.csv');
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(true, $validator->isValid()); $this->assertEquals(true, $validator->isValid());
} }
@ -48,14 +47,14 @@ class ValidatorTest extends TestCase
$parser = $this->generateParser('example.csv'); $parser = $this->generateParser('example.csv');
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->addFieldConstraint(0, new NotBlank()); $validator->addFieldConstraint(0, new NotBlank());
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(true, $validator->isValid()); $this->assertEquals(true, $validator->isValid());
$this->assertEquals(0, count($validator->getErrors())); $this->assertEquals(0, count($validator->getErrors()));
$parser = $this->generateParser('example.csv'); $parser = $this->generateParser('example.csv');
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->addFieldConstraint(1, new NotBlank()); $validator->addFieldConstraint(1, new NotBlank());
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(true, $validator->isValid()); $this->assertEquals(true, $validator->isValid());
$this->assertEquals(0, count($validator->getErrors())); $this->assertEquals(0, count($validator->getErrors()));
@ -63,24 +62,24 @@ class ValidatorTest extends TestCase
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->addFieldConstraint(0, new NotBlank()); $validator->addFieldConstraint(0, new NotBlank());
$validator->addFieldConstraint(1, new NotBlank()); $validator->addFieldConstraint(1, new NotBlank());
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(true, $validator->isValid()); $this->assertEquals(true, $validator->isValid());
$this->assertEquals(0, count($validator->getErrors())); $this->assertEquals(0, count($validator->getErrors()));
} }
public function testFieldContraintsKo() public function testFieldContraintsKo()
{ {
$parser = $this->generateParser(); $parser = $this->generateParser('example.csv');
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->addFieldConstraint(0, new Email()); $validator->addFieldConstraint(0, new Email());
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(false, $validator->isValid()); $this->assertEquals(false, $validator->isValid());
$this->assertEquals(2, count($validator->getErrors())); $this->assertEquals(2, count($validator->getErrors()));
$parser = $this->generateParser(); $parser = $this->generateParser('example.csv');
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->addFieldConstraint(1, new Email()); $validator->addFieldConstraint(1, new Email());
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(false, $validator->isValid()); $this->assertEquals(false, $validator->isValid());
$this->assertEquals(5, count($validator->getErrors())); $this->assertEquals(5, count($validator->getErrors()));
@ -88,14 +87,14 @@ class ValidatorTest extends TestCase
$validator = $this->generateValidator(); $validator = $this->generateValidator();
$validator->addFieldConstraint(0, new Email()); $validator->addFieldConstraint(0, new Email());
$validator->addFieldConstraint(1, new Email()); $validator->addFieldConstraint(1, new Email());
$validator->validate($parser->parseFile(__DIR__.'/fixtures/example.csv')); $validator->validate($parser);
$this->assertEquals(false, $validator->isValid()); $this->assertEquals(false, $validator->isValid());
$this->assertEquals(7, count($validator->getErrors())); $this->assertEquals(7, count($validator->getErrors()));
} }
protected function generateParser() protected function generateParser($file)
{ {
return new CsvParser(); return new CsvParser(__DIR__.'/fixtures/'.$file);
} }
protected function generateValidator() protected function generateValidator()

View file

@ -1,10 +1,9 @@
<?php <?php
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\ConstraintViolation; use Symfony\Component\Validator\ConstraintViolation;
use Deblan\CsvValidator\Violation; use Deblan\CsvValidator\Violation;
class ViolationTest extends TestCase class ViolationTest extends \PHPUnit_Framework_TestCase
{ {
public function testViolation() public function testViolation()
{ {